webruby 0.2.2 → 0.2.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (245) hide show
  1. checksums.yaml +4 -4
  2. data/lib/webruby/config.rb +4 -9
  3. data/lib/webruby/rake/files.rake +2 -2
  4. data/modules/emscripten/AUTHORS +9 -1
  5. data/modules/emscripten/CONTRIBUTING.markdown +5 -0
  6. data/modules/emscripten/ChangeLog +435 -0
  7. data/modules/emscripten/cmake/Modules/FindOpenAL.cmake +26 -0
  8. data/modules/emscripten/cmake/Platform/Emscripten.cmake +9 -2
  9. data/modules/emscripten/em++ +0 -2
  10. data/modules/emscripten/emcc +92 -32
  11. data/modules/emscripten/emlink.py +16 -13
  12. data/modules/emscripten/emmake +1 -1
  13. data/modules/emscripten/emrun +918 -0
  14. data/modules/emscripten/emrun.bat +2 -0
  15. data/modules/emscripten/emscripten.py +545 -20
  16. data/modules/emscripten/src/analyzer.js +6 -1
  17. data/modules/emscripten/src/compiler.js +25 -16
  18. data/modules/emscripten/src/emrun_postjs.js +20 -0
  19. data/modules/emscripten/{tests → src}/hello_world.js +0 -0
  20. data/modules/emscripten/src/intertyper.js +45 -16
  21. data/modules/emscripten/src/jsifier.js +78 -48
  22. data/modules/emscripten/src/library.js +381 -96
  23. data/modules/emscripten/src/library_browser.js +50 -53
  24. data/modules/emscripten/src/library_egl.js +66 -24
  25. data/modules/emscripten/src/library_fs.js +122 -90
  26. data/modules/emscripten/src/library_gl.js +739 -353
  27. data/modules/emscripten/src/library_glfw.js +9 -3
  28. data/modules/emscripten/src/library_glut.js +10 -5
  29. data/modules/emscripten/src/library_idbfs.js +14 -14
  30. data/modules/emscripten/src/library_memfs.js +65 -41
  31. data/modules/emscripten/src/library_nodefs.js +61 -9
  32. data/modules/emscripten/src/library_openal.js +4 -4
  33. data/modules/emscripten/src/library_path.js +9 -13
  34. data/modules/emscripten/src/library_sdl.js +301 -64
  35. data/modules/emscripten/src/library_sockfs.js +7 -5
  36. data/modules/emscripten/src/modules.js +62 -22
  37. data/modules/emscripten/src/parseTools.js +135 -102
  38. data/modules/emscripten/src/postamble.js +3 -4
  39. data/modules/emscripten/src/preamble.js +49 -29
  40. data/modules/emscripten/src/proxyClient.js +1 -1
  41. data/modules/emscripten/src/proxyWorker.js +10 -10
  42. data/modules/emscripten/src/relooper/Relooper.cpp +15 -4
  43. data/modules/emscripten/src/runtime.js +32 -8
  44. data/modules/emscripten/src/settings.js +25 -8
  45. data/modules/emscripten/src/shell.html +6 -3
  46. data/modules/emscripten/src/shell.js +13 -11
  47. data/modules/emscripten/src/simd.js +602 -432
  48. data/modules/emscripten/src/struct_info.json +22 -2
  49. data/modules/emscripten/src/utility.js +32 -17
  50. data/modules/emscripten/system/include/SDL/SDL_events.h +1 -0
  51. data/modules/emscripten/system/include/compat/ctype.h +17 -0
  52. data/modules/emscripten/system/include/compat/wchar.h +23 -0
  53. data/modules/emscripten/system/include/compat/wctype.h +23 -0
  54. data/modules/emscripten/system/include/emscripten/emmintrin.h +87 -0
  55. data/modules/emscripten/system/include/emscripten/emscripten.h +30 -4
  56. data/modules/emscripten/system/include/emscripten/vector.h +29 -1
  57. data/modules/emscripten/system/include/emscripten/xmmintrin.h +131 -0
  58. data/modules/emscripten/system/include/libcxx/CREDITS.TXT +9 -1
  59. data/modules/emscripten/system/include/libcxx/__bit_reference +8 -8
  60. data/modules/emscripten/system/include/libcxx/__config +95 -17
  61. data/modules/emscripten/system/include/libcxx/__debug +25 -4
  62. data/modules/emscripten/system/include/libcxx/__functional_03 +7 -7
  63. data/modules/emscripten/system/include/libcxx/__functional_base +169 -9
  64. data/modules/emscripten/system/include/libcxx/__functional_base_03 +1 -1
  65. data/modules/emscripten/system/include/libcxx/__hash_table +25 -25
  66. data/modules/emscripten/system/include/libcxx/__locale +21 -19
  67. data/modules/emscripten/system/include/libcxx/__mutex_base +2 -33
  68. data/modules/emscripten/system/include/libcxx/__split_buffer +9 -9
  69. data/modules/emscripten/system/include/libcxx/__std_stream +14 -0
  70. data/modules/emscripten/system/include/libcxx/__tree +35 -26
  71. data/modules/emscripten/system/include/libcxx/__tuple +15 -15
  72. data/modules/emscripten/system/include/libcxx/__tuple_03 +2 -2
  73. data/modules/emscripten/system/include/libcxx/__undef_min_max +8 -0
  74. data/modules/emscripten/system/include/libcxx/algorithm +121 -110
  75. data/modules/emscripten/system/include/libcxx/array +15 -15
  76. data/modules/emscripten/system/include/libcxx/bitset +4 -4
  77. data/modules/emscripten/system/include/libcxx/chrono +51 -17
  78. data/modules/emscripten/system/include/libcxx/cmath +25 -23
  79. data/modules/emscripten/system/include/libcxx/codecvt +21 -18
  80. data/modules/emscripten/system/include/libcxx/complex +48 -7
  81. data/modules/emscripten/system/include/libcxx/cstddef +1 -1
  82. data/modules/emscripten/system/include/libcxx/cstdio +8 -1
  83. data/modules/emscripten/system/include/libcxx/cstdlib +1 -1
  84. data/modules/emscripten/system/include/libcxx/cwchar +1 -1
  85. data/modules/emscripten/system/include/libcxx/deque +26 -12
  86. data/modules/emscripten/system/include/libcxx/dynarray +311 -0
  87. data/modules/emscripten/system/include/libcxx/exception +4 -4
  88. data/modules/emscripten/system/include/libcxx/ext/__hash +3 -3
  89. data/modules/emscripten/system/include/libcxx/ext/hash_map +19 -15
  90. data/modules/emscripten/system/include/libcxx/ext/hash_set +7 -3
  91. data/modules/emscripten/system/include/libcxx/forward_list +33 -7
  92. data/modules/emscripten/system/include/libcxx/fstream +4 -4
  93. data/modules/emscripten/system/include/libcxx/functional +200 -170
  94. data/modules/emscripten/system/include/libcxx/future +83 -39
  95. data/modules/emscripten/system/include/libcxx/initializer_list +24 -11
  96. data/modules/emscripten/system/include/libcxx/iomanip +147 -0
  97. data/modules/emscripten/system/include/libcxx/ios +24 -16
  98. data/modules/emscripten/system/include/libcxx/iosfwd +19 -19
  99. data/modules/emscripten/system/include/libcxx/istream +13 -8
  100. data/modules/emscripten/system/include/libcxx/iterator +108 -417
  101. data/modules/emscripten/system/include/libcxx/limits +8 -4
  102. data/modules/emscripten/system/include/libcxx/list +28 -8
  103. data/modules/emscripten/system/include/libcxx/locale +153 -390
  104. data/modules/emscripten/system/include/libcxx/map +280 -100
  105. data/modules/emscripten/system/include/libcxx/memory +49 -97
  106. data/modules/emscripten/system/include/libcxx/mutex +2 -2
  107. data/modules/emscripten/system/include/libcxx/new +43 -14
  108. data/modules/emscripten/system/include/libcxx/numeric +2 -2
  109. data/modules/emscripten/system/include/libcxx/optional +697 -0
  110. data/modules/emscripten/system/include/libcxx/ostream +17 -8
  111. data/modules/emscripten/system/include/libcxx/queue +5 -5
  112. data/modules/emscripten/system/include/libcxx/random +53 -51
  113. data/modules/emscripten/system/include/libcxx/ratio +11 -11
  114. data/modules/emscripten/system/include/libcxx/readme.txt +1 -1
  115. data/modules/emscripten/system/include/libcxx/regex +23 -20
  116. data/modules/emscripten/system/include/libcxx/scoped_allocator +1 -1
  117. data/modules/emscripten/system/include/libcxx/set +166 -2
  118. data/modules/emscripten/system/include/libcxx/shared_mutex +419 -0
  119. data/modules/emscripten/system/include/libcxx/sstream +4 -4
  120. data/modules/emscripten/system/include/libcxx/stack +3 -3
  121. data/modules/emscripten/system/include/libcxx/streambuf +5 -5
  122. data/modules/emscripten/system/include/libcxx/string +372 -324
  123. data/modules/emscripten/system/include/libcxx/support/ibm/limits.h +99 -0
  124. data/modules/emscripten/system/include/libcxx/support/ibm/support.h +54 -0
  125. data/modules/emscripten/system/include/libcxx/support/ibm/xlocale.h +326 -0
  126. data/modules/emscripten/system/include/libcxx/support/win32/limits_win32.h +6 -6
  127. data/modules/emscripten/system/include/libcxx/support/win32/locale_win32.h +15 -15
  128. data/modules/emscripten/system/include/libcxx/support/win32/math_win32.h +2 -0
  129. data/modules/emscripten/system/include/libcxx/support/win32/support.h +6 -1
  130. data/modules/emscripten/system/include/libcxx/system_error +14 -8
  131. data/modules/emscripten/system/include/libcxx/thread +7 -8
  132. data/modules/emscripten/system/include/libcxx/tuple +29 -88
  133. data/modules/emscripten/system/include/libcxx/type_traits +253 -209
  134. data/modules/emscripten/system/include/libcxx/typeindex +3 -3
  135. data/modules/emscripten/system/include/libcxx/unordered_map +162 -101
  136. data/modules/emscripten/system/include/libcxx/unordered_set +79 -2
  137. data/modules/emscripten/system/include/libcxx/utility +20 -20
  138. data/modules/emscripten/system/include/libcxx/valarray +23 -23
  139. data/modules/emscripten/system/include/libcxx/vector +114 -91
  140. data/modules/emscripten/system/lib/libc/musl/src/regex/regcomp.c +3352 -0
  141. data/modules/emscripten/system/lib/libc/musl/src/regex/regerror.c +35 -0
  142. data/modules/emscripten/system/lib/libc/musl/src/regex/regexec.c +1011 -0
  143. data/modules/emscripten/system/lib/libc/musl/src/regex/tre-mem.c +158 -0
  144. data/modules/emscripten/system/lib/libc/musl/src/regex/tre.h +231 -0
  145. data/modules/emscripten/system/lib/libcextra.symbols +7 -0
  146. data/modules/emscripten/system/lib/libcxx/CREDITS.TXT +9 -1
  147. data/modules/emscripten/system/lib/libcxx/algorithm.cpp +1 -0
  148. data/modules/emscripten/system/lib/libcxx/debug.cpp +66 -42
  149. data/modules/emscripten/system/lib/libcxx/exception.cpp +88 -16
  150. data/modules/emscripten/system/lib/libcxx/future.cpp +6 -0
  151. data/modules/emscripten/system/lib/libcxx/ios.cpp +7 -2
  152. data/modules/emscripten/system/lib/libcxx/iostream.cpp +8 -8
  153. data/modules/emscripten/system/lib/libcxx/locale.cpp +38 -11
  154. data/modules/emscripten/system/lib/libcxx/mutex.cpp +3 -0
  155. data/modules/emscripten/system/lib/libcxx/new.cpp +44 -10
  156. data/modules/emscripten/system/lib/libcxx/optional.cpp +25 -0
  157. data/modules/emscripten/system/lib/libcxx/random.cpp +26 -0
  158. data/modules/emscripten/system/lib/libcxx/readme.txt +1 -1
  159. data/modules/emscripten/system/lib/libcxx/shared_mutex.cpp +101 -0
  160. data/modules/emscripten/system/lib/libcxx/stdexcept.cpp +11 -7
  161. data/modules/emscripten/system/lib/libcxx/string.cpp +3 -1
  162. data/modules/emscripten/system/lib/libcxx/strstream.cpp +7 -7
  163. data/modules/emscripten/system/lib/libcxx/support/win32/locale_win32.cpp +12 -13
  164. data/modules/emscripten/system/lib/libcxx/support/win32/support.cpp +33 -36
  165. data/modules/emscripten/system/lib/libcxx/symbols +187 -168
  166. data/modules/emscripten/system/lib/libcxx/system_error.cpp +1 -0
  167. data/modules/emscripten/system/lib/libcxx/thread.cpp +7 -3
  168. data/modules/emscripten/system/lib/libcxx/typeinfo.cpp +9 -6
  169. data/modules/emscripten/system/lib/libcxx/valarray.cpp +2 -0
  170. data/modules/emscripten/third_party/lzma.js/doit.bat +4 -0
  171. data/modules/emscripten/third_party/lzma.js/doit.sh +9 -2
  172. data/modules/emscripten/tools/cache.py +5 -7
  173. data/modules/emscripten/tools/cache.pyc +0 -0
  174. data/modules/emscripten/tools/eliminator/asm-eliminator-test-output.js +7 -0
  175. data/modules/emscripten/tools/eliminator/asm-eliminator-test.js +9 -1
  176. data/modules/emscripten/tools/eliminator/eliminator-test-output.js +3 -0
  177. data/modules/emscripten/tools/eliminator/eliminator-test.js +9 -1
  178. data/modules/emscripten/tools/file_packager.py +93 -50
  179. data/modules/emscripten/tools/js-optimizer.js +98 -48
  180. data/modules/emscripten/tools/js_optimizer.py +4 -4
  181. data/modules/emscripten/tools/js_optimizer.pyc +0 -0
  182. data/modules/emscripten/tools/jsrun.py +1 -1
  183. data/modules/emscripten/tools/jsrun.pyc +0 -0
  184. data/modules/emscripten/tools/response_file.py +6 -0
  185. data/modules/emscripten/tools/response_file.pyc +0 -0
  186. data/modules/emscripten/tools/settings_template_readonly.py +2 -0
  187. data/modules/emscripten/tools/shared.py +88 -34
  188. data/modules/emscripten/tools/shared.pyc +0 -0
  189. data/modules/emscripten/tools/split.py +21 -13
  190. data/modules/mruby/build_config.rb +7 -1
  191. data/modules/mruby/doc/compile/README.md +5 -9
  192. data/modules/mruby/include/mrbconf.h +5 -2
  193. data/modules/mruby/include/mruby/array.h +1 -0
  194. data/modules/mruby/include/mruby/compile.h +2 -4
  195. data/modules/mruby/include/mruby/dump.h +7 -16
  196. data/modules/mruby/include/mruby/hash.h +1 -1
  197. data/modules/mruby/include/mruby/irep.h +14 -2
  198. data/modules/mruby/include/mruby/khash.h +8 -7
  199. data/modules/mruby/include/mruby/string.h +1 -0
  200. data/modules/mruby/include/mruby/value.h +5 -2
  201. data/modules/mruby/include/mruby.h +12 -13
  202. data/modules/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb.c +16 -6
  203. data/modules/mruby/mrbgems/mruby-bin-mruby/tools/mruby/mruby.c +18 -30
  204. data/modules/mruby/mrbgems/mruby-fiber/src/fiber.c +21 -0
  205. data/modules/mruby/mrbgems/mruby-math/src/math.c +1 -1
  206. data/modules/mruby/mrbgems/mruby-random/src/random.c +144 -47
  207. data/modules/mruby/mrbgems/mruby-random/test/random.rb +44 -0
  208. data/modules/mruby/mrbgems/mruby-struct/src/struct.c +5 -5
  209. data/modules/mruby/mrblib/numeric.rb +99 -33
  210. data/modules/mruby/src/array.c +11 -4
  211. data/modules/mruby/src/backtrace.c +2 -2
  212. data/modules/mruby/src/class.c +49 -30
  213. data/modules/mruby/src/codegen.c +131 -79
  214. data/modules/mruby/src/debug.c +1 -1
  215. data/modules/mruby/src/dump.c +213 -163
  216. data/modules/mruby/src/error.c +17 -17
  217. data/modules/mruby/src/error.h +1 -1
  218. data/modules/mruby/src/etc.c +10 -0
  219. data/modules/mruby/src/gc.c +35 -17
  220. data/modules/mruby/src/hash.c +5 -5
  221. data/modules/mruby/src/kernel.c +36 -14
  222. data/modules/mruby/src/load.c +238 -296
  223. data/modules/mruby/src/numeric.c +18 -98
  224. data/modules/mruby/src/object.c +3 -5
  225. data/modules/mruby/src/parse.y +63 -56
  226. data/modules/mruby/src/proc.c +8 -5
  227. data/modules/mruby/src/re.h +0 -1
  228. data/modules/mruby/src/state.c +65 -27
  229. data/modules/mruby/src/string.c +3 -31
  230. data/modules/mruby/src/symbol.c +3 -3
  231. data/modules/mruby/src/variable.c +12 -5
  232. data/modules/mruby/src/vm.c +90 -72
  233. data/modules/mruby/tasks/mruby_build.rake +10 -1
  234. data/modules/mruby/tasks/toolchains/gcc.rake +12 -2
  235. data/modules/mruby/tasks/toolchains/{vs2012.rake → visualcpp.rake} +1 -1
  236. data/modules/mruby/test/driver.c +3 -3
  237. data/modules/mruby/test/t/array.rb +5 -5
  238. data/modules/mruby/test/t/class.rb +14 -1
  239. data/modules/mruby/test/t/kernel.rb +4 -0
  240. data/modules/mruby/test/t/module.rb +4 -4
  241. data/modules/mruby/test/t/nameerror.rb +1 -1
  242. data/modules/mruby/tools/mrbc/mrbc.c +23 -17
  243. data/modules/mruby/travis_config.rb +10 -1
  244. metadata +28 -5
  245. 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 + os.path.realpath(associated_source_file_base)
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
- if input_file is not None: input_file.close()
95
- if output_main_file is not None: output_main_file.close()
96
- if output_part_file is not None: output_part_file.close()
97
- if output_html_include_file is not None: output_html_include_file.close()
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
- toolchain :gcc
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 2010 on Windows.
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 :vs2010
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
- /* array size for parser buffer */
60
- //#define MRB_PARSER_BUF_SIZE 1024
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
- #ifndef MRB_PARSER_BUF_SIZE
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
- int mrb_generate_code(mrb_state*, struct mrb_parser_state*);
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*, size_t, int, FILE*);
18
- int mrb_dump_irep_cfunc(mrb_state *mrb, size_t n, int, FILE *f, const char *initname);
19
- int32_t mrb_read_irep_file(mrb_state*, FILE*);
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 "0001"
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), mrb_intern2(mrb, "ifnone", 6))
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: (not implemented / not used in RiteVM)
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: (not implemented / not used in RiteVM)
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
- uint8_t *p = mrb_malloc(h->mrb, sizeof(uint8_t)*sz/4+(sizeof(khkey_t)+sizeof(khval_t))*sz); \
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 = (p+sizeof(khkey_t)*sz+sizeof(khval_t)*sz); \
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
- extern mrb_value
267
- mrb_float_value(struct mrb_state *mrb, mrb_float f);
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 MRB_ARENA_SIZE
49
- #define MRB_ARENA_SIZE 100
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
- struct RBasic *arena[MRB_ARENA_SIZE]; /* GC protection array */
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 mrb_intern2(mrb_state*,const char*,size_t);
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
- /* For backward compatibility. */
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
- n = mrb_generate_code(mrb, parser);
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 = mrb_run(mrb,
368
- /* pass a proc for evaulation */
369
- mrb_proc_new(mrb, mrb->irep[n]),
370
- mrb_top_self(mrb));
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, mrb_intern2(mrb, "inspect", 7))){
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
- n = mrb_read_irep_file(mrb, args.rfp);
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
- mrbc_context *c = mrbc_context_new(mrb);
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
- mrbc_context_free(mrb, c);
238
- if (mrb->exc) {
239
- if (!mrb_undef_p(v)) {
240
- mrb_print_error(mrb);
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
@@ -89,7 +89,7 @@ erfc(double x)
89
89
 
90
90
  #endif
91
91
 
92
- #if (defined _MSC_VER && _MSC_VER < 1800) || defined __ANDROID__
92
+ #if (defined _MSC_VER && _MSC_VER < 1800) || defined __ANDROID__ || (defined __FreeBSD__ && __FreeBSD_version < 803000)
93
93
 
94
94
  double
95
95
  log2(double x)