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.
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)