webruby 0.2.5 → 0.2.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (82) hide show
  1. checksums.yaml +4 -4
  2. data/lib/webruby.rb +0 -4
  3. data/lib/webruby/app.rb +4 -0
  4. data/lib/webruby/rake/files.rake +2 -1
  5. data/lib/webruby/rake/mruby.rake +1 -1
  6. data/modules/emscripten/AUTHORS +1 -0
  7. data/modules/emscripten/ChangeLog +34 -1
  8. data/modules/emscripten/cmake/Platform/Emscripten.cmake +30 -9
  9. data/modules/emscripten/emcc +61 -28
  10. data/modules/emscripten/emrun +15 -11
  11. data/modules/emscripten/emscripten.py +3 -0
  12. data/modules/emscripten/src/closure-externs.js +110 -0
  13. data/modules/emscripten/src/intertyper.js +1 -1
  14. data/modules/emscripten/src/jsifier.js +7 -21
  15. data/modules/emscripten/src/library.js +2 -1
  16. data/modules/emscripten/src/library_browser.js +16 -5
  17. data/modules/emscripten/src/library_fs.js +3 -1
  18. data/modules/emscripten/src/library_gl.js +691 -591
  19. data/modules/emscripten/src/library_glut.js +2 -0
  20. data/modules/emscripten/src/library_sdl.js +29 -5
  21. data/modules/emscripten/src/library_uuid.js +140 -0
  22. data/modules/emscripten/src/modules.js +1 -1
  23. data/modules/emscripten/src/parseTools.js +29 -19
  24. data/modules/emscripten/src/postamble.js +3 -4
  25. data/modules/emscripten/src/preamble.js +17 -1
  26. data/modules/emscripten/src/relooper/Relooper.cpp +8 -8
  27. data/modules/emscripten/src/relooper/Relooper.h +5 -5
  28. data/modules/emscripten/src/relooper/test.txt +2 -2
  29. data/modules/emscripten/src/runtime.js +1 -1
  30. data/modules/emscripten/src/settings.js +3 -0
  31. data/modules/emscripten/src/struct_info.json +12 -0
  32. data/modules/emscripten/system/include/uuid/uuid.h +35 -0
  33. data/modules/emscripten/tools/js-optimizer.js +191 -142
  34. data/modules/emscripten/tools/js_optimizer.py +3 -29
  35. data/modules/emscripten/tools/shared.py +43 -6
  36. data/modules/mruby/include/mruby/value.h +3 -2
  37. data/modules/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb.c +5 -9
  38. data/modules/mruby/mrbgems/mruby-bin-mruby/tools/mruby/mruby.c +3 -5
  39. data/modules/mruby/mrbgems/mruby-hash-ext/src/hash-ext.c +0 -3
  40. data/modules/mruby/mrbgems/mruby-numeric-ext/src/numeric_ext.c +0 -1
  41. data/modules/mruby/mrbgems/mruby-random/src/mt19937ar.c +0 -1
  42. data/modules/mruby/mrbgems/mruby-range-ext/src/range.c +2 -6
  43. data/modules/mruby/mrbgems/mruby-sprintf/src/sprintf.c +0 -4
  44. data/modules/mruby/mrbgems/mruby-string-ext/mrblib/string.rb +22 -0
  45. data/modules/mruby/mrbgems/mruby-string-ext/src/string.c +2 -2
  46. data/modules/mruby/mrbgems/mruby-string-ext/test/string.rb +21 -2
  47. data/modules/mruby/mrbgems/mruby-string-utf8/mrbgem.rake +4 -0
  48. data/modules/mruby/mrbgems/mruby-string-utf8/src/string.c +297 -0
  49. data/modules/mruby/mrbgems/mruby-string-utf8/test/string.rb +27 -0
  50. data/modules/mruby/mrbgems/mruby-struct/src/struct.c +0 -1
  51. data/modules/mruby/mrblib/init_mrblib.c +0 -3
  52. data/modules/mruby/src/array.c +22 -8
  53. data/modules/mruby/src/backtrace.c +12 -9
  54. data/modules/mruby/src/class.c +3 -3
  55. data/modules/mruby/src/codegen.c +17 -5
  56. data/modules/mruby/src/dump.c +5 -6
  57. data/modules/mruby/src/error.c +0 -2
  58. data/modules/mruby/src/etc.c +0 -2
  59. data/modules/mruby/src/gc.c +4 -8
  60. data/modules/mruby/src/load.c +1 -6
  61. data/modules/mruby/src/numeric.c +0 -6
  62. data/modules/mruby/src/object.c +3 -5
  63. data/modules/mruby/src/parse.y +37 -38
  64. data/modules/mruby/src/proc.c +8 -1
  65. data/modules/mruby/src/range.c +3 -7
  66. data/modules/mruby/src/state.c +0 -1
  67. data/modules/mruby/src/string.c +2 -17
  68. data/modules/mruby/src/symbol.c +0 -1
  69. data/modules/mruby/src/variable.c +3 -22
  70. data/modules/mruby/src/vm.c +9 -8
  71. data/modules/mruby/tasks/mrbgem_spec.rake +13 -5
  72. data/modules/mruby/tasks/mrbgems_test.rake +3 -3
  73. data/modules/mruby/tasks/mruby_build_commands.rake +2 -2
  74. data/modules/mruby/tasks/mruby_build_gem.rake +3 -3
  75. data/modules/mruby/test/init_mrbtest.c +0 -3
  76. data/modules/mruby/test/t/array.rb +12 -1
  77. data/modules/mruby/test/t/class.rb +67 -0
  78. data/modules/mruby/test/t/exception.rb +12 -0
  79. data/modules/mruby/test/t/kernel.rb +75 -1
  80. data/modules/mruby/test/t/syntax.rb +115 -0
  81. data/scripts/gen_require.rb +12 -1
  82. metadata +8 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 8aa9f4f3e59012a040e4f07a5bc66d2d6cb095ec
