webruby 0.2.2 → 0.2.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|
|