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
@@ -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);
|