4
- data.tar.gz: c0b1bc4d899990bf072b9c73732dc53b0bd0279f
3
+ metadata.gz: d6513c6c3002e5e95c2c5a19b60dec1243224216
4
+ data.tar.gz: f682702ae1a94714e2b6a35a62efa8f9f07803d3
5
5
  SHA512:
6
- metadata.gz: 963102b0355a11a2412d344525217fdc4cbf34d0e8495b714d7c4922dc96e18ccdeca1748cd6a84a123d17b45ccaf0c2a1ffcafcf0d7652094d5319986785d7d
7
- data.tar.gz: 9699973d8194cc3ccfadc5ba513ce10cccec9565193236f16dc7558a8ef1c24d9ee6816f957c9d5d8f3ee621b1f719e29d01424963714d1d2d1c4c5a47805e2b
6
+ metadata.gz: 76d40913b69ff80303589bf22895a590723d8c245ee47f9afa4578f084ea58cee89bb09dcfc6c83b2aa7238e7b7e2078f8900d69446319fae80c8fc812b95a90
7
+ data.tar.gz: f0c76941cd3b514e667cb86e352bc225e762a01604f78e515ab4ef34b80c5149acc4cd616a43a2727e4ed2437eb8b6909b73dfdd7a0933c1d2d3c287579ffb03
data/lib/webruby.rb CHANGED
@@ -4,7 +4,3 @@ require 'webruby/app'
4
4
  require 'webruby/config'
5
5
  require 'webruby/environment'
6
6
  require 'webruby/utility'
7
-
8
- # load rake tasks
9
- require 'rake'
10
- Dir.glob("#{CURRENT_DIR}/webruby/rake/*.rake") { |f| load f; }
data/lib/webruby/app.rb CHANGED
@@ -7,6 +7,10 @@ module Webruby
7
7
 
8
8
  def setup(&block)
9
9
  block.call(config)
10
+
11
+ # load rake tasks
12
+ require 'rake'
13
+ Dir.glob("#{CURRENT_DIR}/webruby/rake/*.rake") { |f| load f; }
10
14
  end
11
15
  end
12
16
  end
@@ -11,7 +11,7 @@ end
11
11
  file "#{Webruby.build_dir}/rbcode.c" => [Webruby.entrypoint_file,
12
12
  :libmruby,
13
13
  Webruby.build_dir] +
14
- Webruby.rb_files do |t|
14
+ Webruby.rb_files do |t|
15
15
  if Webruby::App.config.source_processor == :gen_require
16
16
  ENV["MRBC"] = "#{Webruby.full_build_dir}/#{MRBC}"
17
17
  sh "ruby #{SCRIPT_GEN_REQUIRE} #{File.expand_path(Webruby.entrypoint_file)} #{Webruby.full_build_dir}/rbcode.c"
@@ -49,6 +49,7 @@ file "#{Webruby.build_dir}/#{Webruby::App.config.output_name}" =>
49
49
  ["#{Webruby.build_dir}/link.js"] + append_file_deps do |t|
50
50
  sh "cat #{Webruby.build_dir}/link.js > #{Webruby.build_dir}/#{Webruby::App.config.output_name}"
51
51
  if Webruby::App.config.append_file
52
+ sh "echo '' >> #{Webruby.build_dir}/#{Webruby::App.config.output_name}"
52
53
  sh "cat #{Webruby::App.config.append_file} >> #{Webruby.build_dir}/#{Webruby::App.config.output_name}"
53
54
  end
54
55
  end
@@ -43,5 +43,5 @@ end
43
43
  desc "mruby test library"
44
44
  task :libmruby_test => Webruby.build_config do |t|
45
45
  ENV["MRUBY_CONFIG"] = Webruby.full_build_config
