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/numeric.c
CHANGED
@@ -41,38 +41,6 @@ mrb_to_flo(mrb_state *mrb, mrb_value val)
|
|
41
41
|
return mrb_float(val);
|
42
42
|
}
|
43
43
|
|
44
|
-
/*
|
45
|
-
* call-seq:
|
46
|
-
* +num -> num
|
47
|
-
*
|
48
|
-
* Unary Plus---Returns the receiver's value.
|
49
|
-
*/
|
50
|
-
|
51
|
-
static mrb_value
|
52
|
-
num_uplus(mrb_state *mrb, mrb_value num)
|
53
|
-
{
|
54
|
-
return num;
|
55
|
-
}
|
56
|
-
|
57
|
-
/*
|
58
|
-
* call-seq:
|
59
|
-
* -num -> numeric
|
60
|
-
*
|
61
|
-
* Unary Minus---Returns the receiver's value, negated.
|
62
|
-
*/
|
63
|
-
|
64
|
-
static mrb_value
|
65
|
-
num_uminus(mrb_state *mrb, mrb_value num)
|
66
|
-
{
|
67
|
-
return mrb_float_value(mrb, (mrb_float)0 - mrb_to_flo(mrb, num));
|
68
|
-
}
|
69
|
-
|
70
|
-
static mrb_value
|
71
|
-
fix_uminus(mrb_state *mrb, mrb_value num)
|
72
|
-
{
|
73
|
-
return mrb_fixnum_value(0 - mrb_fixnum(num));
|
74
|
-
}
|
75
|
-
|
76
44
|
/*
|
77
45
|
* call-seq:
|
78
46
|
*
|
@@ -131,27 +99,6 @@ num_div(mrb_state *mrb, mrb_value x)
|
|
131
99
|
return mrb_float_value(mrb, mrb_to_flo(mrb, x) / y);
|
132
100
|
}
|
133
101
|
|
134
|
-
/*
|
135
|
-
* call-seq:
|
136
|
-
* num.abs -> numeric
|
137
|
-
* num.magnitude -> numeric
|
138
|
-
*
|
139
|
-
* Returns the absolute value of <i>num</i>.
|
140
|
-
*
|
141
|
-
* 12.abs #=> 12
|
142
|
-
* (-34.56).abs #=> 34.56
|
143
|
-
* -34.56.abs #=> 34.56
|
144
|
-
*/
|
145
|
-
|
146
|
-
static mrb_value
|
147
|
-
num_abs(mrb_state *mrb, mrb_value num)
|
148
|
-
{
|
149
|
-
if (mrb_to_flo(mrb, num) < 0) {
|
150
|
-
return num_uminus(mrb, num);
|
151
|
-
}
|
152
|
-
return num;
|
153
|
-
}
|
154
|
-
|
155
102
|
/********************************************************************
|
156
103
|
*
|
157
104
|
* Document-class: Float
|
@@ -695,42 +642,6 @@ int_to_i(mrb_state *mrb, mrb_value num)
|
|
695
642
|
return num;
|
696
643
|
}
|
697
644
|
|
698
|
-
/* 15.2.8.3.21 */
|
699
|
-
/*
|
700
|
-
* call-seq:
|
701
|
-
* fixnum.next -> integer
|
702
|
-
* fixnum.succ -> integer
|
703
|
-
*
|
704
|
-
* Returns the <code>Integer</code> equal to <i>int</i> + 1.
|
705
|
-
*
|
706
|
-
* 1.next #=> 2
|
707
|
-
* (-1).next #=> 0
|
708
|
-
*/
|
709
|
-
|
710
|
-
static mrb_value
|
711
|
-
fix_succ(mrb_state *mrb, mrb_value num)
|
712
|
-
{
|
713
|
-
return mrb_fixnum_value(mrb_fixnum(num)+1);
|
714
|
-
}
|
715
|
-
|
716
|
-
/* 15.2.8.3.19 */
|
717
|
-
/*
|
718
|
-
* call-seq:
|
719
|
-
* int.next -> integer
|
720
|
-
* int.succ -> integer
|
721
|
-
*
|
722
|
-
* Returns the <code>Integer</code> equal to <i>int</i> + 1.
|
723
|
-
*
|
724
|
-
* 1.next #=> 2
|
725
|
-
* (-1).next #=> 0
|
726
|
-
*/
|
727
|
-
static mrb_value
|
728
|
-
int_succ(mrb_state *mrb, mrb_value num)
|
729
|
-
{
|
730
|
-
if (mrb_fixnum_p(num)) return fix_succ(mrb, num);
|
731
|
-
return mrb_funcall(mrb, num, "+", 1, mrb_fixnum_value(1));
|
732
|
-
}
|
733
|
-
|
734
645
|
#define SQRT_INT_MAX ((mrb_int)1<<((sizeof(mrb_int)*CHAR_BIT-1)/2))
|
735
646
|
/*tests if N*N would overflow*/
|
736
647
|
#define FIT_SQRT_INT(n) (((n)<SQRT_INT_MAX)&&((n)>=-SQRT_INT_MAX))
|
@@ -873,6 +784,21 @@ fix_divmod(mrb_state *mrb, mrb_value x)
|
|
873
784
|
}
|
874
785
|
}
|
875
786
|
|
787
|
+
static mrb_value
|
788
|
+
flo_divmod(mrb_state *mrb, mrb_value x)
|
789
|
+
{
|
790
|
+
mrb_value y;
|
791
|
+
mrb_float div, mod;
|
792
|
+
mrb_value a, b;
|
793
|
+
|
794
|
+
mrb_get_args(mrb, "o", &y);
|
795
|
+
|
796
|
+
flodivmod(mrb, mrb_float(x), mrb_to_flo(mrb, y), &div, &mod);
|
797
|
+
a = mrb_float_value(mrb, (mrb_int)div);
|
798
|
+
b = mrb_float_value(mrb, mod);
|
799
|
+
return mrb_assoc_new(mrb, a, b);
|
800
|
+
}
|
801
|
+
|
876
802
|
/* 15.2.8.3.7 */
|
877
803
|
/*
|
878
804
|
* call-seq:
|
@@ -1145,7 +1071,7 @@ mrb_flo_to_fixnum(mrb_state *mrb, mrb_value x)
|
|
1145
1071
|
|
1146
1072
|
if (mrb_float_p(x)) {
|
1147
1073
|
mrb_raise(mrb, E_TYPE_ERROR, "non float value");
|
1148
|
-
z = 0; /* not reached. just
|
1074
|
+
z = 0; /* not reached. just suppress warnings. */
|
1149
1075
|
}
|
1150
1076
|
else {
|
1151
1077
|
mrb_float d = mrb_float(x);
|
@@ -1359,14 +1285,10 @@ mrb_init_numeric(mrb_state *mrb)
|
|
1359
1285
|
|
1360
1286
|
/* Numeric Class */
|
1361
1287
|
numeric = mrb_define_class(mrb, "Numeric", mrb->object_class);
|
1362
|
-
mrb_include_module(mrb, numeric, mrb_class_get(mrb, "Comparable"));
|
1363
1288
|
|
1364
|
-
mrb_define_method(mrb, numeric, "+@", num_uplus, MRB_ARGS_REQ(1)); /* 15.2.7.4.1 */
|
1365
|
-
mrb_define_method(mrb, numeric, "-@", num_uminus, MRB_ARGS_REQ(1)); /* 15.2.7.4.2 */
|
1366
1289
|
mrb_define_method(mrb, numeric, "**", num_pow, MRB_ARGS_REQ(1));
|
1367
1290
|
mrb_define_method(mrb, numeric, "/", num_div, MRB_ARGS_REQ(1)); /* 15.2.8.3.4 */
|
1368
1291
|
mrb_define_method(mrb, numeric, "quo", num_div, MRB_ARGS_REQ(1)); /* 15.2.7.4.5 (x) */
|
1369
|
-
mrb_define_method(mrb, numeric, "abs", num_abs, MRB_ARGS_NONE()); /* 15.2.7.4.3 */
|
1370
1292
|
mrb_define_method(mrb, numeric, "<=>", num_cmp, MRB_ARGS_REQ(1)); /* 15.2.9.3.6 */
|
1371
1293
|
|
1372
1294
|
/* Integer Class */
|
@@ -1374,11 +1296,10 @@ mrb_init_numeric(mrb_state *mrb)
|
|
1374
1296
|
mrb_undef_class_method(mrb, integer, "new");
|
1375
1297
|
mrb_define_method(mrb, integer, "to_i", int_to_i, MRB_ARGS_NONE()); /* 15.2.8.3.24 */
|
1376
1298
|
mrb_define_method(mrb, integer, "to_int", int_to_i, MRB_ARGS_NONE());
|
1377
|
-
fixnum = mrb->fixnum_class = mrb_define_class(mrb, "Fixnum", integer);
|
1378
1299
|
|
1300
|
+
fixnum = mrb->fixnum_class = mrb_define_class(mrb, "Fixnum", integer);
|
1379
1301
|
mrb_define_method(mrb, fixnum, "+", fix_plus, MRB_ARGS_REQ(1)); /* 15.2.8.3.1 */
|
1380
1302
|
mrb_define_method(mrb, fixnum, "-", fix_minus, MRB_ARGS_REQ(1)); /* 15.2.8.3.2 */
|
1381
|
-
mrb_define_method(mrb, fixnum, "-@", fix_uminus, MRB_ARGS_REQ(1)); /* 15.2.7.4.2 */
|
1382
1303
|
mrb_define_method(mrb, fixnum, "*", fix_mul, MRB_ARGS_REQ(1)); /* 15.2.8.3.3 */
|
1383
1304
|
mrb_define_method(mrb, fixnum, "%", fix_mod, MRB_ARGS_REQ(1)); /* 15.2.8.3.5 */
|
1384
1305
|
mrb_define_method(mrb, fixnum, "==", fix_equal, MRB_ARGS_REQ(1)); /* 15.2.8.3.7 */
|
@@ -1390,8 +1311,6 @@ mrb_init_numeric(mrb_state *mrb)
|
|
1390
1311
|
mrb_define_method(mrb, fixnum, ">>", fix_rshift, MRB_ARGS_REQ(1)); /* 15.2.8.3.13 */
|
1391
1312
|
mrb_define_method(mrb, fixnum, "eql?", num_eql, MRB_ARGS_REQ(1)); /* 15.2.8.3.16 */
|
1392
1313
|
mrb_define_method(mrb, fixnum, "hash", flo_hash, MRB_ARGS_NONE()); /* 15.2.8.3.18 */
|
1393
|
-
mrb_define_method(mrb, fixnum, "next", int_succ, MRB_ARGS_NONE()); /* 15.2.8.3.19 */
|
1394
|
-
mrb_define_method(mrb, fixnum, "succ", fix_succ, MRB_ARGS_NONE()); /* 15.2.8.3.21 */
|
1395
1314
|
mrb_define_method(mrb, fixnum, "to_f", fix_to_f, MRB_ARGS_NONE()); /* 15.2.8.3.23 */
|
1396
1315
|
mrb_define_method(mrb, fixnum, "to_s", fix_to_s, MRB_ARGS_NONE()); /* 15.2.8.3.25 */
|
1397
1316
|
mrb_define_method(mrb, fixnum, "inspect", fix_to_s, MRB_ARGS_NONE());
|
@@ -1414,6 +1333,7 @@ mrb_init_numeric(mrb_state *mrb)
|
|
1414
1333
|
mrb_define_method(mrb, fl, "to_i", flo_truncate, MRB_ARGS_NONE()); /* 15.2.9.3.14 */
|
1415
1334
|
mrb_define_method(mrb, fl, "to_int", flo_truncate, MRB_ARGS_NONE());
|
1416
1335
|
mrb_define_method(mrb, fl, "truncate", flo_truncate, MRB_ARGS_NONE()); /* 15.2.9.3.15 */
|
1336
|
+
mrb_define_method(mrb, fl, "divmod", flo_divmod, MRB_ARGS_REQ(1));
|
1417
1337
|
|
1418
1338
|
mrb_define_method(mrb, fl, "to_s", flo_to_s, MRB_ARGS_NONE()); /* 15.2.9.3.16(x) */
|
1419
1339
|
mrb_define_method(mrb, fl, "inspect", flo_to_s, MRB_ARGS_NONE());
|
data/modules/mruby/src/object.c
CHANGED
@@ -532,16 +532,14 @@ mrb_convert_to_integer(mrb_state *mrb, mrb_value val, int base)
|
|
532
532
|
if (base != 0) goto arg_error;
|
533
533
|
return val;
|
534
534
|
|
535
|
-
case MRB_TT_STRING:
|
536
|
-
string_conv:
|
537
|
-
return mrb_str_to_inum(mrb, val, base, TRUE);
|
538
|
-
|
539
535
|
default:
|
540
536
|
break;
|
541
537
|
}
|
542
538
|
if (base != 0) {
|
543
539
|
tmp = mrb_check_string_type(mrb, val);
|
544
|
-
if (!mrb_nil_p(tmp))
|
540
|
+
if (!mrb_nil_p(tmp)) {
|
541
|
+
return mrb_str_to_inum(mrb, val, base, TRUE);
|
542
|
+
}
|
545
543
|
arg_error:
|
546
544
|
mrb_raise(mrb, E_ARGUMENT_ERROR, "base specified for non string value");
|
547
545
|
}
|
data/modules/mruby/src/parse.y
CHANGED
@@ -37,6 +37,7 @@ static void yyerror(parser_state *p, const char *s);
|
|
37
37
|
static void yywarn(parser_state *p, const char *s);
|
38
38
|
static void yywarning(parser_state *p, const char *s);
|
39
39
|
static void backref_error(parser_state *p, node *n);
|
40
|
+
static void tokadd(parser_state *p, int c);
|
40
41
|
|
41
42
|
#ifndef isascii
|
42
43
|
#define isascii(c) (((c) & ~0x7f) == 0)
|
@@ -65,23 +66,23 @@ typedef unsigned int stack_type;
|
|
65
66
|
#define nsym(x) ((node*)(intptr_t)(x))
|
66
67
|
|
67
68
|
static inline mrb_sym
|
68
|
-
|
69
|
+
intern_cstr_gen(parser_state *p, const char *s)
|
69
70
|
{
|
70
71
|
return mrb_intern_cstr(p->mrb, s);
|
71
72
|
}
|
72
|
-
#define
|
73
|
+
#define intern_cstr(s) intern_cstr_gen(p,(s))
|
73
74
|
|
74
75
|
static inline mrb_sym
|
75
|
-
|
76
|
+
intern_gen(parser_state *p, const char *s, size_t len)
|
76
77
|
{
|
77
|
-
return
|
78
|
+
return mrb_intern(p->mrb, s, len);
|
78
79
|
}
|
79
|
-
#define
|
80
|
+
#define intern(s,len) intern_gen(p,(s),(len))
|
80
81
|
|
81
82
|
static inline mrb_sym
|
82
83
|
intern_gen_c(parser_state *p, const char c)
|
83
84
|
{
|
84
|
-
return
|
85
|
+
return mrb_intern(p->mrb, &c, 1);
|
85
86
|
}
|
86
87
|
#define intern_c(c) intern_gen_c(p,(c))
|
87
88
|
|
@@ -537,7 +538,7 @@ new_strsym(parser_state *p, node* str)
|
|
537
538
|
const char *s = (const char*)str->cdr->car;
|
538
539
|
size_t len = (size_t)str->cdr->cdr;
|
539
540
|
|
540
|
-
return
|
541
|
+
return mrb_intern(p->mrb, s, len);
|
541
542
|
}
|
542
543
|
|
543
544
|
// (:lvar . a)
|
@@ -799,14 +800,14 @@ new_symbols(parser_state *p, node *a)
|
|
799
800
|
static node*
|
800
801
|
call_uni_op(parser_state *p, node *recv, char *m)
|
801
802
|
{
|
802
|
-
return new_call(p, recv,
|
803
|
+
return new_call(p, recv, intern_cstr(m), 0);
|
803
804
|
}
|
804
805
|
|
805
806
|
// (:call a op b)
|
806
807
|
static node*
|
807
808
|
call_bin_op(parser_state *p, node *recv, char *m, node *arg1)
|
808
809
|
{
|
809
|
-
return new_call(p, recv,
|
810
|
+
return new_call(p, recv, intern_cstr(m), list1(list1(arg1)));
|
810
811
|
}
|
811
812
|
|
812
813
|
static void
|
@@ -1283,7 +1284,7 @@ stmt : keyword_alias fsym {p->lstate = EXPR_FNAME;} fsym
|
|
1283
1284
|
}
|
1284
1285
|
| primary_value '[' opt_call_args rbracket tOP_ASGN command_call
|
1285
1286
|
{
|
1286
|
-
$$ = new_op_asgn(p, new_call(p, $1,
|
1287
|
+
$$ = new_op_asgn(p, new_call(p, $1, intern("[]",2), $3), $5, $6);
|
1287
1288
|
}
|
1288
1289
|
| primary_value '.' tIDENTIFIER tOP_ASGN command_call
|
1289
1290
|
{
|
@@ -1522,7 +1523,7 @@ mlhs_node : variable
|
|
1522
1523
|
}
|
1523
1524
|
| primary_value '[' opt_call_args rbracket
|
1524
1525
|
{
|
1525
|
-
$$ = new_call(p, $1,
|
1526
|
+
$$ = new_call(p, $1, intern("[]",2), $3);
|
1526
1527
|
}
|
1527
1528
|
| primary_value '.' tIDENTIFIER
|
1528
1529
|
{
|
@@ -1561,7 +1562,7 @@ lhs : variable
|
|
1561
1562
|
}
|
1562
1563
|
| primary_value '[' opt_call_args rbracket
|
1563
1564
|
{
|
1564
|
-
$$ = new_call(p, $1,
|
1565
|
+
$$ = new_call(p, $1, intern("[]",2), $3);
|
1565
1566
|
}
|
1566
1567
|
| primary_value '.' tIDENTIFIER
|
1567
1568
|
{
|
@@ -1647,31 +1648,31 @@ undef_list : fsym
|
|
1647
1648
|
op : '|' { $$ = intern_c('|'); }
|
1648
1649
|
| '^' { $$ = intern_c('^'); }
|
1649
1650
|
| '&' { $$ = intern_c('&'); }
|
1650
|
-
| tCMP { $$ =
|
1651
|
-
| tEQ { $$ =
|
1652
|
-
| tEQQ { $$ =
|
1653
|
-
| tMATCH { $$ =
|
1654
|
-
| tNMATCH { $$ =
|
1651
|
+
| tCMP { $$ = intern("<=>",3); }
|
1652
|
+
| tEQ { $$ = intern("==",2); }
|
1653
|
+
| tEQQ { $$ = intern("===",3); }
|
1654
|
+
| tMATCH { $$ = intern("=~",2); }
|
1655
|
+
| tNMATCH { $$ = intern("!~",2); }
|
1655
1656
|
| '>' { $$ = intern_c('>'); }
|
1656
|
-
| tGEQ { $$ =
|
1657
|
+
| tGEQ { $$ = intern(">=",2); }
|
1657
1658
|
| '<' { $$ = intern_c('<'); }
|
1658
|
-
| tLEQ { $$ =
|
1659
|
-
| tNEQ { $$ =
|
1660
|
-
| tLSHFT { $$ =
|
1661
|
-
| tRSHFT { $$ =
|
1659
|
+
| tLEQ { $$ = intern("<=",2); }
|
1660
|
+
| tNEQ { $$ = intern("!=",2); }
|
1661
|
+
| tLSHFT { $$ = intern("<<",2); }
|
1662
|
+
| tRSHFT { $$ = intern(">>",2); }
|
1662
1663
|
| '+' { $$ = intern_c('+'); }
|
1663
1664
|
| '-' { $$ = intern_c('-'); }
|
1664
1665
|
| '*' { $$ = intern_c('*'); }
|
1665
1666
|
| tSTAR { $$ = intern_c('*'); }
|
1666
1667
|
| '/' { $$ = intern_c('/'); }
|
1667
1668
|
| '%' { $$ = intern_c('%'); }
|
1668
|
-
| tPOW { $$ =
|
1669
|
+
| tPOW { $$ = intern("**",2); }
|
1669
1670
|
| '!' { $$ = intern_c('!'); }
|
1670
1671
|
| '~' { $$ = intern_c('~'); }
|
1671
|
-
| tUPLUS { $$ =
|
1672
|
-
| tUMINUS { $$ =
|
1673
|
-
| tAREF { $$ =
|
1674
|
-
| tASET { $$ =
|
1672
|
+
| tUPLUS { $$ = intern("+@",2); }
|
1673
|
+
| tUMINUS { $$ = intern("-@",2); }
|
1674
|
+
| tAREF { $$ = intern("[]",2); }
|
1675
|
+
| tASET { $$ = intern("[]=",3); }
|
1675
1676
|
| '`' { $$ = intern_c('`'); }
|
1676
1677
|
;
|
1677
1678
|
|
@@ -1707,7 +1708,7 @@ arg : lhs '=' arg
|
|
1707
1708
|
}
|
1708
1709
|
| primary_value '[' opt_call_args rbracket tOP_ASGN arg
|
1709
1710
|
{
|
1710
|
-
$$ = new_op_asgn(p, new_call(p, $1,
|
1711
|
+
$$ = new_op_asgn(p, new_call(p, $1, intern("[]",2), $3), $5, $6);
|
1711
1712
|
}
|
1712
1713
|
| primary_value '.' tIDENTIFIER tOP_ASGN arg
|
1713
1714
|
{
|
@@ -2519,11 +2520,11 @@ method_call : operation paren_args
|
|
2519
2520
|
}
|
2520
2521
|
| primary_value '.' paren_args
|
2521
2522
|
{
|
2522
|
-
$$ = new_call(p, $1,
|
2523
|
+
$$ = new_call(p, $1, intern("call",4), $3);
|
2523
2524
|
}
|
2524
2525
|
| primary_value tCOLON2 paren_args
|
2525
2526
|
{
|
2526
|
-
$$ = new_call(p, $1,
|
2527
|
+
$$ = new_call(p, $1, intern("call",4), $3);
|
2527
2528
|
}
|
2528
2529
|
| keyword_super paren_args
|
2529
2530
|
{
|
@@ -2535,7 +2536,7 @@ method_call : operation paren_args
|
|
2535
2536
|
}
|
2536
2537
|
| primary_value '[' opt_call_args rbracket
|
2537
2538
|
{
|
2538
|
-
$$ = new_call(p, $1,
|
2539
|
+
$$ = new_call(p, $1, intern("[]",2), $3);
|
2539
2540
|
}
|
2540
2541
|
;
|
2541
2542
|
|
@@ -3315,14 +3316,14 @@ nextc(parser_state *p)
|
|
3315
3316
|
else {
|
3316
3317
|
#ifdef ENABLE_STDIO
|
3317
3318
|
if (p->f) {
|
3318
|
-
if (feof(p->f)) goto
|
3319
|
+
if (feof(p->f)) goto eof;
|
3319
3320
|
c = fgetc(p->f);
|
3320
|
-
if (c == EOF) goto
|
3321
|
+
if (c == EOF) goto eof;
|
3321
3322
|
}
|
3322
3323
|
else
|
3323
3324
|
#endif
|
3324
3325
|
if (!p->s || p->s >= p->send) {
|
3325
|
-
goto
|
3326
|
+
goto eof;
|
3326
3327
|
}
|
3327
3328
|
else {
|
3328
3329
|
c = (unsigned char)*p->s++;
|
@@ -3331,14 +3332,14 @@ nextc(parser_state *p)
|
|
3331
3332
|
p->column++;
|
3332
3333
|
return c;
|
3333
3334
|
|
3334
|
-
|
3335
|
+
eof:
|
3335
3336
|
if (!p->cxt) return -1;
|
3336
3337
|
else {
|
3337
3338
|
mrbc_context *cxt = p->cxt;
|
3338
3339
|
|
3339
3340
|
if (cxt->partial_hook(p) < 0) return -1;
|
3340
|
-
|
3341
|
-
|
3341
|
+
c = '\n';
|
3342
|
+
p->lineno = 1;
|
3342
3343
|
p->cxt = cxt;
|
3343
3344
|
return c;
|
3344
3345
|
}
|
@@ -3866,6 +3867,9 @@ heredoc_identifier(parser_state *p)
|
|
3866
3867
|
return 0;
|
3867
3868
|
}
|
3868
3869
|
} else {
|
3870
|
+
if (c == -1) {
|
3871
|
+
return 0; /* missing here document identifier */
|
3872
|
+
}
|
3869
3873
|
if (! identchar(c)) {
|
3870
3874
|
pushback(p, c);
|
3871
3875
|
if (indent) pushback(p, '-');
|
@@ -3929,7 +3933,10 @@ parser_yylex(parser_state *p)
|
|
3929
3933
|
case '\0': /* NUL */
|
3930
3934
|
case '\004': /* ^D */
|
3931
3935
|
case '\032': /* ^Z */
|
3936
|
+
return 0;
|
3932
3937
|
case -1: /* end of script. */
|
3938
|
+
if (p->heredocs_from_nextline)
|
3939
|
+
goto maybe_heredoc;
|
3933
3940
|
return 0;
|
3934
3941
|
|
3935
3942
|
/* white spaces */
|
@@ -3942,6 +3949,7 @@ parser_yylex(parser_state *p)
|
|
3942
3949
|
skip(p, '\n');
|
3943
3950
|
/* fall through */
|
3944
3951
|
case '\n':
|
3952
|
+
maybe_heredoc:
|
3945
3953
|
heredoc_treat_nextline(p);
|
3946
3954
|
switch (p->lstate) {
|
3947
3955
|
case EXPR_BEG:
|
@@ -3988,7 +3996,7 @@ parser_yylex(parser_state *p)
|
|
3988
3996
|
case '*':
|
3989
3997
|
if ((c = nextc(p)) == '*') {
|
3990
3998
|
if ((c = nextc(p)) == '=') {
|
3991
|
-
yylval.id =
|
3999
|
+
yylval.id = intern("**",2);
|
3992
4000
|
p->lstate = EXPR_BEG;
|
3993
4001
|
return tOP_ASGN;
|
3994
4002
|
}
|
@@ -4097,7 +4105,7 @@ parser_yylex(parser_state *p)
|
|
4097
4105
|
}
|
4098
4106
|
if (c == '<') {
|
4099
4107
|
if ((c = nextc(p)) == '=') {
|
4100
|
-
yylval.id =
|
4108
|
+
yylval.id = intern("<<",2);
|
4101
4109
|
p->lstate = EXPR_BEG;
|
4102
4110
|
return tOP_ASGN;
|
4103
4111
|
}
|
@@ -4118,7 +4126,7 @@ parser_yylex(parser_state *p)
|
|
4118
4126
|
}
|
4119
4127
|
if (c == '>') {
|
4120
4128
|
if ((c = nextc(p)) == '=') {
|
4121
|
-
yylval.id =
|
4129
|
+
yylval.id = intern(">>",2);
|
4122
4130
|
p->lstate = EXPR_BEG;
|
4123
4131
|
return tOP_ASGN;
|
4124
4132
|
}
|
@@ -4232,7 +4240,7 @@ parser_yylex(parser_state *p)
|
|
4232
4240
|
if ((c = nextc(p)) == '&') {
|
4233
4241
|
p->lstate = EXPR_BEG;
|
4234
4242
|
if ((c = nextc(p)) == '=') {
|
4235
|
-
yylval.id =
|
4243
|
+
yylval.id = intern("&&",2);
|
4236
4244
|
p->lstate = EXPR_BEG;
|
4237
4245
|
return tOP_ASGN;
|
4238
4246
|
}
|
@@ -4266,7 +4274,7 @@ parser_yylex(parser_state *p)
|
|
4266
4274
|
if ((c = nextc(p)) == '|') {
|
4267
4275
|
p->lstate = EXPR_BEG;
|
4268
4276
|
if ((c = nextc(p)) == '=') {
|
4269
|
-
yylval.id =
|
4277
|
+
yylval.id = intern("||",2);
|
4270
4278
|
p->lstate = EXPR_BEG;
|
4271
4279
|
return tOP_ASGN;
|
4272
4280
|
}
|
@@ -4870,7 +4878,7 @@ parser_yylex(parser_state *p)
|
|
4870
4878
|
tokadd(p, '$');
|
4871
4879
|
tokadd(p, c);
|
4872
4880
|
tokfix(p);
|
4873
|
-
yylval.id =
|
4881
|
+
yylval.id = intern_cstr(tok(p));
|
4874
4882
|
return tGVAR;
|
4875
4883
|
|
4876
4884
|
case '-':
|
@@ -4880,7 +4888,7 @@ parser_yylex(parser_state *p)
|
|
4880
4888
|
pushback(p, c);
|
4881
4889
|
gvar:
|
4882
4890
|
tokfix(p);
|
4883
|
-
yylval.id =
|
4891
|
+
yylval.id = intern_cstr(tok(p));
|
4884
4892
|
return tGVAR;
|
4885
4893
|
|
4886
4894
|
case '&': /* $&: last match */
|
@@ -5032,7 +5040,7 @@ parser_yylex(parser_state *p)
|
|
5032
5040
|
p->lstate = EXPR_BEG;
|
5033
5041
|
nextc(p);
|
5034
5042
|
tokfix(p);
|
5035
|
-
yylval.id =
|
5043
|
+
yylval.id = intern_cstr(tok(p));
|
5036
5044
|
return tLABEL;
|
5037
5045
|
}
|
5038
5046
|
}
|
@@ -5045,7 +5053,7 @@ parser_yylex(parser_state *p)
|
|
5045
5053
|
enum mrb_lex_state_enum state = p->lstate;
|
5046
5054
|
p->lstate = kw->state;
|
5047
5055
|
if (state == EXPR_FNAME) {
|
5048
|
-
yylval.id =
|
5056
|
+
yylval.id = intern_cstr(kw->name);
|
5049
5057
|
return kw->id[0];
|
5050
5058
|
}
|
5051
5059
|
if (p->lstate == EXPR_BEG) {
|
@@ -5090,7 +5098,7 @@ parser_yylex(parser_state *p)
|
|
5090
5098
|
}
|
5091
5099
|
}
|
5092
5100
|
{
|
5093
|
-
mrb_sym ident =
|
5101
|
+
mrb_sym ident = intern_cstr(tok(p));
|
5094
5102
|
|
5095
5103
|
yylval.id = ident;
|
5096
5104
|
#if 0
|
@@ -5154,7 +5162,7 @@ parser_update_cxt(parser_state *p, mrbc_context *cxt)
|
|
5154
5162
|
}
|
5155
5163
|
}
|
5156
5164
|
|
5157
|
-
void codedump_all(mrb_state*,
|
5165
|
+
void codedump_all(mrb_state*, struct RProc*);
|
5158
5166
|
void parser_dump(mrb_state *mrb, node *tree, int offset);
|
5159
5167
|
|
5160
5168
|
void
|
@@ -5345,7 +5353,6 @@ load_exec(mrb_state *mrb, parser_state *p, mrbc_context *c)
|
|
5345
5353
|
{
|
5346
5354
|
struct RClass *target = mrb->object_class;
|
5347
5355
|
struct RProc *proc;
|
5348
|
-
int n;
|
5349
5356
|
mrb_value v;
|
5350
5357
|
|
5351
5358
|
if (!p) {
|
@@ -5354,6 +5361,7 @@ load_exec(mrb_state *mrb, parser_state *p, mrbc_context *c)
|
|
5354
5361
|
if (!p->tree || p->nerr) {
|
5355
5362
|
if (p->capture_errors) {
|
5356
5363
|
char buf[256];
|
5364
|
+
int n;
|
5357
5365
|
|
5358
5366
|
n = snprintf(buf, sizeof(buf), "line %d: %s\n",
|
5359
5367
|
p->error_buffer[0].lineno, p->error_buffer[0].message);
|
@@ -5368,26 +5376,25 @@ load_exec(mrb_state *mrb, parser_state *p, mrbc_context *c)
|
|
5368
5376
|
return mrb_undef_value();
|
5369
5377
|
}
|
5370
5378
|
}
|
5371
|
-
|
5379
|
+
proc = mrb_generate_code(mrb, p);
|
5372
5380
|
mrb_parser_free(p);
|
5373
|
-
if (
|
5381
|
+
if (proc == NULL) {
|
5374
5382
|
static const char msg[] = "codegen error";
|
5375
5383
|
mrb->exc = mrb_obj_ptr(mrb_exc_new(mrb, E_SCRIPT_ERROR, msg, sizeof(msg) - 1));
|
5376
|
-
return
|
5384
|
+
return mrb_undef_value();
|
5377
5385
|
}
|
5378
5386
|
if (c) {
|
5379
|
-
if (c->dump_result) codedump_all(mrb,
|
5380
|
-
if (c->no_exec) return
|
5387
|
+
if (c->dump_result) codedump_all(mrb, proc);
|
5388
|
+
if (c->no_exec) return mrb_obj_value(proc);
|
5381
5389
|
if (c->target_class) {
|
5382
5390
|
target = c->target_class;
|
5383
5391
|
}
|
5384
5392
|
}
|
5385
|
-
proc = mrb_proc_new(mrb, mrb->irep[n]);
|
5386
5393
|
proc->target_class = target;
|
5387
5394
|
if (mrb->c->ci) {
|
5388
5395
|
mrb->c->ci->target_class = target;
|
5389
5396
|
}
|
5390
|
-
v =
|
5397
|
+
v = mrb_context_run(mrb, proc, mrb_top_self(mrb), 0);
|
5391
5398
|
if (mrb->exc) return mrb_nil_value();
|
5392
5399
|
return v;
|
5393
5400
|
}
|
data/modules/mruby/src/proc.c
CHANGED
@@ -22,6 +22,7 @@ mrb_proc_new(mrb_state *mrb, mrb_irep *irep)
|
|
22
22
|
p->target_class = (mrb->c->ci) ? mrb->c->ci->target_class : 0;
|
23
23
|
p->body.irep = irep;
|
24
24
|
p->env = 0;
|
25
|
+
mrb_irep_incref(mrb, irep);
|
25
26
|
|
26
27
|
return p;
|
27
28
|
}
|
@@ -80,6 +81,9 @@ mrb_proc_copy(struct RProc *a, struct RProc *b)
|
|
80
81
|
{
|
81
82
|
a->flags = b->flags;
|
82
83
|
a->body = b->body;
|
84
|
+
if (!MRB_PROC_CFUNC_P(a)) {
|
85
|
+
a->body.irep->refcnt++;
|
86
|
+
};
|
83
87
|
a->target_class = b->target_class;
|
84
88
|
a->env = b->env;
|
85
89
|
}
|
@@ -181,15 +185,14 @@ void
|
|
181
185
|
mrb_init_proc(mrb_state *mrb)
|
182
186
|
{
|
183
187
|
struct RProc *m;
|
184
|
-
mrb_irep *call_irep = (mrb_irep *)
|
188
|
+
mrb_irep *call_irep = (mrb_irep *)mrb_malloc(mrb, sizeof(mrb_irep));
|
185
189
|
static const mrb_irep mrb_irep_zero = { 0 };
|
186
190
|
|
187
|
-
if (
|
191
|
+
if (call_irep == NULL)
|
188
192
|
return;
|
189
193
|
|
190
194
|
*call_irep = mrb_irep_zero;
|
191
195
|
call_irep->flags = MRB_ISEQ_NO_FREE;
|
192
|
-
call_irep->idx = -1;
|
193
196
|
call_irep->iseq = call_iseq;
|
194
197
|
call_irep->ilen = 1;
|
195
198
|
|
@@ -201,8 +204,8 @@ mrb_init_proc(mrb_state *mrb)
|
|
201
204
|
mrb_define_method(mrb, mrb->proc_class, "arity", mrb_proc_arity, MRB_ARGS_NONE());
|
202
205
|
|
203
206
|
m = mrb_proc_new(mrb, call_irep);
|
204
|
-
mrb_define_method_raw(mrb, mrb->proc_class,
|
205
|
-
mrb_define_method_raw(mrb, mrb->proc_class,
|
207
|
+
mrb_define_method_raw(mrb, mrb->proc_class, mrb_intern_lit(mrb, "call"), m);
|
208
|
+
mrb_define_method_raw(mrb, mrb->proc_class, mrb_intern_lit(mrb, "[]"), m);
|
206
209
|
|
207
210
|
mrb_define_class_method(mrb, mrb->kernel_module, "lambda", proc_lambda, MRB_ARGS_NONE()); /* 15.3.1.2.6 */
|
208
211
|
mrb_define_method(mrb, mrb->kernel_module, "lambda", proc_lambda, MRB_ARGS_NONE()); /* 15.3.1.3.27 */
|