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
@@ -6,7 +6,9 @@
|
|
6
6
|
|
7
7
|
#include "mruby.h"
|
8
8
|
#include "mruby/variable.h"
|
9
|
+
#include "mruby/class.h"
|
9
10
|
#include "mruby/data.h"
|
11
|
+
#include "mruby/array.h"
|
10
12
|
#include "mt19937ar.h"
|
11
13
|
|
12
14
|
#include <time.h>
|
@@ -18,23 +20,11 @@
|
|
18
20
|
#define INSTANCE_RAND_SEED_KEY_CSTR_LEN 16
|
19
21
|
|
20
22
|
#define MT_STATE_KEY "$mrb_i_mt_state"
|
21
|
-
#define MT_STATE_KEY_CSTR_LEN 15
|
22
23
|
|
23
24
|
static const struct mrb_data_type mt_state_type = {
|
24
25
|
MT_STATE_KEY, mrb_free,
|
25
26
|
};
|
26
27
|
|
27
|
-
static mt_state *mrb_mt_get_context(mrb_state *mrb, mrb_value self)
|
28
|
-
{
|
29
|
-
mt_state *t;
|
30
|
-
mrb_value context;
|
31
|
-
|
32
|
-
context = mrb_iv_get(mrb, self, mrb_intern2(mrb, MT_STATE_KEY, MT_STATE_KEY_CSTR_LEN));
|
33
|
-
t = DATA_GET_PTR(mrb, context, &mt_state_type, mt_state);
|
34
|
-
|
35
|
-
return t;
|
36
|
-
}
|
37
|
-
|
38
28
|
static void mt_g_srand(unsigned long seed)
|
39
29
|
{
|
40
30
|
init_genrand(seed);
|
@@ -50,7 +40,8 @@ static double mt_g_rand_real()
|
|
50
40
|
return genrand_real1();
|
51
41
|
}
|
52
42
|
|
53
|
-
static mrb_value
|
43
|
+
static mrb_value
|
44
|
+
mrb_random_mt_g_srand(mrb_state *mrb, mrb_value seed)
|
54
45
|
{
|
55
46
|
if (mrb_nil_p(seed)) {
|
56
47
|
seed = mrb_fixnum_value(time(NULL) + mt_g_rand());
|
@@ -64,35 +55,41 @@ static mrb_value mrb_random_mt_g_srand(mrb_state *mrb, mrb_value seed)
|
|
64
55
|
return seed;
|
65
56
|
}
|
66
57
|
|
67
|
-
static mrb_value
|
58
|
+
static mrb_value
|
59
|
+
mrb_random_mt_g_rand(mrb_state *mrb, mrb_value max)
|
68
60
|
{
|
69
61
|
mrb_value value;
|
70
62
|
|
71
63
|
if (mrb_fixnum(max) == 0) {
|
72
64
|
value = mrb_float_value(mrb, mt_g_rand_real());
|
73
|
-
}
|
65
|
+
}
|
66
|
+
else {
|
74
67
|
value = mrb_fixnum_value(mt_g_rand() % mrb_fixnum(max));
|
75
68
|
}
|
76
69
|
|
77
70
|
return value;
|
78
71
|
}
|
79
72
|
|
80
|
-
static void
|
73
|
+
static void
|
74
|
+
mt_srand(mt_state *t, unsigned long seed)
|
81
75
|
{
|
82
76
|
mrb_random_init_genrand(t, seed);
|
83
77
|
}
|
84
78
|
|
85
|
-
static unsigned long
|
79
|
+
static unsigned long
|
80
|
+
mt_rand(mt_state *t)
|
86
81
|
{
|
87
82
|
return mrb_random_genrand_int32(t);
|
88
83
|
}
|
89
84
|
|
90
|
-
static double
|
85
|
+
static double
|
86
|
+
mt_rand_real(mt_state *t)
|
91
87
|
{
|
92
88
|
return mrb_random_genrand_real1(t);
|
93
89
|
}
|
94
90
|
|
95
|
-
static mrb_value
|
91
|
+
static mrb_value
|
92
|
+
mrb_random_mt_srand(mrb_state *mrb, mt_state *t, mrb_value seed)
|
96
93
|
{
|
97
94
|
if (mrb_nil_p(seed)) {
|
98
95
|
seed = mrb_fixnum_value(time(NULL) + mt_rand(t));
|
@@ -106,20 +103,23 @@ static mrb_value mrb_random_mt_srand(mrb_state *mrb, mt_state *t, mrb_value seed
|
|
106
103
|
return seed;
|
107
104
|
}
|
108
105
|
|
109
|
-
static mrb_value
|
106
|
+
static mrb_value
|
107
|
+
mrb_random_mt_rand(mrb_state *mrb, mt_state *t, mrb_value max)
|
110
108
|
{
|
111
109
|
mrb_value value;
|
112
110
|
|
113
111
|
if (mrb_fixnum(max) == 0) {
|
114
112
|
value = mrb_float_value(mrb, mt_rand_real(t));
|
115
|
-
}
|
113
|
+
}
|
114
|
+
else {
|
116
115
|
value = mrb_fixnum_value(mt_rand(t) % mrb_fixnum(max));
|
117
116
|
}
|
118
117
|
|
119
118
|
return value;
|
120
119
|
}
|
121
120
|
|
122
|
-
static mrb_value
|
121
|
+
static mrb_value
|
122
|
+
get_opt(mrb_state* mrb)
|
123
123
|
{
|
124
124
|
mrb_value arg;
|
125
125
|
|
@@ -138,89 +138,186 @@ static mrb_value get_opt(mrb_state* mrb)
|
|
138
138
|
return arg;
|
139
139
|
}
|
140
140
|
|
141
|
-
static
|
141
|
+
static void
|
142
|
+
mrb_random_g_rand_seed(mrb_state *mrb)
|
142
143
|
{
|
143
|
-
mrb_value max;
|
144
144
|
mrb_value seed;
|
145
|
-
|
146
|
-
|
147
|
-
seed = mrb_gv_get(mrb, mrb_intern2(mrb, GLOBAL_RAND_SEED_KEY, GLOBAL_RAND_SEED_KEY_CSTR_LEN));
|
145
|
+
|
146
|
+
seed = mrb_gv_get(mrb, mrb_intern(mrb, GLOBAL_RAND_SEED_KEY, GLOBAL_RAND_SEED_KEY_CSTR_LEN));
|
148
147
|
if (mrb_nil_p(seed)) {
|
149
148
|
mrb_random_mt_g_srand(mrb, mrb_nil_value());
|
150
149
|
}
|
150
|
+
}
|
151
|
+
|
152
|
+
static mrb_value
|
153
|
+
mrb_random_g_rand(mrb_state *mrb, mrb_value self)
|
154
|
+
{
|
155
|
+
mrb_value max;
|
156
|
+
|
157
|
+
max = get_opt(mrb);
|
158
|
+
mrb_random_g_rand_seed(mrb);
|
151
159
|
return mrb_random_mt_g_rand(mrb, max);
|
152
160
|
}
|
153
161
|
|
154
|
-
static mrb_value
|
162
|
+
static mrb_value
|
163
|
+
mrb_random_g_srand(mrb_state *mrb, mrb_value self)
|
155
164
|
{
|
156
165
|
mrb_value seed;
|
157
166
|
mrb_value old_seed;
|
158
167
|
|
159
168
|
seed = get_opt(mrb);
|
160
169
|
seed = mrb_random_mt_g_srand(mrb, seed);
|
161
|
-
old_seed = mrb_gv_get(mrb,
|
162
|
-
mrb_gv_set(mrb,
|
170
|
+
old_seed = mrb_gv_get(mrb, mrb_intern(mrb, GLOBAL_RAND_SEED_KEY, GLOBAL_RAND_SEED_KEY_CSTR_LEN));
|
171
|
+
mrb_gv_set(mrb, mrb_intern(mrb, GLOBAL_RAND_SEED_KEY, GLOBAL_RAND_SEED_KEY_CSTR_LEN), seed);
|
163
172
|
return old_seed;
|
164
173
|
}
|
165
174
|
|
166
|
-
static mrb_value
|
175
|
+
static mrb_value
|
176
|
+
mrb_random_init(mrb_state *mrb, mrb_value self)
|
167
177
|
{
|
168
178
|
mrb_value seed;
|
169
|
-
|
170
|
-
|
171
|
-
|
179
|
+
mt_state *t;
|
180
|
+
|
181
|
+
DATA_TYPE(self) = &mt_state_type;
|
182
|
+
DATA_PTR(self) = NULL;
|
183
|
+
|
184
|
+
/* avoid memory leaks */
|
185
|
+
t = (mt_state*)DATA_PTR(self);
|
186
|
+
if (t) {
|
187
|
+
mrb_free(mrb, t);
|
188
|
+
}
|
189
|
+
|
190
|
+
t = (mt_state *)mrb_malloc(mrb, sizeof(mt_state));
|
172
191
|
t->mti = N + 1;
|
173
192
|
|
174
193
|
seed = get_opt(mrb);
|
175
194
|
seed = mrb_random_mt_srand(mrb, t, seed);
|
176
|
-
mrb_iv_set(mrb, self,
|
177
|
-
|
178
|
-
|
195
|
+
mrb_iv_set(mrb, self, mrb_intern(mrb, INSTANCE_RAND_SEED_KEY, INSTANCE_RAND_SEED_KEY_CSTR_LEN), seed);
|
196
|
+
|
197
|
+
DATA_PTR(self) = t;
|
198
|
+
|
179
199
|
return self;
|
180
200
|
}
|
181
201
|
|
182
|
-
static
|
202
|
+
static void
|
203
|
+
mrb_random_rand_seed(mrb_state *mrb, mrb_value self)
|
183
204
|
{
|
184
|
-
mrb_value max;
|
185
205
|
mrb_value seed;
|
186
|
-
mt_state *t =
|
187
|
-
|
188
|
-
|
189
|
-
seed = mrb_iv_get(mrb, self, mrb_intern2(mrb, INSTANCE_RAND_SEED_KEY, INSTANCE_RAND_SEED_KEY_CSTR_LEN));
|
206
|
+
mt_state *t = DATA_PTR(self);
|
207
|
+
|
208
|
+
seed = mrb_iv_get(mrb, self, mrb_intern(mrb, INSTANCE_RAND_SEED_KEY, INSTANCE_RAND_SEED_KEY_CSTR_LEN));
|
190
209
|
if (mrb_nil_p(seed)) {
|
191
210
|
mrb_random_mt_srand(mrb, t, mrb_nil_value());
|
192
211
|
}
|
212
|
+
}
|
213
|
+
|
214
|
+
static mrb_value
|
215
|
+
mrb_random_rand(mrb_state *mrb, mrb_value self)
|
216
|
+
{
|
217
|
+
mrb_value max;
|
218
|
+
mt_state *t = DATA_PTR(self);
|
219
|
+
|
220
|
+
max = get_opt(mrb);
|
221
|
+
mrb_random_rand_seed(mrb, self);
|
193
222
|
return mrb_random_mt_rand(mrb, t, max);
|
194
223
|
}
|
195
224
|
|
196
|
-
static mrb_value
|
225
|
+
static mrb_value
|
226
|
+
mrb_random_srand(mrb_state *mrb, mrb_value self)
|
197
227
|
{
|
198
228
|
mrb_value seed;
|
199
229
|
mrb_value old_seed;
|
200
|
-
mt_state *t =
|
230
|
+
mt_state *t = DATA_PTR(self);
|
201
231
|
|
202
232
|
seed = get_opt(mrb);
|
203
233
|
seed = mrb_random_mt_srand(mrb, t, seed);
|
204
|
-
old_seed = mrb_iv_get(mrb, self,
|
205
|
-
mrb_iv_set(mrb, self,
|
234
|
+
old_seed = mrb_iv_get(mrb, self, mrb_intern(mrb, INSTANCE_RAND_SEED_KEY, INSTANCE_RAND_SEED_KEY_CSTR_LEN));
|
235
|
+
mrb_iv_set(mrb, self, mrb_intern(mrb, INSTANCE_RAND_SEED_KEY, INSTANCE_RAND_SEED_KEY_CSTR_LEN), seed);
|
206
236
|
|
207
237
|
return old_seed;
|
208
238
|
}
|
209
239
|
|
240
|
+
/*
|
241
|
+
* call-seq:
|
242
|
+
* ary.shuffle! -> ary
|
243
|
+
*
|
244
|
+
* Shuffles elements in self in place.
|
245
|
+
*/
|
246
|
+
|
247
|
+
static mrb_value
|
248
|
+
mrb_ary_shuffle_bang(mrb_state *mrb, mrb_value ary)
|
249
|
+
{
|
250
|
+
mrb_int i;
|
251
|
+
mrb_value random = mrb_nil_value();
|
252
|
+
|
253
|
+
if (RARRAY_LEN(ary) > 1) {
|
254
|
+
mrb_get_args(mrb, "|o", &random);
|
255
|
+
|
256
|
+
if (mrb_nil_p(random)) {
|
257
|
+
mrb_random_g_rand_seed(mrb);
|
258
|
+
}
|
259
|
+
else {
|
260
|
+
mrb_data_check_type(mrb, random, &mt_state_type);
|
261
|
+
mrb_random_rand_seed(mrb, random);
|
262
|
+
}
|
263
|
+
|
264
|
+
mrb_ary_modify(mrb, mrb_ary_ptr(ary));
|
265
|
+
|
266
|
+
for (i = RARRAY_LEN(ary) - 1; i > 0; i--) {
|
267
|
+
mrb_int j;
|
268
|
+
mrb_value tmp;
|
269
|
+
|
270
|
+
if (mrb_nil_p(random)) {
|
271
|
+
j = mrb_fixnum(mrb_random_mt_g_rand(mrb, mrb_fixnum_value(RARRAY_LEN(ary))));
|
272
|
+
}
|
273
|
+
else {
|
274
|
+
j = mrb_fixnum(mrb_random_mt_rand(mrb, DATA_PTR(random), mrb_fixnum_value(RARRAY_LEN(ary))));
|
275
|
+
}
|
276
|
+
|
277
|
+
tmp = RARRAY_PTR(ary)[i];
|
278
|
+
RARRAY_PTR(ary)[i] = RARRAY_PTR(ary)[j];
|
279
|
+
RARRAY_PTR(ary)[j] = tmp;
|
280
|
+
}
|
281
|
+
}
|
282
|
+
|
283
|
+
return ary;
|
284
|
+
}
|
285
|
+
|
286
|
+
/*
|
287
|
+
* call-seq:
|
288
|
+
* ary.shuffle -> new_ary
|
289
|
+
*
|
290
|
+
* Returns a new array with elements of self shuffled.
|
291
|
+
*/
|
292
|
+
|
293
|
+
static mrb_value
|
294
|
+
mrb_ary_shuffle(mrb_state *mrb, mrb_value ary)
|
295
|
+
{
|
296
|
+
mrb_value new_ary = mrb_ary_new_from_values(mrb, RARRAY_LEN(ary), RARRAY_PTR(ary));
|
297
|
+
mrb_ary_shuffle_bang(mrb, new_ary);
|
298
|
+
|
299
|
+
return new_ary;
|
300
|
+
}
|
301
|
+
|
210
302
|
void mrb_mruby_random_gem_init(mrb_state *mrb)
|
211
303
|
{
|
212
304
|
struct RClass *random;
|
305
|
+
struct RClass *array = mrb->array_class;
|
213
306
|
|
214
307
|
mrb_define_method(mrb, mrb->kernel_module, "rand", mrb_random_g_rand, MRB_ARGS_OPT(1));
|
215
308
|
mrb_define_method(mrb, mrb->kernel_module, "srand", mrb_random_g_srand, MRB_ARGS_OPT(1));
|
216
309
|
|
217
310
|
random = mrb_define_class(mrb, "Random", mrb->object_class);
|
311
|
+
MRB_SET_INSTANCE_TT(random, MRB_TT_DATA);
|
218
312
|
mrb_define_class_method(mrb, random, "rand", mrb_random_g_rand, MRB_ARGS_OPT(1));
|
219
313
|
mrb_define_class_method(mrb, random, "srand", mrb_random_g_srand, MRB_ARGS_OPT(1));
|
220
314
|
|
221
315
|
mrb_define_method(mrb, random, "initialize", mrb_random_init, MRB_ARGS_OPT(1));
|
222
316
|
mrb_define_method(mrb, random, "rand", mrb_random_rand, MRB_ARGS_OPT(1));
|
223
317
|
mrb_define_method(mrb, random, "srand", mrb_random_srand, MRB_ARGS_OPT(1));
|
318
|
+
|
319
|
+
mrb_define_method(mrb, array, "shuffle", mrb_ary_shuffle, MRB_ARGS_OPT(1));
|
320
|
+
mrb_define_method(mrb, array, "shuffle!", mrb_ary_shuffle_bang, MRB_ARGS_OPT(1));
|
224
321
|
}
|
225
322
|
|
226
323
|
void mrb_mruby_random_gem_final(mrb_state *mrb)
|
@@ -30,3 +30,47 @@ end
|
|
30
30
|
assert("float") do
|
31
31
|
rand.class == Float
|
32
32
|
end
|
33
|
+
|
34
|
+
assert("Array#shuffle") do
|
35
|
+
ary = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
|
36
|
+
shuffled = ary.shuffle
|
37
|
+
|
38
|
+
ary == [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] and shuffled != ary and 10.times { |x| ary.include? x }
|
39
|
+
end
|
40
|
+
|
41
|
+
assert('Array#shuffle!') do
|
42
|
+
ary = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
|
43
|
+
ary.shuffle!
|
44
|
+
|
45
|
+
ary != [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] and 10.times { |x| ary.include? x }
|
46
|
+
end
|
47
|
+
|
48
|
+
assert("Array#shuffle(random)") do
|
49
|
+
assert_raise(TypeError) do
|
50
|
+
# this will cause an exception due to the wrong argument
|
51
|
+
[1, 2].shuffle "Not a Random instance"
|
52
|
+
end
|
53
|
+
|
54
|
+
# verify that the same seed causes the same results
|
55
|
+
ary1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
|
56
|
+
shuffle1 = ary1.shuffle Random.new 345
|
57
|
+
ary2 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
|
58
|
+
shuffle2 = ary2.shuffle Random.new 345
|
59
|
+
|
60
|
+
ary1 != shuffle1 and 10.times { |x| shuffle1.include? x } and shuffle1 == shuffle2
|
61
|
+
end
|
62
|
+
|
63
|
+
assert('Array#shuffle!(random)') do
|
64
|
+
assert_raise(TypeError) do
|
65
|
+
# this will cause an exception due to the wrong argument
|
66
|
+
[1, 2].shuffle! "Not a Random instance"
|
67
|
+
end
|
68
|
+
|
69
|
+
# verify that the same seed causes the same results
|
70
|
+
ary1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
|
71
|
+
ary1.shuffle! Random.new 345
|
72
|
+
ary2 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
|
73
|
+
ary2.shuffle! Random.new 345
|
74
|
+
|
75
|
+
ary1 != [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] and 10.times { |x| ary1.include? x } and ary1 == ary2
|
76
|
+
end
|
@@ -49,7 +49,7 @@ mrb_struct_iv_get(mrb_state *mrb, mrb_value c, const char *name)
|
|
49
49
|
mrb_value
|
50
50
|
mrb_struct_s_members(mrb_state *mrb, mrb_value klass)
|
51
51
|
{
|
52
|
-
mrb_value members = struct_ivar_get(mrb, klass,
|
52
|
+
mrb_value members = struct_ivar_get(mrb, klass, mrb_intern_lit(mrb, "__members__"));
|
53
53
|
|
54
54
|
if (mrb_nil_p(members)) {
|
55
55
|
mrb_raise(mrb, E_TYPE_ERROR, "uninitialized struct");
|
@@ -176,7 +176,7 @@ mrb_id_attrset(mrb_state *mrb, mrb_sym id)
|
|
176
176
|
buf[len] = '=';
|
177
177
|
buf[len+1] = '\0';
|
178
178
|
|
179
|
-
mid =
|
179
|
+
mid = mrb_intern(mrb, buf, len+1);
|
180
180
|
mrb_free(mrb, buf);
|
181
181
|
return mid;
|
182
182
|
}
|
@@ -191,7 +191,7 @@ mrb_struct_set(mrb_state *mrb, mrb_value obj, mrb_value val)
|
|
191
191
|
|
192
192
|
/* get base id */
|
193
193
|
name = mrb_sym2name_len(mrb, mrb->c->ci->mid, &len);
|
194
|
-
mid =
|
194
|
+
mid = mrb_intern(mrb, name, len-1); /* omit last "=" */
|
195
195
|
|
196
196
|
members = mrb_struct_members(mrb, obj);
|
197
197
|
ptr_members = RARRAY_PTR(members);
|
@@ -258,7 +258,7 @@ make_struct(mrb_state *mrb, mrb_value name, mrb_value members, struct RClass * k
|
|
258
258
|
}
|
259
259
|
MRB_SET_INSTANCE_TT(c, MRB_TT_ARRAY);
|
260
260
|
nstr = mrb_obj_value(c);
|
261
|
-
mrb_iv_set(mrb, nstr,
|
261
|
+
mrb_iv_set(mrb, nstr, mrb_intern_lit(mrb, "__members__"), members);
|
262
262
|
|
263
263
|
mrb_define_class_method(mrb, c, "new", mrb_instance_new, MRB_ARGS_ANY());
|
264
264
|
mrb_define_class_method(mrb, c, "[]", mrb_instance_new, MRB_ARGS_ANY());
|
@@ -393,7 +393,7 @@ num_members(mrb_state *mrb, struct RClass *klass)
|
|
393
393
|
{
|
394
394
|
mrb_value members;
|
395
395
|
|
396
|
-
members = struct_ivar_get(mrb, mrb_obj_value(klass),
|
396
|
+
members = struct_ivar_get(mrb, mrb_obj_value(klass), mrb_intern_lit(mrb, "__members__"));
|
397
397
|
if (!mrb_array_p(members)) {
|
398
398
|
mrb_raise(mrb, E_TYPE_ERROR, "broken members");
|
399
399
|
}
|
@@ -1,24 +1,51 @@
|
|
1
1
|
##
|
2
|
-
#
|
2
|
+
# Numeric
|
3
3
|
#
|
4
|
-
# ISO 15.2.
|
5
|
-
class
|
6
|
-
|
4
|
+
# ISO 15.2.7
|
5
|
+
class Numeric
|
6
|
+
include Comparable
|
7
7
|
##
|
8
8
|
# Returns the receiver simply.
|
9
9
|
#
|
10
|
-
# ISO 15.2.
|
11
|
-
def
|
10
|
+
# ISO 15.2.7.4.1
|
11
|
+
def +@
|
12
12
|
self
|
13
13
|
end
|
14
14
|
|
15
|
+
##
|
16
|
+
# Returns the receiver's value, negated.
|
17
|
+
#
|
18
|
+
# ISO 15.2.7.4.2
|
19
|
+
def -@
|
20
|
+
0 - self
|
21
|
+
end
|
22
|
+
|
23
|
+
##
|
24
|
+
# Returns the absolute value of the receiver.
|
25
|
+
#
|
26
|
+
# ISO 15.2.7.4.3
|
27
|
+
def abs
|
28
|
+
if self < 0
|
29
|
+
-self
|
30
|
+
else
|
31
|
+
self
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
##
|
37
|
+
# Integral
|
38
|
+
#
|
39
|
+
# mruby special - module to share methods between Floats and Integers
|
40
|
+
# to make them compatible
|
41
|
+
module Integral
|
15
42
|
##
|
16
43
|
# Calls the given block once for each Integer
|
17
44
|
# from +self+ downto +num+.
|
18
45
|
#
|
19
46
|
# ISO 15.2.8.3.15
|
20
47
|
def downto(num, &block)
|
21
|
-
i = self
|
48
|
+
i = self.to_i
|
22
49
|
while(i >= num)
|
23
50
|
block.call(i)
|
24
51
|
i -= 1
|
@@ -27,12 +54,14 @@ class Integer
|
|
27
54
|
end
|
28
55
|
|
29
56
|
##
|
30
|
-
# Returns
|
57
|
+
# Returns self + 1
|
31
58
|
#
|
32
|
-
# ISO 15.2.8.3.
|
33
|
-
def
|
34
|
-
self
|
59
|
+
# ISO 15.2.8.3.19
|
60
|
+
def next
|
61
|
+
self + 1
|
35
62
|
end
|
63
|
+
# ISO 15.2.8.3.21
|
64
|
+
alias succ next
|
36
65
|
|
37
66
|
##
|
38
67
|
# Calls the given block +self+ times.
|
@@ -47,29 +76,13 @@ class Integer
|
|
47
76
|
self
|
48
77
|
end
|
49
78
|
|
50
|
-
##
|
51
|
-
# Returns the receiver simply.
|
52
|
-
#
|
53
|
-
# ISO 15.2.8.3.24
|
54
|
-
def round
|
55
|
-
self
|
56
|
-
end
|
57
|
-
|
58
|
-
##
|
59
|
-
# Returns the receiver simply.
|
60
|
-
#
|
61
|
-
# ISO 15.2.8.3.26
|
62
|
-
def truncate
|
63
|
-
self
|
64
|
-
end
|
65
|
-
|
66
79
|
##
|
67
80
|
# Calls the given block once for each Integer
|
68
81
|
# from +self+ upto +num+.
|
69
82
|
#
|
70
83
|
# ISO 15.2.8.3.27
|
71
84
|
def upto(num, &block)
|
72
|
-
i = self
|
85
|
+
i = self.to_i
|
73
86
|
while(i <= num)
|
74
87
|
block.call(i)
|
75
88
|
i += 1
|
@@ -92,10 +105,63 @@ class Integer
|
|
92
105
|
end
|
93
106
|
|
94
107
|
##
|
95
|
-
#
|
108
|
+
# Integer
|
96
109
|
#
|
97
|
-
# ISO 15.2.
|
98
|
-
|
99
|
-
|
100
|
-
|
110
|
+
# ISO 15.2.8
|
111
|
+
class Integer
|
112
|
+
include Integral
|
113
|
+
##
|
114
|
+
# Returns the receiver simply.
|
115
|
+
#
|
116
|
+
# ISO 15.2.8.3.14
|
117
|
+
def ceil
|
118
|
+
self
|
119
|
+
end
|
120
|
+
|
121
|
+
##
|
122
|
+
# Returns the receiver simply.
|
123
|
+
#
|
124
|
+
# ISO 15.2.8.3.17
|
125
|
+
def floor
|
126
|
+
self
|
127
|
+
end
|
128
|
+
|
129
|
+
##
|
130
|
+
# Returns the receiver simply.
|
131
|
+
#
|
132
|
+
# ISO 15.2.8.3.24
|
133
|
+
alias round floor
|
134
|
+
|
135
|
+
##
|
136
|
+
# Returns the receiver simply.
|
137
|
+
#
|
138
|
+
# ISO 15.2.8.3.26
|
139
|
+
alias truncate floor
|
140
|
+
end
|
141
|
+
|
142
|
+
##
|
143
|
+
# Float
|
144
|
+
#
|
145
|
+
# ISO 15.2.9
|
146
|
+
class Float
|
147
|
+
include Integral
|
148
|
+
# mruby special - since mruby integers may be upgraded to floats,
|
149
|
+
# floats should be compatible to integers.
|
150
|
+
def >> other
|
151
|
+
n = self.to_i
|
152
|
+
other.to_i.times {
|
153
|
+
n /= 2
|
154
|
+
}
|
155
|
+
n
|
156
|
+
end
|
157
|
+
def << other
|
158
|
+
n = self.to_i
|
159
|
+
other.to_i.times {
|
160
|
+
n *= 2
|
161
|
+
}
|
162
|
+
n.to_i
|
163
|
+
end
|
164
|
+
|
165
|
+
def divmod(other)
|
166
|
+
end
|
101
167
|
end
|
data/modules/mruby/src/array.c
CHANGED
@@ -138,6 +138,13 @@ ary_modify(mrb_state *mrb, struct RArray *a)
|
|
138
138
|
}
|
139
139
|
}
|
140
140
|
|
141
|
+
void
|
142
|
+
mrb_ary_modify(mrb_state *mrb, struct RArray* a)
|
143
|
+
{
|
144
|
+
mrb_write_barrier(mrb, (struct RBasic*)a);
|
145
|
+
ary_modify(mrb, a);
|
146
|
+
}
|
147
|
+
|
141
148
|
static void
|
142
149
|
ary_make_shared(mrb_state *mrb, struct RArray *a)
|
143
150
|
{
|
@@ -302,7 +309,7 @@ mrb_ary_cmp(mrb_state *mrb, mrb_value ary1)
|
|
302
309
|
a1 = RARRAY(ary1); a2 = RARRAY(ary2);
|
303
310
|
if (a1->len == a2->len && a1->ptr == a2->ptr) return mrb_fixnum_value(0);
|
304
311
|
else {
|
305
|
-
mrb_sym cmp =
|
312
|
+
mrb_sym cmp = mrb_intern_lit(mrb, "<=>");
|
306
313
|
|
307
314
|
len = RARRAY_LEN(ary1);
|
308
315
|
if (len > RARRAY_LEN(ary2)) {
|
@@ -1063,7 +1070,7 @@ mrb_ary_equal(mrb_state *mrb, mrb_value ary1)
|
|
1063
1070
|
if (mrb_obj_equal(mrb, ary1, ary2)) return mrb_true_value();
|
1064
1071
|
if (mrb_special_const_p(ary2)) return mrb_false_value();
|
1065
1072
|
if (!mrb_array_p(ary2)) {
|
1066
|
-
if (!mrb_respond_to(mrb, ary2,
|
1073
|
+
if (!mrb_respond_to(mrb, ary2, mrb_intern_lit(mrb, "to_ary"))) {
|
1067
1074
|
return mrb_false_value();
|
1068
1075
|
}
|
1069
1076
|
else {
|
@@ -1117,8 +1124,8 @@ mrb_init_array(mrb_state *mrb)
|
|
1117
1124
|
|
1118
1125
|
mrb_define_class_method(mrb, a, "[]", mrb_ary_s_create, MRB_ARGS_ANY()); /* 15.2.12.4.1 */
|
1119
1126
|
|
1120
|
-
mrb_define_method(mrb, a, "
|
1121
|
-
mrb_define_method(mrb, a, "
|
1127
|
+
mrb_define_method(mrb, a, "+", mrb_ary_plus, MRB_ARGS_REQ(1)); /* 15.2.12.5.1 */
|
1128
|
+
mrb_define_method(mrb, a, "*", mrb_ary_times, MRB_ARGS_REQ(1)); /* 15.2.12.5.2 */
|
1122
1129
|
mrb_define_method(mrb, a, "<<", mrb_ary_push_m, MRB_ARGS_REQ(1)); /* 15.2.12.5.3 */
|
1123
1130
|
mrb_define_method(mrb, a, "[]", mrb_ary_aget, MRB_ARGS_ANY()); /* 15.2.12.5.4 */
|
1124
1131
|
mrb_define_method(mrb, a, "[]=", mrb_ary_aset, MRB_ARGS_ANY()); /* 15.2.12.5.5 */
|
@@ -65,7 +65,7 @@ mrb_output_backtrace(mrb_state *mrb, struct RObject *exc, output_stream_func fun
|
|
65
65
|
int i, line;
|
66
66
|
|
67
67
|
func(mrb, stream, 1, "trace:\n");
|
68
|
-
ciidx = mrb_fixnum(mrb_obj_iv_get(mrb, exc,
|
68
|
+
ciidx = mrb_fixnum(mrb_obj_iv_get(mrb, exc, mrb_intern_lit(mrb, "ciidx")));
|
69
69
|
if (ciidx >= mrb->c->ciend - mrb->c->cibase)
|
70
70
|
ciidx = 10; /* ciidx is broken... */
|
71
71
|
|
@@ -88,7 +88,7 @@ mrb_output_backtrace(mrb_state *mrb, struct RObject *exc, output_stream_func fun
|
|
88
88
|
pc = mrb->c->cibase[i+1].pc - 1;
|
89
89
|
}
|
90
90
|
else {
|
91
|
-
pc = (mrb_code*)mrb_cptr(mrb_obj_iv_get(mrb, exc,
|
91
|
+
pc = (mrb_code*)mrb_cptr(mrb_obj_iv_get(mrb, exc, mrb_intern_lit(mrb, "lastpc")));
|
92
92
|
}
|
93
93
|
filename = mrb_debug_get_filename(irep, pc - irep->iseq);
|
94
94
|
line = mrb_debug_get_line(irep, pc - irep->iseq);
|