46
- sh "cd #{MRUBY_DIR} && ruby ./minirake #{Webruby.full_build_dir}/#{MRBTEST}"
46
+ sh "cd #{MRUBY_DIR} && ruby ./minirake #{Webruby.full_build_dir}/#{LIBMRUBY} #{Webruby.full_build_dir}/#{MRBTEST}"
47
47
  end
@@ -114,3 +114,4 @@ a license to everyone to use it as detailed in LICENSE.)
114
114
  * Vasilis Kalintiris <ehostunreach@gmail.com>
115
115
  * Adam C. Clifton <adam@hulkamaniac.com>
116
116
  * Volo Zyko <volo.zyko@gmail.com>
117
+ * Andre Weissflog <floooh@gmail.com>
@@ -10,7 +10,40 @@ Not all changes are documented here. In particular, new features, user-oriented
10
10
  Current trunk code
11
11
  ------------------
12
12
  - To see a list of commits in the active development branch 'incoming', which have not yet been packaged in a release, see
13
- https://github.com/kripken/emscripten/compare/1.7.8...incoming
13
+ https://github.com/kripken/emscripten/compare/1.8.2...incoming
14
+
15
+ v1.8.2: 1/4/2013
16
+ ------------------
17
+ - Fixed glGetFramebufferAttachmentParameteriv and an issue with glGetXXX when the returned value was null.
18
+ - Full list of changes: https://github.com/kripken/emscripten/compare/1.8.1...1.8.2
19
+
20
+ v1.8.1: 1/3/2013
21
+ ------------------
22
+ - Added support for WebGL hardware instancing extension.
23
+ - Improved fastcomp native LLVM backend support.
24
+ - Added support for #include filename.js to JS libraries.
25
+ - Deprecated --compression emcc command line parameter that manually compressed output JS files, due to performance issues. Instead, it is best to rely on the web server to serve compressed JS files.
26
+ - Full list of changes: https://github.com/kripken/emscripten/compare/1.8.0...1.8.1
27
+
28
+ v1.8.0: 12/28/2013
29
+ ------------------
30
+ - Fix two issues with function outliner and relooper.
31
+ - Full list of changes: https://github.com/kripken/emscripten/compare/1.7.9...1.8.0
32
+
33
+ v1.7.9: 12/27/2013
34
+ ------------------
35
+ - Added new command line parameter --em-config that allows specifying a custom location for the .emscripten configuration file.
36
+ - Reintroduced relaxed asm.js heap sizes, which no longer need to be power of 2, but a multiple of 16MB is sufficient.
37
+ - Added emrun command line tool that allows launching .html pages from command line on desktop and Android as if they were native applications. See https://groups.google.com/forum/#!topic/emscripten-discuss/t2juu3q1H8E . Adds --emrun compiler link flag.
38
+ - Began initial work on the "fastcomp" compiler toolchain, a rewrite of the previous JS LLVM AST parsing and codegen via a native LLVM backend.
39
+ - Added --exclude-file command line flag to emcc and a matching --exclude command line flag to file packager, which allows specifying files and directories that should be excluded while packaging a VFS data blob.
40
+ - Improved GLES2 and EGL support libraries to be more spec-conformant.
41
+ - Optimized legacy GL emulation code path. Added new GL_FFP_ONLY optimization path to fixed function pipeline emulation.
42
+ - Added new core functions emscripten_log() and emscripten_get_callstack() that allow printing out log messages with demangled and source-mapped callstack information.
43
+ - Improved BSD Sockets support. Implemented getprotobyname() for BSD Sockets library.
44
+ - Fixed issues with simd support.
45
+ - Various bugfixes: #1573, #1846, #1886, #1908, #1918, #1930, #1931, #1942, #1948, ..
46
+ - Full list of changes: https://github.com/kripken/emscripten/compare/1.7.8...1.7.9
14
47
 
15
48
  v1.7.8: 11/19/2013
16
49
  ------------------
@@ -124,22 +124,22 @@ SET(APPLE)
124
124
  set(CMAKE_C_SIZEOF_DATA_PTR 4)
125
125
  set(CMAKE_CXX_SIZEOF_DATA_PTR 4)
126
126
 
