Ignore:
Timestamp:
Jul 9, 2020, 8:51:43 AM (4 years ago)
Author:
coas-nagasima
Message:

mrubyを2.1.1に更新

Location:
EcnlProtoTool/trunk/mruby-2.1.1
Files:
1 added
1 deleted
2 edited
1 moved

Legend:

Unmodified
Added
Removed
  • EcnlProtoTool/trunk/mruby-2.1.1/mrbgems/mruby-test/driver.c

    r331 r439  
    1919#include <mruby/array.h>
    2020
    21 void
    22 mrb_init_mrbtest(mrb_state *);
     21extern const uint8_t mrbtest_assert_irep[];
     22
     23void mrbgemtest_init(mrb_state* mrb);
     24void mrb_init_test_vformat(mrb_state* mrb);
    2325
    2426/* Print a short remark for the user */
     
    3032
    3133static int
    32 check_error(mrb_state *mrb)
    33 {
    34   /* Error check */
    35   /* $ko_test and $kill_test should be 0 */
    36   mrb_value ko_test = mrb_gv_get(mrb, mrb_intern_lit(mrb, "$ko_test"));
    37   mrb_value kill_test = mrb_gv_get(mrb, mrb_intern_lit(mrb, "$kill_test"));
    38 
    39   return mrb_fixnum_p(ko_test) && mrb_fixnum(ko_test) == 0 && mrb_fixnum_p(kill_test) && mrb_fixnum(kill_test) == 0;
    40 }
    41 
    42 static int
    4334eval_test(mrb_state *mrb)
    4435{
    4536  /* evaluate the test */
    46   mrb_funcall(mrb, mrb_top_self(mrb), "report", 0);
     37  mrb_value result = mrb_funcall(mrb, mrb_top_self(mrb), "report", 0);
    4738  /* did an exception occur? */
    4839  if (mrb->exc) {
     
    5142    return EXIT_FAILURE;
    5243  }
    53   else if (!check_error(mrb)) {
    54     return EXIT_FAILURE;
    55   }
    56   return EXIT_SUCCESS;
    57 }
    58 
    59 static void
    60 t_printstr(mrb_state *mrb, mrb_value obj)
    61 {
    62   char *s;
    63   int len;
    64 
    65   if (mrb_string_p(obj)) {
    66     s = RSTRING_PTR(obj);
    67     len = RSTRING_LEN(obj);
    68     fwrite(s, len, 1, stdout);
    69   }
    70 }
    71 
    72 mrb_value
    73 mrb_t_printstr(mrb_state *mrb, mrb_value self)
    74 {
    75   mrb_value argv;
    76 
    77   mrb_get_args(mrb, "o", &argv);
    78   t_printstr(mrb, argv);
    79 
    80   return argv;
     44  else {
     45    return mrb_bool(result) ? EXIT_SUCCESS : EXIT_FAILURE;
     46  }
     47}
     48
     49/* Implementation of print due to the reason that there might be no print */
     50static mrb_value
     51t_print(mrb_state *mrb, mrb_value self)
     52{
     53  mrb_value *argv;
     54  mrb_int argc;
     55  mrb_int i;
     56
     57  mrb_get_args(mrb, "*!", &argv, &argc);
     58  for (i = 0; i < argc; ++i) {
     59    mrb_value s = mrb_obj_as_string(mrb, argv[i]);
     60    fwrite(RSTRING_PTR(s), RSTRING_LEN(s), 1, stdout);
     61  }
     62  fflush(stdout);
     63
     64  return mrb_nil_value();
     65}
     66
     67#define UNESCAPE(p, endp) ((p) != (endp) && *(p) == '\\' ? (p)+1 : (p))
     68#define CHAR_CMP(c1, c2) ((unsigned char)(c1) - (unsigned char)(c2))
     69
     70static const char *
     71str_match_bracket(const char *p, const char *pat_end,
     72                  const char *s, const char *str_end)
     73{
     74  mrb_bool ok = FALSE, negated = FALSE;
     75
     76  if (p == pat_end) return NULL;
     77  if (*p == '!' || *p == '^') {
     78    negated = TRUE;
     79    ++p;
     80  }
     81
     82  while (*p != ']') {
     83    const char *t1 = p;
     84    if ((t1 = UNESCAPE(t1, pat_end)) == pat_end) return NULL;
     85    if ((p = t1 + 1) == pat_end) return NULL;
     86    if (p[0] == '-' && p[1] != ']') {
     87      const char *t2 = p + 1;
     88      if ((t2 = UNESCAPE(t2, pat_end)) == pat_end) return NULL;
     89      p = t2 + 1;
     90      if (!ok && CHAR_CMP(*t1, *s) <= 0 && CHAR_CMP(*s, *t2) <= 0) ok = TRUE;
     91    }
     92    else {
     93      if (!ok && CHAR_CMP(*t1, *s) == 0) ok = TRUE;
     94    }
     95  }
     96
     97  return ok == negated ? NULL : p + 1;
     98}
     99
     100static mrb_bool
     101str_match_no_brace_p(const char *pat, mrb_int pat_len,
     102                     const char *str, mrb_int str_len)
     103{
     104  const char *p = pat, *s = str;
     105  const char *pat_end = pat + pat_len, *str_end = str + str_len;
     106  const char *p_tmp = NULL, *s_tmp = NULL;
     107
     108  for (;;) {
     109    if (p == pat_end) return s == str_end;
     110    switch (*p) {
     111      case '*':
     112        do { ++p; } while (p != pat_end && *p == '*');
     113        if (UNESCAPE(p, pat_end) == pat_end) return TRUE;
     114        if (s == str_end) return FALSE;
     115        p_tmp = p;
     116        s_tmp = s;
     117        continue;
     118      case '?':
     119        if (s == str_end) return FALSE;
     120        ++p;
     121        ++s;
     122        continue;
     123      case '[': {
     124        const char *t;
     125        if (s == str_end) return FALSE;
     126        if ((t = str_match_bracket(p+1, pat_end, s, str_end))) {
     127          p = t;
     128          ++s;
     129          continue;
     130        }
     131        goto L_failed;
     132      }
     133    }
     134
     135    /* ordinary */
     136    p = UNESCAPE(p, pat_end);
     137    if (s == str_end) return p == pat_end;
     138    if (p == pat_end) goto L_failed;
     139    if (*p++ != *s++) goto L_failed;
     140    continue;
     141
     142    L_failed:
     143    if (p_tmp && s_tmp) {
     144      /* try next '*' position */
     145      p = p_tmp;
     146      s = ++s_tmp;
     147      continue;
     148    }
     149
     150    return FALSE;
     151  }
     152}
     153
     154#define COPY_AND_INC(dst, src, len) \
     155  do { memcpy(dst, src, len); dst += len; } while (0)
     156
     157static mrb_bool
     158str_match_p(mrb_state *mrb,
     159            const char *pat, mrb_int pat_len,
     160            const char *str, mrb_int str_len)
     161{
     162  const char *p = pat, *pat_end = pat + pat_len;
     163  const char *lbrace = NULL, *rbrace = NULL;
     164  int nest = 0;
     165  mrb_bool ret = FALSE;
     166
     167  for (; p != pat_end; ++p) {
     168    if (*p == '{' && nest++ == 0) lbrace = p;
     169    else if (*p == '}' && lbrace && --nest == 0) { rbrace = p; break; }
     170    else if (*p == '\\' && ++p == pat_end) break;
     171  }
     172
     173  if (lbrace && rbrace) {
     174    /* expand brace */
     175    char *ex_pat = (char *)mrb_malloc(mrb, pat_len-2);  /* expanded pattern */
     176    char *ex_p = ex_pat;
     177
     178    COPY_AND_INC(ex_p, pat, lbrace-pat);
     179    p = lbrace;
     180    while (p < rbrace) {
     181      char *orig_ex_p = ex_p;
     182      const char *t = ++p;
     183      for (nest = 0; p < rbrace && !(*p == ',' && nest == 0); ++p) {
     184        if (*p == '{') ++nest;
     185        else if (*p == '}') --nest;
     186        else if (*p == '\\' && ++p == rbrace) break;
     187      }
     188      COPY_AND_INC(ex_p, t, p-t);
     189      COPY_AND_INC(ex_p, rbrace+1, pat_end-rbrace-1);
     190      if ((ret = str_match_p(mrb, ex_pat, ex_p-ex_pat, str, str_len))) break;
     191      ex_p = orig_ex_p;
     192    }
     193    mrb_free(mrb, ex_pat);
     194  }
     195  else if (!lbrace && !rbrace) {
     196    ret = str_match_no_brace_p(pat, pat_len, str, str_len);
     197  }
     198
     199  return ret;
     200}
     201
     202static mrb_value
     203m_str_match_p(mrb_state *mrb, mrb_value self)
     204{
     205  const char *pat, *str;
     206  mrb_int pat_len, str_len;
     207
     208  mrb_get_args(mrb, "ss", &pat, &pat_len, &str, &str_len);
     209  return mrb_bool_value(str_match_p(mrb, pat, pat_len, str, str_len));
    81210}
    82211
     
    87216
    88217  krn = mrb->kernel_module;
    89   mrb_define_method(mrb, krn, "__t_printstr__", mrb_t_printstr, MRB_ARGS_REQ(1));
     218  mrb_define_method(mrb, krn, "t_print", t_print, MRB_ARGS_ANY());
     219  mrb_define_method(mrb, krn, "_str_match?", m_str_match_p, MRB_ARGS_REQ(2));
    90220
    91221  mrbtest = mrb_define_module(mrb, "Mrbtest");
     
    95225  mrb_define_const(mrb, mrbtest, "FIXNUM_BIT", mrb_fixnum_value(MRB_INT_BIT));
    96226
     227#ifndef MRB_WITHOUT_FLOAT
    97228#ifdef MRB_USE_FLOAT
    98229  mrb_define_const(mrb, mrbtest, "FLOAT_TOLERANCE", mrb_float_value(mrb, 1e-6));
     
    100231  mrb_define_const(mrb, mrbtest, "FLOAT_TOLERANCE", mrb_float_value(mrb, 1e-12));
    101232#endif
     233#endif
     234
     235  mrb_init_test_vformat(mrb);
    102236
    103237  if (verbose) {
     
    128262  TEST_COUNT_PASS(ko_test);
    129263  TEST_COUNT_PASS(kill_test);
     264  TEST_COUNT_PASS(warning_test);
     265  TEST_COUNT_PASS(skip_test);
    130266
    131267#undef TEST_COUNT_PASS
     
    165301
    166302  mrb_init_test_driver(mrb, verbose);
    167   mrb_init_mrbtest(mrb);
     303  mrb_load_irep(mrb, mrbtest_assert_irep);
     304  mrbgemtest_init(mrb);
    168305  ret = eval_test(mrb);
    169306  mrb_close(mrb);
  • EcnlProtoTool/trunk/mruby-2.1.1/mrbgems/mruby-test/mrbgem.rake

    r331 r439  
    1313  exec = exefile("#{build.build_dir}/bin/mrbtest")
    1414
    15   libmruby = libfile("#{build.build_dir}/lib/libmruby")
    16   libmruby_core = libfile("#{build.build_dir}/lib/libmruby_core")
    17 
    1815  mrbtest_lib = libfile("#{build_dir}/mrbtest")
    1916  mrbtest_objs = []
    2017
    21   driver_obj = objfile("#{build_dir}/driver")
    22   driver = "#{spec.dir}/driver.c"
     18  driver_objs = Dir.glob("#{dir}/*.{c,cpp,cxx,cc,m,asm,s,S}").map do |f|
     19    objfile(f.relative_path_from(dir).to_s.pathmap("#{build_dir}/%X"))
     20  end
    2321
    2422  assert_c = "#{build_dir}/assert.c"
     
    2826
    2927  file assert_lib => assert_c
    30   file assert_c => assert_rb do |t|
     28  file assert_c => [assert_rb, build.mrbcfile] do |t|
    3129    open(t.name, 'w') do |f|
    3230      mrbc.run f, assert_rb, 'mrbtest_assert_irep'
     
    4240
    4341    file test_rbobj => g.test_rbireps
    44     file g.test_rbireps => [g.test_rbfiles].flatten do |t|
    45       FileUtils.mkdir_p File.dirname(t.name)
     42    file g.test_rbireps => [g.test_rbfiles, build.mrbcfile].flatten do |t|
     43      mkdir_p File.dirname(t.name)
    4644      open(t.name, 'w') do |f|
    4745        g.print_gem_test_header(f)
     
    9896            f.puts %Q[  if (mrb2->exc) {]
    9997            f.puts %Q[    mrb_print_error(mrb2);]
     98            f.puts %Q[    mrb_close(mrb2);]
    10099            f.puts %Q[    exit(EXIT_FAILURE);]
    101100            f.puts %Q[  }]
     
    136135
    137136  unless build.build_mrbtest_lib_only?
    138     file exec => [driver_obj, mlib, mrbtest_lib, libmruby_core, libmruby] do |t|
     137    file exec => [*driver_objs, mlib, mrbtest_lib, build.libmruby_static] do |t|
    139138      gem_flags = build.gems.map { |g| g.linker.flags }
    140139      gem_flags_before_libraries = build.gems.map { |g| g.linker.flags_before_libraries }
     
    142141      gem_libraries = build.gems.map { |g| g.linker.libraries }
    143142      gem_library_paths = build.gems.map { |g| g.linker.library_paths }
    144       build.linker.run t.name, t.prerequisites, gem_libraries, gem_library_paths, gem_flags, gem_flags_before_libraries
     143      build.linker.run t.name, t.prerequisites, gem_libraries, gem_library_paths, gem_flags,
     144                       gem_flags_before_libraries, gem_flags_after_libraries
    145145    end
    146146  end
    147 
    148   init = "#{spec.dir}/init_mrbtest.c"
    149147
    150148  # store the last gem selection and make the re-build
    151149  # of the test gem depending on a change to the gem
    152150  # selection
    153   active_gems = "#{build_dir}/active_gems.lst"
    154   FileUtils.mkdir_p File.dirname(active_gems)
    155   open(active_gems, 'w+') do |f|
    156     build.gems.each do |g|
    157       f.puts g.name
    158     end
     151  active_gems_path = "#{build_dir}/active_gems_path.lst"
     152  active_gem_list = File.read active_gems_path if File.exist? active_gems_path
     153  current_gem_list = build.gems.map(&:name).join("\n")
     154  task active_gems_path do |_t|
     155    mkdir_p File.dirname(active_gems_path)
     156    File.write active_gems_path, current_gem_list
    159157  end
    160   file clib => active_gems
     158  file clib => active_gems_path if active_gem_list != current_gem_list
    161159
    162160  file mlib => clib
    163   file clib => init do |t|
     161  file clib => [build.mrbcfile, __FILE__] do |_t|
    164162    _pp "GEN", "*.rb", "#{clib.relative_path}"
    165     FileUtils.mkdir_p File.dirname(clib)
     163    mkdir_p File.dirname(clib)
    166164    open(clib, 'w') do |f|
    167165      f.puts %Q[/*]
     
    174172      f.puts %Q[ */]
    175173      f.puts %Q[]
    176       f.puts IO.read(init)
     174      f.puts %Q[struct mrb_state;]
     175      f.puts %Q[typedef struct mrb_state mrb_state;]
    177176      build.gems.each do |g|
    178177        f.puts %Q[void GENERATED_TMP_mrb_#{g.funcname}_gem_test(mrb_state *mrb);]
Note: See TracChangeset for help on using the changeset viewer.