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/load.c
CHANGED
@@ -30,31 +30,6 @@
|
|
30
30
|
# error This code assumes CHAR_BIT == 8
|
31
31
|
#endif
|
32
32
|
|
33
|
-
static void
|
34
|
-
irep_free(size_t sirep, mrb_state *mrb)
|
35
|
-
{
|
36
|
-
size_t i;
|
37
|
-
void *p;
|
38
|
-
|
39
|
-
for (i = sirep; i < mrb->irep_len; i++) {
|
40
|
-
if (mrb->irep[i]) {
|
41
|
-
p = mrb->irep[i]->iseq;
|
42
|
-
if (p)
|
43
|
-
mrb_free(mrb, p);
|
44
|
-
|
45
|
-
p = mrb->irep[i]->pool;
|
46
|
-
if (p)
|
47
|
-
mrb_free(mrb, p);
|
48
|
-
|
49
|
-
p = mrb->irep[i]->syms;
|
50
|
-
if (p)
|
51
|
-
mrb_free(mrb, p);
|
52
|
-
|
53
|
-
mrb_free(mrb, mrb->irep[i]);
|
54
|
-
}
|
55
|
-
}
|
56
|
-
}
|
57
|
-
|
58
33
|
static size_t
|
59
34
|
offset_crc_body(void)
|
60
35
|
{
|
@@ -62,10 +37,9 @@ offset_crc_body(void)
|
|
62
37
|
return ((uint8_t *)header.binary_crc - (uint8_t *)&header) + sizeof(header.binary_crc);
|
63
38
|
}
|
64
39
|
|
65
|
-
static
|
66
|
-
|
40
|
+
static mrb_irep*
|
41
|
+
read_irep_record_1(mrb_state *mrb, const uint8_t *bin, uint32_t *len)
|
67
42
|
{
|
68
|
-
int ret;
|
69
43
|
size_t i;
|
70
44
|
const uint8_t *src = bin;
|
71
45
|
uint16_t tt, pool_data_len, snl;
|
@@ -84,19 +58,21 @@ read_rite_irep_record(mrb_state *mrb, const uint8_t *bin, uint32_t *len)
|
|
84
58
|
irep->nregs = bin_to_uint16(src);
|
85
59
|
src += sizeof(uint16_t);
|
86
60
|
|
61
|
+
// number of child irep
|
62
|
+
irep->rlen = bin_to_uint16(src);
|
63
|
+
src += sizeof(uint16_t);
|
64
|
+
|
87
65
|
// Binary Data Section
|
88
66
|
// ISEQ BLOCK
|
89
67
|
irep->ilen = bin_to_uint32(src);
|
90
68
|
src += sizeof(uint32_t);
|
91
69
|
if (irep->ilen > 0) {
|
92
70
|
if (SIZE_ERROR_MUL(sizeof(mrb_code), irep->ilen)) {
|
93
|
-
|
94
|
-
goto error_exit;
|
71
|
+
return NULL;
|
95
72
|
}
|
96
73
|
irep->iseq = (mrb_code *)mrb_malloc(mrb, sizeof(mrb_code) * irep->ilen);
|
97
74
|
if (irep->iseq == NULL) {
|
98
|
-
|
99
|
-
goto error_exit;
|
75
|
+
return NULL;
|
100
76
|
}
|
101
77
|
for (i = 0; i < irep->ilen; i++) {
|
102
78
|
irep->iseq[i] = bin_to_uint32(src); //iseq
|
@@ -109,36 +85,36 @@ read_rite_irep_record(mrb_state *mrb, const uint8_t *bin, uint32_t *len)
|
|
109
85
|
src += sizeof(uint32_t);
|
110
86
|
if (plen > 0) {
|
111
87
|
if (SIZE_ERROR_MUL(sizeof(mrb_value), plen)) {
|
112
|
-
|
113
|
-
goto error_exit;
|
88
|
+
return NULL;
|
114
89
|
}
|
115
|
-
irep->pool = (mrb_value
|
90
|
+
irep->pool = (mrb_value*)mrb_malloc(mrb, sizeof(mrb_value) * plen);
|
116
91
|
if (irep->pool == NULL) {
|
117
|
-
|
118
|
-
goto error_exit;
|
92
|
+
return NULL;
|
119
93
|
}
|
120
94
|
|
121
95
|
for (i = 0; i < plen; i++) {
|
122
96
|
mrb_value s;
|
97
|
+
|
123
98
|
tt = *src++; //pool TT
|
124
99
|
pool_data_len = bin_to_uint16(src); //pool data length
|
125
100
|
src += sizeof(uint16_t);
|
126
101
|
s = mrb_str_new(mrb, (char *)src, pool_data_len);
|
127
102
|
src += pool_data_len;
|
128
103
|
switch (tt) { //pool data
|
129
|
-
case
|
104
|
+
case IREP_TT_FIXNUM:
|
130
105
|
irep->pool[i] = mrb_str_to_inum(mrb, s, 10, FALSE);
|
131
106
|
break;
|
132
107
|
|
133
|
-
case
|
134
|
-
irep->pool[i] =
|
108
|
+
case IREP_TT_FLOAT:
|
109
|
+
irep->pool[i] = mrb_float_pool(mrb, mrb_str_to_dbl(mrb, s, FALSE));
|
135
110
|
break;
|
136
111
|
|
137
|
-
case
|
138
|
-
irep->pool[i] = s;
|
112
|
+
case IREP_TT_STRING:
|
113
|
+
irep->pool[i] = mrb_str_pool(mrb, s);
|
139
114
|
break;
|
140
115
|
|
141
116
|
default:
|
117
|
+
/* should not happen */
|
142
118
|
irep->pool[i] = mrb_nil_value();
|
143
119
|
break;
|
144
120
|
}
|
@@ -152,13 +128,11 @@ read_rite_irep_record(mrb_state *mrb, const uint8_t *bin, uint32_t *len)
|
|
152
128
|
src += sizeof(uint32_t);
|
153
129
|
if (irep->slen > 0) {
|
154
130
|
if (SIZE_ERROR_MUL(sizeof(mrb_sym), irep->slen)) {
|
155
|
-
|
156
|
-
goto error_exit;
|
131
|
+
return NULL;
|
157
132
|
}
|
158
133
|
irep->syms = (mrb_sym *)mrb_malloc(mrb, sizeof(mrb_sym) * irep->slen);
|
159
134
|
if (irep->syms == NULL) {
|
160
|
-
|
161
|
-
goto error_exit;
|
135
|
+
return NULL;
|
162
136
|
}
|
163
137
|
|
164
138
|
for (i = 0; i < irep->slen; i++) {
|
@@ -170,53 +144,47 @@ read_rite_irep_record(mrb_state *mrb, const uint8_t *bin, uint32_t *len)
|
|
170
144
|
continue;
|
171
145
|
}
|
172
146
|
|
173
|
-
irep->syms[i] =
|
147
|
+
irep->syms[i] = mrb_intern(mrb, (char *)src, snl);
|
174
148
|
src += snl + 1;
|
175
149
|
|
176
150
|
mrb_gc_arena_restore(mrb, ai);
|
177
151
|
}
|
178
152
|
}
|
153
|
+
|
154
|
+
irep->reps = (mrb_irep**)mrb_malloc(mrb, sizeof(mrb_irep*)*irep->rlen);
|
179
155
|
*len = src - bin;
|
180
156
|
|
181
|
-
|
182
|
-
error_exit:
|
183
|
-
return ret;
|
157
|
+
return irep;
|
184
158
|
}
|
185
159
|
|
186
|
-
static
|
187
|
-
|
160
|
+
static mrb_irep*
|
161
|
+
read_irep_record(mrb_state *mrb, const uint8_t *bin, uint32_t *len)
|
188
162
|
{
|
189
|
-
|
190
|
-
size_t
|
191
|
-
uint32_t len;
|
192
|
-
uint16_t nirep;
|
193
|
-
uint16_t n;
|
194
|
-
const struct rite_section_irep_header *header;
|
195
|
-
|
196
|
-
header = (const struct rite_section_irep_header*)bin;
|
197
|
-
bin += sizeof(struct rite_section_irep_header);
|
163
|
+
mrb_irep *irep = read_irep_record_1(mrb, bin, len);
|
164
|
+
size_t i;
|
198
165
|
|
199
|
-
|
200
|
-
|
166
|
+
bin += *len;
|
167
|
+
for (i=0; i<irep->rlen; i++) {
|
168
|
+
uint32_t rlen;
|
201
169
|
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
if (result != MRB_DUMP_OK)
|
206
|
-
goto error_exit;
|
207
|
-
bin += len;
|
170
|
+
irep->reps[i] = read_irep_record(mrb, bin, &rlen);
|
171
|
+
bin += rlen;
|
172
|
+
*len += rlen;
|
208
173
|
}
|
174
|
+
return irep;
|
175
|
+
}
|
209
176
|
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
177
|
+
static mrb_irep*
|
178
|
+
read_section_irep(mrb_state *mrb, const uint8_t *bin)
|
179
|
+
{
|
180
|
+
uint32_t len;
|
181
|
+
|
182
|
+
bin += sizeof(struct rite_section_irep_header);
|
183
|
+
return read_irep_record(mrb, bin, &len);
|
216
184
|
}
|
217
185
|
|
218
186
|
static int
|
219
|
-
|
187
|
+
read_lineno_record_1(mrb_state *mrb, const uint8_t *bin, mrb_irep *irep, uint32_t *len)
|
220
188
|
{
|
221
189
|
int ret;
|
222
190
|
size_t i, fname_len, niseq;
|
@@ -231,13 +199,11 @@ read_rite_lineno_record(mrb_state *mrb, const uint8_t *bin, size_t irepno, uint3
|
|
231
199
|
bin += sizeof(uint16_t);
|
232
200
|
*len += sizeof(uint16_t);
|
233
201
|
if (SIZE_ERROR(fname_len + 1)) {
|
234
|
-
|
235
|
-
goto error_exit;
|
202
|
+
return MRB_DUMP_GENERAL_FAILURE;
|
236
203
|
}
|
237
204
|
fname = (char *)mrb_malloc(mrb, fname_len + 1);
|
238
205
|
if (fname == NULL) {
|
239
|
-
|
240
|
-
goto error_exit;
|
206
|
+
return MRB_DUMP_GENERAL_FAILURE;
|
241
207
|
}
|
242
208
|
memcpy(fname, bin, fname_len);
|
243
209
|
fname[fname_len] = '\0';
|
@@ -249,63 +215,58 @@ read_rite_lineno_record(mrb_state *mrb, const uint8_t *bin, size_t irepno, uint3
|
|
249
215
|
*len += sizeof(uint32_t);
|
250
216
|
|
251
217
|
if (SIZE_ERROR_MUL(niseq, sizeof(uint16_t))) {
|
252
|
-
|
253
|
-
goto error_exit;
|
218
|
+
return MRB_DUMP_GENERAL_FAILURE;
|
254
219
|
}
|
255
220
|
lines = (uint16_t *)mrb_malloc(mrb, niseq * sizeof(uint16_t));
|
256
221
|
if (lines == NULL) {
|
257
|
-
|
258
|
-
goto error_exit;
|
222
|
+
return MRB_DUMP_GENERAL_FAILURE;
|
259
223
|
}
|
260
224
|
for (i = 0; i < niseq; i++) {
|
261
225
|
lines[i] = bin_to_uint16(bin);
|
262
226
|
bin += sizeof(uint16_t); // niseq
|
263
227
|
*len += sizeof(uint16_t);
|
264
|
-
|
265
|
-
|
266
|
-
mrb->irep[irepno]->filename = fname;
|
267
|
-
mrb->irep[irepno]->lines = lines;
|
268
|
-
|
269
|
-
error_exit:
|
228
|
+
}
|
270
229
|
|
230
|
+
irep->filename = fname;
|
231
|
+
irep->lines = lines;
|
271
232
|
return ret;
|
272
233
|
}
|
273
234
|
|
274
235
|
static int
|
275
|
-
|
236
|
+
read_lineno_record(mrb_state *mrb, const uint8_t *bin, mrb_irep *irep, uint32_t *lenp)
|
276
237
|
{
|
277
|
-
int result;
|
238
|
+
int result = read_lineno_record_1(mrb, bin, irep, lenp);
|
278
239
|
size_t i;
|
240
|
+
|
241
|
+
if (result != MRB_DUMP_OK) return result;
|
242
|
+
for (i = 0; i < irep->rlen; i++) {
|
243
|
+
uint32_t len;
|
244
|
+
|
245
|
+
result = read_lineno_record(mrb, bin, irep->reps[i], &len);
|
246
|
+
if (result != MRB_DUMP_OK) break;
|
247
|
+
bin += len;
|
248
|
+
*lenp += len;
|
249
|
+
}
|
250
|
+
return result;
|
251
|
+
}
|
252
|
+
|
253
|
+
static int
|
254
|
+
read_section_lineno(mrb_state *mrb, const uint8_t *bin, mrb_irep *irep)
|
255
|
+
{
|
279
256
|
uint32_t len;
|
280
|
-
uint16_t nirep;
|
281
|
-
uint16_t n;
|
282
|
-
const struct rite_section_lineno_header *header;
|
283
257
|
|
284
258
|
len = 0;
|
285
|
-
header = (const struct rite_section_lineno_header*)bin;
|
286
259
|
bin += sizeof(struct rite_section_lineno_header);
|
287
260
|
|
288
|
-
nirep = bin_to_uint16(header->nirep);
|
289
|
-
|
290
261
|
//Read Binary Data Section
|
291
|
-
|
292
|
-
result = read_rite_lineno_record(mrb, bin, i, &len);
|
293
|
-
if (result != MRB_DUMP_OK)
|
294
|
-
goto error_exit;
|
295
|
-
bin += len;
|
296
|
-
}
|
297
|
-
|
298
|
-
result = sirep + bin_to_uint16(header->sirep);
|
299
|
-
error_exit:
|
300
|
-
return result;
|
262
|
+
return read_lineno_record(mrb, bin, irep, &len);
|
301
263
|
}
|
302
264
|
|
303
265
|
static int
|
304
|
-
|
266
|
+
read_debug_record(mrb_state *mrb, const uint8_t *start, mrb_irep* irep, uint32_t *len, const mrb_sym *filenames, size_t filenames_len)
|
305
267
|
{
|
306
268
|
const uint8_t *bin = start;
|
307
|
-
|
308
|
-
size_t record_size;
|
269
|
+
size_t record_size, i;
|
309
270
|
uint16_t f_idx;
|
310
271
|
|
311
272
|
if(irep->debug_info) { return MRB_DUMP_INVALID_IREP; }
|
@@ -368,19 +329,28 @@ read_rite_debug_record(mrb_state *mrb, const uint8_t *start, size_t irepno, uint
|
|
368
329
|
return MRB_DUMP_GENERAL_FAILURE;
|
369
330
|
}
|
370
331
|
|
332
|
+
for (i = 0; i < irep->rlen; i++) {
|
333
|
+
uint32_t len;
|
334
|
+
int ret;
|
335
|
+
|
336
|
+
ret =read_debug_record(mrb, bin, irep->reps[i], &len, filenames, filenames_len);
|
337
|
+
if (ret != MRB_DUMP_OK) return ret;
|
338
|
+
bin += len;
|
339
|
+
}
|
340
|
+
|
371
341
|
*len = bin - start;
|
372
342
|
|
373
343
|
return MRB_DUMP_OK;
|
374
344
|
}
|
375
345
|
|
376
346
|
static int
|
377
|
-
|
347
|
+
read_section_debug(mrb_state *mrb, const uint8_t *start, mrb_irep *irep)
|
378
348
|
{
|
379
349
|
const uint8_t *bin;
|
380
350
|
struct rite_section_debug_header *header;
|
381
351
|
uint16_t i;
|
352
|
+
uint32_t len = 0;
|
382
353
|
int result;
|
383
|
-
uint16_t nirep;
|
384
354
|
size_t filenames_len;
|
385
355
|
mrb_sym *filenames;
|
386
356
|
|
@@ -388,37 +358,31 @@ read_rite_section_debug(mrb_state *mrb, const uint8_t *start, size_t sirep)
|
|
388
358
|
header = (struct rite_section_debug_header *)bin;
|
389
359
|
bin += sizeof(struct rite_section_debug_header);
|
390
360
|
|
391
|
-
nirep = bin_to_uint16(header->nirep);
|
392
|
-
|
393
361
|
filenames_len = bin_to_uint16(bin);
|
394
362
|
bin += sizeof(uint16_t);
|
395
|
-
filenames = (mrb_sym*)mrb_malloc(mrb, sizeof(mrb_sym
|
363
|
+
filenames = (mrb_sym*)mrb_malloc(mrb, sizeof(mrb_sym) * filenames_len);
|
396
364
|
for(i = 0; i < filenames_len; ++i) {
|
397
365
|
uint16_t f_len = bin_to_uint16(bin);
|
398
366
|
bin += sizeof(uint16_t);
|
399
|
-
filenames[i] =
|
367
|
+
filenames[i] = mrb_intern(mrb, (const char *)bin, f_len);
|
400
368
|
bin += f_len;
|
401
369
|
}
|
402
370
|
|
403
|
-
|
404
|
-
|
405
|
-
result = read_rite_debug_record(mrb, bin, i, &len, filenames, filenames_len);
|
406
|
-
if (result != MRB_DUMP_OK) { goto debug_exit; }
|
407
|
-
bin += len;
|
408
|
-
}
|
371
|
+
result = read_debug_record(mrb, bin, irep, &len, filenames, filenames_len);
|
372
|
+
if (result != MRB_DUMP_OK) goto debug_exit;
|
409
373
|
|
374
|
+
bin += len;
|
410
375
|
if ((bin - start) != bin_to_uint32(header->section_size)) {
|
411
|
-
|
376
|
+
result = MRB_DUMP_GENERAL_FAILURE;
|
412
377
|
}
|
413
378
|
|
414
|
-
result = sirep + bin_to_uint16(header->sirep);
|
415
379
|
debug_exit:
|
416
380
|
mrb_free(mrb, filenames);
|
417
381
|
return result;
|
418
382
|
}
|
419
383
|
|
420
384
|
static int
|
421
|
-
|
385
|
+
read_binary_header(const uint8_t *bin, size_t *bin_size, uint16_t *crc)
|
422
386
|
{
|
423
387
|
const struct rite_binary_header *header = (const struct rite_binary_header *)bin;
|
424
388
|
|
@@ -438,226 +402,195 @@ read_rite_binary_header(const uint8_t *bin, size_t *bin_size, uint16_t *crc)
|
|
438
402
|
return MRB_DUMP_OK;
|
439
403
|
}
|
440
404
|
|
441
|
-
|
405
|
+
mrb_irep*
|
442
406
|
mrb_read_irep(mrb_state *mrb, const uint8_t *bin)
|
443
407
|
{
|
444
408
|
int result;
|
445
|
-
|
409
|
+
mrb_irep *irep = NULL;
|
446
410
|
const struct rite_section_header *section_header;
|
447
411
|
uint16_t crc;
|
448
412
|
size_t bin_size = 0;
|
449
413
|
size_t n;
|
450
|
-
size_t sirep;
|
451
414
|
|
452
415
|
if ((mrb == NULL) || (bin == NULL)) {
|
453
|
-
return
|
416
|
+
return NULL;
|
454
417
|
}
|
455
418
|
|
456
|
-
result =
|
419
|
+
result = read_binary_header(bin, &bin_size, &crc);
|
457
420
|
if (result != MRB_DUMP_OK) {
|
458
|
-
return
|
421
|
+
return NULL;
|
459
422
|
}
|
460
423
|
|
461
424
|
n = offset_crc_body();
|
462
425
|
if (crc != calc_crc_16_ccitt(bin + n, bin_size - n, 0)) {
|
463
|
-
return
|
426
|
+
return NULL;
|
464
427
|
}
|
465
428
|
|
466
429
|
bin += sizeof(struct rite_binary_header);
|
467
|
-
sirep = mrb->irep_len;
|
468
|
-
|
469
430
|
do {
|
470
431
|
section_header = (const struct rite_section_header *)bin;
|
471
432
|
if (memcmp(section_header->section_identify, RITE_SECTION_IREP_IDENTIFIER, sizeof(section_header->section_identify)) == 0) {
|
472
|
-
|
473
|
-
if (
|
474
|
-
return result;
|
475
|
-
}
|
476
|
-
total_nirep += result;
|
433
|
+
irep = read_section_irep(mrb, bin);
|
434
|
+
if (!irep) return NULL;
|
477
435
|
}
|
478
436
|
else if (memcmp(section_header->section_identify, RITE_SECTION_LINENO_IDENTIFIER, sizeof(section_header->section_identify)) == 0) {
|
479
|
-
|
437
|
+
if (!irep) return NULL; /* corrupted data */
|
438
|
+
result = read_section_lineno(mrb, bin, irep);
|
480
439
|
if (result < MRB_DUMP_OK) {
|
481
|
-
return
|
440
|
+
return NULL;
|
482
441
|
}
|
483
442
|
}
|
484
443
|
else if (memcmp(section_header->section_identify, RITE_SECTION_DEBUG_IDENTIFIER, sizeof(section_header->section_identify)) == 0) {
|
485
|
-
|
444
|
+
if (!irep) return NULL; /* corrupted data */
|
445
|
+
result = read_section_debug(mrb, bin, irep);
|
486
446
|
if (result < MRB_DUMP_OK) {
|
487
|
-
return
|
447
|
+
return NULL;
|
488
448
|
}
|
489
449
|
}
|
490
450
|
bin += bin_to_uint32(section_header->section_size);
|
491
451
|
} while (memcmp(section_header->section_identify, RITE_BINARY_EOF, sizeof(section_header->section_identify)) != 0);
|
492
452
|
|
493
|
-
return
|
453
|
+
return irep;
|
494
454
|
}
|
495
455
|
|
496
456
|
static void
|
497
|
-
irep_error(mrb_state *mrb
|
457
|
+
irep_error(mrb_state *mrb)
|
498
458
|
{
|
499
459
|
static const char msg[] = "irep load error";
|
500
460
|
mrb->exc = mrb_obj_ptr(mrb_exc_new(mrb, E_SCRIPT_ERROR, msg, sizeof(msg) - 1));
|
501
461
|
}
|
502
462
|
|
503
463
|
mrb_value
|
504
|
-
|
464
|
+
mrb_load_irep_cxt(mrb_state *mrb, const uint8_t *bin, mrbc_context *c)
|
505
465
|
{
|
506
|
-
|
466
|
+
mrb_irep *irep = mrb_read_irep(mrb, bin);
|
467
|
+
mrb_value val;
|
468
|
+
struct RProc *proc;
|
507
469
|
|
508
|
-
|
509
|
-
|
510
|
-
irep_error(mrb, n);
|
470
|
+
if (!irep) {
|
471
|
+
irep_error(mrb);
|
511
472
|
return mrb_nil_value();
|
512
473
|
}
|
513
|
-
|
474
|
+
proc = mrb_proc_new(mrb, irep);
|
475
|
+
mrb_irep_decref(mrb, irep);
|
476
|
+
if (c && c->no_exec) return mrb_obj_value(proc);
|
477
|
+
val = mrb_context_run(mrb, proc, mrb_top_self(mrb), 0);
|
478
|
+
return val;
|
479
|
+
}
|
480
|
+
|
481
|
+
mrb_value
|
482
|
+
mrb_load_irep(mrb_state *mrb, const uint8_t *bin)
|
483
|
+
{
|
484
|
+
return mrb_load_irep_cxt(mrb, bin, NULL);
|
514
485
|
}
|
515
486
|
|
516
487
|
#ifdef ENABLE_STDIO
|
517
488
|
|
518
|
-
static
|
519
|
-
|
489
|
+
static int
|
490
|
+
read_lineno_record_file(mrb_state *mrb, FILE *fp, mrb_irep *irep)
|
520
491
|
{
|
521
|
-
|
522
|
-
size_t
|
523
|
-
|
524
|
-
|
525
|
-
uint32_t len
|
526
|
-
|
527
|
-
|
492
|
+
uint8_t header[4];
|
493
|
+
const size_t record_header_size = sizeof(header);
|
494
|
+
int result;
|
495
|
+
size_t i, buf_size;
|
496
|
+
uint32_t len;
|
497
|
+
void *ptr;
|
498
|
+
uint8_t *buf;
|
528
499
|
|
529
|
-
|
530
|
-
if (fread(&header, sizeof(struct rite_section_lineno_header), 1, fp) == 0) {
|
500
|
+
if (fread(header, record_header_size, 1, fp) == 0) {
|
531
501
|
return MRB_DUMP_READ_FAULT;
|
532
502
|
}
|
533
|
-
|
534
|
-
|
535
|
-
|
536
|
-
buf_size = record_header_size;
|
537
|
-
/* We don't need to check buf_size. As it is enough small. */
|
538
|
-
buf = (uint8_t *)mrb_malloc(mrb, buf_size);
|
539
|
-
if (!buf) {
|
540
|
-
result = MRB_DUMP_GENERAL_FAILURE;
|
541
|
-
goto error_exit;
|
503
|
+
buf_size = bin_to_uint32(&header[0]);
|
504
|
+
if (SIZE_ERROR(buf_size)) {
|
505
|
+
return MRB_DUMP_GENERAL_FAILURE;
|
542
506
|
}
|
543
|
-
|
544
|
-
|
545
|
-
|
546
|
-
void *ptr;
|
547
|
-
|
548
|
-
if (fread(buf, record_header_size, 1, fp) == 0) {
|
549
|
-
result = MRB_DUMP_READ_FAULT;
|
550
|
-
goto error_exit;
|
551
|
-
}
|
552
|
-
buf_size = bin_to_uint32(&buf[0]);
|
553
|
-
if (SIZE_ERROR(buf_size)) {
|
554
|
-
result = MRB_DUMP_GENERAL_FAILURE;
|
555
|
-
goto error_exit;
|
556
|
-
}
|
557
|
-
ptr = mrb_realloc(mrb, buf, buf_size);
|
558
|
-
if (!ptr) {
|
559
|
-
result = MRB_DUMP_GENERAL_FAILURE;
|
560
|
-
goto error_exit;
|
561
|
-
}
|
562
|
-
buf = (uint8_t *)ptr;
|
563
|
-
|
564
|
-
if (fread(&buf[record_header_size], buf_size - record_header_size, 1, fp) == 0) {
|
565
|
-
result = MRB_DUMP_READ_FAULT;
|
566
|
-
goto error_exit;
|
567
|
-
}
|
568
|
-
result = read_rite_lineno_record(mrb, buf, i, &len);
|
569
|
-
if (result != MRB_DUMP_OK)
|
570
|
-
goto error_exit;
|
507
|
+
ptr = mrb_malloc(mrb, buf_size);
|
508
|
+
if (!ptr) {
|
509
|
+
return MRB_DUMP_GENERAL_FAILURE;
|
571
510
|
}
|
511
|
+
buf = (uint8_t *)ptr;
|
572
512
|
|
573
|
-
|
574
|
-
|
575
|
-
if (buf) {
|
576
|
-
mrb_free(mrb, buf);
|
513
|
+
if (fread(&buf[record_header_size], buf_size - record_header_size, 1, fp) == 0) {
|
514
|
+
return MRB_DUMP_READ_FAULT;
|
577
515
|
}
|
578
|
-
|
579
|
-
|
516
|
+
result = read_lineno_record_1(mrb, buf, irep, &len);
|
517
|
+
mrb_free(mrb, ptr);
|
518
|
+
if (result != MRB_DUMP_OK) return result;
|
519
|
+
for (i = 0; i < irep->rlen; i++) {
|
520
|
+
result = read_lineno_record_file(mrb, fp, irep->reps[i]);
|
521
|
+
if (result != MRB_DUMP_OK) break;
|
580
522
|
}
|
581
523
|
return result;
|
582
524
|
}
|
583
525
|
|
584
526
|
static int32_t
|
585
|
-
|
527
|
+
read_section_lineno_file(mrb_state *mrb, FILE *fp, mrb_irep *irep)
|
586
528
|
{
|
587
|
-
|
588
|
-
size_t sirep;
|
589
|
-
uint16_t nirep;
|
590
|
-
uint16_t n;
|
591
|
-
uint32_t len, buf_size;
|
592
|
-
uint8_t *buf = NULL;
|
593
|
-
const size_t record_header_size = 1 + 4;
|
594
|
-
struct rite_section_irep_header header;
|
529
|
+
struct rite_section_lineno_header header;
|
595
530
|
|
596
|
-
if (fread(&header, sizeof(struct
|
531
|
+
if (fread(&header, sizeof(struct rite_section_lineno_header), 1, fp) == 0) {
|
597
532
|
return MRB_DUMP_READ_FAULT;
|
598
533
|
}
|
599
534
|
|
600
|
-
sirep = mrb->irep_len;
|
601
|
-
nirep = bin_to_uint16(header.nirep);
|
602
|
-
|
603
|
-
buf_size = record_header_size;
|
604
|
-
/* You don't need use SIZE_ERROR as buf_size is enough small. */
|
605
|
-
buf = (uint8_t *)mrb_malloc(mrb, buf_size);
|
606
|
-
if (!buf) {
|
607
|
-
result = MRB_DUMP_GENERAL_FAILURE;
|
608
|
-
goto error_exit;
|
609
|
-
}
|
610
|
-
|
611
535
|
//Read Binary Data Section
|
612
|
-
|
613
|
-
|
536
|
+
return read_lineno_record_file(mrb, fp, irep);
|
537
|
+
}
|
614
538
|
|
615
|
-
|
616
|
-
|
617
|
-
|
618
|
-
|
619
|
-
|
620
|
-
|
621
|
-
|
622
|
-
|
623
|
-
|
624
|
-
|
625
|
-
if (!ptr) {
|
626
|
-
result = MRB_DUMP_GENERAL_FAILURE;
|
627
|
-
goto error_exit;
|
628
|
-
}
|
629
|
-
buf = (uint8_t *)ptr;
|
539
|
+
static mrb_irep*
|
540
|
+
read_irep_record_file(mrb_state *mrb, FILE *fp)
|
541
|
+
{
|
542
|
+
uint8_t header[1 + 4];
|
543
|
+
const size_t record_header_size = sizeof(header);
|
544
|
+
size_t buf_size, i;
|
545
|
+
uint32_t len;
|
546
|
+
mrb_irep *irep = NULL;
|
547
|
+
void *ptr;
|
548
|
+
uint8_t *buf;
|
630
549
|
|
631
|
-
|
632
|
-
|
633
|
-
goto error_exit;
|
634
|
-
}
|
635
|
-
result = read_rite_irep_record(mrb, buf, &len);
|
636
|
-
if (result != MRB_DUMP_OK)
|
637
|
-
goto error_exit;
|
550
|
+
if (fread(header, record_header_size, 1, fp) == 0) {
|
551
|
+
return NULL;
|
638
552
|
}
|
639
|
-
|
640
|
-
|
641
|
-
|
642
|
-
if (buf) {
|
643
|
-
mrb_free(mrb, buf);
|
553
|
+
buf_size = bin_to_uint32(&header[0]);
|
554
|
+
if (SIZE_ERROR(buf_size)) {
|
555
|
+
return NULL;
|
644
556
|
}
|
645
|
-
|
646
|
-
|
557
|
+
ptr = mrb_malloc(mrb, buf_size);
|
558
|
+
if (!ptr) return NULL;
|
559
|
+
buf = (uint8_t *)ptr;
|
560
|
+
memcpy(buf, header, record_header_size);
|
561
|
+
if (fread(&buf[record_header_size], buf_size - record_header_size, 1, fp) == 0) {
|
562
|
+
return NULL;
|
647
563
|
}
|
648
|
-
|
564
|
+
irep = read_irep_record_1(mrb, buf, &len);
|
565
|
+
mrb_free(mrb, ptr);
|
566
|
+
if (!irep) return NULL;
|
567
|
+
for (i=0; i<irep->rlen; i++) {
|
568
|
+
irep->reps[i] = read_irep_record_file(mrb, fp);
|
569
|
+
if (!irep->reps[i]) return NULL;
|
570
|
+
}
|
571
|
+
return irep;
|
649
572
|
}
|
650
573
|
|
651
|
-
|
574
|
+
static mrb_irep*
|
575
|
+
read_section_irep_file(mrb_state *mrb, FILE *fp)
|
576
|
+
{
|
577
|
+
struct rite_section_irep_header header;
|
578
|
+
|
579
|
+
if (fread(&header, sizeof(struct rite_section_irep_header), 1, fp) == 0) {
|
580
|
+
return NULL;
|
581
|
+
}
|
582
|
+
return read_irep_record_file(mrb, fp);
|
583
|
+
}
|
584
|
+
|
585
|
+
mrb_irep*
|
652
586
|
mrb_read_irep_file(mrb_state *mrb, FILE* fp)
|
653
587
|
{
|
588
|
+
mrb_irep *irep = NULL;
|
654
589
|
int result;
|
655
|
-
int32_t total_nirep = 0;
|
656
590
|
uint8_t *buf;
|
657
591
|
uint16_t crc, crcwk = 0;
|
658
592
|
uint32_t section_size = 0;
|
659
593
|
size_t nbytes;
|
660
|
-
size_t sirep;
|
661
594
|
struct rite_section_header section_header;
|
662
595
|
long fpos;
|
663
596
|
size_t block_size = 1 << 14;
|
@@ -666,22 +599,22 @@ mrb_read_irep_file(mrb_state *mrb, FILE* fp)
|
|
666
599
|
const size_t buf_size = sizeof(struct rite_binary_header);
|
667
600
|
|
668
601
|
if ((mrb == NULL) || (fp == NULL)) {
|
669
|
-
return
|
602
|
+
return NULL;
|
670
603
|
}
|
671
604
|
|
672
605
|
/* You don't need use SIZE_ERROR as buf_size is enough small. */
|
673
606
|
buf = mrb_malloc(mrb, buf_size);
|
674
607
|
if (!buf) {
|
675
|
-
return
|
608
|
+
return NULL;
|
676
609
|
}
|
677
610
|
if (fread(buf, buf_size, 1, fp) == 0) {
|
678
611
|
mrb_free(mrb, buf);
|
679
|
-
return
|
612
|
+
return NULL;
|
680
613
|
}
|
681
|
-
result =
|
614
|
+
result = read_binary_header(buf, NULL, &crc);
|
682
615
|
mrb_free(mrb, buf);
|
683
616
|
if (result != MRB_DUMP_OK) {
|
684
|
-
return
|
617
|
+
return NULL;
|
685
618
|
}
|
686
619
|
|
687
620
|
/* verify CRC */
|
@@ -692,7 +625,7 @@ mrb_read_irep_file(mrb_state *mrb, FILE* fp)
|
|
692
625
|
if (buf) break;
|
693
626
|
}
|
694
627
|
if (!buf) {
|
695
|
-
return
|
628
|
+
return NULL;
|
696
629
|
}
|
697
630
|
fseek(fp, offset_crc_body(), SEEK_SET);
|
698
631
|
while ((nbytes = fread(buf, 1, block_size, fp)) > 0) {
|
@@ -700,66 +633,75 @@ mrb_read_irep_file(mrb_state *mrb, FILE* fp)
|
|
700
633
|
}
|
701
634
|
mrb_free(mrb, buf);
|
702
635
|
if (nbytes == 0 && ferror(fp)) {
|
703
|
-
return
|
636
|
+
return NULL;
|
704
637
|
}
|
705
638
|
if (crcwk != crc) {
|
706
|
-
return
|
639
|
+
return NULL;
|
707
640
|
}
|
708
641
|
fseek(fp, fpos + section_size, SEEK_SET);
|
709
|
-
sirep = mrb->irep_len;
|
710
642
|
|
711
643
|
// read sections
|
712
644
|
do {
|
713
645
|
fpos = ftell(fp);
|
714
646
|
if (fread(§ion_header, sizeof(struct rite_section_header), 1, fp) == 0) {
|
715
|
-
return
|
647
|
+
return NULL;
|
716
648
|
}
|
717
649
|
section_size = bin_to_uint32(section_header.section_size);
|
718
650
|
|
719
651
|
if (memcmp(section_header.section_identify, RITE_SECTION_IREP_IDENTIFIER, sizeof(section_header.section_identify)) == 0) {
|
720
652
|
fseek(fp, fpos, SEEK_SET);
|
721
|
-
|
722
|
-
if (
|
723
|
-
return result;
|
724
|
-
}
|
725
|
-
total_nirep += result;
|
653
|
+
irep = read_section_irep_file(mrb, fp);
|
654
|
+
if (!irep) return NULL;
|
726
655
|
}
|
727
656
|
else if (memcmp(section_header.section_identify, RITE_SECTION_LINENO_IDENTIFIER, sizeof(section_header.section_identify)) == 0) {
|
657
|
+
if (!irep) return NULL; /* corrupted data */
|
728
658
|
fseek(fp, fpos, SEEK_SET);
|
729
|
-
result =
|
730
|
-
if (result < MRB_DUMP_OK)
|
731
|
-
return result;
|
732
|
-
}
|
659
|
+
result = read_section_lineno_file(mrb, fp, irep);
|
660
|
+
if (result < MRB_DUMP_OK) return NULL;
|
733
661
|
}
|
734
662
|
else if (memcmp(section_header.section_identify, RITE_SECTION_DEBUG_IDENTIFIER, sizeof(section_header.section_identify)) == 0) {
|
735
|
-
|
736
|
-
|
737
|
-
|
663
|
+
if (!irep) return NULL; /* corrupted data */
|
664
|
+
else {
|
665
|
+
uint8_t* const bin = mrb_malloc(mrb, section_size);
|
666
|
+
|
667
|
+
fseek(fp, fpos, SEEK_SET);
|
668
|
+
if(fread((char*)bin, section_size, 1, fp) != 1) {
|
669
|
+
mrb_free(mrb, bin);
|
670
|
+
return NULL;
|
671
|
+
}
|
672
|
+
result = read_section_debug(mrb, bin, irep);
|
738
673
|
mrb_free(mrb, bin);
|
739
|
-
return MRB_DUMP_READ_FAULT;
|
740
|
-
}
|
741
|
-
result = read_rite_section_debug(mrb, bin, sirep);
|
742
|
-
mrb_free(mrb, bin);
|
743
|
-
if (result < MRB_DUMP_OK) {
|
744
|
-
return result;
|
745
674
|
}
|
675
|
+
if (result < MRB_DUMP_OK) return NULL;
|
746
676
|
}
|
747
677
|
|
748
678
|
fseek(fp, fpos + section_size, SEEK_SET);
|
749
679
|
} while (memcmp(section_header.section_identify, RITE_BINARY_EOF, sizeof(section_header.section_identify)) != 0);
|
750
680
|
|
751
|
-
return
|
681
|
+
return irep;
|
752
682
|
}
|
753
683
|
|
754
684
|
mrb_value
|
755
|
-
|
685
|
+
mrb_load_irep_file_cxt(mrb_state *mrb, FILE* fp, mrbc_context *c)
|
756
686
|
{
|
757
|
-
|
687
|
+
mrb_irep *irep = mrb_read_irep_file(mrb, fp);
|
688
|
+
mrb_value val;
|
689
|
+
struct RProc *proc;
|
758
690
|
|
759
|
-
if (
|
760
|
-
irep_error(mrb
|
691
|
+
if (!irep) {
|
692
|
+
irep_error(mrb);
|
761
693
|
return mrb_nil_value();
|
762
694
|
}
|
763
|
-
|
695
|
+
proc = mrb_proc_new(mrb, irep);
|
696
|
+
mrb_irep_decref(mrb, irep);
|
697
|
+
if (c && c->no_exec) return mrb_obj_value(proc);
|
698
|
+
val = mrb_context_run(mrb, proc, mrb_top_self(mrb), 0);
|
699
|
+
return val;
|
700
|
+
}
|
701
|
+
|
702
|
+
mrb_value
|
703
|
+
mrb_load_irep_file(mrb_state *mrb, FILE* fp)
|
704
|
+
{
|
705
|
+
return mrb_load_irep_file_cxt(mrb, fp, NULL);
|
764
706
|
}
|
765
707
|
#endif /* ENABLE_STDIO */
|