127
- set(CMAKE_C_FLAGS_RELEASE "-DNDEBUG" CACHE STRING "Emscripten-overridden CMAKE_C_FLAGS_RELEASE")
128
- set(CMAKE_C_FLAGS_MINSIZEREL "-DNDEBUG" CACHE STRING "Emscripten-overridden CMAKE_C_FLAGS_MINSIZEREL")
129
- set(CMAKE_C_FLAGS_RELWITHDEBINFO "" CACHE STRING "Emscripten-overridden CMAKE_C_FLAGS_RELWITHDEBINFO")
130
- set(CMAKE_CXX_FLAGS_RELEASE "-DNDEBUG" CACHE STRING "Emscripten-overridden CMAKE_CXX_FLAGS_RELEASE")
131
- set(CMAKE_CXX_FLAGS_MINSIZEREL "-DNDEBUG" CACHE STRING "Emscripten-overridden CMAKE_CXX_FLAGS_MINSIZEREL")
132
- set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "" CACHE STRING "Emscripten-overridden CMAKE_CXX_FLAGS_RELWITHDEBINFO")
127
+ set(CMAKE_C_FLAGS_RELEASE "-DNDEBUG -O2" CACHE STRING "Emscripten-overridden CMAKE_C_FLAGS_RELEASE")
128
+ set(CMAKE_C_FLAGS_MINSIZEREL "-DNDEBUG -O2" CACHE STRING "Emscripten-overridden CMAKE_C_FLAGS_MINSIZEREL")
129
+ set(CMAKE_C_FLAGS_RELWITHDEBINFO "-O2" CACHE STRING "Emscripten-overridden CMAKE_C_FLAGS_RELWITHDEBINFO")
130
+ set(CMAKE_CXX_FLAGS_RELEASE "-DNDEBUG -O2" CACHE STRING "Emscripten-overridden CMAKE_CXX_FLAGS_RELEASE")
131
+ set(CMAKE_CXX_FLAGS_MINSIZEREL "-DNDEBUG -O2" CACHE STRING "Emscripten-overridden CMAKE_CXX_FLAGS_MINSIZEREL")
132
+ set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O2" CACHE STRING "Emscripten-overridden CMAKE_CXX_FLAGS_RELWITHDEBINFO")
133
133
 
134
134
  set(CMAKE_EXE_LINKER_FLAGS_RELEASE "-O2" CACHE STRING "Emscripten-overridden CMAKE_EXE_LINKER_FLAGS_RELEASE")
135
135
  set(CMAKE_EXE_LINKER_FLAGS_MINSIZEREL "-O2" CACHE STRING "Emscripten-overridden CMAKE_EXE_LINKER_FLAGS_MINSIZEREL")
136
- set(CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO "-O2" CACHE STRING "Emscripten-overridden CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO")
136
+ set(CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO "-O2 -g" CACHE STRING "Emscripten-overridden CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO")
137
137
  set(CMAKE_SHARED_LINKER_FLAGS_RELEASE "-O2" CACHE STRING "Emscripten-overridden CMAKE_SHARED_LINKER_FLAGS_RELEASE")
138
138
  set(CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL "-O2" CACHE STRING "Emscripten-overridden CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL")
139
- set(CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO "-O2" CACHE STRING "Emscripten-overridden CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO")
139
+ set(CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO "-O2 -g" CACHE STRING "Emscripten-overridden CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO")
140
140
  set(CMAKE_MODULE_LINKER_FLAGS_RELEASE "-O2" CACHE STRING "Emscripten-overridden CMAKE_MODULE_LINKER_FLAGS_RELEASE")
141
141
  set(CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL "-O2" CACHE STRING "Emscripten-overridden CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL")
142
- set(CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO "-O2" CACHE STRING "Emscripten-overridden CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO")
142
+ set(CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO "-O2 -g" CACHE STRING "Emscripten-overridden CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO")
143
143
 
144
144
  function(em_validate_asmjs_after_build target)
145
145
  add_custom_command(TARGET ${target} POST_BUILD COMMAND ${CMAKE_COMMAND} -E echo Validating build output for asm.js... COMMAND "python" ARGS "${EMSCRIPTEN_ROOT_PATH}/tools/validate_asmjs.py" "$<TARGET_FILE:${target}>")
@@ -205,3 +205,24 @@ endfunction()
205
205
  function(em_link_post_js target)
206
206
  em_add_tracked_link_flag(${target} "--post-js" ${ARGN})
207
207
  endfunction()
208
+
209
+ # Experimental support for targeting generation of Visual Studio project files (vs-tool) of Emscripten projects for Windows.
210
+ # To use this, pass the combination -G "Visual Studio 10" -DCMAKE_TOOLCHAIN_FILE=Emscripten.cmake
211
+ if ("${CMAKE_GENERATOR}" MATCHES "^Visual Studio.*")
212
+ # By default, CMake generates VS project files with a <GenerateManifest>true</GenerateManifest> directive.
213
+ # This causes VS to attempt to invoke rc.exe during the build, which will fail since app manifests are meaningless for Emscripten.
214
+ # To disable this, add the following linker flag. This flag will not go to emcc, since the Visual Studio CMake generator will swallow it.
215
+ set(EMSCRIPTEN_VS_LINKER_FLAGS "/MANIFEST:NO")
216
+ # CMake is hardcoded to write a ClCompile directive <ObjectFileName>$(IntDir)</ObjectFileName> in all VS project files it generates.
217
+ # This makes VS pass emcc a -o param that points to a directory instead of a file, which causes emcc autogenerate the output filename.
218
+ # CMake is hardcoded to assume all object files have the suffix .obj, so adjust the emcc-autogenerated default suffix name to match.
219
+ set(EMSCRIPTEN_VS_LINKER_FLAGS "${EMSCRIPTEN_VS_LINKER_FLAGS} --default-obj-ext .obj")
220
+ # Also hint CMake that it should not hardcode <ObjectFileName> generation. Requires a custom CMake build for this to work (ignored on others)
221
+ # See http://www.cmake.org/Bug/view.php?id=14673 and https://github.com/juj/CMake
222
+ set(CMAKE_VS_NO_DEFAULT_OBJECTFILENAME 1)
223
+
224
+ # Apply and cache Emscripten Visual Studio IDE-specific linker flags.
225
+ set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${EMSCRIPTEN_VS_LINKER_FLAGS}" CACHE STRING "")
226
+ set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${EMSCRIPTEN_VS_LINKER_FLAGS}" CACHE STRING "")
227
+ set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} ${EMSCRIPTEN_VS_LINKER_FLAGS}" CACHE STRING "")
228
+ endif()
@@ -348,7 +348,9 @@ Options that are modified or new in %s include:
348
348
  --embed-file and --preload-file
