webruby 0.2.2 → 0.2.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/webruby/config.rb +4 -9
- data/lib/webruby/rake/files.rake +2 -2
- data/modules/emscripten/AUTHORS +9 -1
- data/modules/emscripten/CONTRIBUTING.markdown +5 -0
- data/modules/emscripten/ChangeLog +435 -0
- data/modules/emscripten/cmake/Modules/FindOpenAL.cmake +26 -0
- data/modules/emscripten/cmake/Platform/Emscripten.cmake +9 -2
- data/modules/emscripten/em++ +0 -2
- data/modules/emscripten/emcc +92 -32
- data/modules/emscripten/emlink.py +16 -13
- data/modules/emscripten/emmake +1 -1
- data/modules/emscripten/emrun +918 -0
- data/modules/emscripten/emrun.bat +2 -0
- data/modules/emscripten/emscripten.py +545 -20
- data/modules/emscripten/src/analyzer.js +6 -1
- data/modules/emscripten/src/compiler.js +25 -16
- data/modules/emscripten/src/emrun_postjs.js +20 -0
- data/modules/emscripten/{tests → src}/hello_world.js +0 -0
- data/modules/emscripten/src/intertyper.js +45 -16
- data/modules/emscripten/src/jsifier.js +78 -48
- data/modules/emscripten/src/library.js +381 -96
- data/modules/emscripten/src/library_browser.js +50 -53
- data/modules/emscripten/src/library_egl.js +66 -24
- data/modules/emscripten/src/library_fs.js +122 -90
- data/modules/emscripten/src/library_gl.js +739 -353
- data/modules/emscripten/src/library_glfw.js +9 -3
- data/modules/emscripten/src/library_glut.js +10 -5
- data/modules/emscripten/src/library_idbfs.js +14 -14
- data/modules/emscripten/src/library_memfs.js +65 -41
- data/modules/emscripten/src/library_nodefs.js +61 -9
- data/modules/emscripten/src/library_openal.js +4 -4
- data/modules/emscripten/src/library_path.js +9 -13
- data/modules/emscripten/src/library_sdl.js +301 -64
- data/modules/emscripten/src/library_sockfs.js +7 -5
- data/modules/emscripten/src/modules.js +62 -22
- data/modules/emscripten/src/parseTools.js +135 -102
- data/modules/emscripten/src/postamble.js +3 -4
- data/modules/emscripten/src/preamble.js +49 -29
- data/modules/emscripten/src/proxyClient.js +1 -1
- data/modules/emscripten/src/proxyWorker.js +10 -10
- data/modules/emscripten/src/relooper/Relooper.cpp +15 -4
- data/modules/emscripten/src/runtime.js +32 -8
- data/modules/emscripten/src/settings.js +25 -8
- data/modules/emscripten/src/shell.html +6 -3
- data/modules/emscripten/src/shell.js +13 -11
- data/modules/emscripten/src/simd.js +602 -432
- data/modules/emscripten/src/struct_info.json +22 -2
- data/modules/emscripten/src/utility.js +32 -17
- data/modules/emscripten/system/include/SDL/SDL_events.h +1 -0
- data/modules/emscripten/system/include/compat/ctype.h +17 -0
- data/modules/emscripten/system/include/compat/wchar.h +23 -0
- data/modules/emscripten/system/include/compat/wctype.h +23 -0
- data/modules/emscripten/system/include/emscripten/emmintrin.h +87 -0
- data/modules/emscripten/system/include/emscripten/emscripten.h +30 -4
- data/modules/emscripten/system/include/emscripten/vector.h +29 -1
- data/modules/emscripten/system/include/emscripten/xmmintrin.h +131 -0
- data/modules/emscripten/system/include/libcxx/CREDITS.TXT +9 -1
- data/modules/emscripten/system/include/libcxx/__bit_reference +8 -8
- data/modules/emscripten/system/include/libcxx/__config +95 -17
- data/modules/emscripten/system/include/libcxx/__debug +25 -4
- data/modules/emscripten/system/include/libcxx/__functional_03 +7 -7
- data/modules/emscripten/system/include/libcxx/__functional_base +169 -9
- data/modules/emscripten/system/include/libcxx/__functional_base_03 +1 -1
- data/modules/emscripten/system/include/libcxx/__hash_table +25 -25
- data/modules/emscripten/system/include/libcxx/__locale +21 -19
- data/modules/emscripten/system/include/libcxx/__mutex_base +2 -33
- data/modules/emscripten/system/include/libcxx/__split_buffer +9 -9
- data/modules/emscripten/system/include/libcxx/__std_stream +14 -0
- data/modules/emscripten/system/include/libcxx/__tree +35 -26
- data/modules/emscripten/system/include/libcxx/__tuple +15 -15
- data/modules/emscripten/system/include/libcxx/__tuple_03 +2 -2
- data/modules/emscripten/system/include/libcxx/__undef_min_max +8 -0
- data/modules/emscripten/system/include/libcxx/algorithm +121 -110
- data/modules/emscripten/system/include/libcxx/array +15 -15
- data/modules/emscripten/system/include/libcxx/bitset +4 -4
- data/modules/emscripten/system/include/libcxx/chrono +51 -17
- data/modules/emscripten/system/include/libcxx/cmath +25 -23
- data/modules/emscripten/system/include/libcxx/codecvt +21 -18
- data/modules/emscripten/system/include/libcxx/complex +48 -7
- data/modules/emscripten/system/include/libcxx/cstddef +1 -1
- data/modules/emscripten/system/include/libcxx/cstdio +8 -1
- data/modules/emscripten/system/include/libcxx/cstdlib +1 -1
- data/modules/emscripten/system/include/libcxx/cwchar +1 -1
- data/modules/emscripten/system/include/libcxx/deque +26 -12
- data/modules/emscripten/system/include/libcxx/dynarray +311 -0
- data/modules/emscripten/system/include/libcxx/exception +4 -4
- data/modules/emscripten/system/include/libcxx/ext/__hash +3 -3
- data/modules/emscripten/system/include/libcxx/ext/hash_map +19 -15
- data/modules/emscripten/system/include/libcxx/ext/hash_set +7 -3
- data/modules/emscripten/system/include/libcxx/forward_list +33 -7
- data/modules/emscripten/system/include/libcxx/fstream +4 -4
- data/modules/emscripten/system/include/libcxx/functional +200 -170
- data/modules/emscripten/system/include/libcxx/future +83 -39
- data/modules/emscripten/system/include/libcxx/initializer_list +24 -11
- data/modules/emscripten/system/include/libcxx/iomanip +147 -0
- data/modules/emscripten/system/include/libcxx/ios +24 -16
- data/modules/emscripten/system/include/libcxx/iosfwd +19 -19
- data/modules/emscripten/system/include/libcxx/istream +13 -8
- data/modules/emscripten/system/include/libcxx/iterator +108 -417
- data/modules/emscripten/system/include/libcxx/limits +8 -4
- data/modules/emscripten/system/include/libcxx/list +28 -8
- data/modules/emscripten/system/include/libcxx/locale +153 -390
- data/modules/emscripten/system/include/libcxx/map +280 -100
- data/modules/emscripten/system/include/libcxx/memory +49 -97
- data/modules/emscripten/system/include/libcxx/mutex +2 -2
- data/modules/emscripten/system/include/libcxx/new +43 -14
- data/modules/emscripten/system/include/libcxx/numeric +2 -2
- data/modules/emscripten/system/include/libcxx/optional +697 -0
- data/modules/emscripten/system/include/libcxx/ostream +17 -8
- data/modules/emscripten/system/include/libcxx/queue +5 -5
- data/modules/emscripten/system/include/libcxx/random +53 -51
- data/modules/emscripten/system/include/libcxx/ratio +11 -11
- data/modules/emscripten/system/include/libcxx/readme.txt +1 -1
- data/modules/emscripten/system/include/libcxx/regex +23 -20
- data/modules/emscripten/system/include/libcxx/scoped_allocator +1 -1
- data/modules/emscripten/system/include/libcxx/set +166 -2
- data/modules/emscripten/system/include/libcxx/shared_mutex +419 -0
- data/modules/emscripten/system/include/libcxx/sstream +4 -4
- data/modules/emscripten/system/include/libcxx/stack +3 -3
- data/modules/emscripten/system/include/libcxx/streambuf +5 -5
- data/modules/emscripten/system/include/libcxx/string +372 -324
- data/modules/emscripten/system/include/libcxx/support/ibm/limits.h +99 -0
- data/modules/emscripten/system/include/libcxx/support/ibm/support.h +54 -0
- data/modules/emscripten/system/include/libcxx/support/ibm/xlocale.h +326 -0
- data/modules/emscripten/system/include/libcxx/support/win32/limits_win32.h +6 -6
- data/modules/emscripten/system/include/libcxx/support/win32/locale_win32.h +15 -15
- data/modules/emscripten/system/include/libcxx/support/win32/math_win32.h +2 -0
- data/modules/emscripten/system/include/libcxx/support/win32/support.h +6 -1
- data/modules/emscripten/system/include/libcxx/system_error +14 -8
- data/modules/emscripten/system/include/libcxx/thread +7 -8
- data/modules/emscripten/system/include/libcxx/tuple +29 -88
- data/modules/emscripten/system/include/libcxx/type_traits +253 -209
- data/modules/emscripten/system/include/libcxx/typeindex +3 -3
- data/modules/emscripten/system/include/libcxx/unordered_map +162 -101
- data/modules/emscripten/system/include/libcxx/unordered_set +79 -2
- data/modules/emscripten/system/include/libcxx/utility +20 -20
- data/modules/emscripten/system/include/libcxx/valarray +23 -23
- data/modules/emscripten/system/include/libcxx/vector +114 -91
- data/modules/emscripten/system/lib/libc/musl/src/regex/regcomp.c +3352 -0
- data/modules/emscripten/system/lib/libc/musl/src/regex/regerror.c +35 -0
- data/modules/emscripten/system/lib/libc/musl/src/regex/regexec.c +1011 -0
- data/modules/emscripten/system/lib/libc/musl/src/regex/tre-mem.c +158 -0
- data/modules/emscripten/system/lib/libc/musl/src/regex/tre.h +231 -0
- data/modules/emscripten/system/lib/libcextra.symbols +7 -0
- data/modules/emscripten/system/lib/libcxx/CREDITS.TXT +9 -1
- data/modules/emscripten/system/lib/libcxx/algorithm.cpp +1 -0
- data/modules/emscripten/system/lib/libcxx/debug.cpp +66 -42
- data/modules/emscripten/system/lib/libcxx/exception.cpp +88 -16
- data/modules/emscripten/system/lib/libcxx/future.cpp +6 -0
- data/modules/emscripten/system/lib/libcxx/ios.cpp +7 -2
- data/modules/emscripten/system/lib/libcxx/iostream.cpp +8 -8
- data/modules/emscripten/system/lib/libcxx/locale.cpp +38 -11
- data/modules/emscripten/system/lib/libcxx/mutex.cpp +3 -0
- data/modules/emscripten/system/lib/libcxx/new.cpp +44 -10
- data/modules/emscripten/system/lib/libcxx/optional.cpp +25 -0
- data/modules/emscripten/system/lib/libcxx/random.cpp +26 -0
- data/modules/emscripten/system/lib/libcxx/readme.txt +1 -1
- data/modules/emscripten/system/lib/libcxx/shared_mutex.cpp +101 -0
- data/modules/emscripten/system/lib/libcxx/stdexcept.cpp +11 -7
- data/modules/emscripten/system/lib/libcxx/string.cpp +3 -1
- data/modules/emscripten/system/lib/libcxx/strstream.cpp +7 -7
- data/modules/emscripten/system/lib/libcxx/support/win32/locale_win32.cpp +12 -13
- data/modules/emscripten/system/lib/libcxx/support/win32/support.cpp +33 -36
- data/modules/emscripten/system/lib/libcxx/symbols +187 -168
- data/modules/emscripten/system/lib/libcxx/system_error.cpp +1 -0
- data/modules/emscripten/system/lib/libcxx/thread.cpp +7 -3
- data/modules/emscripten/system/lib/libcxx/typeinfo.cpp +9 -6
- data/modules/emscripten/system/lib/libcxx/valarray.cpp +2 -0
- data/modules/emscripten/third_party/lzma.js/doit.bat +4 -0
- data/modules/emscripten/third_party/lzma.js/doit.sh +9 -2
- data/modules/emscripten/tools/cache.py +5 -7
- data/modules/emscripten/tools/cache.pyc +0 -0
- data/modules/emscripten/tools/eliminator/asm-eliminator-test-output.js +7 -0
- data/modules/emscripten/tools/eliminator/asm-eliminator-test.js +9 -1
- data/modules/emscripten/tools/eliminator/eliminator-test-output.js +3 -0
- data/modules/emscripten/tools/eliminator/eliminator-test.js +9 -1
- data/modules/emscripten/tools/file_packager.py +93 -50
- data/modules/emscripten/tools/js-optimizer.js +98 -48
- data/modules/emscripten/tools/js_optimizer.py +4 -4
- data/modules/emscripten/tools/js_optimizer.pyc +0 -0
- data/modules/emscripten/tools/jsrun.py +1 -1
- data/modules/emscripten/tools/jsrun.pyc +0 -0
- data/modules/emscripten/tools/response_file.py +6 -0
- data/modules/emscripten/tools/response_file.pyc +0 -0
- data/modules/emscripten/tools/settings_template_readonly.py +2 -0
- data/modules/emscripten/tools/shared.py +88 -34
- data/modules/emscripten/tools/shared.pyc +0 -0
- data/modules/emscripten/tools/split.py +21 -13
- data/modules/mruby/build_config.rb +7 -1
- data/modules/mruby/doc/compile/README.md +5 -9
- data/modules/mruby/include/mrbconf.h +5 -2
- data/modules/mruby/include/mruby/array.h +1 -0
- data/modules/mruby/include/mruby/compile.h +2 -4
- data/modules/mruby/include/mruby/dump.h +7 -16
- data/modules/mruby/include/mruby/hash.h +1 -1
- data/modules/mruby/include/mruby/irep.h +14 -2
- data/modules/mruby/include/mruby/khash.h +8 -7
- data/modules/mruby/include/mruby/string.h +1 -0
- data/modules/mruby/include/mruby/value.h +5 -2
- data/modules/mruby/include/mruby.h +12 -13
- data/modules/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb.c +16 -6
- data/modules/mruby/mrbgems/mruby-bin-mruby/tools/mruby/mruby.c +18 -30
- data/modules/mruby/mrbgems/mruby-fiber/src/fiber.c +21 -0
- data/modules/mruby/mrbgems/mruby-math/src/math.c +1 -1
- data/modules/mruby/mrbgems/mruby-random/src/random.c +144 -47
- data/modules/mruby/mrbgems/mruby-random/test/random.rb +44 -0
- data/modules/mruby/mrbgems/mruby-struct/src/struct.c +5 -5
- data/modules/mruby/mrblib/numeric.rb +99 -33
- data/modules/mruby/src/array.c +11 -4
- data/modules/mruby/src/backtrace.c +2 -2
- data/modules/mruby/src/class.c +49 -30
- data/modules/mruby/src/codegen.c +131 -79
- data/modules/mruby/src/debug.c +1 -1
- data/modules/mruby/src/dump.c +213 -163
- data/modules/mruby/src/error.c +17 -17
- data/modules/mruby/src/error.h +1 -1
- data/modules/mruby/src/etc.c +10 -0
- data/modules/mruby/src/gc.c +35 -17
- data/modules/mruby/src/hash.c +5 -5
- data/modules/mruby/src/kernel.c +36 -14
- data/modules/mruby/src/load.c +238 -296
- data/modules/mruby/src/numeric.c +18 -98
- data/modules/mruby/src/object.c +3 -5
- data/modules/mruby/src/parse.y +63 -56
- data/modules/mruby/src/proc.c +8 -5
- data/modules/mruby/src/re.h +0 -1
- data/modules/mruby/src/state.c +65 -27
- data/modules/mruby/src/string.c +3 -31
- data/modules/mruby/src/symbol.c +3 -3
- data/modules/mruby/src/variable.c +12 -5
- data/modules/mruby/src/vm.c +90 -72
- data/modules/mruby/tasks/mruby_build.rake +10 -1
- data/modules/mruby/tasks/toolchains/gcc.rake +12 -2
- data/modules/mruby/tasks/toolchains/{vs2012.rake → visualcpp.rake} +1 -1
- data/modules/mruby/test/driver.c +3 -3
- data/modules/mruby/test/t/array.rb +5 -5
- data/modules/mruby/test/t/class.rb +14 -1
- data/modules/mruby/test/t/kernel.rb +4 -0
- data/modules/mruby/test/t/module.rb +4 -4
- data/modules/mruby/test/t/nameerror.rb +1 -1
- data/modules/mruby/tools/mrbc/mrbc.c +23 -17
- data/modules/mruby/travis_config.rb +10 -1
- metadata +28 -5
- data/modules/mruby/tasks/toolchains/vs2010.rake +0 -3
@@ -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
|