Ignore:
Timestamp:
Jan 21, 2018, 12:10:09 AM (6 years ago)
Author:
coas-nagasima
Message:

prototoolに関連するプロジェクトをnewlibからmuslを使うよう変更・更新
ntshellをnewlibの下位の実装から、muslのsyscallの実装に変更・更新
以下のOSSをアップデート
・mruby-1.3.0
・musl-1.1.18
・onigmo-6.1.3
・tcc-0.9.27
以下のOSSを追加
・openssl-1.1.0e
・curl-7.57.0
・zlib-1.2.11
以下のmrbgemsを追加
・iij/mruby-digest
・iij/mruby-env
・iij/mruby-errno
・iij/mruby-iijson
・iij/mruby-ipaddr
・iij/mruby-mock
・iij/mruby-require
・iij/mruby-tls-openssl

Location:
EcnlProtoTool/trunk/mruby-1.3.0
Files:
1 edited
1 moved

Legend:

Unmodified
Added
Removed
  • EcnlProtoTool/trunk/mruby-1.3.0/src/error.c

    r321 r331  
    88#include <stdarg.h>
    99#include <stdlib.h>
    10 #include "mruby.h"
    11 #include "mruby/array.h"
    12 #include "mruby/irep.h"
    13 #include "mruby/proc.h"
    14 #include "mruby/string.h"
    15 #include "mruby/variable.h"
    16 #include "mruby/debug.h"
    17 #include "mruby/error.h"
    18 #include "mruby/class.h"
    19 #include "mruby/throw.h"
     10#include <mruby.h>
     11#include <mruby/array.h>
     12#include <mruby/irep.h>
     13#include <mruby/proc.h>
     14#include <mruby/string.h>
     15#include <mruby/variable.h>
     16#include <mruby/debug.h>
     17#include <mruby/error.h>
     18#include <mruby/class.h>
     19#include <mruby/throw.h>
    2020
    2121MRB_API mrb_value
     
    4545{
    4646  mrb_value mesg;
    47 
    48   if (mrb_get_args(mrb, "|o", &mesg) == 1) {
     47  mrb_int argc;
     48  mrb_value *argv;
     49
     50  if (mrb_get_args(mrb, "|o*", &mesg, &argv, &argc) >= 1) {
    4951    mrb_iv_set(mrb, exc, mrb_intern_lit(mrb, "mesg"), mesg);
    5052  }
     
    6163 *  return the receiver. Otherwise, create a new
    6264 *  exception object of the same class as the receiver, but with a
    63  *  message equal to <code>string.to_str</code>.
     65 *  message equal to <code>string</code>.
    6466 *
    6567 */
     
    110112 *
    111113 * Returns the result of invoking <code>exception.to_s</code>.
    112  * Normally this returns the exception's message or name. By
    113  * supplying a to_str method, exceptions are agreeing to
    114  * be used where Strings are expected.
     114 * Normally this returns the exception's message or name.
    115115 */
    116116
     
    136136  mrb_value str, mesg, file, line;
    137137  mrb_bool append_mesg;
     138  const char *cname;
    138139
    139140  mesg = mrb_attr_get(mrb, exc, mrb_intern_lit(mrb, "mesg"));
     
    147148  }
    148149
    149   if (!mrb_nil_p(file) && !mrb_nil_p(line)) {
    150     str = mrb_str_dup(mrb, file);
    151     mrb_str_cat_lit(mrb, str, ":");
    152     mrb_str_append(mrb, str, line);
    153     mrb_str_cat_lit(mrb, str, ": ");
     150  cname = mrb_obj_classname(mrb, exc);
     151  str = mrb_str_new_cstr(mrb, cname);
     152  if (mrb_string_p(file) && mrb_fixnum_p(line)) {
    154153    if (append_mesg) {
    155       mrb_str_cat_str(mrb, str, mesg);
    156       mrb_str_cat_lit(mrb, str, " (");
    157     }
    158     mrb_str_cat_cstr(mrb, str, mrb_obj_classname(mrb, exc));
    159     if (append_mesg) {
    160       mrb_str_cat_lit(mrb, str, ")");
    161     }
     154      str = mrb_format(mrb, "%S:%S:%S (%S)", file, line, mesg, str);
     155    }
     156    else {
     157      str = mrb_format(mrb, "%S:%S:%S", file, line, str);
     158    }
     159  }
     160  else if (append_mesg) {
     161    str = mrb_format(mrb, "%S:%S", str, mesg);
     162  }
     163  return str;
     164}
     165
     166void mrb_keep_backtrace(mrb_state *mrb, mrb_value exc);
     167
     168static void
     169set_backtrace(mrb_state *mrb, mrb_value exc, mrb_value backtrace)
     170{
     171  if (!mrb_array_p(backtrace)) {
     172  type_err:
     173    mrb_raise(mrb, E_TYPE_ERROR, "backtrace must be Array of String");
    162174  }
    163175  else {
    164     const char *cname = mrb_obj_classname(mrb, exc);
    165     str = mrb_str_new_cstr(mrb, cname);
    166     mrb_str_cat_lit(mrb, str, ": ");
    167     if (append_mesg) {
    168       mrb_str_cat_str(mrb, str, mesg);
    169     }
    170     else {
    171       mrb_str_cat_cstr(mrb, str, cname);
    172     }
    173   }
    174   return str;
    175 }
    176 
     176    const mrb_value *p = RARRAY_PTR(backtrace);
     177    const mrb_value *pend = p + RARRAY_LEN(backtrace);
     178
     179    while (p < pend) {
     180      if (!mrb_string_p(*p)) goto type_err;
     181      p++;
     182    }
     183  }
     184  mrb_iv_set(mrb, exc, mrb_intern_lit(mrb, "backtrace"), backtrace);
     185}
     186
     187static mrb_value
     188exc_set_backtrace(mrb_state *mrb, mrb_value exc)
     189{
     190  mrb_value backtrace;
     191
     192  mrb_get_args(mrb, "o", &backtrace);
     193  set_backtrace(mrb, exc, backtrace);
     194  return backtrace;
     195}
    177196
    178197static void
     
    182201  mrb_code *pc = ci->pc;
    183202
    184   mrb_obj_iv_set(mrb, exc, mrb_intern_lit(mrb, "ciidx"), mrb_fixnum_value((mrb_int)(ci - mrb->c->cibase)));
    185203  while (ci >= mrb->c->cibase) {
    186204    mrb_code *err = ci->err;
     
    203221}
    204222
     223void
     224mrb_exc_set(mrb_state *mrb, mrb_value exc)
     225{
     226  if (mrb_nil_p(exc)) {
     227    mrb->exc = 0;
     228  }
     229  else {
     230    mrb->exc = mrb_obj_ptr(exc);
     231    if (!mrb->gc.out_of_memory) {
     232      exc_debug_info(mrb, mrb->exc);
     233      mrb_keep_backtrace(mrb, exc);
     234    }
     235  }
     236}
     237
    205238MRB_API mrb_noreturn void
    206239mrb_exc_raise(mrb_state *mrb, mrb_value exc)
    207240{
    208   mrb->exc = mrb_obj_ptr(exc);
    209   if (!mrb->gc.out_of_memory) {
    210     exc_debug_info(mrb, mrb->exc);
    211   }
     241  if (!mrb_obj_is_kind_of(mrb, exc, mrb->eException_class)) {
     242    mrb_raise(mrb, E_TYPE_ERROR, "exception object expected");
     243  }
     244  mrb_exc_set(mrb, exc);
    212245  if (!mrb->jmp) {
    213246    mrb_p(mrb, exc);
     
    220253mrb_raise(mrb_state *mrb, struct RClass *c, const char *msg)
    221254{
    222   mrb_value mesg;
    223   mesg = mrb_str_new_cstr(mrb, msg);
    224   mrb_exc_raise(mrb, mrb_exc_new_str(mrb, c, mesg));
     255  mrb_exc_raise(mrb, mrb_exc_new_str(mrb, c, mrb_str_new_cstr(mrb, msg)));
    225256}
    226257
     
    232263  ptrdiff_t size;
    233264  mrb_value ary = mrb_ary_new_capa(mrb, 4);
     265  int ai = mrb_gc_arena_save(mrb);
    234266
    235267  while (*p) {
     
    255287      }
    256288    }
     289    mrb_gc_arena_restore(mrb, ai);
    257290  }
    258291  if (b == format) {
     
    261294  else {
    262295    size = p - b;
    263     mrb_ary_push(mrb, ary, mrb_str_new(mrb, b, size));
    264     return mrb_ary_join(mrb, ary, mrb_str_new(mrb, NULL, 0));
     296    if (size > 0) {
     297      mrb_ary_push(mrb, ary, mrb_str_new(mrb, b, size));
     298      mrb_gc_arena_restore(mrb, ai);
     299    }
     300    return mrb_ary_join(mrb, ary, mrb_nil_value());
    265301  }
    266302}
     
    279315}
    280316
     317static mrb_noreturn void
     318raise_va(mrb_state *mrb, struct RClass *c, const char *fmt, va_list ap, int argc, mrb_value *argv)
     319{
     320  mrb_value mesg;
     321
     322  mesg = mrb_vformat(mrb, fmt, ap);
     323  if (argv == NULL) {
     324    argv = &mesg;
     325  }
     326  else {
     327    argv[0] = mesg;
     328  }
     329  mrb_exc_raise(mrb, mrb_obj_new(mrb, c, argc+1, argv));
     330}
     331
    281332MRB_API mrb_noreturn void
    282333mrb_raisef(mrb_state *mrb, struct RClass *c, const char *fmt, ...)
    283334{
    284335  va_list args;
    285   mrb_value mesg;
    286336
    287337  va_start(args, fmt);
    288   mesg = mrb_vformat(mrb, fmt, args);
     338  raise_va(mrb, c, fmt, args, 0, NULL);
    289339  va_end(args);
    290   mrb_exc_raise(mrb, mrb_exc_new_str(mrb, c, mesg));
    291340}
    292341
     
    294343mrb_name_error(mrb_state *mrb, mrb_sym id, const char *fmt, ...)
    295344{
    296   mrb_value exc;
    297345  mrb_value argv[2];
    298346  va_list args;
    299347
    300348  va_start(args, fmt);
    301   argv[0] = mrb_vformat(mrb, fmt, args);
     349  argv[1] = mrb_symbol_value(id);
     350  raise_va(mrb, E_NAME_ERROR, fmt, args, 1, argv);
    302351  va_end(args);
    303 
    304   argv[1] = mrb_symbol_value(id);
    305   exc = mrb_obj_new(mrb, E_NAME_ERROR, 2, argv);
    306   mrb_exc_raise(mrb, exc);
    307352}
    308353
     
    338383}
    339384
    340 static void
    341 set_backtrace(mrb_state *mrb, mrb_value info, mrb_value bt)
    342 {
    343   mrb_funcall(mrb, info, "set_backtrace", 1, bt);
    344 }
    345 
    346 static mrb_value
    347 make_exception(mrb_state *mrb, int argc, const mrb_value *argv, mrb_bool isstr)
     385MRB_API mrb_value
     386mrb_make_exception(mrb_state *mrb, int argc, const mrb_value *argv)
    348387{
    349388  mrb_value mesg;
     
    357396      if (mrb_nil_p(argv[0]))
    358397        break;
    359       if (isstr) {
    360         mesg = mrb_check_string_type(mrb, argv[0]);
    361         if (!mrb_nil_p(mesg)) {
    362           mesg = mrb_exc_new_str(mrb, E_RUNTIME_ERROR, mesg);
    363           break;
    364         }
     398      if (mrb_string_p(argv[0])) {
     399        mesg = mrb_exc_new_str(mrb, E_RUNTIME_ERROR, argv[0]);
     400        break;
    365401      }
    366402      n = 0;
     
    389425  if (argc > 0) {
    390426    if (!mrb_obj_is_kind_of(mrb, mesg, mrb->eException_class))
    391       mrb_raise(mrb, E_TYPE_ERROR, "exception object expected");
     427      mrb_raise(mrb, mrb->eException_class, "exception object expected");
    392428    if (argc > 2)
    393         set_backtrace(mrb, mesg, argv[2]);
     429      set_backtrace(mrb, mesg, argv[2]);
    394430  }
    395431
    396432  return mesg;
    397 }
    398 
    399 MRB_API mrb_value
    400 mrb_make_exception(mrb_state *mrb, int argc, const mrb_value *argv)
    401 {
    402   return make_exception(mrb, argc, argv, TRUE);
    403433}
    404434
     
    428458{
    429459  mrb_value exc;
     460  mrb_value argv[3];
    430461  va_list ap;
    431462
    432463  va_start(ap, fmt);
    433   exc = mrb_funcall(mrb, mrb_obj_value(E_NOMETHOD_ERROR), "new", 3,
    434                     mrb_vformat(mrb, fmt, ap), mrb_symbol_value(id), args);
     464  argv[0] = mrb_vformat(mrb, fmt, ap);
     465  argv[1] = mrb_symbol_value(id);
     466  argv[2] = args;
    435467  va_end(ap);
     468  exc = mrb_obj_new(mrb, E_NOMETHOD_ERROR, 3, argv);
    436469  mrb_exc_raise(mrb, exc);
    437470}
     
    440473mrb_init_exception(mrb_state *mrb)
    441474{
    442   struct RClass *exception, *runtime_error, *script_error;
     475  struct RClass *exception, *script_error, *stack_error, *nomem_error;
    443476
    444477  mrb->eException_class = exception = mrb_define_class(mrb, "Exception", mrb->object_class); /* 15.2.22 */
     
    451484  mrb_define_method(mrb, exception, "inspect",         exc_inspect,       MRB_ARGS_NONE());
    452485  mrb_define_method(mrb, exception, "backtrace",       mrb_exc_backtrace, MRB_ARGS_NONE());
     486  mrb_define_method(mrb, exception, "set_backtrace",   exc_set_backtrace, MRB_ARGS_REQ(1));
    453487
    454488  mrb->eStandardError_class = mrb_define_class(mrb, "StandardError", mrb->eException_class); /* 15.2.23 */
    455   runtime_error = mrb_define_class(mrb, "RuntimeError", mrb->eStandardError_class);          /* 15.2.28 */
    456   mrb->nomem_err = mrb_obj_ptr(mrb_exc_new_str_lit(mrb, runtime_error, "Out of memory"));
     489  mrb_define_class(mrb, "RuntimeError", mrb->eStandardError_class);          /* 15.2.28 */
    457490  script_error = mrb_define_class(mrb, "ScriptError", mrb->eException_class);                /* 15.2.37 */
    458491  mrb_define_class(mrb, "SyntaxError", script_error);                                        /* 15.2.38 */
    459   mrb_define_class(mrb, "SystemStackError", exception);
    460 }
     492  stack_error = mrb_define_class(mrb, "SystemStackError", exception);
     493  mrb->stack_err = mrb_obj_ptr(mrb_exc_new_str_lit(mrb, stack_error, "stack level too deep"));
     494
     495  nomem_error = mrb_define_class(mrb, "NoMemoryError", exception);
     496  mrb->nomem_err = mrb_obj_ptr(mrb_exc_new_str_lit(mrb, nomem_error, "Out of memory"));
     497#ifdef MRB_GC_FIXED_ARENA
     498  mrb->arena_err = mrb_obj_ptr(mrb_exc_new_str_lit(mrb, nomem_error, "arena overflow error"));
     499#endif
     500}
Note: See TracChangeset for help on using the changeset viewer.