349
349
  wildcard is supported
350
350
 
351
- --compression <codec> Compress both the compiled code and embedded/
351
+ --compression <codec> **THIS OPTION IS DEPRECATED**
352
+
353
+ Compress both the compiled code and embedded/
352
354
  preloaded files. <codec> should be a triple,
353
355
 
354
356
  <native_encoder>,<js_decoder>,<js_name>
@@ -517,6 +519,13 @@ Options that are modified or new in %s include:
517
519
  file, and if that is not set, the default location
518
520
  ~/.emscripten is assumed.
519
521
 
522
+ --default-obj-ext .ext Specifies the file suffix to generate if the location
523
+ of a directory name is passed to -o directive, e.g.
524
+ emcc -c a.c -o dir/
525
+ will by default generate an output name 'dir/a.o',
526
+ but this cmdline param can be passed to generate a
527
+ file with a custom suffix 'dir/a.ext'.
528
+
520
529
  The target file, if specified (-o <target>), defines what will
521
530
  be generated:
522
531
 
@@ -678,7 +687,7 @@ if os.environ.get('EMMAKEN_CXX'):
678
687
  CC_ADDITIONAL_ARGS = shared.COMPILER_OPTS
679
688
 
680
689
  EMMAKEN_CFLAGS = os.environ.get('EMMAKEN_CFLAGS')
681
- if EMMAKEN_CFLAGS: CC_ADDITIONAL_ARGS += shlex.split(EMMAKEN_CFLAGS)
690
+ if EMMAKEN_CFLAGS: sys.argv += shlex.split(EMMAKEN_CFLAGS)
682
691
 
683
692
  # ---------------- Utilities ---------------
684
693
 
@@ -804,6 +813,7 @@ try:
804
813
  use_preload_cache = False
805
814
  no_heap_copy = False
806
815
  proxy_to_worker = False
816
+ default_object_extension = '.o'
807
817
 
808
818
  if use_cxx:
809
819
  default_cxx_std = '-std=c++03' # Enforce a consistent C++ standard when compiling .cpp files, if user does not specify one on the cmdline.
@@ -914,6 +924,7 @@ try:
914
924
  newargs[i] = ''
915
925
  newargs[i+1] = ''
916
926
  elif newargs[i].startswith('--compression'):
927
+ logging.warning('--compression is deprecated. Instead, it is recommended you use native gzip compression in your webserver')
917
928
  check_bad_eq(newargs[i])
918
929
  parts = newargs[i+1].split(',')
919
930
  assert len(parts) == 3, '--compression requires specifying native_encoder,js_decoder,js_name - see emcc --help. got: %s' % newargs[i+1]
@@ -999,6 +1010,12 @@ try:
999
1010
  # This option is parsed in tools/shared.py, here only clean it up from being passed to clang.
1000
1011
  newargs[i] = ''
1001
1012
  newargs[i+1] = ''
1013
+ elif newargs[i] == '--default-obj-ext':
1014
+ newargs[i] = ''
1015
+ default_object_extension = newargs[i+1]
1016
+ if not default_object_extension.startswith('.'):
1017
+ default_object_extension = '.' + default_object_extension
1018
+ newargs[i+1] = ''
1002
1019
 
1003
1020
  newargs = [ arg for arg in newargs if arg is not '' ]
1004
1021
 
@@ -1173,11 +1190,10 @@ try:
1173
1190
  logging.warning('disabling asm.js since embind is not ready for it yet')
1174
1191
  shared.Settings.ASM_JS = 0
1175
1192
 
1176
- if os.environ.get('EMCC_FAST_COMPILER'):
1193
+ fastcomp = os.environ.get('EMCC_FAST_COMPILER') == '1'
1194
+
1195
+ if fastcomp:
1177
1196
  shared.Settings.ASM_JS = 1
