webruby 0.2.2 → 0.2.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/webruby/config.rb +4 -9
- data/lib/webruby/rake/files.rake +2 -2
- data/modules/emscripten/AUTHORS +9 -1
- data/modules/emscripten/CONTRIBUTING.markdown +5 -0
- data/modules/emscripten/ChangeLog +435 -0
- data/modules/emscripten/cmake/Modules/FindOpenAL.cmake +26 -0
- data/modules/emscripten/cmake/Platform/Emscripten.cmake +9 -2
- data/modules/emscripten/em++ +0 -2
- data/modules/emscripten/emcc +92 -32
- data/modules/emscripten/emlink.py +16 -13
- data/modules/emscripten/emmake +1 -1
- data/modules/emscripten/emrun +918 -0
- data/modules/emscripten/emrun.bat +2 -0
- data/modules/emscripten/emscripten.py +545 -20
- data/modules/emscripten/src/analyzer.js +6 -1
- data/modules/emscripten/src/compiler.js +25 -16
- data/modules/emscripten/src/emrun_postjs.js +20 -0
- data/modules/emscripten/{tests → src}/hello_world.js +0 -0
- data/modules/emscripten/src/intertyper.js +45 -16
- data/modules/emscripten/src/jsifier.js +78 -48
- data/modules/emscripten/src/library.js +381 -96
- data/modules/emscripten/src/library_browser.js +50 -53
- data/modules/emscripten/src/library_egl.js +66 -24
- data/modules/emscripten/src/library_fs.js +122 -90
- data/modules/emscripten/src/library_gl.js +739 -353
- data/modules/emscripten/src/library_glfw.js +9 -3
- data/modules/emscripten/src/library_glut.js +10 -5
- data/modules/emscripten/src/library_idbfs.js +14 -14
- data/modules/emscripten/src/library_memfs.js +65 -41
- data/modules/emscripten/src/library_nodefs.js +61 -9
- data/modules/emscripten/src/library_openal.js +4 -4
- data/modules/emscripten/src/library_path.js +9 -13
- data/modules/emscripten/src/library_sdl.js +301 -64
- data/modules/emscripten/src/library_sockfs.js +7 -5
- data/modules/emscripten/src/modules.js +62 -22
- data/modules/emscripten/src/parseTools.js +135 -102
- data/modules/emscripten/src/postamble.js +3 -4
- data/modules/emscripten/src/preamble.js +49 -29
- data/modules/emscripten/src/proxyClient.js +1 -1
- data/modules/emscripten/src/proxyWorker.js +10 -10
- data/modules/emscripten/src/relooper/Relooper.cpp +15 -4
- data/modules/emscripten/src/runtime.js +32 -8
- data/modules/emscripten/src/settings.js +25 -8
- data/modules/emscripten/src/shell.html +6 -3
- data/modules/emscripten/src/shell.js +13 -11
- data/modules/emscripten/src/simd.js +602 -432
- data/modules/emscripten/src/struct_info.json +22 -2
- data/modules/emscripten/src/utility.js +32 -17
- data/modules/emscripten/system/include/SDL/SDL_events.h +1 -0
- data/modules/emscripten/system/include/compat/ctype.h +17 -0
- data/modules/emscripten/system/include/compat/wchar.h +23 -0
- data/modules/emscripten/system/include/compat/wctype.h +23 -0
- data/modules/emscripten/system/include/emscripten/emmintrin.h +87 -0
- data/modules/emscripten/system/include/emscripten/emscripten.h +30 -4
- data/modules/emscripten/system/include/emscripten/vector.h +29 -1
- data/modules/emscripten/system/include/emscripten/xmmintrin.h +131 -0
- data/modules/emscripten/system/include/libcxx/CREDITS.TXT +9 -1
- data/modules/emscripten/system/include/libcxx/__bit_reference +8 -8
- data/modules/emscripten/system/include/libcxx/__config +95 -17
- data/modules/emscripten/system/include/libcxx/__debug +25 -4
- data/modules/emscripten/system/include/libcxx/__functional_03 +7 -7
- data/modules/emscripten/system/include/libcxx/__functional_base +169 -9
- data/modules/emscripten/system/include/libcxx/__functional_base_03 +1 -1
- data/modules/emscripten/system/include/libcxx/__hash_table +25 -25
- data/modules/emscripten/system/include/libcxx/__locale +21 -19
- data/modules/emscripten/system/include/libcxx/__mutex_base +2 -33
- data/modules/emscripten/system/include/libcxx/__split_buffer +9 -9
- data/modules/emscripten/system/include/libcxx/__std_stream +14 -0
- data/modules/emscripten/system/include/libcxx/__tree +35 -26
- data/modules/emscripten/system/include/libcxx/__tuple +15 -15
- data/modules/emscripten/system/include/libcxx/__tuple_03 +2 -2
- data/modules/emscripten/system/include/libcxx/__undef_min_max +8 -0
- data/modules/emscripten/system/include/libcxx/algorithm +121 -110
- data/modules/emscripten/system/include/libcxx/array +15 -15
- data/modules/emscripten/system/include/libcxx/bitset +4 -4
- data/modules/emscripten/system/include/libcxx/chrono +51 -17
- data/modules/emscripten/system/include/libcxx/cmath +25 -23
- data/modules/emscripten/system/include/libcxx/codecvt +21 -18
- data/modules/emscripten/system/include/libcxx/complex +48 -7
- data/modules/emscripten/system/include/libcxx/cstddef +1 -1
- data/modules/emscripten/system/include/libcxx/cstdio +8 -1
- data/modules/emscripten/system/include/libcxx/cstdlib +1 -1
- data/modules/emscripten/system/include/libcxx/cwchar +1 -1
- data/modules/emscripten/system/include/libcxx/deque +26 -12
- data/modules/emscripten/system/include/libcxx/dynarray +311 -0
- data/modules/emscripten/system/include/libcxx/exception +4 -4
- data/modules/emscripten/system/include/libcxx/ext/__hash +3 -3
- data/modules/emscripten/system/include/libcxx/ext/hash_map +19 -15
- data/modules/emscripten/system/include/libcxx/ext/hash_set +7 -3
- data/modules/emscripten/system/include/libcxx/forward_list +33 -7
- data/modules/emscripten/system/include/libcxx/fstream +4 -4
- data/modules/emscripten/system/include/libcxx/functional +200 -170
- data/modules/emscripten/system/include/libcxx/future +83 -39
- data/modules/emscripten/system/include/libcxx/initializer_list +24 -11
- data/modules/emscripten/system/include/libcxx/iomanip +147 -0
- data/modules/emscripten/system/include/libcxx/ios +24 -16
- data/modules/emscripten/system/include/libcxx/iosfwd +19 -19
- data/modules/emscripten/system/include/libcxx/istream +13 -8
- data/modules/emscripten/system/include/libcxx/iterator +108 -417
- data/modules/emscripten/system/include/libcxx/limits +8 -4
- data/modules/emscripten/system/include/libcxx/list +28 -8
- data/modules/emscripten/system/include/libcxx/locale +153 -390
- data/modules/emscripten/system/include/libcxx/map +280 -100
- data/modules/emscripten/system/include/libcxx/memory +49 -97
- data/modules/emscripten/system/include/libcxx/mutex +2 -2
- data/modules/emscripten/system/include/libcxx/new +43 -14
- data/modules/emscripten/system/include/libcxx/numeric +2 -2
- data/modules/emscripten/system/include/libcxx/optional +697 -0
- data/modules/emscripten/system/include/libcxx/ostream +17 -8
- data/modules/emscripten/system/include/libcxx/queue +5 -5
- data/modules/emscripten/system/include/libcxx/random +53 -51
- data/modules/emscripten/system/include/libcxx/ratio +11 -11
- data/modules/emscripten/system/include/libcxx/readme.txt +1 -1
- data/modules/emscripten/system/include/libcxx/regex +23 -20
- data/modules/emscripten/system/include/libcxx/scoped_allocator +1 -1
- data/modules/emscripten/system/include/libcxx/set +166 -2
- data/modules/emscripten/system/include/libcxx/shared_mutex +419 -0
- data/modules/emscripten/system/include/libcxx/sstream +4 -4
- data/modules/emscripten/system/include/libcxx/stack +3 -3
- data/modules/emscripten/system/include/libcxx/streambuf +5 -5
- data/modules/emscripten/system/include/libcxx/string +372 -324
- data/modules/emscripten/system/include/libcxx/support/ibm/limits.h +99 -0
- data/modules/emscripten/system/include/libcxx/support/ibm/support.h +54 -0
- data/modules/emscripten/system/include/libcxx/support/ibm/xlocale.h +326 -0
- data/modules/emscripten/system/include/libcxx/support/win32/limits_win32.h +6 -6
- data/modules/emscripten/system/include/libcxx/support/win32/locale_win32.h +15 -15
- data/modules/emscripten/system/include/libcxx/support/win32/math_win32.h +2 -0
- data/modules/emscripten/system/include/libcxx/support/win32/support.h +6 -1
- data/modules/emscripten/system/include/libcxx/system_error +14 -8
- data/modules/emscripten/system/include/libcxx/thread +7 -8
- data/modules/emscripten/system/include/libcxx/tuple +29 -88
- data/modules/emscripten/system/include/libcxx/type_traits +253 -209
- data/modules/emscripten/system/include/libcxx/typeindex +3 -3
- data/modules/emscripten/system/include/libcxx/unordered_map +162 -101
- data/modules/emscripten/system/include/libcxx/unordered_set +79 -2
- data/modules/emscripten/system/include/libcxx/utility +20 -20
- data/modules/emscripten/system/include/libcxx/valarray +23 -23
- data/modules/emscripten/system/include/libcxx/vector +114 -91
- data/modules/emscripten/system/lib/libc/musl/src/regex/regcomp.c +3352 -0
- data/modules/emscripten/system/lib/libc/musl/src/regex/regerror.c +35 -0
- data/modules/emscripten/system/lib/libc/musl/src/regex/regexec.c +1011 -0
- data/modules/emscripten/system/lib/libc/musl/src/regex/tre-mem.c +158 -0
- data/modules/emscripten/system/lib/libc/musl/src/regex/tre.h +231 -0
- data/modules/emscripten/system/lib/libcextra.symbols +7 -0
- data/modules/emscripten/system/lib/libcxx/CREDITS.TXT +9 -1
- data/modules/emscripten/system/lib/libcxx/algorithm.cpp +1 -0
- data/modules/emscripten/system/lib/libcxx/debug.cpp +66 -42
- data/modules/emscripten/system/lib/libcxx/exception.cpp +88 -16
- data/modules/emscripten/system/lib/libcxx/future.cpp +6 -0
- data/modules/emscripten/system/lib/libcxx/ios.cpp +7 -2
- data/modules/emscripten/system/lib/libcxx/iostream.cpp +8 -8
- data/modules/emscripten/system/lib/libcxx/locale.cpp +38 -11
- data/modules/emscripten/system/lib/libcxx/mutex.cpp +3 -0
- data/modules/emscripten/system/lib/libcxx/new.cpp +44 -10
- data/modules/emscripten/system/lib/libcxx/optional.cpp +25 -0
- data/modules/emscripten/system/lib/libcxx/random.cpp +26 -0
- data/modules/emscripten/system/lib/libcxx/readme.txt +1 -1
- data/modules/emscripten/system/lib/libcxx/shared_mutex.cpp +101 -0
- data/modules/emscripten/system/lib/libcxx/stdexcept.cpp +11 -7
- data/modules/emscripten/system/lib/libcxx/string.cpp +3 -1
- data/modules/emscripten/system/lib/libcxx/strstream.cpp +7 -7
- data/modules/emscripten/system/lib/libcxx/support/win32/locale_win32.cpp +12 -13
- data/modules/emscripten/system/lib/libcxx/support/win32/support.cpp +33 -36
- data/modules/emscripten/system/lib/libcxx/symbols +187 -168
- data/modules/emscripten/system/lib/libcxx/system_error.cpp +1 -0
- data/modules/emscripten/system/lib/libcxx/thread.cpp +7 -3
- data/modules/emscripten/system/lib/libcxx/typeinfo.cpp +9 -6
- data/modules/emscripten/system/lib/libcxx/valarray.cpp +2 -0
- data/modules/emscripten/third_party/lzma.js/doit.bat +4 -0
- data/modules/emscripten/third_party/lzma.js/doit.sh +9 -2
- data/modules/emscripten/tools/cache.py +5 -7
- data/modules/emscripten/tools/cache.pyc +0 -0
- data/modules/emscripten/tools/eliminator/asm-eliminator-test-output.js +7 -0
- data/modules/emscripten/tools/eliminator/asm-eliminator-test.js +9 -1
- data/modules/emscripten/tools/eliminator/eliminator-test-output.js +3 -0
- data/modules/emscripten/tools/eliminator/eliminator-test.js +9 -1
- data/modules/emscripten/tools/file_packager.py +93 -50
- data/modules/emscripten/tools/js-optimizer.js +98 -48
- data/modules/emscripten/tools/js_optimizer.py +4 -4
- data/modules/emscripten/tools/js_optimizer.pyc +0 -0
- data/modules/emscripten/tools/jsrun.py +1 -1
- data/modules/emscripten/tools/jsrun.pyc +0 -0
- data/modules/emscripten/tools/response_file.py +6 -0
- data/modules/emscripten/tools/response_file.pyc +0 -0
- data/modules/emscripten/tools/settings_template_readonly.py +2 -0
- data/modules/emscripten/tools/shared.py +88 -34
- data/modules/emscripten/tools/shared.pyc +0 -0
- data/modules/emscripten/tools/split.py +21 -13
- data/modules/mruby/build_config.rb +7 -1
- data/modules/mruby/doc/compile/README.md +5 -9
- data/modules/mruby/include/mrbconf.h +5 -2
- data/modules/mruby/include/mruby/array.h +1 -0
- data/modules/mruby/include/mruby/compile.h +2 -4
- data/modules/mruby/include/mruby/dump.h +7 -16
- data/modules/mruby/include/mruby/hash.h +1 -1
- data/modules/mruby/include/mruby/irep.h +14 -2
- data/modules/mruby/include/mruby/khash.h +8 -7
- data/modules/mruby/include/mruby/string.h +1 -0
- data/modules/mruby/include/mruby/value.h +5 -2
- data/modules/mruby/include/mruby.h +12 -13
- data/modules/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb.c +16 -6
- data/modules/mruby/mrbgems/mruby-bin-mruby/tools/mruby/mruby.c +18 -30
- data/modules/mruby/mrbgems/mruby-fiber/src/fiber.c +21 -0
- data/modules/mruby/mrbgems/mruby-math/src/math.c +1 -1
- data/modules/mruby/mrbgems/mruby-random/src/random.c +144 -47
- data/modules/mruby/mrbgems/mruby-random/test/random.rb +44 -0
- data/modules/mruby/mrbgems/mruby-struct/src/struct.c +5 -5
- data/modules/mruby/mrblib/numeric.rb +99 -33
- data/modules/mruby/src/array.c +11 -4
- data/modules/mruby/src/backtrace.c +2 -2
- data/modules/mruby/src/class.c +49 -30
- data/modules/mruby/src/codegen.c +131 -79
- data/modules/mruby/src/debug.c +1 -1
- data/modules/mruby/src/dump.c +213 -163
- data/modules/mruby/src/error.c +17 -17
- data/modules/mruby/src/error.h +1 -1
- data/modules/mruby/src/etc.c +10 -0
- data/modules/mruby/src/gc.c +35 -17
- data/modules/mruby/src/hash.c +5 -5
- data/modules/mruby/src/kernel.c +36 -14
- data/modules/mruby/src/load.c +238 -296
- data/modules/mruby/src/numeric.c +18 -98
- data/modules/mruby/src/object.c +3 -5
- data/modules/mruby/src/parse.y +63 -56
- data/modules/mruby/src/proc.c +8 -5
- data/modules/mruby/src/re.h +0 -1
- data/modules/mruby/src/state.c +65 -27
- data/modules/mruby/src/string.c +3 -31
- data/modules/mruby/src/symbol.c +3 -3
- data/modules/mruby/src/variable.c +12 -5
- data/modules/mruby/src/vm.c +90 -72
- data/modules/mruby/tasks/mruby_build.rake +10 -1
- data/modules/mruby/tasks/toolchains/gcc.rake +12 -2
- data/modules/mruby/tasks/toolchains/{vs2012.rake → visualcpp.rake} +1 -1
- data/modules/mruby/test/driver.c +3 -3
- data/modules/mruby/test/t/array.rb +5 -5
- data/modules/mruby/test/t/class.rb +14 -1
- data/modules/mruby/test/t/kernel.rb +4 -0
- data/modules/mruby/test/t/module.rb +4 -4
- data/modules/mruby/test/t/nameerror.rb +1 -1
- data/modules/mruby/tools/mrbc/mrbc.c +23 -17
- data/modules/mruby/travis_config.rb +10 -1
- metadata +28 -5
- data/modules/mruby/tasks/toolchains/vs2010.rake +0 -3
data/modules/mruby/src/codegen.c
CHANGED
@@ -9,7 +9,7 @@
|
|
9
9
|
#include <string.h>
|
10
10
|
#include "mruby.h"
|
11
11
|
#include "mruby/compile.h"
|
12
|
-
#include "mruby/
|
12
|
+
#include "mruby/proc.h"
|
13
13
|
#include "mruby/numeric.h"
|
14
14
|
#include "mruby/string.h"
|
15
15
|
#include "mruby/debug.h"
|
@@ -61,14 +61,13 @@ typedef struct scope {
|
|
61
61
|
|
62
62
|
mrb_irep *irep;
|
63
63
|
size_t pcapa;
|
64
|
-
|
64
|
+
size_t scapa;
|
65
|
+
size_t rcapa;
|
65
66
|
|
66
67
|
int nlocals;
|
67
68
|
int nregs;
|
68
69
|
int ai;
|
69
70
|
|
70
|
-
int idx;
|
71
|
-
|
72
71
|
int debug_start_pos;
|
73
72
|
uint16_t filename_index;
|
74
73
|
parser_state* parser;
|
@@ -90,10 +89,10 @@ codegen_error(codegen_scope *s, const char *message)
|
|
90
89
|
{
|
91
90
|
if (!s) return;
|
92
91
|
while (s->prev) {
|
92
|
+
codegen_scope *tmp = s->prev;
|
93
93
|
mrb_pool_close(s->mpool);
|
94
|
-
s =
|
94
|
+
s = tmp;
|
95
95
|
}
|
96
|
-
mrb_pool_close(s->mpool);
|
97
96
|
#ifdef ENABLE_STDIO
|
98
97
|
if (s->filename && s->lineno) {
|
99
98
|
fprintf(stderr, "codegen error:%s:%d: %s\n", s->filename, s->lineno, message);
|
@@ -114,19 +113,19 @@ codegen_palloc(codegen_scope *s, size_t len)
|
|
114
113
|
return p;
|
115
114
|
}
|
116
115
|
|
117
|
-
void*
|
116
|
+
static void*
|
118
117
|
codegen_malloc(codegen_scope *s, size_t len)
|
119
118
|
{
|
120
|
-
void *p =
|
119
|
+
void *p = mrb_malloc_simple(s->mrb, len);
|
121
120
|
|
122
121
|
if (!p) codegen_error(s, "mrb_malloc");
|
123
122
|
return p;
|
124
123
|
}
|
125
124
|
|
126
|
-
void*
|
125
|
+
static void*
|
127
126
|
codegen_realloc(codegen_scope *s, void *p, size_t len)
|
128
127
|
{
|
129
|
-
p =
|
128
|
+
p = mrb_realloc_simple(s->mrb, p, len);
|
130
129
|
|
131
130
|
if (!p && len > 0) codegen_error(s, "mrb_realloc");
|
132
131
|
return p;
|
@@ -398,34 +397,65 @@ static inline int
|
|
398
397
|
new_lit(codegen_scope *s, mrb_value val)
|
399
398
|
{
|
400
399
|
size_t i;
|
400
|
+
mrb_value *pv;
|
401
401
|
|
402
402
|
switch (mrb_type(val)) {
|
403
403
|
case MRB_TT_STRING:
|
404
404
|
for (i=0; i<s->irep->plen; i++) {
|
405
|
-
mrb_value pv = s->irep->pool[i];
|
406
405
|
mrb_int len;
|
406
|
+
pv = &s->irep->pool[i];
|
407
407
|
|
408
|
-
if (mrb_type(pv) != MRB_TT_STRING) continue;
|
409
|
-
if ((len = RSTRING_LEN(pv)) != RSTRING_LEN(val)) continue;
|
410
|
-
if (memcmp(RSTRING_PTR(pv), RSTRING_PTR(val), len) == 0)
|
408
|
+
if (mrb_type(*pv) != MRB_TT_STRING) continue;
|
409
|
+
if ((len = RSTRING_LEN(*pv)) != RSTRING_LEN(val)) continue;
|
410
|
+
if (memcmp(RSTRING_PTR(*pv), RSTRING_PTR(val), len) == 0)
|
411
411
|
return i;
|
412
412
|
}
|
413
413
|
break;
|
414
414
|
case MRB_TT_FLOAT:
|
415
|
-
default:
|
416
415
|
for (i=0; i<s->irep->plen; i++) {
|
417
|
-
|
416
|
+
pv = &s->irep->pool[i];
|
417
|
+
if (mrb_type(*pv) != MRB_TT_FLOAT) continue;
|
418
|
+
if (mrb_float(*pv) == mrb_float(val)) return i;
|
418
419
|
}
|
419
420
|
break;
|
421
|
+
case MRB_TT_FIXNUM:
|
422
|
+
for (i=0; i<s->irep->plen; i++) {
|
423
|
+
pv = &s->irep->pool[i];
|
424
|
+
if (mrb_type(*pv) != MRB_TT_FIXNUM) continue;
|
425
|
+
if (mrb_fixnum(*pv) == mrb_fixnum(val)) return i;
|
426
|
+
}
|
427
|
+
break;
|
428
|
+
default:
|
429
|
+
/* should not happen */
|
430
|
+
return 0;
|
420
431
|
}
|
421
432
|
|
422
433
|
if (s->irep->plen == s->pcapa) {
|
423
434
|
s->pcapa *= 2;
|
424
435
|
s->irep->pool = (mrb_value *)codegen_realloc(s, s->irep->pool, sizeof(mrb_value)*s->pcapa);
|
425
436
|
}
|
426
|
-
|
437
|
+
|
438
|
+
pv = &s->irep->pool[s->irep->plen];
|
427
439
|
i = s->irep->plen++;
|
428
440
|
|
441
|
+
switch (mrb_type(val)) {
|
442
|
+
case MRB_TT_STRING:
|
443
|
+
*pv = mrb_str_pool(s->mrb, val);
|
444
|
+
break;
|
445
|
+
|
446
|
+
case MRB_TT_FLOAT:
|
447
|
+
#ifdef MRB_WORD_BOXING
|
448
|
+
*pv = mrb_float_pool(s->mrb, mrb_float(val));
|
449
|
+
break;
|
450
|
+
#endif
|
451
|
+
case MRB_TT_FIXNUM:
|
452
|
+
*pv = val;
|
453
|
+
break;
|
454
|
+
|
455
|
+
default:
|
456
|
+
/* should not happen */
|
457
|
+
break;
|
458
|
+
}
|
429
459
|
return i;
|
430
460
|
}
|
431
461
|
|
@@ -500,7 +530,7 @@ static void
|
|
500
530
|
for_body(codegen_scope *s, node *tree)
|
501
531
|
{
|
502
532
|
codegen_scope *prev = s;
|
503
|
-
int idx
|
533
|
+
int idx;
|
504
534
|
struct loopinfo *lp;
|
505
535
|
node *n2;
|
506
536
|
mrb_code c;
|
@@ -509,7 +539,6 @@ for_body(codegen_scope *s, node *tree)
|
|
509
539
|
codegen(s, tree->cdr->car, VAL);
|
510
540
|
// generate loop-block
|
511
541
|
s = scope_new(s->mrb, s, tree->car);
|
512
|
-
idx = s->idx;
|
513
542
|
|
514
543
|
lp = loop_push(s, LOOP_FOR);
|
515
544
|
lp->pc1 = new_label(s);
|
@@ -534,20 +563,18 @@ for_body(codegen_scope *s, node *tree)
|
|
534
563
|
loop_pop(s, NOVAL);
|
535
564
|
scope_finish(s);
|
536
565
|
s = prev;
|
537
|
-
genop(s, MKOP_Abc(OP_LAMBDA, cursp(),
|
566
|
+
genop(s, MKOP_Abc(OP_LAMBDA, cursp(), s->irep->rlen-1, OP_L_BLOCK));
|
538
567
|
pop();
|
539
|
-
idx = new_msym(s,
|
568
|
+
idx = new_msym(s, mrb_intern_lit(s->mrb, "each"));
|
540
569
|
genop(s, MKOP_ABC(OP_SENDB, cursp(), idx, 0));
|
541
570
|
}
|
542
571
|
|
543
572
|
static int
|
544
573
|
lambda_body(codegen_scope *s, node *tree, int blk)
|
545
574
|
{
|
546
|
-
int idx, base = s->idx;
|
547
575
|
mrb_code c;
|
548
|
-
|
576
|
+
codegen_scope *parent = s;
|
549
577
|
s = scope_new(s->mrb, s, tree->car);
|
550
|
-
idx = s->idx;
|
551
578
|
s->mscope = !blk;
|
552
579
|
|
553
580
|
if (blk) {
|
@@ -626,15 +653,13 @@ lambda_body(codegen_scope *s, node *tree, int blk)
|
|
626
653
|
loop_pop(s, NOVAL);
|
627
654
|
}
|
628
655
|
scope_finish(s);
|
629
|
-
|
630
|
-
return idx - base;
|
656
|
+
return parent->irep->rlen - 1;
|
631
657
|
}
|
632
658
|
|
633
659
|
static int
|
634
660
|
scope_body(codegen_scope *s, node *tree)
|
635
661
|
{
|
636
662
|
codegen_scope *scope = scope_new(s->mrb, s, tree->car);
|
637
|
-
int idx = scope->idx;
|
638
663
|
|
639
664
|
codegen(scope, tree->cdr, VAL);
|
640
665
|
if (!s->iseq) {
|
@@ -646,12 +671,17 @@ scope_body(codegen_scope *s, node *tree)
|
|
646
671
|
genop(scope, MKOP_AB(OP_RETURN, 0, OP_R_NORMAL));
|
647
672
|
}
|
648
673
|
else {
|
649
|
-
|
674
|
+
pop();
|
675
|
+
genop_peep(scope, MKOP_AB(OP_RETURN, cursp(), OP_R_NORMAL), NOVAL);
|
676
|
+
push();
|
650
677
|
}
|
651
678
|
}
|
652
679
|
scope_finish(scope);
|
653
|
-
|
654
|
-
|
680
|
+
if (!s->irep) {
|
681
|
+
/* should not happen */
|
682
|
+
return 0;
|
683
|
+
}
|
684
|
+
return s->irep->rlen - 1;
|
655
685
|
}
|
656
686
|
|
657
687
|
static mrb_bool
|
@@ -677,7 +707,7 @@ attrsym(codegen_scope *s, mrb_sym a)
|
|
677
707
|
name2[len] = '=';
|
678
708
|
name2[len+1] = '\0';
|
679
709
|
|
680
|
-
return
|
710
|
+
return mrb_intern(s->mrb, name2, len+1);
|
681
711
|
}
|
682
712
|
|
683
713
|
static int
|
@@ -946,7 +976,7 @@ static void
|
|
946
976
|
gen_send_intern(codegen_scope *s)
|
947
977
|
{
|
948
978
|
pop();
|
949
|
-
genop(s, MKOP_ABC(OP_SEND, cursp(), new_msym(s,
|
979
|
+
genop(s, MKOP_ABC(OP_SEND, cursp(), new_msym(s, mrb_intern_lit(s->mrb, "intern")), 0));
|
950
980
|
push();
|
951
981
|
}
|
952
982
|
static void
|
@@ -1146,12 +1176,12 @@ codegen(codegen_scope *s, node *tree, int val)
|
|
1146
1176
|
codegen(s, n4->car, VAL);
|
1147
1177
|
}
|
1148
1178
|
else {
|
1149
|
-
genop(s, MKOP_ABx(OP_GETCONST, cursp(), new_msym(s,
|
1179
|
+
genop(s, MKOP_ABx(OP_GETCONST, cursp(), new_msym(s, mrb_intern_lit(s->mrb, "StandardError"))));
|
1150
1180
|
push();
|
1151
1181
|
}
|
1152
1182
|
genop(s, MKOP_AB(OP_MOVE, cursp(), exc));
|
1153
1183
|
pop();
|
1154
|
-
genop(s, MKOP_ABC(OP_SEND, cursp(), new_msym(s,
|
1184
|
+
genop(s, MKOP_ABC(OP_SEND, cursp(), new_msym(s, mrb_intern_lit(s->mrb, "===")), 1));
|
1155
1185
|
tmp = new_label(s);
|
1156
1186
|
genop(s, MKOP_AsBx(OP_JMPIF, cursp(), pos2));
|
1157
1187
|
pos2 = tmp;
|
@@ -1355,7 +1385,7 @@ codegen(codegen_scope *s, node *tree, int val)
|
|
1355
1385
|
if (head) {
|
1356
1386
|
genop(s, MKOP_AB(OP_MOVE, cursp(), head));
|
1357
1387
|
pop();
|
1358
|
-
genop(s, MKOP_ABC(OP_SEND, cursp(), new_msym(s,
|
1388
|
+
genop(s, MKOP_ABC(OP_SEND, cursp(), new_msym(s, mrb_intern_lit(s->mrb, "===")), 1));
|
1359
1389
|
}
|
1360
1390
|
else {
|
1361
1391
|
pop();
|
@@ -1695,7 +1725,7 @@ codegen(codegen_scope *s, node *tree, int val)
|
|
1695
1725
|
}
|
1696
1726
|
pop_n(n+1);
|
1697
1727
|
if (sendv) n = CALL_MAXARGS;
|
1698
|
-
genop(s, MKOP_ABC(OP_SEND, cursp(), new_msym(s,
|
1728
|
+
genop(s, MKOP_ABC(OP_SEND, cursp(), new_msym(s, mrb_intern_lit(s->mrb, "call")), n));
|
1699
1729
|
if (val) push();
|
1700
1730
|
}
|
1701
1731
|
break;
|
@@ -1965,7 +1995,7 @@ codegen(codegen_scope *s, node *tree, int val)
|
|
1965
1995
|
|
1966
1996
|
default:
|
1967
1997
|
{
|
1968
|
-
int sym = new_msym(s,
|
1998
|
+
int sym = new_msym(s, mrb_intern_lit(s->mrb, "-"));
|
1969
1999
|
|
1970
2000
|
genop(s, MKOP_ABx(OP_LOADI, cursp(), 0));
|
1971
2001
|
push();
|
@@ -2033,7 +2063,7 @@ codegen(codegen_scope *s, node *tree, int val)
|
|
2033
2063
|
char *p = (char*)tree->car;
|
2034
2064
|
size_t len = (intptr_t)tree->cdr;
|
2035
2065
|
int ai = mrb_gc_arena_save(s->mrb);
|
2036
|
-
int sym = new_sym(s,
|
2066
|
+
int sym = new_sym(s, mrb_intern_lit(s->mrb, "Kernel"));
|
2037
2067
|
int off = new_lit(s, mrb_str_new(s->mrb, p, len));
|
2038
2068
|
|
2039
2069
|
genop(s, MKOP_A(OP_OCLASS, cursp()));
|
@@ -2041,7 +2071,7 @@ codegen(codegen_scope *s, node *tree, int val)
|
|
2041
2071
|
push();
|
2042
2072
|
genop(s, MKOP_ABx(OP_STRING, cursp(), off));
|
2043
2073
|
pop();
|
2044
|
-
sym = new_sym(s,
|
2074
|
+
sym = new_sym(s, mrb_intern_lit(s->mrb, "`"));
|
2045
2075
|
genop(s, MKOP_ABC(OP_SEND, cursp(), sym, 1));
|
2046
2076
|
mrb_gc_arena_restore(s->mrb, ai);
|
2047
2077
|
push();
|
@@ -2053,7 +2083,7 @@ codegen(codegen_scope *s, node *tree, int val)
|
|
2053
2083
|
char *p1 = (char*)tree->car;
|
2054
2084
|
char *p2 = (char*)tree->cdr;
|
2055
2085
|
int ai = mrb_gc_arena_save(s->mrb);
|
2056
|
-
int sym = new_sym(s,
|
2086
|
+
int sym = new_sym(s, mrb_intern_lit(s->mrb, REGEXP_CLASS));
|
2057
2087
|
int off = new_lit(s, mrb_str_new(s->mrb, p1, strlen(p1)));
|
2058
2088
|
int argc = 1;
|
2059
2089
|
|
@@ -2069,7 +2099,7 @@ codegen(codegen_scope *s, node *tree, int val)
|
|
2069
2099
|
pop();
|
2070
2100
|
}
|
2071
2101
|
pop();
|
2072
|
-
sym = new_sym(s,
|
2102
|
+
sym = new_sym(s, mrb_intern_lit(s->mrb, "compile"));
|
2073
2103
|
genop(s, MKOP_ABC(OP_SEND, cursp(), sym, argc));
|
2074
2104
|
mrb_gc_arena_restore(s->mrb, ai);
|
2075
2105
|
push();
|
@@ -2080,7 +2110,7 @@ codegen(codegen_scope *s, node *tree, int val)
|
|
2080
2110
|
if (val) {
|
2081
2111
|
node *n = tree->car;
|
2082
2112
|
int ai = mrb_gc_arena_save(s->mrb);
|
2083
|
-
int sym = new_sym(s,
|
2113
|
+
int sym = new_sym(s, mrb_intern_lit(s->mrb, REGEXP_CLASS));
|
2084
2114
|
int argc = 1;
|
2085
2115
|
int off;
|
2086
2116
|
char *p;
|
@@ -2117,7 +2147,7 @@ codegen(codegen_scope *s, node *tree, int val)
|
|
2117
2147
|
pop();
|
2118
2148
|
}
|
2119
2149
|
pop();
|
2120
|
-
sym = new_sym(s,
|
2150
|
+
sym = new_sym(s, mrb_intern_lit(s->mrb, "compile"));
|
2121
2151
|
genop(s, MKOP_ABC(OP_SEND, cursp(), sym, argc));
|
2122
2152
|
mrb_gc_arena_restore(s->mrb, ai);
|
2123
2153
|
push();
|
@@ -2182,7 +2212,7 @@ codegen(codegen_scope *s, node *tree, int val)
|
|
2182
2212
|
{
|
2183
2213
|
int a = new_msym(s, sym(tree->car));
|
2184
2214
|
int b = new_msym(s, sym(tree->cdr));
|
2185
|
-
int c = new_msym(s,
|
2215
|
+
int c = new_msym(s, mrb_intern_lit(s->mrb,"alias_method"));
|
2186
2216
|
|
2187
2217
|
genop(s, MKOP_A(OP_TCLASS, cursp()));
|
2188
2218
|
push();
|
@@ -2201,7 +2231,7 @@ codegen(codegen_scope *s, node *tree, int val)
|
|
2201
2231
|
|
2202
2232
|
case NODE_UNDEF:
|
2203
2233
|
{
|
2204
|
-
int undef = new_msym(s,
|
2234
|
+
int undef = new_msym(s, mrb_intern_lit(s->mrb, "undef_method"));
|
2205
2235
|
int num = 0;
|
2206
2236
|
node *t = tree;
|
2207
2237
|
|
@@ -2342,6 +2372,21 @@ codegen(codegen_scope *s, node *tree, int val)
|
|
2342
2372
|
}
|
2343
2373
|
}
|
2344
2374
|
|
2375
|
+
static void
|
2376
|
+
scope_add_irep(codegen_scope *s, mrb_irep *irep)
|
2377
|
+
{
|
2378
|
+
if (s->irep == NULL) {
|
2379
|
+
s->irep = irep;
|
2380
|
+
return;
|
2381
|
+
}
|
2382
|
+
if (s->irep->rlen == s->rcapa) {
|
2383
|
+
s->rcapa *= 2;
|
2384
|
+
s->irep->reps = (mrb_irep**)codegen_realloc(s, s->irep->reps, sizeof(mrb_irep*)*s->rcapa);
|
2385
|
+
}
|
2386
|
+
s->irep->reps[s->irep->rlen] = irep;
|
2387
|
+
s->irep->rlen++;
|
2388
|
+
}
|
2389
|
+
|
2345
2390
|
static codegen_scope*
|
2346
2391
|
scope_new(mrb_state *mrb, codegen_scope *prev, node *lv)
|
2347
2392
|
{
|
@@ -2359,17 +2404,21 @@ scope_new(mrb_state *mrb, codegen_scope *prev, node *lv)
|
|
2359
2404
|
p->mscope = 0;
|
2360
2405
|
|
2361
2406
|
p->irep = mrb_add_irep(mrb);
|
2362
|
-
|
2407
|
+
scope_add_irep(prev, p->irep);
|
2408
|
+
|
2409
|
+
p->rcapa = 8;
|
2410
|
+
p->irep->reps = (mrb_irep**)mrb_malloc(mrb, sizeof(mrb_irep*)*p->rcapa);
|
2363
2411
|
|
2364
2412
|
p->icapa = 1024;
|
2365
2413
|
p->iseq = (mrb_code*)mrb_malloc(mrb, sizeof(mrb_code)*p->icapa);
|
2414
|
+
p->irep->iseq = p->iseq;
|
2366
2415
|
|
2367
2416
|
p->pcapa = 32;
|
2368
2417
|
p->irep->pool = (mrb_value*)mrb_malloc(mrb, sizeof(mrb_value)*p->pcapa);
|
2369
2418
|
p->irep->plen = 0;
|
2370
2419
|
|
2371
2420
|
p->scapa = 256;
|
2372
|
-
p->irep->syms = (mrb_sym*)mrb_malloc(mrb, sizeof(mrb_sym)*
|
2421
|
+
p->irep->syms = (mrb_sym*)mrb_malloc(mrb, sizeof(mrb_sym)*p->scapa);
|
2373
2422
|
p->irep->slen = 0;
|
2374
2423
|
|
2375
2424
|
p->lv = lv;
|
@@ -2418,8 +2467,9 @@ scope_finish(codegen_scope *s)
|
|
2418
2467
|
irep->lines = 0;
|
2419
2468
|
}
|
2420
2469
|
}
|
2421
|
-
irep->pool = (mrb_value
|
2422
|
-
irep->syms = (mrb_sym
|
2470
|
+
irep->pool = (mrb_value*)codegen_realloc(s, irep->pool, sizeof(mrb_value)*irep->plen);
|
2471
|
+
irep->syms = (mrb_sym*)codegen_realloc(s, irep->syms, sizeof(mrb_sym)*irep->slen);
|
2472
|
+
irep->reps = (mrb_irep**)codegen_realloc(s, irep->reps, sizeof(mrb_irep*)*irep->rlen);
|
2423
2473
|
if (s->filename) {
|
2424
2474
|
s->irep->filename = mrb_parser_get_filename(s->parser, s->filename_index);
|
2425
2475
|
mrb_debug_info_append_file(mrb, s->irep, s->debug_start_pos, s->pc);
|
@@ -2507,17 +2557,16 @@ loop_pop(codegen_scope *s, int val)
|
|
2507
2557
|
}
|
2508
2558
|
|
2509
2559
|
static void
|
2510
|
-
codedump(mrb_state *mrb,
|
2560
|
+
codedump(mrb_state *mrb, mrb_irep *irep)
|
2511
2561
|
{
|
2512
2562
|
#ifdef ENABLE_STDIO
|
2513
|
-
mrb_irep *irep = mrb->irep[n];
|
2514
2563
|
uint32_t i;
|
2515
2564
|
int ai;
|
2516
2565
|
mrb_code c;
|
2517
2566
|
|
2518
2567
|
if (!irep) return;
|
2519
|
-
printf("irep %
|
2520
|
-
irep->nregs, irep->nlocals, (int)irep->plen, (int)irep->slen);
|
2568
|
+
printf("irep %p nregs=%d nlocals=%d pools=%d syms=%d reps=%d\n", irep,
|
2569
|
+
irep->nregs, irep->nlocals, (int)irep->plen, (int)irep->slen, (int)irep->rlen);
|
2521
2570
|
for (i=0; i<irep->ilen; i++) {
|
2522
2571
|
ai = mrb_gc_arena_save(mrb);
|
2523
2572
|
printf("%03d ", i);
|
@@ -2760,9 +2809,8 @@ codedump(mrb_state *mrb, int n)
|
|
2760
2809
|
break;
|
2761
2810
|
case OP_STRING:
|
2762
2811
|
{
|
2763
|
-
mrb_value
|
2764
|
-
|
2765
|
-
s = mrb_str_dump(mrb, s);
|
2812
|
+
mrb_value v = irep->pool[GETARG_Bx(c)];
|
2813
|
+
mrb_value s = mrb_str_dump(mrb, mrb_str_new(mrb, RSTRING_PTR(v), RSTRING_LEN(v)));
|
2766
2814
|
printf("OP_STRING\tR%d\t%s\n", GETARG_A(c), RSTRING_PTR(s));
|
2767
2815
|
}
|
2768
2816
|
break;
|
@@ -2785,7 +2833,7 @@ codedump(mrb_state *mrb, int n)
|
|
2785
2833
|
mrb_sym2name(mrb, irep->syms[GETARG_B(c)]));
|
2786
2834
|
break;
|
2787
2835
|
case OP_EXEC:
|
2788
|
-
printf("OP_EXEC\tR%d\tI(
|
2836
|
+
printf("OP_EXEC\tR%d\tI(%+d)\n", GETARG_A(c), GETARG_Bx(c));
|
2789
2837
|
break;
|
2790
2838
|
case OP_SCLASS:
|
2791
2839
|
printf("OP_SCLASS\tR%d\tR%d\n", GETARG_A(c), GETARG_B(c));
|
@@ -2797,7 +2845,7 @@ codedump(mrb_state *mrb, int n)
|
|
2797
2845
|
printf("OP_ERR\tL(%d)\n", GETARG_Bx(c));
|
2798
2846
|
break;
|
2799
2847
|
case OP_EPUSH:
|
2800
|
-
printf("OP_EPUSH\t:I(
|
2848
|
+
printf("OP_EPUSH\t:I(%+d)\n", GETARG_Bx(c));
|
2801
2849
|
break;
|
2802
2850
|
case OP_ONERR:
|
2803
2851
|
printf("OP_ONERR\t%03d\n", i+GETARG_sBx(c));
|
@@ -2826,22 +2874,31 @@ codedump(mrb_state *mrb, int n)
|
|
2826
2874
|
#endif
|
2827
2875
|
}
|
2828
2876
|
|
2829
|
-
void
|
2830
|
-
|
2877
|
+
static void
|
2878
|
+
codedump_recur(mrb_state *mrb, mrb_irep *irep)
|
2831
2879
|
{
|
2832
2880
|
size_t i;
|
2833
2881
|
|
2834
|
-
|
2835
|
-
|
2882
|
+
codedump(mrb, irep);
|
2883
|
+
for (i=0; i<irep->rlen; i++) {
|
2884
|
+
codedump_recur(mrb, irep->reps[i]);
|
2836
2885
|
}
|
2837
2886
|
}
|
2838
|
-
|
2839
|
-
|
2887
|
+
|
2888
|
+
void
|
2889
|
+
codedump_all(mrb_state *mrb, struct RProc *proc)
|
2890
|
+
{
|
2891
|
+
return codedump_recur(mrb, proc->body.irep);
|
2892
|
+
}
|
2893
|
+
|
2894
|
+
struct RProc*
|
2895
|
+
mrb_generate_code(mrb_state *mrb, parser_state *p)
|
2840
2896
|
{
|
2841
2897
|
codegen_scope *scope = scope_new(mrb, 0, 0);
|
2898
|
+
struct RProc *proc;
|
2842
2899
|
|
2843
2900
|
if (!scope) {
|
2844
|
-
return
|
2901
|
+
return NULL;
|
2845
2902
|
}
|
2846
2903
|
scope->mrb = mrb;
|
2847
2904
|
scope->parser = p;
|
@@ -2850,22 +2907,17 @@ codegen_start(mrb_state *mrb, parser_state *p)
|
|
2850
2907
|
if (setjmp(scope->jmp) == 0) {
|
2851
2908
|
// prepare irep
|
2852
2909
|
codegen(scope, p->tree, NOVAL);
|
2910
|
+
proc = mrb_proc_new(mrb, scope->irep);
|
2911
|
+
mrb_irep_decref(mrb, scope->irep);
|
2853
2912
|
mrb_pool_close(scope->mpool);
|
2854
|
-
return
|
2913
|
+
return proc;
|
2855
2914
|
}
|
2856
2915
|
else {
|
2857
|
-
|
2916
|
+
if (scope->filename == scope->irep->filename) {
|
2917
|
+
scope->irep->filename = NULL;
|
2918
|
+
}
|
2919
|
+
mrb_irep_decref(mrb, scope->irep);
|
2920
|
+
mrb_pool_close(scope->mpool);
|
2921
|
+
return NULL;
|
2858
2922
|
}
|
2859
2923
|
}
|
2860
|
-
|
2861
|
-
int
|
2862
|
-
mrb_generate_code(mrb_state *mrb, parser_state *p)
|
2863
|
-
{
|
2864
|
-
int start = mrb->irep_len;
|
2865
|
-
int n;
|
2866
|
-
|
2867
|
-
n = codegen_start(mrb, p);
|
2868
|
-
if (n < 0) return n;
|
2869
|
-
|
2870
|
-
return start;
|
2871
|
-
}
|
data/modules/mruby/src/debug.c
CHANGED
@@ -154,7 +154,7 @@ mrb_debug_info_append_file(mrb_state *mrb, mrb_irep *irep,
|
|
154
154
|
info->pc_count = end_pos;
|
155
155
|
|
156
156
|
fn_len = strlen(irep->filename);
|
157
|
-
ret->filename_sym =
|
157
|
+
ret->filename_sym = mrb_intern(mrb, irep->filename, fn_len);
|
158
158
|
len = 0;
|
159
159
|
ret->filename = mrb_sym2name_len(mrb, ret->filename_sym, &len);
|
160
160
|
|