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/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 */
|