1178
- if shared.Settings.DISABLE_EXCEPTION_CATCHING == 0:
1179
- logging.warning('disabling exception catching since not supported in fastcomp yet')
1180
- shared.Settings.DISABLE_EXCEPTION_CATCHING = 1
1181
1197
  assert shared.Settings.ALLOW_MEMORY_GROWTH == 0, 'memory growth not supported in fastcomp yet'
1182
1198
  assert shared.Settings.UNALIGNED_MEMORY == 0, 'forced unaligned memory not supported in fastcomp'
1183
1199
  assert shared.Settings.SAFE_HEAP == 0, 'safe heap not supported in fastcomp yet'
@@ -1191,10 +1207,18 @@ try:
1191
1207
  assert shared.Settings.NAMED_GLOBALS == 0, 'named globals not supported in fastcomp'
1192
1208
  assert shared.Settings.PGO == 0, 'pgo not supported in fastcomp'
1193
1209
  assert shared.Settings.TARGET_LE32 == 1, 'fastcomp requires le32'
1210
+ assert shared.Settings.USE_TYPED_ARRAYS == 2, 'fastcomp assumes ta2'
1194
1211
  assert not bind, 'embind not supported in fastcomp yet'
1212
+ if jcache:
1213
+ logging.warning('jcache is not supported in fastcomp (you should not need it anyhow), disabling')
1214
+ jcache = False
1215
+
1216
+ fastcomp_opts = ['-pnacl-abi-simplify-preopt', '-pnacl-abi-simplify-postopt']
1217
+ if not shared.Settings.DISABLE_EXCEPTION_CATCHING:
1218
+ fastcomp_opts += ['-enable-emscripten-cxx-exceptions']
1195
1219
 
1196
1220
  if shared.Settings.ASM_JS:
1197
- assert opt_level >= 1 or os.environ.get('EMCC_FAST_COMPILER'), 'asm.js requires -O1 or above'
1221
+ assert opt_level >= 1 or fastcomp, 'asm.js requires -O1 or above'
1198
1222
 
1199
1223
  if bind:
1200
1224
  shared.Settings.RESERVED_FUNCTION_POINTERS = max(shared.Settings.RESERVED_FUNCTION_POINTERS, 10)
@@ -1206,16 +1230,6 @@ try:
1206
1230
  shared.Settings.CORRECT_OVERFLOWS = 1
1207
1231
  assert not shared.Settings.PGO, 'cannot run PGO in ASM_JS mode'
1208
1232
 
1209
- heap = 4096
1210
- while heap < shared.Settings.TOTAL_MEMORY:
1211
- if heap < 16*1024*1024:
1212
- heap *= 2
1213
- else:
1214
- heap += 16*1024*1024
1215
- if heap != shared.Settings.TOTAL_MEMORY:
1216
- logging.warning('increasing TOTAL_MEMORY to %d to be more reasonable for asm.js' % heap)
1217
- shared.Settings.TOTAL_MEMORY = heap
1218
-
1219
1233
  if shared.Settings.CORRECT_SIGNS >= 2 or shared.Settings.CORRECT_OVERFLOWS >= 2 or shared.Settings.CORRECT_ROUNDINGS >= 2:
1220
1234
  debug_level = 4 # must keep debug info to do line-by-line operations
1221
1235
 
@@ -1340,7 +1354,16 @@ try:
1340
1354
  else:
1341
1355
  if len(input_files) == 1:
1342
1356
  temp_output_base = in_temp(unsuffixed(uniquename(input_files[0])))
1343
- shutil.move(temp_output_base + '.o', specified_target)
1357
+ if specified_target.endswith('/') or specified_target.endswith('\\') or os.path.isdir(specified_target): # User passed '-o <directory' as the location to output to.
1358
+ obj_output_name = os.path.join(specified_target, os.path.splitext(os.path.basename(input_file))[0] + default_object_extension)
1359
+ logging.debug('User specified -o <directoryname> as the location of the output. Generating output file ' + obj_output_name)
1360
+ try:
1361
+ shutil.move(temp_output_base + '.o', obj_output_name)
1362
+ except IOError, e:
1363
+ logging.error('Could not write to output file ' + obj_output_name + '. Perhaps the output directory does not exist?')
1364
+ exit(1)
1365
+ else: # User passed '-o <filename>' as the location to output to.
1366
+ shutil.move(temp_output_base + '.o', specified_target)
1344
1367
  if os.path.exists(temp_output_base + '.d'):
1345
1368
  # There was a .d file generated, from -MD or -MMD and friends, save a copy of it to where the output resides,
1346
1369
  # adjusting the target name away from the temporary file name to the specified target.
@@ -1722,22 +1745,24 @@ try:
1722
1745
  # At minimum remove dead functions etc., this potentially saves a lot in the size of the generated code (and the time to compile it)
1723
1746
  link_opts += shared.Building.get_safe_internalize() + ['-globaldce']
1724
1747
 
