script_core 0.2.5 → 0.2.6
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/README.md +7 -1
- data/ext/enterprise_script_service/libseccomp/.travis.yml +3 -5
- data/ext/enterprise_script_service/libseccomp/CHANGELOG +10 -0
- data/ext/enterprise_script_service/libseccomp/CREDITS +3 -0
- data/ext/enterprise_script_service/libseccomp/README.md +18 -0
- data/ext/enterprise_script_service/libseccomp/configure.ac +1 -1
- data/ext/enterprise_script_service/libseccomp/include/seccomp-syscalls.h +7 -0
- data/ext/enterprise_script_service/libseccomp/src/arch-s390-syscalls.c +16 -0
- data/ext/enterprise_script_service/libseccomp/src/arch-s390x-syscalls.c +16 -0
- data/ext/enterprise_script_service/libseccomp/tests/.gitignore +1 -0
- data/ext/enterprise_script_service/libseccomp/tests/15-basic-resolver.c +3 -3
- data/ext/enterprise_script_service/libseccomp/tests/52-basic-load.c +48 -0
- data/ext/enterprise_script_service/libseccomp/tests/52-basic-load.py +38 -0
- data/ext/enterprise_script_service/libseccomp/tests/52-basic-load.tests +11 -0
- data/ext/enterprise_script_service/libseccomp/tests/Makefile.am +6 -3
- data/ext/enterprise_script_service/libseccomp/tests/regression +4 -0
- data/ext/enterprise_script_service/libseccomp/tools/Makefile.am +0 -3
- data/ext/enterprise_script_service/libseccomp/tools/scmp_bpf_sim.c +2 -0
- data/ext/enterprise_script_service/mruby/.github/workflows/build.yml +106 -0
- data/ext/enterprise_script_service/mruby/.github/workflows/main.yml +24 -0
- data/ext/enterprise_script_service/mruby/.gitignore +3 -0
- data/ext/enterprise_script_service/mruby/.travis.yml +6 -9
- data/ext/enterprise_script_service/mruby/AUTHORS +1 -0
- data/ext/enterprise_script_service/mruby/Doxyfile +1 -1
- data/ext/enterprise_script_service/mruby/LICENSE +1 -1
- data/ext/enterprise_script_service/mruby/README.md +6 -2
- data/ext/enterprise_script_service/mruby/appveyor.yml +9 -12
- data/ext/enterprise_script_service/mruby/appveyor_config.rb +9 -0
- data/ext/enterprise_script_service/mruby/build_config.rb +6 -6
- data/ext/enterprise_script_service/mruby/doc/guides/compile.md +6 -2
- data/ext/enterprise_script_service/mruby/doc/guides/debugger.md +1 -1
- data/ext/enterprise_script_service/mruby/doc/guides/mrbconf.md +4 -8
- data/ext/enterprise_script_service/mruby/doc/limitations.md +10 -10
- data/ext/enterprise_script_service/mruby/doc/opcode.md +108 -95
- data/ext/enterprise_script_service/mruby/examples/targets/build_config_ArduinoDue.rb +2 -2
- data/ext/enterprise_script_service/mruby/examples/targets/build_config_IntelEdison.rb +2 -2
- data/ext/enterprise_script_service/mruby/examples/targets/build_config_IntelGalileo.rb +2 -2
- data/ext/enterprise_script_service/mruby/examples/targets/build_config_RX630.rb +2 -2
- data/ext/enterprise_script_service/mruby/examples/targets/build_config_chipKITMax32.rb +2 -2
- data/ext/enterprise_script_service/mruby/examples/targets/build_config_dreamcast_shelf.rb +108 -0
- data/ext/enterprise_script_service/mruby/include/mrbconf.h +10 -7
- data/ext/enterprise_script_service/mruby/include/mruby.h +11 -9
- data/ext/enterprise_script_service/mruby/include/mruby/array.h +4 -0
- data/ext/enterprise_script_service/mruby/include/mruby/boxing_nan.h +11 -2
- data/ext/enterprise_script_service/mruby/include/mruby/boxing_word.h +0 -9
- data/ext/enterprise_script_service/mruby/include/mruby/common.h +10 -0
- data/ext/enterprise_script_service/mruby/include/mruby/compile.h +11 -3
- data/ext/enterprise_script_service/mruby/include/mruby/dump.h +1 -17
- data/ext/enterprise_script_service/mruby/include/mruby/irep.h +10 -0
- data/ext/enterprise_script_service/mruby/include/mruby/istruct.h +4 -1
- data/ext/enterprise_script_service/mruby/include/mruby/khash.h +23 -5
- data/ext/enterprise_script_service/mruby/include/mruby/numeric.h +1 -0
- data/ext/enterprise_script_service/mruby/include/mruby/ops.h +3 -2
- data/ext/enterprise_script_service/mruby/include/mruby/string.h +2 -1
- data/ext/enterprise_script_service/mruby/include/mruby/value.h +7 -12
- data/ext/enterprise_script_service/mruby/include/mruby/version.h +4 -4
- data/ext/enterprise_script_service/mruby/lib/mruby/build.rb +2 -30
- data/ext/enterprise_script_service/mruby/lib/mruby/build/command.rb +21 -46
- data/ext/enterprise_script_service/mruby/lib/mruby/gem.rb +9 -0
- data/ext/enterprise_script_service/mruby/lib/mruby/source.rb +3 -1
- data/ext/enterprise_script_service/mruby/mrbgems/default.gembox +7 -0
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-array-ext/mrblib/array.rb +0 -31
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-array-ext/test/array.rb +0 -13
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-config/mrbgem.rake +5 -2
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/mrdb.c +0 -1
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/mrdbconf.h +5 -1
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb.c +5 -1
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-mrbc/tools/mrbc/mrbc.c +7 -11
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-mruby/mrbgem.rake +0 -1
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-mruby/tools/mruby/mruby.c +6 -2
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-strip/tools/mruby-strip/mruby-strip.c +6 -2
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-class-ext/src/class.c +6 -1
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-compiler/core/codegen.c +76 -48
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-compiler/core/parse.y +107 -32
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-compiler/core/y.tab.c +13153 -0
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-compiler/mrbgem.rake +13 -15
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-error/src/exception.c +3 -3
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-eval/src/eval.c +2 -213
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-eval/test/eval.rb +21 -0
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-hash-ext/src/hash-ext.c +1 -3
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-io/include/mruby/ext/io.h +39 -7
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-io/mrbgem.rake +2 -8
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-io/mrblib/file_constants.rb +0 -16
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-io/mrblib/io.rb +7 -12
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-io/src/file.c +76 -30
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-io/src/file_test.c +9 -10
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-io/src/io.c +323 -120
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-io/test/file.rb +18 -12
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-io/test/io.rb +32 -0
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-io/test/mruby_io_test.c +57 -49
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-metaprog/src/metaprog.c +15 -17
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-metaprog/test/metaprog.rb +9 -0
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-method/src/method.c +1 -1
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-object-ext/src/object.c +3 -12
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-pack/src/pack.c +113 -10
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-print/src/print.c +5 -1
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-proc-ext/src/proc.c +2 -2
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-rational/src/rational.c +9 -9
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-sleep/src/mrb_sleep.c +1 -1
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-socket/mrbgem.rake +1 -1
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-socket/test/sockettest.c +3 -2
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-sprintf/src/sprintf.c +61 -24
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-sprintf/test/sprintf.rb +5 -23
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-string-ext/src/string.c +3 -3
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-symbol-ext/src/symbol.c +1 -1
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-test/mrbgem.rake +1 -0
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-time/src/time.c +6 -5
- data/ext/enterprise_script_service/mruby/mrblib/hash.rb +3 -3
- data/ext/enterprise_script_service/mruby/src/array.c +11 -0
- data/ext/enterprise_script_service/mruby/src/backtrace.c +2 -2
- data/ext/enterprise_script_service/mruby/src/class.c +26 -11
- data/ext/enterprise_script_service/mruby/src/codedump.c +4 -0
- data/ext/enterprise_script_service/mruby/src/debug.c +8 -5
- data/ext/enterprise_script_service/mruby/src/dump.c +3 -65
- data/ext/enterprise_script_service/mruby/src/error.c +57 -5
- data/ext/enterprise_script_service/mruby/src/etc.c +13 -4
- data/ext/enterprise_script_service/mruby/src/fmt_fp.c +98 -21
- data/ext/enterprise_script_service/mruby/src/gc.c +10 -275
- data/ext/enterprise_script_service/mruby/src/hash.c +5 -6
- data/ext/enterprise_script_service/mruby/src/kernel.c +2 -2
- data/ext/enterprise_script_service/mruby/src/load.c +56 -30
- data/ext/enterprise_script_service/mruby/src/numeric.c +22 -10
- data/ext/enterprise_script_service/mruby/src/object.c +12 -4
- data/ext/enterprise_script_service/mruby/src/print.c +27 -3
- data/ext/enterprise_script_service/mruby/src/proc.c +21 -1
- data/ext/enterprise_script_service/mruby/src/state.c +34 -11
- data/ext/enterprise_script_service/mruby/src/string.c +69 -35
- data/ext/enterprise_script_service/mruby/src/symbol.c +12 -10
- data/ext/enterprise_script_service/mruby/src/vm.c +21 -30
- data/ext/enterprise_script_service/mruby/tasks/gitlab.rake +19 -22
- data/ext/enterprise_script_service/mruby/tasks/mrbgems.rake +1 -1
- data/ext/enterprise_script_service/mruby/tasks/toolchains/android.rake +46 -1
- data/ext/enterprise_script_service/mruby/tasks/toolchains/gcc.rake +3 -3
- data/ext/enterprise_script_service/mruby/tasks/toolchains/openwrt.rake +6 -6
- data/ext/enterprise_script_service/mruby/tasks/toolchains/visualcpp.rake +8 -8
- data/ext/enterprise_script_service/mruby/test/assert.rb +5 -4
- data/ext/enterprise_script_service/mruby/test/t/ensure.rb +8 -26
- data/ext/enterprise_script_service/mruby/test/t/exception.rb +2 -2
- data/ext/enterprise_script_service/mruby/test/t/kernel.rb +8 -24
- data/ext/enterprise_script_service/mruby/travis_config.rb +0 -14
- data/ext/enterprise_script_service/msgpack/.github/depends/boost.sh +56 -0
- data/ext/enterprise_script_service/msgpack/.github/workflows/coverage.yml +62 -0
- data/ext/enterprise_script_service/msgpack/.github/workflows/gha.yml +304 -0
- data/ext/enterprise_script_service/msgpack/CHANGELOG.md +11 -0
- data/ext/enterprise_script_service/msgpack/CMakeLists.txt +82 -39
- data/ext/enterprise_script_service/msgpack/Files.cmake +22 -12
- data/ext/enterprise_script_service/msgpack/QUICKSTART-C.md +26 -29
- data/ext/enterprise_script_service/msgpack/README.md +3 -2
- data/ext/enterprise_script_service/msgpack/appveyor.yml +6 -2
- data/ext/enterprise_script_service/msgpack/ci/build_cmake.sh +3 -1
- data/ext/enterprise_script_service/msgpack/cmake/CodeCoverage.cmake +55 -0
- data/ext/enterprise_script_service/msgpack/codecov.yml +36 -0
- data/ext/enterprise_script_service/msgpack/example/CMakeLists.txt +9 -5
- data/ext/enterprise_script_service/msgpack/example/boost/CMakeLists.txt +1 -1
- data/ext/enterprise_script_service/msgpack/example/c/CMakeLists.txt +17 -6
- data/ext/enterprise_script_service/msgpack/example/c/boundary.c +296 -0
- data/ext/enterprise_script_service/msgpack/example/c/jsonconv.c +419 -0
- data/ext/enterprise_script_service/msgpack/example/c/simple_c.c +1 -1
- data/ext/enterprise_script_service/msgpack/example/cpp03/CMakeLists.txt +3 -3
- data/ext/enterprise_script_service/msgpack/example/cpp11/CMakeLists.txt +2 -2
- data/ext/enterprise_script_service/msgpack/example/x3/CMakeLists.txt +2 -2
- data/ext/enterprise_script_service/msgpack/include/msgpack/pack.h +24 -1
- data/ext/enterprise_script_service/msgpack/include/msgpack/v1/adaptor/array_ref.hpp +5 -4
- data/ext/enterprise_script_service/msgpack/include/msgpack/v1/adaptor/boost/optional.hpp +4 -4
- data/ext/enterprise_script_service/msgpack/include/msgpack/v1/adaptor/cpp17/vector_byte.hpp +8 -8
- data/ext/enterprise_script_service/msgpack/include/msgpack/v1/adaptor/map.hpp +4 -4
- data/ext/enterprise_script_service/msgpack/include/msgpack/v1/adaptor/vector.hpp +4 -4
- data/ext/enterprise_script_service/msgpack/include/msgpack/v1/adaptor/vector_char.hpp +8 -8
- data/ext/enterprise_script_service/msgpack/include/msgpack/v1/adaptor/vector_unsigned_char.hpp +8 -8
- data/ext/enterprise_script_service/msgpack/include/msgpack/v1/adaptor/wstring.hpp +4 -4
- data/ext/enterprise_script_service/msgpack/include/msgpack/v3/unpack.hpp +6 -6
- data/ext/enterprise_script_service/msgpack/include/msgpack/version_master.h +2 -2
- data/ext/enterprise_script_service/msgpack/include/msgpack/zbuffer.h +4 -4
- data/ext/enterprise_script_service/msgpack/make_file_list.sh +38 -11
- data/ext/enterprise_script_service/msgpack/src/vrefbuffer.c +6 -0
- data/ext/enterprise_script_service/msgpack/test/CMakeLists.txt +86 -64
- data/ext/enterprise_script_service/msgpack/test/array_ref.cpp +4 -0
- data/ext/enterprise_script_service/msgpack/test/boost_fusion.cpp +4 -0
- data/ext/enterprise_script_service/msgpack/test/boost_optional.cpp +4 -0
- data/ext/enterprise_script_service/msgpack/test/boost_string_ref.cpp +4 -1
- data/ext/enterprise_script_service/msgpack/test/boost_string_view.cpp +4 -0
- data/ext/enterprise_script_service/msgpack/test/boost_variant.cpp +4 -0
- data/ext/enterprise_script_service/msgpack/test/buffer.cpp +4 -47
- data/ext/enterprise_script_service/msgpack/test/buffer_c.cpp +148 -0
- data/ext/enterprise_script_service/msgpack/test/carray.cpp +4 -0
- data/ext/enterprise_script_service/msgpack/test/cases.cpp +8 -4
- data/ext/enterprise_script_service/msgpack/test/convert.cpp +8 -4
- data/ext/enterprise_script_service/msgpack/test/fixint.cpp +4 -0
- data/ext/enterprise_script_service/msgpack/test/fixint_c.cpp +4 -0
- data/ext/enterprise_script_service/msgpack/test/fuzz_unpack_pack_fuzzer_cpp11.cpp +4 -0
- data/ext/enterprise_script_service/msgpack/test/iterator_cpp11.cpp +4 -0
- data/ext/enterprise_script_service/msgpack/test/json.cpp +4 -0
- data/ext/enterprise_script_service/msgpack/test/limit.cpp +8 -4
- data/ext/enterprise_script_service/msgpack/test/msgpack_basic.cpp +4 -0
- data/ext/enterprise_script_service/msgpack/test/msgpack_c.cpp +159 -0
- data/ext/enterprise_script_service/msgpack/test/msgpack_container.cpp +4 -0
- data/ext/enterprise_script_service/msgpack/test/msgpack_cpp11.cpp +32 -27
- data/ext/enterprise_script_service/msgpack/test/msgpack_cpp17.cpp +4 -0
- data/ext/enterprise_script_service/msgpack/test/msgpack_stream.cpp +4 -0
- data/ext/enterprise_script_service/msgpack/test/msgpack_tuple.cpp +4 -1
- data/ext/enterprise_script_service/msgpack/test/msgpack_vref.cpp +4 -0
- data/ext/enterprise_script_service/msgpack/test/msgpack_x3_parse.cpp +4 -0
- data/ext/enterprise_script_service/msgpack/test/object.cpp +4 -1
- data/ext/enterprise_script_service/msgpack/test/object_with_zone.cpp +12 -8
- data/ext/enterprise_script_service/msgpack/test/pack_unpack.cpp +30 -26
- data/ext/enterprise_script_service/msgpack/test/pack_unpack_c.cpp +4 -0
- data/ext/enterprise_script_service/msgpack/test/raw.cpp +4 -0
- data/ext/enterprise_script_service/msgpack/test/reference.cpp +4 -0
- data/ext/enterprise_script_service/msgpack/test/reference_cpp11.cpp +4 -0
- data/ext/enterprise_script_service/msgpack/test/reference_wrapper_cpp11.cpp +4 -0
- data/ext/enterprise_script_service/msgpack/test/shared_ptr_cpp11.cpp +4 -0
- data/ext/enterprise_script_service/msgpack/test/size_equal_only.cpp +4 -0
- data/ext/enterprise_script_service/msgpack/test/streaming.cpp +8 -4
- data/ext/enterprise_script_service/msgpack/test/streaming_c.cpp +4 -0
- data/ext/enterprise_script_service/msgpack/test/unique_ptr_cpp11.cpp +4 -0
- data/ext/enterprise_script_service/msgpack/test/user_class.cpp +16 -12
- data/ext/enterprise_script_service/msgpack/test/version.cpp +4 -0
- data/ext/enterprise_script_service/msgpack/test/visitor.cpp +4 -0
- data/ext/enterprise_script_service/msgpack/test/zone.cpp +4 -0
- data/lib/script_core/version.rb +1 -1
- data/script_core.gemspec +1 -1
- metadata +23 -9
- data/ext/enterprise_script_service/msgpack/.travis.yml +0 -258
|
@@ -201,6 +201,8 @@ gettimeofday_time(void)
|
|
|
201
201
|
|
|
202
202
|
#define objects(p) ((RVALUE *)p->objects)
|
|
203
203
|
|
|
204
|
+
mrb_noreturn void mrb_raise_nomemory(mrb_state *mrb);
|
|
205
|
+
|
|
204
206
|
MRB_API void*
|
|
205
207
|
mrb_realloc_simple(mrb_state *mrb, void *p, size_t len)
|
|
206
208
|
{
|
|
@@ -224,12 +226,12 @@ mrb_realloc(mrb_state *mrb, void *p, size_t len)
|
|
|
224
226
|
if (len == 0) return p2;
|
|
225
227
|
if (p2 == NULL) {
|
|
226
228
|
if (mrb->gc.out_of_memory) {
|
|
227
|
-
|
|
229
|
+
mrb_raise_nomemory(mrb);
|
|
228
230
|
/* mrb_panic(mrb); */
|
|
229
231
|
}
|
|
230
232
|
else {
|
|
231
233
|
mrb->gc.out_of_memory = TRUE;
|
|
232
|
-
|
|
234
|
+
mrb_raise_nomemory(mrb);
|
|
233
235
|
}
|
|
234
236
|
}
|
|
235
237
|
else {
|
|
@@ -958,13 +960,12 @@ root_scan_phase(mrb_state *mrb, mrb_gc *gc)
|
|
|
958
960
|
}
|
|
959
961
|
}
|
|
960
962
|
|
|
963
|
+
/* rough estimation of number of GC marks (non recursive) */
|
|
961
964
|
static size_t
|
|
962
|
-
|
|
965
|
+
gc_gray_counts(mrb_state *mrb, mrb_gc *gc, struct RBasic *obj)
|
|
963
966
|
{
|
|
964
967
|
size_t children = 0;
|
|
965
968
|
|
|
966
|
-
gc_mark_children(mrb, gc, obj);
|
|
967
|
-
|
|
968
969
|
switch (obj->tt) {
|
|
969
970
|
case MRB_TT_ICLASS:
|
|
970
971
|
children++;
|
|
@@ -1062,7 +1063,9 @@ incremental_marking_phase(mrb_state *mrb, mrb_gc *gc, size_t limit)
|
|
|
1062
1063
|
size_t tried_marks = 0;
|
|
1063
1064
|
|
|
1064
1065
|
while (gc->gray_list && tried_marks < limit) {
|
|
1065
|
-
|
|
1066
|
+
struct RBasic *obj = gc->gray_list;
|
|
1067
|
+
gc_mark_children(mrb, gc, obj);
|
|
1068
|
+
tried_marks += gc_gray_counts(mrb, gc, obj);
|
|
1066
1069
|
}
|
|
1067
1070
|
|
|
1068
1071
|
return tried_marks;
|
|
@@ -1294,6 +1297,7 @@ mrb_full_gc(mrb_state *mrb)
|
|
|
1294
1297
|
{
|
|
1295
1298
|
mrb_gc *gc = &mrb->gc;
|
|
1296
1299
|
|
|
1300
|
+
if (!mrb->c) return;
|
|
1297
1301
|
if (gc->disabled || gc->iterating) return;
|
|
1298
1302
|
|
|
1299
1303
|
GC_INVOKE_TIME_REPORT("mrb_full_gc()");
|
|
@@ -1632,272 +1636,3 @@ mrb_init_gc(mrb_state *mrb)
|
|
|
1632
1636
|
#endif
|
|
1633
1637
|
#endif
|
|
1634
1638
|
}
|
|
1635
|
-
|
|
1636
|
-
#ifdef GC_TEST
|
|
1637
|
-
#ifdef GC_DEBUG
|
|
1638
|
-
void
|
|
1639
|
-
test_mrb_field_write_barrier(void)
|
|
1640
|
-
{
|
|
1641
|
-
mrb_state *mrb = mrb_open();
|
|
1642
|
-
struct RBasic *obj, *value;
|
|
1643
|
-
mrb_gc *gc = &mrb->gc;
|
|
1644
|
-
|
|
1645
|
-
puts("test_mrb_field_write_barrier");
|
|
1646
|
-
gc->generational = FALSE;
|
|
1647
|
-
obj = mrb_basic_ptr(mrb_ary_new(mrb));
|
|
1648
|
-
value = mrb_basic_ptr(mrb_str_new_lit(mrb, "value"));
|
|
1649
|
-
paint_black(obj);
|
|
1650
|
-
paint_partial_white(gc, value);
|
|
1651
|
-
|
|
1652
|
-
|
|
1653
|
-
puts(" in MRB_GC_STATE_MARK");
|
|
1654
|
-
gc->state = MRB_GC_STATE_MARK;
|
|
1655
|
-
mrb_field_write_barrier(mrb, obj, value);
|
|
1656
|
-
|
|
1657
|
-
mrb_assert(is_gray(value));
|
|
1658
|
-
|
|
1659
|
-
|
|
1660
|
-
puts(" in MRB_GC_STATE_SWEEP");
|
|
1661
|
-
paint_partial_white(gc, value);
|
|
1662
|
-
gc->state = MRB_GC_STATE_SWEEP;
|
|
1663
|
-
mrb_field_write_barrier(mrb, obj, value);
|
|
1664
|
-
|
|
1665
|
-
mrb_assert(obj->color & gc->current_white_part);
|
|
1666
|
-
mrb_assert(value->color & gc->current_white_part);
|
|
1667
|
-
|
|
1668
|
-
|
|
1669
|
-
puts(" fail with black");
|
|
1670
|
-
gc->state = MRB_GC_STATE_MARK;
|
|
1671
|
-
paint_white(obj);
|
|
1672
|
-
paint_partial_white(gc, value);
|
|
1673
|
-
mrb_field_write_barrier(mrb, obj, value);
|
|
1674
|
-
|
|
1675
|
-
mrb_assert(obj->color & gc->current_white_part);
|
|
1676
|
-
|
|
1677
|
-
|
|
1678
|
-
puts(" fail with gray");
|
|
1679
|
-
gc->state = MRB_GC_STATE_MARK;
|
|
1680
|
-
paint_black(obj);
|
|
1681
|
-
paint_gray(value);
|
|
1682
|
-
mrb_field_write_barrier(mrb, obj, value);
|
|
1683
|
-
|
|
1684
|
-
mrb_assert(is_gray(value));
|
|
1685
|
-
|
|
1686
|
-
|
|
1687
|
-
{
|
|
1688
|
-
puts("test_mrb_field_write_barrier_value");
|
|
1689
|
-
obj = mrb_basic_ptr(mrb_ary_new(mrb));
|
|
1690
|
-
mrb_value value = mrb_str_new_lit(mrb, "value");
|
|
1691
|
-
paint_black(obj);
|
|
1692
|
-
paint_partial_white(gc, mrb_basic_ptr(value));
|
|
1693
|
-
|
|
1694
|
-
gc->state = MRB_GC_STATE_MARK;
|
|
1695
|
-
mrb_field_write_barrier_value(mrb, obj, value);
|
|
1696
|
-
|
|
1697
|
-
mrb_assert(is_gray(mrb_basic_ptr(value)));
|
|
1698
|
-
}
|
|
1699
|
-
|
|
1700
|
-
mrb_close(mrb);
|
|
1701
|
-
}
|
|
1702
|
-
|
|
1703
|
-
void
|
|
1704
|
-
test_mrb_write_barrier(void)
|
|
1705
|
-
{
|
|
1706
|
-
mrb_state *mrb = mrb_open();
|
|
1707
|
-
struct RBasic *obj;
|
|
1708
|
-
mrb_gc *gc = &mrb->gc;
|
|
1709
|
-
|
|
1710
|
-
puts("test_mrb_write_barrier");
|
|
1711
|
-
obj = mrb_basic_ptr(mrb_ary_new(mrb));
|
|
1712
|
-
paint_black(obj);
|
|
1713
|
-
|
|
1714
|
-
puts(" in MRB_GC_STATE_MARK");
|
|
1715
|
-
gc->state = MRB_GC_STATE_MARK;
|
|
1716
|
-
mrb_write_barrier(mrb, obj);
|
|
1717
|
-
|
|
1718
|
-
mrb_assert(is_gray(obj));
|
|
1719
|
-
mrb_assert(gc->atomic_gray_list == obj);
|
|
1720
|
-
|
|
1721
|
-
|
|
1722
|
-
puts(" fail with gray");
|
|
1723
|
-
paint_gray(obj);
|
|
1724
|
-
mrb_write_barrier(mrb, obj);
|
|
1725
|
-
|
|
1726
|
-
mrb_assert(is_gray(obj));
|
|
1727
|
-
|
|
1728
|
-
mrb_close(mrb);
|
|
1729
|
-
}
|
|
1730
|
-
|
|
1731
|
-
void
|
|
1732
|
-
test_add_gray_list(void)
|
|
1733
|
-
{
|
|
1734
|
-
mrb_state *mrb = mrb_open();
|
|
1735
|
-
struct RBasic *obj1, *obj2;
|
|
1736
|
-
mrb_gc *gc = &mrb->gc;
|
|
1737
|
-
|
|
1738
|
-
puts("test_add_gray_list");
|
|
1739
|
-
change_gen_gc_mode(mrb, gc, FALSE);
|
|
1740
|
-
mrb_assert(gc->gray_list == NULL);
|
|
1741
|
-
obj1 = mrb_basic_ptr(mrb_str_new_lit(mrb, "test"));
|
|
1742
|
-
add_gray_list(mrb, gc, obj1);
|
|
1743
|
-
mrb_assert(gc->gray_list == obj1);
|
|
1744
|
-
mrb_assert(is_gray(obj1));
|
|
1745
|
-
|
|
1746
|
-
obj2 = mrb_basic_ptr(mrb_str_new_lit(mrb, "test"));
|
|
1747
|
-
add_gray_list(mrb, gc, obj2);
|
|
1748
|
-
mrb_assert(gc->gray_list == obj2);
|
|
1749
|
-
mrb_assert(gc->gray_list->gcnext == obj1);
|
|
1750
|
-
mrb_assert(is_gray(obj2));
|
|
1751
|
-
|
|
1752
|
-
mrb_close(mrb);
|
|
1753
|
-
}
|
|
1754
|
-
|
|
1755
|
-
void
|
|
1756
|
-
test_gc_gray_mark(void)
|
|
1757
|
-
{
|
|
1758
|
-
mrb_state *mrb = mrb_open();
|
|
1759
|
-
mrb_value obj_v, value_v;
|
|
1760
|
-
struct RBasic *obj;
|
|
1761
|
-
size_t gray_num = 0;
|
|
1762
|
-
mrb_gc *gc = &mrb->gc;
|
|
1763
|
-
|
|
1764
|
-
puts("test_gc_gray_mark");
|
|
1765
|
-
|
|
1766
|
-
puts(" in MRB_TT_CLASS");
|
|
1767
|
-
obj = (struct RBasic*)mrb->object_class;
|
|
1768
|
-
paint_gray(obj);
|
|
1769
|
-
gray_num = gc_gray_mark(mrb, gc, obj);
|
|
1770
|
-
mrb_assert(is_black(obj));
|
|
1771
|
-
mrb_assert(gray_num > 1);
|
|
1772
|
-
|
|
1773
|
-
puts(" in MRB_TT_ARRAY");
|
|
1774
|
-
obj_v = mrb_ary_new(mrb);
|
|
1775
|
-
value_v = mrb_str_new_lit(mrb, "test");
|
|
1776
|
-
paint_gray(mrb_basic_ptr(obj_v));
|
|
1777
|
-
paint_partial_white(gc, mrb_basic_ptr(value_v));
|
|
1778
|
-
mrb_ary_push(mrb, obj_v, value_v);
|
|
1779
|
-
gray_num = gc_gray_mark(mrb, gc, mrb_basic_ptr(obj_v));
|
|
1780
|
-
mrb_assert(is_black(mrb_basic_ptr(obj_v)));
|
|
1781
|
-
mrb_assert(is_gray(mrb_basic_ptr(value_v)));
|
|
1782
|
-
mrb_assert(gray_num == 1);
|
|
1783
|
-
|
|
1784
|
-
mrb_close(mrb);
|
|
1785
|
-
}
|
|
1786
|
-
|
|
1787
|
-
void
|
|
1788
|
-
test_incremental_gc(void)
|
|
1789
|
-
{
|
|
1790
|
-
mrb_state *mrb = mrb_open();
|
|
1791
|
-
size_t max = ~0, live = 0, total = 0, freed = 0;
|
|
1792
|
-
RVALUE *free;
|
|
1793
|
-
mrb_heap_page *page;
|
|
1794
|
-
mrb_gc *gc = &mrb->gc;
|
|
1795
|
-
|
|
1796
|
-
puts("test_incremental_gc");
|
|
1797
|
-
change_gen_gc_mode(mrb, gc, FALSE);
|
|
1798
|
-
|
|
1799
|
-
puts(" in mrb_full_gc");
|
|
1800
|
-
mrb_full_gc(mrb);
|
|
1801
|
-
|
|
1802
|
-
mrb_assert(gc->state == MRB_GC_STATE_ROOT);
|
|
1803
|
-
puts(" in MRB_GC_STATE_ROOT");
|
|
1804
|
-
incremental_gc(mrb, gc, max);
|
|
1805
|
-
mrb_assert(gc->state == MRB_GC_STATE_MARK);
|
|
1806
|
-
puts(" in MRB_GC_STATE_MARK");
|
|
1807
|
-
incremental_gc_until(mrb, gc, MRB_GC_STATE_SWEEP);
|
|
1808
|
-
mrb_assert(gc->state == MRB_GC_STATE_SWEEP);
|
|
1809
|
-
|
|
1810
|
-
puts(" in MRB_GC_STATE_SWEEP");
|
|
1811
|
-
page = gc->heaps;
|
|
1812
|
-
while (page) {
|
|
1813
|
-
RVALUE *p = objects(page);
|
|
1814
|
-
RVALUE *e = p + MRB_HEAP_PAGE_SIZE;
|
|
1815
|
-
while (p<e) {
|
|
1816
|
-
if (is_black(&p->as.basic)) {
|
|
1817
|
-
live++;
|
|
1818
|
-
}
|
|
1819
|
-
if (is_gray(&p->as.basic) && !is_dead(gc, &p->as.basic)) {
|
|
1820
|
-
printf("%p\n", &p->as.basic);
|
|
1821
|
-
}
|
|
1822
|
-
p++;
|
|
1823
|
-
}
|
|
1824
|
-
page = page->next;
|
|
1825
|
-
total += MRB_HEAP_PAGE_SIZE;
|
|
1826
|
-
}
|
|
1827
|
-
|
|
1828
|
-
mrb_assert(gc->gray_list == NULL);
|
|
1829
|
-
|
|
1830
|
-
incremental_gc(mrb, gc, max);
|
|
1831
|
-
mrb_assert(gc->state == MRB_GC_STATE_SWEEP);
|
|
1832
|
-
|
|
1833
|
-
incremental_gc(mrb, gc, max);
|
|
1834
|
-
mrb_assert(gc->state == MRB_GC_STATE_ROOT);
|
|
1835
|
-
|
|
1836
|
-
free = (RVALUE*)gc->heaps->freelist;
|
|
1837
|
-
while (free) {
|
|
1838
|
-
freed++;
|
|
1839
|
-
free = (RVALUE*)free->as.free.next;
|
|
1840
|
-
}
|
|
1841
|
-
|
|
1842
|
-
mrb_assert(gc->live == live);
|
|
1843
|
-
mrb_assert(gc->live == total-freed);
|
|
1844
|
-
|
|
1845
|
-
puts("test_incremental_gc(gen)");
|
|
1846
|
-
incremental_gc_until(mrb, gc, MRB_GC_STATE_SWEEP);
|
|
1847
|
-
change_gen_gc_mode(mrb, gc, TRUE);
|
|
1848
|
-
|
|
1849
|
-
mrb_assert(gc->full == FALSE);
|
|
1850
|
-
mrb_assert(gc->state == MRB_GC_STATE_ROOT);
|
|
1851
|
-
|
|
1852
|
-
puts(" in minor");
|
|
1853
|
-
mrb_assert(is_minor_gc(gc));
|
|
1854
|
-
mrb_assert(gc->majorgc_old_threshold > 0);
|
|
1855
|
-
gc->majorgc_old_threshold = 0;
|
|
1856
|
-
mrb_incremental_gc(mrb);
|
|
1857
|
-
mrb_assert(gc->full == TRUE);
|
|
1858
|
-
mrb_assert(gc->state == MRB_GC_STATE_ROOT);
|
|
1859
|
-
|
|
1860
|
-
puts(" in major");
|
|
1861
|
-
mrb_assert(is_major_gc(gc));
|
|
1862
|
-
do {
|
|
1863
|
-
mrb_incremental_gc(mrb);
|
|
1864
|
-
} while (gc->state != MRB_GC_STATE_ROOT);
|
|
1865
|
-
mrb_assert(gc->full == FALSE);
|
|
1866
|
-
|
|
1867
|
-
mrb_close(mrb);
|
|
1868
|
-
}
|
|
1869
|
-
|
|
1870
|
-
void
|
|
1871
|
-
test_incremental_sweep_phase(void)
|
|
1872
|
-
{
|
|
1873
|
-
mrb_state *mrb = mrb_open();
|
|
1874
|
-
mrb_gc *gc = &mrb->gc;
|
|
1875
|
-
|
|
1876
|
-
puts("test_incremental_sweep_phase");
|
|
1877
|
-
|
|
1878
|
-
add_heap(mrb, gc);
|
|
1879
|
-
gc->sweeps = gc->heaps;
|
|
1880
|
-
|
|
1881
|
-
mrb_assert(gc->heaps->next->next == NULL);
|
|
1882
|
-
mrb_assert(gc->free_heaps->next->next == NULL);
|
|
1883
|
-
incremental_sweep_phase(mrb, gc, MRB_HEAP_PAGE_SIZE * 3);
|
|
1884
|
-
|
|
1885
|
-
mrb_assert(gc->heaps->next == NULL);
|
|
1886
|
-
mrb_assert(gc->heaps == gc->free_heaps);
|
|
1887
|
-
|
|
1888
|
-
mrb_close(mrb);
|
|
1889
|
-
}
|
|
1890
|
-
|
|
1891
|
-
static mrb_value
|
|
1892
|
-
gc_test(mrb_state *mrb, mrb_value self)
|
|
1893
|
-
{
|
|
1894
|
-
test_mrb_field_write_barrier();
|
|
1895
|
-
test_mrb_write_barrier();
|
|
1896
|
-
test_add_gray_list();
|
|
1897
|
-
test_gc_gray_mark();
|
|
1898
|
-
test_incremental_gc();
|
|
1899
|
-
test_incremental_sweep_phase();
|
|
1900
|
-
return mrb_nil_value();
|
|
1901
|
-
}
|
|
1902
|
-
#endif /* GC_DEBUG */
|
|
1903
|
-
#endif /* GC_TEST */
|
|
@@ -222,9 +222,8 @@ static void
|
|
|
222
222
|
ht_compact(mrb_state *mrb, htable *t)
|
|
223
223
|
{
|
|
224
224
|
segment *seg;
|
|
225
|
-
|
|
225
|
+
uint16_t i, i2;
|
|
226
226
|
segment *seg2 = NULL;
|
|
227
|
-
mrb_int i2;
|
|
228
227
|
mrb_int size = 0;
|
|
229
228
|
|
|
230
229
|
if (t == NULL) return;
|
|
@@ -366,7 +365,7 @@ ht_put(mrb_state *mrb, htable *t, mrb_value key, mrb_value val)
|
|
|
366
365
|
if (!seg->next && i >= t->last_len) {
|
|
367
366
|
seg->e[i].key = key;
|
|
368
367
|
seg->e[i].val = val;
|
|
369
|
-
t->last_len = i+1;
|
|
368
|
+
t->last_len = (uint16_t)i+1;
|
|
370
369
|
t->size++;
|
|
371
370
|
return;
|
|
372
371
|
}
|
|
@@ -374,7 +373,7 @@ ht_put(mrb_state *mrb, htable *t, mrb_value key, mrb_value val)
|
|
|
374
373
|
deleted++;
|
|
375
374
|
continue;
|
|
376
375
|
}
|
|
377
|
-
if (ht_hash_equal(mrb, t,
|
|
376
|
+
if (ht_hash_equal(mrb, t, key, k)) {
|
|
378
377
|
seg->e[i].val = val;
|
|
379
378
|
return;
|
|
380
379
|
}
|
|
@@ -408,7 +407,7 @@ ht_put(mrb_state *mrb, htable *t, mrb_value key, mrb_value val)
|
|
|
408
407
|
}
|
|
409
408
|
seg->e[i].key = key;
|
|
410
409
|
seg->e[i].val = val;
|
|
411
|
-
t->last_len = i+1;
|
|
410
|
+
t->last_len = (uint16_t)i+1;
|
|
412
411
|
if (t->index == NULL && t->size > MRB_HT_INIT_SIZE*4) {
|
|
413
412
|
ht_index(mrb, t);
|
|
414
413
|
}
|
|
@@ -455,7 +454,7 @@ ht_get(mrb_state *mrb, htable *t, mrb_value key, mrb_value *vp)
|
|
|
455
454
|
return FALSE;
|
|
456
455
|
}
|
|
457
456
|
if (mrb_undef_p(k)) continue;
|
|
458
|
-
if (ht_hash_equal(mrb, t,
|
|
457
|
+
if (ht_hash_equal(mrb, t, key, k)) {
|
|
459
458
|
if (vp) *vp = seg->e[i].val;
|
|
460
459
|
return TRUE;
|
|
461
460
|
}
|
|
@@ -325,7 +325,7 @@ mrb_obj_clone(mrb_state *mrb, mrb_value self)
|
|
|
325
325
|
mrb_value clone;
|
|
326
326
|
|
|
327
327
|
if (mrb_immediate_p(self)) {
|
|
328
|
-
|
|
328
|
+
return self;
|
|
329
329
|
}
|
|
330
330
|
if (mrb_sclass_p(self)) {
|
|
331
331
|
mrb_raise(mrb, E_TYPE_ERROR, "can't clone singleton class");
|
|
@@ -366,7 +366,7 @@ mrb_obj_dup(mrb_state *mrb, mrb_value obj)
|
|
|
366
366
|
mrb_value dup;
|
|
367
367
|
|
|
368
368
|
if (mrb_immediate_p(obj)) {
|
|
369
|
-
|
|
369
|
+
return obj;
|
|
370
370
|
}
|
|
371
371
|
if (mrb_sclass_p(obj)) {
|
|
372
372
|
mrb_raise(mrb, E_TYPE_ERROR, "can't dup singleton class");
|
|
@@ -14,14 +14,12 @@
|
|
|
14
14
|
#include <mruby/string.h>
|
|
15
15
|
#include <mruby/debug.h>
|
|
16
16
|
#include <mruby/error.h>
|
|
17
|
+
#include <mruby/data.h>
|
|
17
18
|
|
|
18
19
|
#if SIZE_MAX < UINT32_MAX
|
|
19
20
|
# error size_t must be at least 32 bits wide
|
|
20
21
|
#endif
|
|
21
22
|
|
|
22
|
-
#define FLAG_BYTEORDER_BIG 2
|
|
23
|
-
#define FLAG_BYTEORDER_LIL 4
|
|
24
|
-
#define FLAG_BYTEORDER_NATIVE 8
|
|
25
23
|
#define FLAG_SRC_MALLOC 1
|
|
26
24
|
#define FLAG_SRC_STATIC 0
|
|
27
25
|
|
|
@@ -58,6 +56,14 @@ str_to_double(mrb_state *mrb, const char *p, size_t len)
|
|
|
58
56
|
|
|
59
57
|
mrb_value mrb_str_len_to_inum(mrb_state *mrb, const char *str, mrb_int len, mrb_int base, int badcheck);
|
|
60
58
|
|
|
59
|
+
static void
|
|
60
|
+
tempirep_free(mrb_state *mrb, void *p)
|
|
61
|
+
{
|
|
62
|
+
if (p) mrb_irep_decref(mrb, (mrb_irep *)p);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
static const mrb_data_type tempirep_type = { "temporary irep", tempirep_free };
|
|
66
|
+
|
|
61
67
|
static mrb_irep*
|
|
62
68
|
read_irep_record_1(mrb_state *mrb, const uint8_t *bin, size_t *len, uint8_t flags)
|
|
63
69
|
{
|
|
@@ -66,8 +72,11 @@ read_irep_record_1(mrb_state *mrb, const uint8_t *bin, size_t *len, uint8_t flag
|
|
|
66
72
|
ptrdiff_t diff;
|
|
67
73
|
uint16_t tt, pool_data_len, snl;
|
|
68
74
|
int plen;
|
|
69
|
-
|
|
75
|
+
struct RData *irep_obj = mrb_data_object_alloc(mrb, mrb->object_class, NULL, &tempirep_type);
|
|
70
76
|
mrb_irep *irep = mrb_add_irep(mrb);
|
|
77
|
+
int ai = mrb_gc_arena_save(mrb);
|
|
78
|
+
|
|
79
|
+
irep_obj->data = irep;
|
|
71
80
|
|
|
72
81
|
/* skip record size */
|
|
73
82
|
src += sizeof(uint32_t);
|
|
@@ -94,8 +103,7 @@ read_irep_record_1(mrb_state *mrb, const uint8_t *bin, size_t *len, uint8_t flag
|
|
|
94
103
|
if (SIZE_ERROR_MUL(irep->ilen, sizeof(mrb_code))) {
|
|
95
104
|
return NULL;
|
|
96
105
|
}
|
|
97
|
-
if ((flags & FLAG_SRC_MALLOC) == 0
|
|
98
|
-
(flags & FLAG_BYTEORDER_NATIVE)) {
|
|
106
|
+
if ((flags & FLAG_SRC_MALLOC) == 0) {
|
|
99
107
|
irep->iseq = (mrb_code*)src;
|
|
100
108
|
src += sizeof(mrb_code) * irep->ilen;
|
|
101
109
|
irep->flags |= MRB_ISEQ_NO_FREE;
|
|
@@ -188,36 +196,47 @@ read_irep_record_1(mrb_state *mrb, const uint8_t *bin, size_t *len, uint8_t flag
|
|
|
188
196
|
}
|
|
189
197
|
}
|
|
190
198
|
|
|
191
|
-
irep->reps = (mrb_irep**)
|
|
199
|
+
irep->reps = (mrb_irep**)mrb_calloc(mrb, irep->rlen, sizeof(mrb_irep*));
|
|
192
200
|
|
|
193
201
|
diff = src - bin;
|
|
194
202
|
mrb_assert_int_fit(ptrdiff_t, diff, size_t, SIZE_MAX);
|
|
195
203
|
*len = (size_t)diff;
|
|
196
204
|
|
|
205
|
+
irep_obj->data = NULL;
|
|
206
|
+
|
|
197
207
|
return irep;
|
|
198
208
|
}
|
|
199
209
|
|
|
200
210
|
static mrb_irep*
|
|
201
211
|
read_irep_record(mrb_state *mrb, const uint8_t *bin, size_t *len, uint8_t flags)
|
|
202
212
|
{
|
|
213
|
+
struct RData *irep_obj = mrb_data_object_alloc(mrb, mrb->object_class, NULL, &tempirep_type);
|
|
214
|
+
int ai = mrb_gc_arena_save(mrb);
|
|
203
215
|
mrb_irep *irep = read_irep_record_1(mrb, bin, len, flags);
|
|
204
216
|
int i;
|
|
205
217
|
|
|
218
|
+
mrb_gc_arena_restore(mrb, ai);
|
|
206
219
|
if (irep == NULL) {
|
|
207
220
|
return NULL;
|
|
208
221
|
}
|
|
209
222
|
|
|
223
|
+
irep_obj->data = irep;
|
|
224
|
+
|
|
210
225
|
bin += *len;
|
|
211
226
|
for (i=0; i<irep->rlen; i++) {
|
|
212
227
|
size_t rlen;
|
|
213
228
|
|
|
214
229
|
irep->reps[i] = read_irep_record(mrb, bin, &rlen, flags);
|
|
230
|
+
mrb_gc_arena_restore(mrb, ai);
|
|
215
231
|
if (irep->reps[i] == NULL) {
|
|
216
232
|
return NULL;
|
|
217
233
|
}
|
|
218
234
|
bin += rlen;
|
|
219
235
|
*len += rlen;
|
|
220
236
|
}
|
|
237
|
+
|
|
238
|
+
irep_obj->data = NULL;
|
|
239
|
+
|
|
221
240
|
return irep;
|
|
222
241
|
}
|
|
223
242
|
|
|
@@ -241,21 +260,21 @@ read_debug_record(mrb_state *mrb, const uint8_t *start, mrb_irep* irep, size_t *
|
|
|
241
260
|
|
|
242
261
|
if (irep->debug_info) { return MRB_DUMP_INVALID_IREP; }
|
|
243
262
|
|
|
244
|
-
irep->debug_info = (mrb_irep_debug_info*)
|
|
263
|
+
irep->debug_info = (mrb_irep_debug_info*)mrb_calloc(mrb, 1, sizeof(mrb_irep_debug_info));
|
|
245
264
|
irep->debug_info->pc_count = (uint32_t)irep->ilen;
|
|
246
265
|
|
|
247
266
|
record_size = (size_t)bin_to_uint32(bin);
|
|
248
267
|
bin += sizeof(uint32_t);
|
|
249
268
|
|
|
250
269
|
irep->debug_info->flen = bin_to_uint16(bin);
|
|
251
|
-
irep->debug_info->files = (mrb_irep_debug_info_file**)
|
|
270
|
+
irep->debug_info->files = (mrb_irep_debug_info_file**)mrb_calloc(mrb, irep->debug_info->flen, sizeof(mrb_irep_debug_info*));
|
|
252
271
|
bin += sizeof(uint16_t);
|
|
253
272
|
|
|
254
273
|
for (f_idx = 0; f_idx < irep->debug_info->flen; ++f_idx) {
|
|
255
274
|
mrb_irep_debug_info_file *file;
|
|
256
275
|
uint16_t filename_idx;
|
|
257
276
|
|
|
258
|
-
file = (mrb_irep_debug_info_file *)
|
|
277
|
+
file = (mrb_irep_debug_info_file *)mrb_calloc(mrb, 1, sizeof(*file));
|
|
259
278
|
irep->debug_info->files[f_idx] = file;
|
|
260
279
|
|
|
261
280
|
file->start_pos = bin_to_uint32(bin);
|
|
@@ -285,8 +304,8 @@ read_debug_record(mrb_state *mrb, const uint8_t *start, mrb_irep* irep, size_t *
|
|
|
285
304
|
case mrb_debug_line_flat_map: {
|
|
286
305
|
uint32_t l;
|
|
287
306
|
|
|
288
|
-
file->lines.flat_map = (mrb_irep_debug_info_line*)
|
|
289
|
-
mrb,
|
|
307
|
+
file->lines.flat_map = (mrb_irep_debug_info_line*)mrb_calloc(
|
|
308
|
+
mrb, (size_t)(file->line_entry_count), sizeof(mrb_irep_debug_info_line));
|
|
290
309
|
for (l = 0; l < file->line_entry_count; ++l) {
|
|
291
310
|
file->lines.flat_map[l].start_pos = bin_to_uint32(bin);
|
|
292
311
|
bin += sizeof(uint32_t);
|
|
@@ -333,6 +352,7 @@ read_section_debug(mrb_state *mrb, const uint8_t *start, mrb_irep *irep, uint8_t
|
|
|
333
352
|
int result;
|
|
334
353
|
uint16_t filenames_len;
|
|
335
354
|
mrb_sym *filenames;
|
|
355
|
+
mrb_value filenames_obj;
|
|
336
356
|
|
|
337
357
|
bin = start;
|
|
338
358
|
header = (struct rite_section_debug_header *)bin;
|
|
@@ -340,7 +360,8 @@ read_section_debug(mrb_state *mrb, const uint8_t *start, mrb_irep *irep, uint8_t
|
|
|
340
360
|
|
|
341
361
|
filenames_len = bin_to_uint16(bin);
|
|
342
362
|
bin += sizeof(uint16_t);
|
|
343
|
-
|
|
363
|
+
filenames_obj = mrb_str_new(mrb, NULL, sizeof(mrb_sym) * (size_t)filenames_len);
|
|
364
|
+
filenames = (mrb_sym*)RSTRING_PTR(filenames_obj);
|
|
344
365
|
for (i = 0; i < filenames_len; ++i) {
|
|
345
366
|
uint16_t f_len = bin_to_uint16(bin);
|
|
346
367
|
bin += sizeof(uint16_t);
|
|
@@ -364,7 +385,7 @@ read_section_debug(mrb_state *mrb, const uint8_t *start, mrb_irep *irep, uint8_t
|
|
|
364
385
|
}
|
|
365
386
|
|
|
366
387
|
debug_exit:
|
|
367
|
-
|
|
388
|
+
mrb_str_resize(mrb, filenames_obj, 0);
|
|
368
389
|
return result;
|
|
369
390
|
}
|
|
370
391
|
|
|
@@ -422,6 +443,7 @@ read_section_lv(mrb_state *mrb, const uint8_t *start, mrb_irep *irep, uint8_t fl
|
|
|
422
443
|
int result;
|
|
423
444
|
uint32_t syms_len;
|
|
424
445
|
mrb_sym *syms;
|
|
446
|
+
mrb_value syms_obj;
|
|
425
447
|
mrb_sym (*intern_func)(mrb_state*, const char*, size_t) =
|
|
426
448
|
(flags & FLAG_SRC_MALLOC)? mrb_intern : mrb_intern_static;
|
|
427
449
|
|
|
@@ -431,7 +453,8 @@ read_section_lv(mrb_state *mrb, const uint8_t *start, mrb_irep *irep, uint8_t fl
|
|
|
431
453
|
|
|
432
454
|
syms_len = bin_to_uint32(bin);
|
|
433
455
|
bin += sizeof(uint32_t);
|
|
434
|
-
|
|
456
|
+
syms_obj = mrb_str_new(mrb, NULL, sizeof(mrb_sym) * (size_t)syms_len);
|
|
457
|
+
syms = (mrb_sym*)RSTRING_PTR(syms_obj);
|
|
435
458
|
for (i = 0; i < syms_len; ++i) {
|
|
436
459
|
uint16_t const str_len = bin_to_uint16(bin);
|
|
437
460
|
bin += sizeof(uint16_t);
|
|
@@ -451,7 +474,7 @@ read_section_lv(mrb_state *mrb, const uint8_t *start, mrb_irep *irep, uint8_t fl
|
|
|
451
474
|
}
|
|
452
475
|
|
|
453
476
|
lv_exit:
|
|
454
|
-
|
|
477
|
+
mrb_str_resize(mrb, syms_obj, 0);
|
|
455
478
|
return result;
|
|
456
479
|
}
|
|
457
480
|
|
|
@@ -464,19 +487,7 @@ read_binary_header(const uint8_t *bin, size_t bufsize, size_t *bin_size, uint16_
|
|
|
464
487
|
return MRB_DUMP_READ_FAULT;
|
|
465
488
|
}
|
|
466
489
|
|
|
467
|
-
if (memcmp(header->binary_ident, RITE_BINARY_IDENT, sizeof(header->binary_ident))
|
|
468
|
-
if (bigendian_p())
|
|
469
|
-
*flags |= FLAG_BYTEORDER_NATIVE;
|
|
470
|
-
else
|
|
471
|
-
*flags |= FLAG_BYTEORDER_BIG;
|
|
472
|
-
}
|
|
473
|
-
else if (memcmp(header->binary_ident, RITE_BINARY_IDENT_LIL, sizeof(header->binary_ident)) == 0) {
|
|
474
|
-
if (bigendian_p())
|
|
475
|
-
*flags |= FLAG_BYTEORDER_LIL;
|
|
476
|
-
else
|
|
477
|
-
*flags |= FLAG_BYTEORDER_NATIVE;
|
|
478
|
-
}
|
|
479
|
-
else {
|
|
490
|
+
if (memcmp(header->binary_ident, RITE_BINARY_IDENT, sizeof(header->binary_ident)) != 0) {
|
|
480
491
|
return MRB_DUMP_INVALID_FILE_HEADER;
|
|
481
492
|
}
|
|
482
493
|
|
|
@@ -500,6 +511,7 @@ static mrb_irep*
|
|
|
500
511
|
read_irep(mrb_state *mrb, const uint8_t *bin, size_t bufsize, uint8_t flags)
|
|
501
512
|
{
|
|
502
513
|
int result;
|
|
514
|
+
struct RData *irep_obj = NULL;
|
|
503
515
|
mrb_irep *irep = NULL;
|
|
504
516
|
const struct rite_section_header *section_header;
|
|
505
517
|
uint16_t crc;
|
|
@@ -520,12 +532,15 @@ read_irep(mrb_state *mrb, const uint8_t *bin, size_t bufsize, uint8_t flags)
|
|
|
520
532
|
return NULL;
|
|
521
533
|
}
|
|
522
534
|
|
|
535
|
+
irep_obj = mrb_data_object_alloc(mrb, mrb->object_class, NULL, &tempirep_type);
|
|
536
|
+
|
|
523
537
|
bin += sizeof(struct rite_binary_header);
|
|
524
538
|
do {
|
|
525
539
|
section_header = (const struct rite_section_header *)bin;
|
|
526
540
|
if (memcmp(section_header->section_ident, RITE_SECTION_IREP_IDENT, sizeof(section_header->section_ident)) == 0) {
|
|
527
541
|
irep = read_section_irep(mrb, bin, flags);
|
|
528
542
|
if (!irep) return NULL;
|
|
543
|
+
irep_obj->data = irep;
|
|
529
544
|
}
|
|
530
545
|
else if (memcmp(section_header->section_ident, RITE_SECTION_DEBUG_IDENT, sizeof(section_header->section_ident)) == 0) {
|
|
531
546
|
if (!irep) return NULL; /* corrupted data */
|
|
@@ -544,6 +559,8 @@ read_irep(mrb_state *mrb, const uint8_t *bin, size_t bufsize, uint8_t flags)
|
|
|
544
559
|
bin += bin_to_uint32(section_header->section_size);
|
|
545
560
|
} while (memcmp(section_header->section_ident, RITE_BINARY_EOF, sizeof(section_header->section_ident)) != 0);
|
|
546
561
|
|
|
562
|
+
irep_obj->data = NULL;
|
|
563
|
+
|
|
547
564
|
return irep;
|
|
548
565
|
}
|
|
549
566
|
|
|
@@ -595,7 +612,16 @@ load_irep(mrb_state *mrb, mrb_irep *irep, mrbc_context *c)
|
|
|
595
612
|
MRB_API mrb_value
|
|
596
613
|
mrb_load_irep_cxt(mrb_state *mrb, const uint8_t *bin, mrbc_context *c)
|
|
597
614
|
{
|
|
598
|
-
|
|
615
|
+
struct RData *irep_obj = mrb_data_object_alloc(mrb, mrb->object_class, NULL, &tempirep_type);
|
|
616
|
+
mrb_irep *irep = mrb_read_irep(mrb, bin);
|
|
617
|
+
mrb_value ret;
|
|
618
|
+
|
|
619
|
+
irep_obj->data = irep;
|
|
620
|
+
mrb_irep_incref(mrb, irep);
|
|
621
|
+
ret = load_irep(mrb, irep, c);
|
|
622
|
+
irep_obj->data = NULL;
|
|
623
|
+
mrb_irep_decref(mrb, irep);
|
|
624
|
+
return ret;
|
|
599
625
|
}
|
|
600
626
|
|
|
601
627
|
MRB_API mrb_value
|