opal 1.7.4 → 1.8.0.alpha1

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 (211) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/build.yml +9 -9
  3. data/.rubocop/todo.yml +2 -2
  4. data/.rubocop.yml +17 -10
  5. data/.rubocop_todo.yml +311 -0
  6. data/CHANGELOG.md +1 -15
  7. data/UNRELEASED.md +78 -1
  8. data/benchmark-ips/bm_block_vs_yield.rb +3 -0
  9. data/benchmark-ips/bm_slice_or_not.rb +53 -0
  10. data/docs/bridging.md +112 -0
  11. data/docs/compiled_ruby.md +10 -10
  12. data/docs/getting_started.md +18 -22
  13. data/lib/opal/cli_runners/chrome.rb +1 -5
  14. data/lib/opal/cli_runners/chrome_cdp_interface.rb +1 -0
  15. data/lib/opal/cli_runners/firefox_cdp_interface.rb +1 -0
  16. data/lib/opal/compiler.rb +33 -1
  17. data/lib/opal/nodes/args/extract_kwoptarg.rb +2 -1
  18. data/lib/opal/nodes/call.rb +1 -1
  19. data/lib/opal/nodes/call_special.rb +71 -47
  20. data/lib/opal/nodes/hash.rb +14 -30
  21. data/lib/opal/nodes/if.rb +37 -29
  22. data/lib/opal/nodes/literal.rb +5 -1
  23. data/lib/opal/nodes/x_string.rb +13 -0
  24. data/lib/opal/parser/patch.rb +1 -0
  25. data/lib/opal/rewriters/for_rewriter.rb +36 -24
  26. data/lib/opal/simple_server.rb +2 -2
  27. data/lib/opal/source_map/file.rb +1 -1
  28. data/lib/opal/version.rb +1 -1
  29. data/opal/corelib/array/pack.rb +1 -0
  30. data/opal/corelib/array.rb +71 -43
  31. data/opal/corelib/basic_object.rb +1 -0
  32. data/opal/corelib/binding.rb +2 -0
  33. data/opal/corelib/boolean.rb +1 -0
  34. data/opal/corelib/class.rb +2 -0
  35. data/opal/corelib/comparable.rb +1 -0
  36. data/opal/corelib/complex.rb +2 -0
  37. data/opal/corelib/constants.rb +2 -2
  38. data/opal/corelib/dir.rb +2 -0
  39. data/opal/corelib/enumerable.rb +3 -2
  40. data/opal/corelib/enumerator/arithmetic_sequence.rb +2 -0
  41. data/opal/corelib/enumerator/chain.rb +1 -0
  42. data/opal/corelib/enumerator/generator.rb +1 -0
  43. data/opal/corelib/enumerator/lazy.rb +1 -0
  44. data/opal/corelib/enumerator/yielder.rb +2 -0
  45. data/opal/corelib/enumerator.rb +1 -0
  46. data/opal/corelib/error/errno.rb +2 -0
  47. data/opal/corelib/error.rb +12 -0
  48. data/opal/corelib/file.rb +1 -0
  49. data/opal/corelib/hash.rb +197 -504
  50. data/opal/corelib/helpers.rb +1 -0
  51. data/opal/corelib/io.rb +2 -0
  52. data/opal/corelib/irb.rb +2 -0
  53. data/opal/corelib/kernel/format.rb +1 -0
  54. data/opal/corelib/kernel.rb +70 -14
  55. data/opal/corelib/main.rb +2 -0
  56. data/opal/corelib/marshal/read_buffer.rb +2 -0
  57. data/opal/corelib/marshal/write_buffer.rb +2 -0
  58. data/opal/corelib/math/polyfills.rb +2 -0
  59. data/opal/corelib/math.rb +1 -0
  60. data/opal/corelib/method.rb +2 -0
  61. data/opal/corelib/module.rb +1 -0
  62. data/opal/corelib/nil.rb +3 -1
  63. data/opal/corelib/number.rb +2 -0
  64. data/opal/corelib/numeric.rb +2 -0
  65. data/opal/corelib/object_space.rb +1 -0
  66. data/opal/corelib/pack_unpack/format_string_parser.rb +2 -0
  67. data/opal/corelib/proc.rb +30 -28
  68. data/opal/corelib/process.rb +2 -0
  69. data/opal/corelib/random/formatter.rb +2 -0
  70. data/opal/corelib/random/math_random.js.rb +2 -0
  71. data/opal/corelib/random/mersenne_twister.rb +2 -0
  72. data/opal/corelib/random/seedrandom.js.rb +2 -0
  73. data/opal/corelib/random.rb +1 -0
  74. data/opal/corelib/range.rb +34 -12
  75. data/opal/corelib/rational.rb +2 -0
  76. data/opal/corelib/regexp.rb +1 -0
  77. data/opal/corelib/runtime.js +187 -231
  78. data/opal/corelib/set.rb +2 -0
  79. data/opal/corelib/string/encoding.rb +3 -0
  80. data/opal/corelib/string/unpack.rb +2 -0
  81. data/opal/corelib/string.rb +20 -12
  82. data/opal/corelib/struct.rb +3 -1
  83. data/opal/corelib/time.rb +1 -0
  84. data/opal/corelib/trace_point.rb +2 -0
  85. data/opal/corelib/unsupported.rb +2 -0
  86. data/opal/corelib/variables.rb +2 -0
  87. data/opal.gemspec +2 -2
  88. data/spec/filters/bugs/array.rb +0 -2
  89. data/spec/filters/bugs/enumerable.rb +0 -3
  90. data/spec/filters/bugs/hash.rb +0 -13
  91. data/spec/filters/bugs/kernel.rb +0 -38
  92. data/spec/filters/bugs/range.rb +0 -1
  93. data/spec/filters/bugs/ruby-32.rb +0 -2
  94. data/spec/filters/bugs/string.rb +0 -1
  95. data/spec/filters/bugs/struct.rb +1 -5
  96. data/spec/filters/unsupported/hash.rb +1 -0
  97. data/spec/lib/compiler_spec.rb +24 -17
  98. data/spec/mspec-opal/formatters.rb +2 -0
  99. data/spec/mspec-opal/runner.rb +2 -0
  100. data/spec/opal/core/array/dup_spec.rb +2 -0
  101. data/spec/opal/core/exception_spec.rb +2 -0
  102. data/spec/opal/core/hash/internals_spec.rb +154 -206
  103. data/spec/opal/core/hash_spec.rb +2 -0
  104. data/spec/opal/core/iterable_props_spec.rb +2 -0
  105. data/spec/opal/core/kernel/at_exit_spec.rb +2 -0
  106. data/spec/opal/core/kernel/respond_to_spec.rb +2 -0
  107. data/spec/opal/core/language/arguments/mlhs_arg_spec.rb +2 -0
  108. data/spec/opal/core/language/safe_navigator_spec.rb +2 -0
  109. data/spec/opal/core/language/xstring_send_spec.rb +15 -0
  110. data/spec/opal/core/language/xstring_spec.rb +2 -0
  111. data/spec/opal/core/language_spec.rb +2 -0
  112. data/spec/opal/core/module_spec.rb +44 -0
  113. data/spec/opal/core/number/to_i_spec.rb +2 -0
  114. data/spec/opal/core/object_id_spec.rb +2 -0
  115. data/spec/opal/core/regexp/match_spec.rb +2 -0
  116. data/spec/opal/core/runtime/bridged_classes_spec.rb +38 -0
  117. data/spec/opal/core/runtime/constants_spec.rb +2 -0
  118. data/spec/opal/core/runtime/eval_spec.rb +2 -0
  119. data/spec/opal/core/runtime/exit_spec.rb +2 -0
  120. data/spec/opal/core/runtime/is_a_spec.rb +2 -0
  121. data/spec/opal/core/runtime/loaded_spec.rb +2 -0
  122. data/spec/opal/core/runtime/method_missing_spec.rb +2 -0
  123. data/spec/opal/core/runtime/rescue_spec.rb +2 -0
  124. data/spec/opal/core/runtime/string_spec.rb +2 -0
  125. data/spec/opal/core/runtime/truthy_spec.rb +2 -0
  126. data/spec/opal/core/runtime_spec.rb +2 -6
  127. data/spec/opal/core/string/to_sym_spec.rb +2 -0
  128. data/spec/opal/stdlib/js_spec.rb +2 -0
  129. data/spec/opal/stdlib/native/alias_native_spec.rb +2 -0
  130. data/spec/opal/stdlib/native/array_spec.rb +2 -0
  131. data/spec/opal/stdlib/native/date_spec.rb +2 -0
  132. data/spec/opal/stdlib/native/each_spec.rb +2 -0
  133. data/spec/opal/stdlib/native/element_reference_spec.rb +2 -0
  134. data/spec/opal/stdlib/native/exposure_spec.rb +2 -0
  135. data/spec/opal/stdlib/native/ext_spec.rb +2 -0
  136. data/spec/opal/stdlib/native/hash_spec.rb +30 -2
  137. data/spec/opal/stdlib/native/initialize_spec.rb +2 -0
  138. data/spec/opal/stdlib/native/method_missing_spec.rb +2 -0
  139. data/spec/opal/stdlib/native/native_alias_spec.rb +2 -0
  140. data/spec/opal/stdlib/native/native_class_spec.rb +2 -0
  141. data/spec/opal/stdlib/native/native_module_spec.rb +2 -0
  142. data/spec/opal/stdlib/native/native_reader_spec.rb +2 -0
  143. data/spec/opal/stdlib/native/native_writer_spec.rb +2 -0
  144. data/spec/opal/stdlib/native/new_spec.rb +2 -0
  145. data/spec/opal/stdlib/native/struct_spec.rb +2 -0
  146. data/spec/spec_helper.rb +2 -0
  147. data/stdlib/await.rb +1 -0
  148. data/stdlib/base64.rb +2 -0
  149. data/stdlib/bigdecimal/bignumber.js.rb +2 -0
  150. data/stdlib/bigdecimal/util.rb +1 -0
  151. data/stdlib/bigdecimal.rb +2 -0
  152. data/stdlib/buffer/array.rb +2 -0
  153. data/stdlib/buffer/view.rb +2 -0
  154. data/stdlib/buffer.rb +2 -0
  155. data/stdlib/cgi.rb +14 -0
  156. data/stdlib/console.rb +2 -0
  157. data/stdlib/date/date_time.rb +2 -0
  158. data/stdlib/date.rb +2 -0
  159. data/stdlib/delegate.rb +2 -0
  160. data/stdlib/deno/base.rb +2 -0
  161. data/stdlib/deno/file.rb +2 -0
  162. data/stdlib/erb.rb +2 -0
  163. data/stdlib/gjs/io.rb +2 -0
  164. data/stdlib/gjs/kernel.rb +2 -0
  165. data/stdlib/headless_browser/base.rb +2 -0
  166. data/stdlib/headless_browser/file.rb +1 -0
  167. data/stdlib/headless_browser.rb +1 -0
  168. data/stdlib/js.rb +2 -0
  169. data/stdlib/json.rb +9 -15
  170. data/stdlib/logger.rb +2 -0
  171. data/stdlib/nashorn/file.rb +2 -0
  172. data/stdlib/nashorn/io.rb +2 -0
  173. data/stdlib/native.rb +48 -48
  174. data/stdlib/nodejs/base.rb +2 -0
  175. data/stdlib/nodejs/dir.rb +2 -0
  176. data/stdlib/nodejs/env.rb +2 -0
  177. data/stdlib/nodejs/file.rb +2 -0
  178. data/stdlib/nodejs/fileutils.rb +2 -0
  179. data/stdlib/nodejs/io.rb +2 -0
  180. data/stdlib/nodejs/js-yaml-3-6-1.js +1 -1
  181. data/stdlib/nodejs/kernel.rb +2 -0
  182. data/stdlib/nodejs/open-uri.rb +2 -0
  183. data/stdlib/nodejs/pathname.rb +2 -0
  184. data/stdlib/nodejs/require.rb +2 -0
  185. data/stdlib/nodejs/yaml.rb +9 -3
  186. data/stdlib/opal/miniracer.rb +2 -0
  187. data/stdlib/opal-parser.rb +8 -1
  188. data/stdlib/opal-platform.rb +2 -0
  189. data/stdlib/opal-replutils.rb +2 -0
  190. data/stdlib/open-uri.rb +4 -1
  191. data/stdlib/ostruct.rb +4 -2
  192. data/stdlib/pathname.rb +2 -0
  193. data/stdlib/pp.rb +1 -0
  194. data/stdlib/promise/v2.rb +2 -0
  195. data/stdlib/quickjs/io.rb +2 -0
  196. data/stdlib/quickjs/kernel.rb +2 -0
  197. data/stdlib/quickjs.rb +2 -0
  198. data/stdlib/securerandom.rb +2 -0
  199. data/stdlib/strscan.rb +2 -0
  200. data/stdlib/time.rb +2 -0
  201. data/stdlib/uri.rb +1 -0
  202. data/tasks/performance/optimization_status.rb +2 -0
  203. data/tasks/testing.rake +1 -0
  204. data/test/nodejs/test_await.rb +1 -0
  205. data/test/nodejs/test_dir.rb +2 -0
  206. data/test/nodejs/test_error.rb +2 -0
  207. data/test/nodejs/test_file.rb +2 -0
  208. data/test/nodejs/test_string.rb +2 -0
  209. data/test/nodejs/test_yaml.rb +20 -0
  210. metadata +22 -13
  211. data/spec/filters/bugs/openstruct.rb +0 -8