1725
- # Simplify LLVM bitcode for fastcomp
1726
- if os.environ.get('EMCC_FAST_COMPILER') and not AUTODEBUG:
1727
- link_opts += ['-pnacl-abi-simplify-preopt', '-pnacl-abi-simplify-postopt']
1728
-
1729
- if (not save_bc and not os.environ.get('EMCC_FAST_COMPILER')) or AUTODEBUG:
1748
+ if (not save_bc and not fastcomp) or AUTODEBUG:
1730
1749
  # let llvm opt directly emit ll, to skip writing and reading all the bitcode
1731
1750
  link_opts += ['-S']
1732
1751
  shared.Building.llvm_opt(final, link_opts, final + '.link.ll')
1733
1752
  final = final + '.link.ll'
1734
1753
  if DEBUG: save_intermediate('linktime', 'll')
1735
1754
  else:
1755
+ if fastcomp and not save_bc:
1756
+ # Simplify LLVM bitcode for fastcomp
1757
+ link_opts += fastcomp_opts
1736
1758
  shared.Building.llvm_opt(final, link_opts)
1737
1759
  if DEBUG: save_intermediate('linktime', 'bc')
1738
-
1739
- if save_bc:
1740
- shutil.copyfile(final, save_bc)
1760
+ if save_bc:
1761
+ shutil.copyfile(final, save_bc)
1762
+ if fastcomp:
1763
+ shared.Building.llvm_opt(final, fastcomp_opts, final + '.adsimp.bc')
1764
+ final += '.adsimp.bc'
1765
+ if DEBUG: save_intermediate('adsimp', 'bc')
1741
1766
 
1742
1767
  # Prepare .ll for Emscripten
1743
1768
  if not LEAVE_INPUTS_RAW:
@@ -1754,8 +1779,8 @@ try:
1754
1779
  if DEBUG: save_intermediate('autodebug', 'll')
1755
1780
 
1756
1781
  # Simplify bitcode after autodebug
1757
- if os.environ.get('EMCC_FAST_COMPILER') and (AUTODEBUG or LEAVE_INPUTS_RAW):
1758
- shared.Building.llvm_opt(final, ['-pnacl-abi-simplify-preopt', '-pnacl-abi-simplify-postopt'], final + '.adsimp.bc')
1782
+ if fastcomp and (AUTODEBUG or LEAVE_INPUTS_RAW):
1783
+ shared.Building.llvm_opt(final, fastcomp_opts, final + '.adsimp.bc')
1759
1784
  final += '.adsimp.bc'
1760
1785
  if DEBUG: save_intermediate('adsimp', 'bc')
1761
1786
 
@@ -1891,6 +1916,9 @@ try:
1891
1916
 
1892
1917
  js_optimizer_queue += [get_eliminate()]
1893
1918
 
1919
+ if shared.Settings.AGGRESSIVE_VARIABLE_ELIMINATION:
1920
+ js_optimizer_queue += ['aggressiveVariableElimination']
1921
+
1894
1922
  if opt_level >= 2:
1895
1923
  js_optimizer_queue += ['simplifyExpressions']
1896
1924
 
@@ -1949,6 +1977,11 @@ try:
1949
1977
  if debug_level >= 4:
1950
1978
  generate_source_map(target)
1951
1979
  shutil.move(final, js_target)
1980
+ # TODO: use an async blob, which would allow code rewriting on the client:
1981
+ # var blob = new Blob([codeString]);
1982
+ # var script = document.createElement('script');
1983
+ # script.src = URL.createObjectURL(blob);
1984
+ # document.body.appendChild(script);
1952
1985
  script_tag = '''<script async type="text/javascript" src="%s"></script>''' % base_js_target
1953
1986
  html.write(shell.replace('{{{ SCRIPT }}}', script_tag))
1954
1987
  else:
@@ -492,15 +492,18 @@ def win_print_gpu_info():
492
492
  print "GPU"+str(i)+ ": " + gpus[i] + " with " + gpu_memory[i] + " MBs of VRAM"
493
493
 
494
494
  def linux_print_gpu_info():
495
- glxinfo = subprocess.check_output('glxinfo')
496
- for line in glxinfo.split("\n"):
497
- if "OpenGL vendor string:" in line:
498
- gl_vendor = line[len("OpenGL vendor string:"):].strip()
499
- if "OpenGL version string:" in line:
500
- gl_version = line[len("OpenGL version string:"):].strip()
501
- if "OpenGL renderer string:" in line:
502
- gl_renderer = line[len("OpenGL renderer string:"):].strip()
503
- logi('GPU: ' + gl_vendor + ' ' + gl_renderer + ', GL version ' + gl_version)
495
+ try:
496
+ glxinfo = subprocess.check_output('glxinfo')
497
+ for line in glxinfo.split("\n"):
498
+ if "OpenGL vendor string:" in line:
499
+ gl_vendor = line[len("OpenGL vendor string:"):].strip()
500
+ if "OpenGL version string:" in line:
501
+ gl_version = line[len("OpenGL version string:"):].strip()
502
+ if "OpenGL renderer string:" in line:
503
+ gl_renderer = line[len("OpenGL renderer string:"):].strip()
504
+ logi('GPU: ' + gl_vendor + ' ' + gl_renderer + ', GL version ' + gl_version)
505
+ except:
506
+ pass
504
507
 
