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
@@ -1,16 +1,13 @@
|
|
1
1
|
import sys
|
2
2
|
import os
|
3
|
+
from sets import Set
|
3
4
|
|
4
5
|
def split_javascript_file(input_filename, output_filename_prefix, max_part_size_in_bytes):
|
5
6
|
|
6
7
|
try:
|
7
|
-
# Contains the entire Emscripten generated Javascript code
|
8
|
-
input_file = open(input_filename,'r')
|
9
|
-
|
10
8
|
# Javascript main file. On execution, this file needs to be loaded at last (!)
|
11
9
|
output_main_filename = output_filename_prefix + ".js"
|
12
10
|
output_main_file = open(output_main_filename,'w')
|
13
|
-
|
14
11
|
# File with HTML script tags to load the Javascript files in HTML later on
|
15
12
|
output_html_include_file = open(output_filename_prefix + ".include.html",'w')
|
16
13
|
|
@@ -22,8 +19,19 @@ def split_javascript_file(input_filename, output_filename_prefix, max_part_size_
|
|
22
19
|
function_buckets = {};
|
23
20
|
|
24
21
|
output_part_file = None
|
25
|
-
|
22
|
+
|
23
|
+
# Locate names of all the source files (.c/.cpp) that produced output to the .js file.
|
24
|
+
source_files = Set()
|
25
|
+
for line in open(input_filename,'r'):
|
26
|
+
if line.startswith("//FUNCTION_END_MARKER_OF_SOURCE_FILE_"):
|
27
|
+
associated_source_file_base = line[len("//FUNCTION_END_MARKER_OF_SOURCE_FILE_"):len(line)-1]
|
28
|
+
if not associated_source_file_base == "NO_SOURCE":
|
29
|
+
source_files.add(os.path.dirname(os.path.abspath(os.path.realpath(associated_source_file_base))))
|
30
|
+
|
31
|
+
common_source_file_prefix = os.path.commonprefix(list(source_files))
|
32
|
+
|
26
33
|
# Iterate over Javascript source; write main file; parse function declarations.
|
34
|
+
input_file = open(input_filename,'r')
|
27
35
|
for line in input_file:
|
28
36
|
if line == "//FUNCTION_BEGIN_MARKER\n":
|
29
37
|
js_function = "//Func\n"
|
@@ -36,8 +44,8 @@ def split_javascript_file(input_filename, output_filename_prefix, max_part_size_
|
|
36
44
|
associated_source_file_base = output_filename_prefix + "_functions";
|
37
45
|
else:
|
38
46
|
# Functions with a known associated source file are stored in a file in the directory `output_filename_prefix`
|
39
|
-
associated_source_file_base = output_filename_prefix
|
40
|
-
|
47
|
+
associated_source_file_base = os.path.join(output_filename_prefix, os.path.relpath(os.path.abspath(os.path.realpath(associated_source_file_base)), common_source_file_prefix))
|
48
|
+
|
41
49
|
associated_source_file_base_lower = associated_source_file_base.lower()
|
42
50
|
|
43
51
|
# Add the function to its respective file
|
@@ -68,7 +76,7 @@ def split_javascript_file(input_filename, output_filename_prefix, max_part_size_
|
|
68
76
|
output_part_file = None
|
69
77
|
for js_function in function_buckets[associated_source_file_base][1]:
|
70
78
|
if output_part_file is None:
|
71
|
-
output_html_include_file.write("<script type=\"text/javascript\" src=\"" + js_source_file + "\"></script>")
|
79
|
+
output_html_include_file.write("<script type=\"text/javascript\" src=\"" + js_source_file.replace('\\', '/') + "\"></script>")
|
72
80
|
output_part_file = open(js_source_file,'w')
|
73
81
|
|
74
82
|
output_part_file.write(js_function)
|
@@ -85,13 +93,13 @@ def split_javascript_file(input_filename, output_filename_prefix, max_part_size_
|
|
85
93
|
|
86
94
|
# Write the main Javascript file at last to the HTML includes because this file contains the code to start
|
87
95
|
# the execution of the generated Emscripten application and requires all the extracted functions.
|
88
|
-
output_html_include_file.write("<script type=\"text/javascript\" src=\"" + output_main_filename + "\"></script>")
|
96
|
+
output_html_include_file.write("<script type=\"text/javascript\" src=\"" + output_main_filename.replace('\\', '/') + "\"></script>")
|
89
97
|
|
90
98
|
except Exception, e:
|
91
99
|
print >> sys.stderr, 'error: Splitting of Emscripten generated Javascript failed: %s' % str(e)
|
92
100
|
|
93
101
|
finally:
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
102
|
+
if input_file is not None: input_file.close()
|
103
|
+
if output_main_file is not None: output_main_file.close()
|
104
|
+
if output_part_file is not None: output_part_file.close()
|
105
|
+
if output_html_include_file is not None: output_html_include_file.close()
|
@@ -1,6 +1,12 @@
|
|
1
1
|
MRuby::Build.new do |conf|
|
2
2
|
# load specific toolchain settings
|
3
|
-
|
3
|
+
|
4
|
+
# Gets set by the VS command prompts.
|
5
|
+
if ENV['VisualStudioVersion']
|
6
|
+
toolchain :visualcpp
|
7
|
+
else
|
8
|
+
toolchain :gcc
|
9
|
+
end
|
4
10
|
|
5
11
|
# Use mrbgems
|
6
12
|
# conf.gem 'examples/mrbgems/ruby_extension_example'
|
@@ -59,17 +59,13 @@ GCC toolchain.
|
|
59
59
|
|
60
60
|
toolchain :clang
|
61
61
|
|
62
|
-
#### Visual Studio 2010
|
62
|
+
#### Visual Studio 2010, 2012 and 2013
|
63
63
|
|
64
|
-
Toolchain configuration for Visual Studio
|
64
|
+
Toolchain configuration for Visual Studio on Windows. If you use the
|
65
|
+
[Visual Studio Command Prompt](http://msdn.microsoft.com/en-us/library/ms229859\(v=vs.110\).aspx),
|
66
|
+
you normally do not have to specify this manually, since it gets automatically detected by our build process.
|
65
67
|
|
66
|
-
toolchain :
|
67
|
-
|
68
|
-
#### Visual Studio 2012
|
69
|
-
|
70
|
-
Toolchain configuration for Visual Studio 2012 on Windows.
|
71
|
-
|
72
|
-
toolchain :vs2012
|
68
|
+
toolchain :visualcpp
|
73
69
|
|
74
70
|
#### Android
|
75
71
|
|
@@ -56,8 +56,11 @@
|
|
56
56
|
/* initial minimum size for string buffer */
|
57
57
|
//#define MRB_STR_BUF_MIN_SIZE 128
|
58
58
|
|
59
|
-
/*
|
60
|
-
//#define
|
59
|
+
/* arena size */
|
60
|
+
//#define MRB_GC_ARENA_SIZE 100
|
61
|
+
|
62
|
+
/* fixed size GC arena */
|
63
|
+
//#define MRB_GC_FIXED_ARENA
|
61
64
|
|
62
65
|
/* -DDISABLE_XXXX to drop following features */
|
63
66
|
//#define DISABLE_STDIO /* use of stdio */
|
@@ -35,6 +35,7 @@ struct RArray {
|
|
35
35
|
#define RARRAY_PTR(a) (RARRAY(a)->ptr)
|
36
36
|
#define MRB_ARY_SHARED 256
|
37
37
|
|
38
|
+
void mrb_ary_modify(mrb_state*, struct RArray*);
|
38
39
|
void mrb_ary_decref(mrb_state*, mrb_shared_array*);
|
39
40
|
mrb_value mrb_ary_new_capa(mrb_state*, mrb_int);
|
40
41
|
mrb_value mrb_ary_new(mrb_state *mrb);
|
@@ -96,9 +96,7 @@ struct mrb_parser_heredoc_info {
|
|
96
96
|
mrb_ast_node *doc;
|
97
97
|
};
|
98
98
|
|
99
|
-
#
|
100
|
-
# define MRB_PARSER_BUF_SIZE 1024
|
101
|
-
#endif
|
99
|
+
#define MRB_PARSER_BUF_SIZE 1024
|
102
100
|
|
103
101
|
/* parser structure */
|
104
102
|
struct mrb_parser_state {
|
@@ -164,7 +162,7 @@ struct mrb_parser_state* mrb_parse_file(mrb_state*,FILE*,mrbc_context*);
|
|
164
162
|
#endif
|
165
163
|
struct mrb_parser_state* mrb_parse_string(mrb_state*,const char*,mrbc_context*);
|
166
164
|
struct mrb_parser_state* mrb_parse_nstring(mrb_state*,const char*,int,mrbc_context*);
|
167
|
-
|
165
|
+
struct RProc* mrb_generate_code(mrb_state*, struct mrb_parser_state*);
|
168
166
|
|
169
167
|
/* program load functions */
|
170
168
|
#ifdef ENABLE_STDIO
|
@@ -12,17 +12,16 @@ extern "C" {
|
|
12
12
|
#endif
|
13
13
|
|
14
14
|
#include "mruby.h"
|
15
|
+
#include "mruby/irep.h"
|
15
16
|
|
16
17
|
#ifdef ENABLE_STDIO
|
17
|
-
int mrb_dump_irep_binary(mrb_state*,
|
18
|
-
int mrb_dump_irep_cfunc(mrb_state *mrb,
|
19
|
-
|
20
|
-
#endif
|
21
|
-
int32_t mrb_read_irep(mrb_state*, const uint8_t*);
|
22
|
-
|
23
|
-
#ifdef ENABLE_STDIO
|
18
|
+
int mrb_dump_irep_binary(mrb_state*, mrb_irep*, int, FILE*);
|
19
|
+
int mrb_dump_irep_cfunc(mrb_state *mrb, mrb_irep*, int, FILE *f, const char *initname);
|
20
|
+
mrb_irep *mrb_read_irep_file(mrb_state*, FILE*);
|
24
21
|
mrb_value mrb_load_irep_file(mrb_state*,FILE*);
|
22
|
+
mrb_value mrb_load_irep_file_cxt(mrb_state*, FILE*, mrbc_context*);
|
25
23
|
#endif
|
24
|
+
mrb_irep *mrb_read_irep(mrb_state*, const uint8_t*);
|
26
25
|
|
27
26
|
/* dump/load error code
|
28
27
|
*
|
@@ -43,7 +42,7 @@ mrb_value mrb_load_irep_file(mrb_state*,FILE*);
|
|
43
42
|
|
44
43
|
/* Rite Binary File header */
|
45
44
|
#define RITE_BINARY_IDENTIFIER "RITE"
|
46
|
-
#define RITE_BINARY_FORMAT_VER "
|
45
|
+
#define RITE_BINARY_FORMAT_VER "0002"
|
47
46
|
#define RITE_COMPILER_NAME "MATZ"
|
48
47
|
#define RITE_COMPILER_VERSION "0000"
|
49
48
|
|
@@ -79,22 +78,14 @@ struct rite_section_irep_header {
|
|
79
78
|
RITE_SECTION_HEADER;
|
80
79
|
|
81
80
|
uint8_t rite_version[4]; // Rite Instruction Specification Version
|
82
|
-
uint8_t nirep[2]; // Number of ireps
|
83
|
-
uint8_t sirep[2]; // Start index
|
84
81
|
};
|
85
82
|
|
86
83
|
struct rite_section_lineno_header {
|
87
84
|
RITE_SECTION_HEADER;
|
88
|
-
|
89
|
-
uint8_t nirep[2]; // Number of ireps
|
90
|
-
uint8_t sirep[2]; // Start index
|
91
85
|
};
|
92
86
|
|
93
87
|
struct rite_section_debug_header {
|
94
88
|
RITE_SECTION_HEADER;
|
95
|
-
|
96
|
-
uint8_t nirep[2]; // Number of ireps
|
97
|
-
uint8_t sirep[2]; // Start index
|
98
89
|
};
|
99
90
|
|
100
91
|
struct rite_binary_footer {
|
@@ -35,7 +35,7 @@ mrb_value mrb_hash_clear(mrb_state *mrb, mrb_value hash);
|
|
35
35
|
/* RHASH_TBL allocates st_table if not available. */
|
36
36
|
#define RHASH(obj) ((struct RHash*)(mrb_ptr(obj)))
|
37
37
|
#define RHASH_TBL(h) (RHASH(h)->ht)
|
38
|
-
#define RHASH_IFNONE(h) mrb_iv_get(mrb, (h),
|
38
|
+
#define RHASH_IFNONE(h) mrb_iv_get(mrb, (h), mrb_intern_lit(mrb, "ifnone"))
|
39
39
|
#define RHASH_PROCDEFAULT(h) RHASH_IFNONE(h)
|
40
40
|
struct kh_ht * mrb_hash_tbl(mrb_state *mrb, mrb_value hash);
|
41
41
|
|
@@ -11,9 +11,16 @@
|
|
11
11
|
extern "C" {
|
12
12
|
#endif
|
13
13
|
|
14
|
+
#include "mruby/compile.h"
|
15
|
+
|
16
|
+
enum irep_pool_type {
|
17
|
+
IREP_TT_STRING,
|
18
|
+
IREP_TT_FIXNUM,
|
19
|
+
IREP_TT_FLOAT,
|
20
|
+
};
|
21
|
+
|
14
22
|
/* Program data array struct */
|
15
23
|
typedef struct mrb_irep {
|
16
|
-
uint32_t idx;
|
17
24
|
uint16_t nlocals; /* Number of local variables */
|
18
25
|
uint16_t nregs; /* Number of register variables */
|
19
26
|
uint8_t flags;
|
@@ -21,19 +28,24 @@ typedef struct mrb_irep {
|
|
21
28
|
mrb_code *iseq;
|
22
29
|
mrb_value *pool;
|
23
30
|
mrb_sym *syms;
|
31
|
+
struct mrb_irep **reps;
|
24
32
|
|
25
33
|
/* debug info */
|
26
34
|
const char *filename;
|
27
35
|
uint16_t *lines;
|
28
36
|
struct mrb_irep_debug_info* debug_info;
|
29
37
|
|
30
|
-
size_t ilen, plen, slen;
|
38
|
+
size_t ilen, plen, slen, rlen, refcnt;
|
31
39
|
} mrb_irep;
|
32
40
|
|
33
41
|
#define MRB_ISEQ_NO_FREE 1
|
34
42
|
|
35
43
|
mrb_irep *mrb_add_irep(mrb_state *mrb);
|
36
44
|
mrb_value mrb_load_irep(mrb_state*, const uint8_t*);
|
45
|
+
mrb_value mrb_load_irep_cxt(mrb_state*, const uint8_t*, mrbc_context*);
|
46
|
+
void mrb_irep_free(mrb_state*, struct mrb_irep*);
|
47
|
+
void mrb_irep_incref(mrb_state*, struct mrb_irep*);
|
48
|
+
void mrb_irep_decref(mrb_state*, struct mrb_irep*);
|
37
49
|
|
38
50
|
#if defined(__cplusplus)
|
39
51
|
} /* extern "C" { */
|
@@ -50,7 +50,7 @@ static const uint8_t __m_either[8] = {0x03, 0x0c, 0x30, 0xc0};
|
|
50
50
|
name: hash name
|
51
51
|
khkey_t: key data type
|
52
52
|
khval_t: value data type
|
53
|
-
kh_is_map: (
|
53
|
+
kh_is_map: (0: hash set / 1: hash map)
|
54
54
|
*/
|
55
55
|
#define KHASH_DECLARE(name, khkey_t, khval_t, kh_is_map) \
|
56
56
|
typedef struct kh_##name { \
|
@@ -89,7 +89,7 @@ kh_fill_flags(uint8_t *p, uint8_t c, size_t len)
|
|
89
89
|
name: hash name
|
90
90
|
khkey_t: key data type
|
91
91
|
khval_t: value data type
|
92
|
-
kh_is_map: (
|
92
|
+
kh_is_map: (0: hash set / 1: hash map)
|
93
93
|
__hash_func: hash function
|
94
94
|
__hash_equal: hash comparation function
|
95
95
|
*/
|
@@ -97,12 +97,13 @@ kh_fill_flags(uint8_t *p, uint8_t c, size_t len)
|
|
97
97
|
void kh_alloc_##name(kh_##name##_t *h) \
|
98
98
|
{ \
|
99
99
|
khint_t sz = h->n_buckets; \
|
100
|
-
|
100
|
+
int len = sizeof(khkey_t) + (kh_is_map ? sizeof(khval_t) : 0); \
|
101
|
+
uint8_t *p = mrb_malloc(h->mrb, sizeof(uint8_t)*sz/4+len*sz); \
|
101
102
|
h->size = h->n_occupied = 0; \
|
102
103
|
h->upper_bound = UPPER_BOUND(sz); \
|
103
104
|
h->keys = (khkey_t *)p; \
|
104
|
-
h->vals = (khval_t *)(p+sizeof(khkey_t)*sz);
|
105
|
-
h->ed_flags =
|
105
|
+
h->vals = kh_is_map ? (khval_t *)(p+sizeof(khkey_t)*sz) : NULL; \
|
106
|
+
h->ed_flags = p+len*sz; \
|
106
107
|
kh_fill_flags(h->ed_flags, 0xaa, sz/4); \
|
107
108
|
h->mask = sz-1; \
|
108
109
|
h->inc = sz/2-1; \
|
@@ -162,7 +163,7 @@ kh_fill_flags(uint8_t *p, uint8_t c, size_t len)
|
|
162
163
|
for (i=0 ; i<old_n_buckets ; i++) { \
|
163
164
|
if (!__ac_iseither(old_ed_flags, i)) { \
|
164
165
|
khint_t k = kh_put_##name(h, old_keys[i]); \
|
165
|
-
kh_value(h,k) = old_vals[i];
|
166
|
+
if (kh_is_map) kh_value(h,k) = old_vals[i]; \
|
166
167
|
} \
|
167
168
|
} \
|
168
169
|
mrb_free(h->mrb, old_keys); \
|
@@ -207,7 +208,7 @@ kh_fill_flags(uint8_t *p, uint8_t c, size_t len)
|
|
207
208
|
for (k = kh_begin(h); k != kh_end(h); k++) { \
|
208
209
|
if (kh_exist(h, k)) { \
|
209
210
|
k2 = kh_put_##name(h2, kh_key(h, k)); \
|
210
|
-
kh_value(h2, k2) = kh_value(h, k);
|
211
|
+
if(kh_is_map) kh_value(h2, k2) = kh_value(h, k); \
|
211
212
|
} \
|
212
213
|
} \
|
213
214
|
return h2; \
|
@@ -65,6 +65,7 @@ mrb_value mrb_str_append(mrb_state *mrb, mrb_value str, mrb_value str2);
|
|
65
65
|
|
66
66
|
int mrb_str_cmp(mrb_state *mrb, mrb_value str1, mrb_value str2);
|
67
67
|
char *mrb_str_to_cstr(mrb_state *mrb, mrb_value str);
|
68
|
+
mrb_value mrb_str_pool(mrb_state *mrb, mrb_value str);
|
68
69
|
|
69
70
|
/* For backward compatibility */
|
70
71
|
static inline mrb_value
|
@@ -183,6 +183,7 @@ mrb_float_value(struct mrb_state *mrb, mrb_float f)
|
|
183
183
|
}
|
184
184
|
return v;
|
185
185
|
}
|
186
|
+
#define mrb_float_pool(mrb,f) mrb_float_value(mrb,f)
|
186
187
|
|
187
188
|
#else
|
188
189
|
|
@@ -215,6 +216,7 @@ enum mrb_vtype {
|
|
215
216
|
|
216
217
|
#if defined(MRB_WORD_BOXING)
|
217
218
|
|
219
|
+
#include <limits.h>
|
218
220
|
#define MRB_TT_HAS_BASIC MRB_TT_FLOAT
|
219
221
|
|
220
222
|
enum mrb_special_consts {
|
@@ -263,8 +265,8 @@ typedef union mrb_value {
|
|
263
265
|
}\
|
264
266
|
} while (0)
|
265
267
|
|
266
|
-
|
267
|
-
|
268
|
+
mrb_value mrb_float_value(struct mrb_state *mrb, mrb_float f);
|
269
|
+
mrb_value mrb_float_pool(struct mrb_state *mrb, mrb_float f);
|
268
270
|
|
269
271
|
#else /* No MRB_xxx_BOXING */
|
270
272
|
|
@@ -298,6 +300,7 @@ mrb_float_value(struct mrb_state *mrb, mrb_float f)
|
|
298
300
|
MRB_SET_VALUE(v, MRB_TT_FLOAT, value.f, f);
|
299
301
|
return v;
|
300
302
|
}
|
303
|
+
#define mrb_float_pool(mrb,f) mrb_float_value(mrb,f)
|
301
304
|
|
302
305
|
#endif /* no boxing */
|
303
306
|
|
@@ -41,12 +41,13 @@ extern "C" {
|
|
41
41
|
typedef uint32_t mrb_code;
|
42
42
|
typedef uint32_t mrb_aspec;
|
43
43
|
|
44
|
+
struct mrb_irep;
|
44
45
|
struct mrb_state;
|
45
46
|
|
46
47
|
typedef void* (*mrb_allocf) (struct mrb_state *mrb, void*, size_t, void *ud);
|
47
48
|
|
48
|
-
#ifndef
|
49
|
-
#define
|
49
|
+
#ifndef MRB_GC_ARENA_SIZE
|
50
|
+
#define MRB_GC_ARENA_SIZE 100
|
50
51
|
#endif
|
51
52
|
|
52
53
|
typedef struct {
|
@@ -105,8 +106,6 @@ typedef struct mrb_state {
|
|
105
106
|
|
106
107
|
struct RObject *exc; /* exception */
|
107
108
|
struct iv_tbl *globals; /* global variable table */
|
108
|
-
struct mrb_irep **irep; /* program data array */
|
109
|
-
size_t irep_len, irep_capa;
|
110
109
|
|
111
110
|
struct RObject *top_self;
|
112
111
|
struct RClass *object_class; /* Object class */
|
@@ -129,7 +128,12 @@ typedef struct mrb_state {
|
|
129
128
|
struct heap_page *sweeps;
|
130
129
|
struct heap_page *free_heaps;
|
131
130
|
size_t live; /* count of live objects */
|
132
|
-
|
131
|
+
#ifdef MRB_GC_FIXED_ARENA
|
132
|
+
struct RBasic *arena[MRB_GC_ARENA_SIZE]; /* GC protection array */
|
133
|
+
#else
|
134
|
+
struct RBasic **arena; /* GC protection array */
|
135
|
+
int arena_capa;
|
136
|
+
#endif
|
133
137
|
int arena_idx;
|
134
138
|
|
135
139
|
enum gc_state gc_state; /* state of gc */
|
@@ -225,7 +229,7 @@ mrb_value mrb_funcall(mrb_state*, mrb_value, const char*, int,...);
|
|
225
229
|
mrb_value mrb_funcall_argv(mrb_state*, mrb_value, mrb_sym, int, mrb_value*);
|
226
230
|
mrb_value mrb_funcall_with_block(mrb_state*, mrb_value, mrb_sym, int, mrb_value*, mrb_value);
|
227
231
|
mrb_sym mrb_intern_cstr(mrb_state*,const char*);
|
228
|
-
mrb_sym
|
232
|
+
mrb_sym mrb_intern(mrb_state*,const char*,size_t);
|
229
233
|
mrb_sym mrb_intern_str(mrb_state*,mrb_value);
|
230
234
|
mrb_value mrb_check_intern_cstr(mrb_state*,const char*);
|
231
235
|
mrb_value mrb_check_intern(mrb_state*,const char*,size_t);
|
@@ -235,12 +239,7 @@ const char *mrb_sym2name_len(mrb_state*,mrb_sym,size_t*);
|
|
235
239
|
mrb_value mrb_sym2str(mrb_state*,mrb_sym);
|
236
240
|
mrb_value mrb_str_format(mrb_state *, int, const mrb_value *, mrb_value);
|
237
241
|
|
238
|
-
|
239
|
-
static inline
|
240
|
-
mrb_sym mrb_intern(mrb_state *mrb,const char *cstr)
|
241
|
-
{
|
242
|
-
return mrb_intern_cstr(mrb, cstr);
|
243
|
-
}
|
242
|
+
#define mrb_intern_lit(mrb, lit) mrb_intern(mrb, (lit), sizeof(lit) - 1)
|
244
243
|
|
245
244
|
void *mrb_malloc(mrb_state*, size_t); /* raise RuntimeError if no mem */
|
246
245
|
void *mrb_calloc(mrb_state*, size_t, size_t); /* ditto */
|
@@ -256,11 +255,11 @@ mrb_value mrb_str_new_static(mrb_state *mrb, const char *p, size_t len);
|
|
256
255
|
|
257
256
|
mrb_state* mrb_open(void);
|
258
257
|
mrb_state* mrb_open_allocf(mrb_allocf, void *ud);
|
259
|
-
void mrb_irep_free(mrb_state*, struct mrb_irep*);
|
260
258
|
void mrb_close(mrb_state*);
|
261
259
|
|
262
260
|
mrb_value mrb_top_self(mrb_state *);
|
263
261
|
mrb_value mrb_run(mrb_state*, struct RProc*, mrb_value);
|
262
|
+
mrb_value mrb_context_run(mrb_state*, struct RProc*, mrb_value, unsigned int);
|
264
263
|
|
265
264
|
void mrb_p(mrb_state*, mrb_value);
|
266
265
|
mrb_int mrb_obj_id(mrb_value obj);
|
@@ -236,6 +236,8 @@ print_cmdline(int code_block_open)
|
|
236
236
|
}
|
237
237
|
}
|
238
238
|
|
239
|
+
void codedump_all(mrb_state*, struct RProc*);
|
240
|
+
|
239
241
|
int
|
240
242
|
main(int argc, char **argv)
|
241
243
|
{
|
@@ -255,6 +257,8 @@ main(int argc, char **argv)
|
|
255
257
|
int n;
|
256
258
|
int code_block_open = FALSE;
|
257
259
|
int ai;
|
260
|
+
int first_command = 1;
|
261
|
+
unsigned int nregs;
|
258
262
|
|
259
263
|
/* new interpreter instance */
|
260
264
|
mrb = mrb_open();
|
@@ -361,13 +365,18 @@ main(int argc, char **argv)
|
|
361
365
|
}
|
362
366
|
else {
|
363
367
|
/* generate bytecode */
|
364
|
-
|
368
|
+
struct RProc *proc = mrb_generate_code(mrb, parser);
|
365
369
|
|
370
|
+
if (args.verbose) {
|
371
|
+
codedump_all(mrb, proc);
|
372
|
+
}
|
373
|
+
/* pass a proc for evaulation */
|
374
|
+
nregs = first_command ? 0: proc->body.irep->nregs;
|
366
375
|
/* evaluate the bytecode */
|
367
|
-
result =
|
368
|
-
|
369
|
-
|
370
|
-
|
376
|
+
result = mrb_context_run(mrb,
|
377
|
+
proc,
|
378
|
+
mrb_top_self(mrb),
|
379
|
+
nregs);
|
371
380
|
/* did an exception occur? */
|
372
381
|
if (mrb->exc) {
|
373
382
|
p(mrb, mrb_obj_value(mrb->exc), 0);
|
@@ -375,7 +384,7 @@ main(int argc, char **argv)
|
|
375
384
|
}
|
376
385
|
else {
|
377
386
|
/* no */
|
378
|
-
if (!mrb_respond_to(mrb, result,
|
387
|
+
if (!mrb_respond_to(mrb, result, mrb_intern_lit(mrb, "inspect"))){
|
379
388
|
result = mrb_any_to_s(mrb,result);
|
380
389
|
}
|
381
390
|
p(mrb, result, 1);
|
@@ -387,6 +396,7 @@ main(int argc, char **argv)
|
|
387
396
|
}
|
388
397
|
mrb_parser_free(parser);
|
389
398
|
cxt->lineno++;
|
399
|
+
first_command = 0;
|
390
400
|
}
|
391
401
|
mrbc_context_free(mrb, cxt);
|
392
402
|
mrb_close(mrb);
|
@@ -178,6 +178,8 @@ main(int argc, char **argv)
|
|
178
178
|
int i;
|
179
179
|
struct _args args;
|
180
180
|
mrb_value ARGV;
|
181
|
+
mrbc_context *c;
|
182
|
+
mrb_value v;
|
181
183
|
|
182
184
|
if (mrb == NULL) {
|
183
185
|
fputs("Invalid mrb_state, exiting mruby\n", stderr);
|
@@ -197,29 +199,16 @@ main(int argc, char **argv)
|
|
197
199
|
}
|
198
200
|
mrb_define_global_const(mrb, "ARGV", ARGV);
|
199
201
|
|
202
|
+
c = mrbc_context_new(mrb);
|
203
|
+
if (args.verbose)
|
204
|
+
c->dump_result = 1;
|
205
|
+
if (args.check_syntax)
|
206
|
+
c->no_exec = 1;
|
200
207
|
if (args.mrbfile) {
|
201
|
-
|
202
|
-
if (n < 0) {
|
203
|
-
fprintf(stderr, "failed to load mrb file: %s\n", args.cmdline);
|
204
|
-
}
|
205
|
-
else if (!args.check_syntax) {
|
206
|
-
mrb_run(mrb, mrb_proc_new(mrb, mrb->irep[n]), mrb_top_self(mrb));
|
207
|
-
n = 0;
|
208
|
-
if (mrb->exc) {
|
209
|
-
mrb_print_error(mrb);
|
210
|
-
n = -1;
|
211
|
-
}
|
212
|
-
}
|
208
|
+
v = mrb_load_irep_file_cxt(mrb, args.rfp, c);
|
213
209
|
}
|
214
210
|
else {
|
215
|
-
|
216
|
-
mrb_sym zero_sym = mrb_intern2(mrb, "$0", 2);
|
217
|
-
mrb_value v;
|
218
|
-
|
219
|
-
if (args.verbose)
|
220
|
-
c->dump_result = 1;
|
221
|
-
if (args.check_syntax)
|
222
|
-
c->no_exec = 1;
|
211
|
+
mrb_sym zero_sym = mrb_intern_lit(mrb, "$0");
|
223
212
|
|
224
213
|
if (args.rfp) {
|
225
214
|
char *cmdline;
|
@@ -233,17 +222,16 @@ main(int argc, char **argv)
|
|
233
222
|
mrb_gv_set(mrb, zero_sym, mrb_str_new(mrb, "-e", 2));
|
234
223
|
v = mrb_load_string_cxt(mrb, args.cmdline, c);
|
235
224
|
}
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
}
|
242
|
-
n = -1;
|
243
|
-
}
|
244
|
-
else if (args.check_syntax) {
|
245
|
-
printf("Syntax OK\n");
|
225
|
+
}
|
226
|
+
mrbc_context_free(mrb, c);
|
227
|
+
if (mrb->exc) {
|
228
|
+
if (!mrb_undef_p(v)) {
|
229
|
+
mrb_print_error(mrb);
|
246
230
|
}
|
231
|
+
n = -1;
|
232
|
+
}
|
233
|
+
else if (args.check_syntax) {
|
234
|
+
printf("Syntax OK\n");
|
247
235
|
}
|
248
236
|
cleanup(mrb, &args);
|
249
237
|
|
@@ -232,6 +232,26 @@ fiber_yield(mrb_state *mrb, mrb_value self)
|
|
232
232
|
return fiber_result(mrb, a, len);
|
233
233
|
}
|
234
234
|
|
235
|
+
/*
|
236
|
+
* call-seq:
|
237
|
+
* Fiber.current() -> fiber
|
238
|
+
*
|
239
|
+
* Returns the current fiber. You need to <code>require 'fiber'</code>
|
240
|
+
* before using this method. If you are not running in the context of
|
241
|
+
* a fiber this method will return the root fiber.
|
242
|
+
*/
|
243
|
+
static mrb_value
|
244
|
+
fiber_current(mrb_state *mrb, mrb_value self)
|
245
|
+
{
|
246
|
+
if (!mrb->c->fib) {
|
247
|
+
struct RFiber *f = (struct RFiber*)mrb_obj_alloc(mrb, MRB_TT_FIBER, mrb_class_ptr(self));
|
248
|
+
|
249
|
+
f->cxt = mrb->c;
|
250
|
+
mrb->c->fib = f;
|
251
|
+
}
|
252
|
+
return mrb_obj_value(mrb->c->fib);
|
253
|
+
}
|
254
|
+
|
235
255
|
void
|
236
256
|
mrb_mruby_fiber_gem_init(mrb_state* mrb)
|
237
257
|
{
|
@@ -245,6 +265,7 @@ mrb_mruby_fiber_gem_init(mrb_state* mrb)
|
|
245
265
|
mrb_define_method(mrb, c, "alive?", fiber_alive_p, MRB_ARGS_NONE());
|
246
266
|
|
247
267
|
mrb_define_class_method(mrb, c, "yield", fiber_yield, MRB_ARGS_ANY());
|
268
|
+
mrb_define_class_method(mrb, c, "current", fiber_current, MRB_ARGS_NONE());
|
248
269
|
}
|
249
270
|
|
250
271
|
void
|