@@ -1,3 +1,5 @@
1
+ # backtick_javascript: true
2
+
1
3
  describe "Exit (Kernel#exit / Opal.exit())" do
2
4
  it "forwards the status code to Opal.exit(status)" do
3
5
  received_status { Kernel.exit }.should == 0
@@ -1,3 +1,5 @@
1
+ # backtick_javascript: true
2
+
1
3
  describe 'Opal.is_a' do
2
4
  describe 'Numeric/Number special cases' do
3
5
  [
@@ -1,3 +1,5 @@
1
+ # backtick_javascript: true
2
+
1
3
  describe 'Opal.loaded' do
2
4
  before do
3
5
  %w[foo bar baz].each do |module_name|
@@ -1,3 +1,5 @@
1
+ # backtick_javascript: true
2
+
1
3
  require "spec_helper"
2
4
 
3
5
  module MethodMissingSpecs
@@ -1,3 +1,5 @@
1
+ # backtick_javascript: true
2
+
1
3
  describe "The rescue keyword" do
2
4
  context 'JS::Error' do
3
5
  it 'handles raw js throws' do
@@ -1,3 +1,5 @@
1
+ # backtick_javascript: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  describe "Runtime String helpers" do
@@ -1,3 +1,5 @@
1
+ # backtick_javascript: true
2
+
1
3
  class Boolean
2
4
  def self_as_an_object
3
5
  self
@@ -1,10 +1,6 @@
1
- require 'spec_helper'
1
+ # backtick_javascript: true
2
2
 
3
- describe '`Opal.hash`' do
4
- it 'converts object literals to hashes' do
5
- `Opal.hash({a: 1, b: 2})`.should == {a: 1, b: 2}
6
- end
7
- end
3
+ require 'spec_helper'
8
4
 
9
5
  describe 'javascript access using .JS' do
10
6
  it 'should call javascript methods via .JS.method()' do
@@ -1,3 +1,5 @@
1
+ # backtick_javascript: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  describe 'String#to_sym' do
@@ -1,3 +1,5 @@
1
+ # backtick_javascript: true
2
+
1
3
  require 'spec_helper'
2
4
  require 'js'
3
5
 
@@ -1,3 +1,5 @@
1
+ # backtick_javascript: true
2
+
1
3
  require 'native'
2
4
 
3
5
  describe "Native.alias_native" do
@@ -1,3 +1,5 @@
1
+ # backtick_javascript: true
2
+
1
3
  require 'native'
2
4
 
3
5
  describe Array do
@@ -1,3 +1,5 @@
1
+ # backtick_javascript: true
2
+
1
3
  require 'native'
2
4
  require 'date'
3
5
 
@@ -1,3 +1,5 @@
1
+ # backtick_javascript: true
2
+
1
3
  require 'native'
2
4
 
3
5
  describe "Native::Object#each" do
@@ -1,3 +1,5 @@
1
+ # backtick_javascript: true
2
+
1
3
  require 'native'
2
4
 
3
5
  describe "Native::Object#[]" do
@@ -1,3 +1,5 @@
1
+ # backtick_javascript: true
2
+
1
3
  require 'native'
2
4
 
3
5
  describe 'Native exposure' do
@@ -1,3 +1,5 @@
1
+ # backtick_javascript: true
2
+
1
3
  require 'native'
2
4
 
3
5
  describe Hash do
@@ -1,3 +1,5 @@
1
+ # backtick_javascript: true
2
+
1
3
  require 'native'
2
4
 
3
5
  describe Hash do
@@ -36,6 +38,32 @@ describe Hash do
36
38
  expect(h).to eq(expected_hash)
37
39
  end
38
40
 
41
+ it 'turns a native JS Map into a hash' do
42
+ obj = %x{
43
+ new Map([ ['a', 1],
44
+ ['b', "two"],
45
+ ['c', new Map([['d', 1]])],
46
+ ['e', [{f: 'g',h: [null]}]] ]);
47
+ }
48
+
49
+ h = Hash.new(obj)
50
+ expected_hash = {
51
+ a: 1,
52
+ b: "two",
53
+ c: {
54
+ d: 1,
55
+ },
56
+ e: [
57
+ {
58
+ f: 'g',
59
+ h: [nil],
60
+ },
61
+ ],
62
+ }
63
+
64
+ expect(h).to eq(expected_hash)
65
+ end
66
+
39
67
  it 'turns Object.create(null) JS objects into a hash' do
40
68
  %x{
41
69
  var obj = Object.create(null);
@@ -54,14 +82,14 @@ describe Hash do
54
82
  it 'converts a hash with native objects as values' do
55
83
  obj = { 'a_key' => `{ key: 1 }` }
56
84
  native = obj.to_n
57
- `#{native}.a_key.key`.should == 1
85
+ `#{native}.get('a_key').key`.should == 1
58
86
  end
59
87
 
60
88
  it 'passes Ruby objects that cannot be converted' do
61
89
  object = Object.new
62
90
  hash = { foo: object }
63
91
  native = hash.to_n
64
- expect(`#{native}.foo`).to eq object
92
+ expect(`#{native}.get('foo')`).to eq object
65
93
  end
66
94
  end
67
95
  end
@@ -1,3 +1,5 @@
1
+ # backtick_javascript: true
2
+
1
3
  require 'native'
2
4
 
3
5
  describe "Native#initialize" do
@@ -1,3 +1,5 @@
1
+ # backtick_javascript: true
2
+
1
3
  require 'native'
2
4
 
3
5
  describe "Native::Object#method_missing" do
@@ -1,3 +1,5 @@
1
+ # backtick_javascript: true
2
+
1
3
  require 'native'
2
4
 
3
5
  describe "Class#native_alias" do
@@ -1,3 +1,5 @@
1
+ # backtick_javascript: true
2
+
1
3
  require 'native'
2
4
 
3
5
  describe "Class#native_class" do
@@ -1,3 +1,5 @@
1
+ # backtick_javascript: true
2
+
1
3
  require 'native'
2
4
 
3
5
  describe "Module#native_module" do
@@ -1,3 +1,5 @@
1
+ # backtick_javascript: true
2
+
1
3
  require 'native'
2
4
 
3
5
  describe "Native.native_reader" do
@@ -1,3 +1,5 @@
1
+ # backtick_javascript: true
2
+
1
3
  require 'native'
2
4
 
3
5
  describe "Native.native_writer" do
@@ -1,3 +1,5 @@
1
+ # backtick_javascript: true
2
+
1
3
  require 'native'
2
4
 
3
5
  describe "Native()" do
@@ -1,3 +1,5 @@
1
+ # backtick_javascript: true
2
+
1
3
  require 'native'
2
4
 
3
5
  describe Struct do
data/spec/spec_helper.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # backtick_javascript: true
2
+
1
3
  require 'opal'
2
4
  require 'set'
3
5
  require 'opal/platform'
data/stdlib/await.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  # helpers: coerce_to
2
2
  # await: await
3
+ # backtick_javascript: true
3
4
 
4
5
  %x{
5
6
  var AsyncFunction = Object.getPrototypeOf(async function() {}).constructor;
data/stdlib/base64.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # backtick_javascript: true
2
+
1
3
  module Base64
2
4
  # FROM https://github.com/davidchambers/Base64.js/blob/69262ec7e1fa4541de5700a1b0b03b0de0e3f5aa/base64.js
3
5
  %x{
@@ -1,3 +1,5 @@
1
+ # backtick_javascript: true
2
+
1
3
  class BigDecimal < Numeric
2
4
  %x{
3
5
  var define = function (f) { Opal.const_set(self, 'BigNumber', f()); };
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: false
2
+ # backtick_javascript: true
2
3
  #
3
4
  #--
4
5
  # bigdecimal/util extends various native classes to provide the #to_d method,
data/stdlib/bigdecimal.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # backtick_javascript: true
2
+
1
3
  class BigDecimal < Numeric; end
2
4
 
3
5
  require 'js'
@@ -1,3 +1,5 @@
1
+ # backtick_javascript: true
2
+
1
3
  class Buffer
2
4
  class Array
3
5
  include Native::Wrapper
@@ -1,3 +1,5 @@
1
+ # backtick_javascript: true
2
+
1
3
  class Buffer
2
4
  class View
3
5
  include Native::Wrapper
data/stdlib/buffer.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # backtick_javascript: true
2
+
1
3
  require 'native'
2
4
  require 'buffer/array'
3
5
  require 'buffer/view'
data/stdlib/cgi.rb ADDED
@@ -0,0 +1,14 @@
1
+ class CGI
2
+ module Util
3
+ def escapeURIComponent(c)
4
+ `encodeURI(c)`
5
+ end
6
+
7
+ def unescapeURIComponent(c)
8
+ `decodeURI(c)`
9
+ end
10
+ end
11
+
12
+ include Util
13
+ extend Util
14
+ end
data/stdlib/console.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # backtick_javascript: true
2
+
1
3
  require 'native'
2
4
 
3
5
  # Manipulate the browser console.
@@ -1,3 +1,5 @@
1
+ # backtick_javascript: true
2
+
1
3
  class DateTime < Date
2
4
  class << self
3
5
  def now
data/stdlib/date.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # backtick_javascript: true
2
+
1
3
  require 'forwardable'
2
4
  require 'date/infinity'
3
5
  require 'time'
data/stdlib/delegate.rb CHANGED
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
  # helpers: freeze, freeze_props
3
+ # backtick_javascript: true
4
+
3
5
  # = delegate -- Support for the Delegation Pattern
4
6
  #
5
7
  # This file ended up in Opal as a port of the following file:
data/stdlib/deno/base.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # backtick_javascript: true
2
+
1
3
  module Deno
2
4
  VERSION = `Deno.version.deno`
3
5
  end
data/stdlib/deno/file.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # backtick_javascript: true
2
+
1
3
  `/* global Deno */`
2
4
  require 'corelib/file'
3
5
 
data/stdlib/erb.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # backtick_javascript: true
2
+
1
3
  require 'template'
2
4
 
3
5
  class ERB
data/stdlib/gjs/io.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # backtick_javascript: true
2
+
1
3
  `/* global imports */`
2
4
 
3
5
  # Basic version, appends \n:
data/stdlib/gjs/kernel.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # backtick_javascript: true
2
+
1
3
  `/* global ARGV */`
2
4
 
3
5
  ARGV = `ARGV`
@@ -1,3 +1,5 @@
1
+ # backtick_javascript: true
2
+
1
3
  %x{
2
4
  // Inhibit the default exit behavior
3
5
  window.OPAL_EXIT_CODE = "noexit";
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+ # backtick_javascript: true
2
3
 
3
4
  class File
4
5
  def self.write(path, data)
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+ # backtick_javascript: true
2
3
 
3
4
  require 'headless_browser/base'
4
5
  require 'headless_browser/file'
data/stdlib/js.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # backtick_javascript: true
2
+
1
3
  # The JS module provides syntax sugar for calling native javascript
2
4
  # operators (e.g. typeof, instanceof, new, delete) and global functions
3
5
  # (e.g. parseFloat, parseInt).
data/stdlib/json.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # backtick_javascript: true
2
+
1
3
  module JSON
2
4
  class JSONError < StandardError
3
5
  end
@@ -36,7 +38,7 @@ module JSON
36
38
  if (!value) return nil;
37
39
 
38
40
  if (value.$$is_array) {
39
- arr = #{`options.array_class`.new};
41
+ arr = #{`Opal.hash_get(options, 'array_class')`.new};
40
42
 
41
43
  for (i = 0, ii = value.length; i < ii; i++) {
42
44
  #{`arr`.push(`to_opal(value[i], options)`)};
@@ -45,7 +47,7 @@ module JSON
45
47
  return arr;
46
48
  }
47
49
  else {
48
- hash = #{`options.object_class`.new};
50
+ hash = #{`Opal.hash_get(options, 'object_class')`.new};
49
51
 
50
52
  for (k in value) {
51
53
  if ($hasOwn.call(value, k)) {
@@ -53,7 +55,7 @@ module JSON
53
55
  }
54
56
  }
55
57
 
56
- if (!options.parse && (klass = #{`hash`[JSON.create_id]}) != nil) {
58
+ if (!Opal.hash_get(options, 'parse') && (klass = #{`hash`[JSON.create_id]}) != nil) {
57
59
  return #{::Object.const_get(`klass`).json_create(`hash`)};
58
60
  }
59
61
  else {
@@ -95,7 +97,7 @@ module JSON
95
97
  options[:object_class] ||= Hash
96
98
  options[:array_class] ||= Array
97
99
 
98
- `to_opal(js_object, options.$$smap)`
100
+ `to_opal(js_object, options)`
99
101
  end
100
102
 
101
103
  def self.generate(obj, options = {})
@@ -155,18 +157,10 @@ class Hash
155
157
  %x{
156
158
  var result = [];
157
159
 
158
- for (var i = 0, keys = self.$$keys, length = keys.length, key, value; i < length; i++) {
159
- key = keys[i];
160
-
161
- if (key.$$is_string) {
162
- value = self.$$smap[key];
163
- } else {
164
- value = key.value;
165
- key = key.key;
166
- }
167
-
160
+ Opal.hash_each(self, false, function(key, value) {
168
161
  result.push(#{`key`.to_s.to_json} + ':' + #{`value`.to_json});
169
- }
162
+ return [false, false];
163
+ });
170
164
 
171
165
  return '{' + result.join(',') + '}';
172
166
  }
data/stdlib/logger.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # backtick_javascript: true
2
+
1
3
  class Logger
2
4
  module Severity
3
5
  DEBUG = 0
@@ -1,3 +1,5 @@
1
+ # backtick_javascript: true
2
+
1
3
  `/* global Java */`
2
4
 
3
5
  require 'corelib/file'
data/stdlib/nashorn/io.rb CHANGED
@@ -1,2 +1,4 @@
1
+ # backtick_javascript: true
2
+
1
3
  $stdout.write_proc = `function(s){print(s)}`
2
4
  $stderr.write_proc = `function(s){print(s)}`
data/stdlib/native.rb CHANGED
@@ -1,3 +1,6 @@
1
+ # backtick_javascript: true
2
+ # helpers: hash_put
3
+
1
4
  # Provides a complete set of tools to wrap native JavaScript
2
5
  # into nice Ruby objects.
3
6
  #
@@ -535,68 +538,65 @@ unless Hash.method_defined? :_initialize
535
538
  class Hash
536
539
  alias _initialize initialize
537
540
 
541
+ %x{
542
+ function $hash_convert_and_put_value(hash, key, value) {
543
+ if (value &&
544
+ (value.constructor === undefined ||
545
+ value.constructor === Object ||
546
+ value instanceof Map)) {
547
+ $hash_put(hash, key, #{Hash.new(`value`)});
548
+ } else if (value && value.$$is_array) {
549
+ value = value.map(function(item) {
550
+ if (item &&
551
+ (item.constructor === undefined ||
552
+ item.constructor === Object ||
553
+ value instanceof Map)) {
554
+ return #{Hash.new(`item`)};
555
+ }
556
+ return #{Native(`item`)};
557
+ });
558
+ $hash_put(hash, key, value)
559
+ } else {
560
+ $hash_put(hash, key, #{Native(`value`)});
561
+ }
562
+ }
563
+ }
564
+
538
565
  def initialize(defaults = undefined, &block)
539
566
  %x{
540
- if (defaults != null &&
541
- (defaults.constructor === undefined ||
542
- defaults.constructor === Object)) {
543
- var smap = self.$$smap,
544
- keys = self.$$keys,
545
- key, value;
546
-
547
- for (key in defaults) {
548
- value = defaults[key];
549
-
550
- if (value &&
551
- (value.constructor === undefined ||
552
- value.constructor === Object)) {
553
- smap[key] = #{Hash.new(`value`)};
554
- } else if (value && value.$$is_array) {
555
- value = value.map(function(item) {
556
- if (item &&
557
- (item.constructor === undefined ||
558
- item.constructor === Object)) {
559
- return #{Hash.new(`item`)};
560
- }
561
-
562
- return #{Native(`item`)};
563
- });
564
- smap[key] = value
565
- } else {
566
- smap[key] = #{Native(`value`)};
567
+ if (defaults != null) {
568
+ if (defaults.constructor === undefined ||
569
+ defaults.constructor === Object) {
570
+ var key, value;
571
+
572
+ for (key in defaults) {
573
+ value = defaults[key];
574
+ $hash_convert_and_put_value(self, key, value);
567
575
  }
568
576
 
569
- keys.push(key);
577
+ return self;
578
+ } else if (defaults instanceof Map) {
579
+ Opal.hash_each(defaults, false, function(key, value) {
580
+ $hash_convert_and_put_value(self, key, value);
581
+ return [false, false];
582
+ });
570
583
  }
571
-
572
- return self;
573
584
  }
574
585
 
575
586
  return #{_initialize(defaults, &block)};
576
587
  }
577
588
  end
578
589
 
579
- # @return a JavaScript object with the same keys but calling #to_n on
580
- # all values.
590
+ # @return a JavaScript Map but calling #to_n on
591
+ # all keys and values.
581
592
  def to_n
582
593
  %x{
583
- var result = {},
584
- keys = self.$$keys,
585
- smap = self.$$smap,
586
- key, value;
587
-
588
- for (var i = 0, length = keys.length; i < length; i++) {
589
- key = keys[i];
590
-
591
- if (key.$$is_string) {
592
- value = smap[key];
593
- } else {
594
- key = key.key;
595
- value = key.value;
596
- }
594
+ var result = new Map();
597
595
 
598
- result[key] = #{Native.try_convert(`value`, `value`)};
599
- }
596
+ Opal.hash_each(self, false, function(key, value) {
597
+ result.set(#{Native.try_convert(`key`, `key`)} , #{Native.try_convert(`value`, `value`)});
598
+ return [false, false];
599
+ });
600
600
 
601
601
  return result;
602
602
  }
@@ -1,3 +1,5 @@
1
+ # backtick_javascript: true
2
+
1
3
  module NodeJS
2
4
  VERSION = `process.version`
3
5
  end
data/stdlib/nodejs/dir.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # backtick_javascript: true
2
+
1
3
  class Dir
2
4
  @__glob__ = `require('glob')`
3
5
  @__fs__ = `require('fs')`
data/stdlib/nodejs/env.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # backtick_javascript: true
2
+
1
3
  ENV = Object.new
2
4
 
3
5
  class << ENV
@@ -1,3 +1,5 @@
1
+ # backtick_javascript: true
2
+
1
3
  require 'corelib/file'
2
4
 
3
5
  %x{