505
508
  def osx_print_gpu_info():
506
509
  try:
@@ -722,11 +725,12 @@ def find_browser(name):
722
725
  ('firefox_beta', os.path.expanduser('~/firefox_beta/firefox')),
723
726
  ('firefox_aurora', os.path.expanduser('~/firefox_aurora/firefox')),
724
727
  ('firefox_nightly', os.path.expanduser('~/firefox_nightly/firefox')),
725
- ('chrome', which('google-chrome-stable'))]
728
+ ('chrome', which('google-chrome-stable')),
729
+ ('chrome', which('google-chrome'))]
726
730
 
727
731
  for (alias, browser_exe) in browser_locations:
728
732
  if name == alias:
729
- if os.path.isfile(browser_exe):
733
+ if browser_exe is not None and os.path.isfile(browser_exe):
730
734
  return [browser_exe]
731
735
 
732
736
  return None # Could not find the browser
@@ -804,6 +804,9 @@ def emscript_fast(infile, settings, outfile, libraries=[], compiler_engine=None,
804
804
  map(lambda x: x[1:], metadata['implementedFunctions'])
805
805
  )
806
806
  ) + map(lambda x: x[1:], metadata['externs'])
807
+ if metadata['simd']:
808
+ settings['SIMD'] = 1
809
+ settings['ASM_JS'] = 2
807
810
 
808
811
  # Save settings to a file to work around v8 issue 1579
809
812
  settings_file = temp_files.get('.txt').name
@@ -0,0 +1,110 @@
1
+ /**
2
+ * This file contains definitions for things that we'd really rather the closure compiler *didn't* minify.
3
+ * See http://code.google.com/p/closure-compiler/wiki/FAQ#How_do_I_write_an_externs_file
4
+ * See also the discussion here: https://github.com/kripken/emscripten/issues/1979
5
+ *
6
+ * The closure_compiler() method in tools/shared.py refers to this file when calling closure.
7
+ */
8
+
9
+ // Closure externs used by library_uuid.js
10
+
11
+ /**
12
+ * @param {Array} typedArray
13
+ */
14
+ crypto.getRandomValues = function(typedArray) {};
15
+
16
+ /**
17
+ BEGIN_NODE_INCLUDE
18
+ var crypto = require('crypto');
19
+ END_NODE_INCLUDE
20
+ */
21
+
22
+ /**
23
+ * @type {Object.<string,*>}
24
+ */
25
+ var crypto = {};
26
+
27
+ /**
28
+ * @param {number} size
29
+ * @param {function(Error, buffer.Buffer)} callback
30
+ */
31
+ crypto.randomBytes = function(size, callback) {};
32
+
33
+
34
+ // Closure externs used by library_sockfs.js
35
+
36
+ /**
37
+ BEGIN_NODE_INCLUDE
38
+ var ws = require('ws');
39
+ END_NODE_INCLUDE
40
+ */
41
+
42
+ /**
43
+ * @type {Object.<string,*>}
44
+ */
45
+ var ws = {};
46
+
47
+ /**
48
+ * @param {string} event
49
+ * @param {function()} callback
50
+ */
51
+ ws.on = function(event, callback) {};
52
+
53
+ /**
54
+ * @param {Object} data
55
+ * @param {Object} flags
56
+ * @param {function()=} callback
57
+ */
58
+ ws.send = function(data, flags, callback) {};
59
+
60
+ /**
61
+ * @type {boolean}
62
+ */
63
+ ws.binaryType;
64
+
65
+ /**
66
+ * @type {Object.<string,*>}
67
+ */
68
+ var wss = ws.Server;
69
+
70
+ /**
71
+ * @param {string} event
72
+ * @param {function()} callback
73
+ */
74
+ wss.on = function(event, callback) {};
75
+
76
+ /**
77
+ * @param {function()} callback
78
+ */
79
+ wss.broadcast = function(callback) {};
80
+
81
+ /**
82
+ * @type {Object.<string,*>}
83
+ */
84
+ wss._socket;
85
+
86
+ /**
87
+ * @type {string}
88
+ */
89
+ wss.url;
90
+
91
+ /**
92
+ * @type {string}
93
+ */
94
+ wss._socket.remoteAddress;
95
+
96
+ /**
97
+ * @type {number}
98
+ */
99
+ wss._socket.remotePort;
100
+
101
+ /**
102
+ * @type {Object.<string,*>}
103
+ */
104
+ var flags = {};
105
+ /**
106
+ * @type {boolean}
107
+ */
108
+ flags.binary;
109
+
110
+