opal 0.6.0 → 0.6.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (87) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/.gitmodules +27 -3
  4. data/.rspec +1 -1
  5. data/CHANGELOG.md +29 -5
  6. data/README.md +30 -3
  7. data/Rakefile +18 -9
  8. data/bin/opal +1 -1
  9. data/bin/opal-build +70 -7
  10. data/lib/mspec/opal/rake_task.rb +6 -9
  11. data/lib/opal/cli.rb +2 -2
  12. data/lib/opal/nodes/call.rb +1 -1
  13. data/lib/opal/nodes/def.rb +1 -1
  14. data/lib/opal/nodes/rescue.rb +19 -18
  15. data/lib/opal/parser/grammar.rb +8 -3
  16. data/lib/opal/parser/grammar.y +4 -0
  17. data/lib/opal/parser/lexer.rb +10 -5
  18. data/lib/opal/sprockets/environment.rb +9 -0
  19. data/lib/opal/sprockets/erb.rb +9 -1
  20. data/lib/opal/sprockets/processor.rb +10 -14
  21. data/lib/opal/util.rb +50 -15
  22. data/lib/opal/version.rb +1 -1
  23. data/opal.gemspec +4 -4
  24. data/opal/corelib/enumerable.rb +1 -1
  25. data/opal/corelib/enumerator.rb +7 -3
  26. data/opal/corelib/hash.rb +38 -14
  27. data/opal/corelib/kernel.rb +6 -2
  28. data/opal/corelib/module.rb +15 -1
  29. data/opal/corelib/runtime.js +32 -2
  30. data/opal/corelib/string.rb +103 -53
  31. data/opal/corelib/variables.rb +3 -3
  32. data/spec/cli/fixtures/sprockets_file.js.rb +3 -0
  33. data/spec/cli/parser/literal_spec.rb +5 -0
  34. data/spec/cli/sprockets/environment_spec.rb +14 -0
  35. data/spec/cli/sprockets/erb_spec.rb +25 -0
  36. data/spec/cli/sprockets/processor_spec.rb +28 -0
  37. data/spec/{opal/filters → filters}/bugs/array.rb +29 -9
  38. data/spec/{opal/filters → filters}/bugs/basic_object.rb +2 -0
  39. data/spec/{opal/filters → filters}/bugs/class.rb +1 -0
  40. data/spec/{opal/filters → filters}/bugs/enumerable.rb +6 -2
  41. data/spec/filters/bugs/enumerator.rb +3 -0
  42. data/spec/{opal/filters → filters}/bugs/hash.rb +6 -24
  43. data/spec/{opal/filters → filters}/bugs/kernel.rb +0 -0
  44. data/spec/{opal/filters → filters}/bugs/language.rb +14 -3
  45. data/spec/{opal/filters → filters}/bugs/math.rb +3 -1
  46. data/spec/{opal/filters → filters}/bugs/module.rb +0 -0
  47. data/spec/{opal/filters → filters}/bugs/nil.rb +0 -0
  48. data/spec/{opal/filters → filters}/bugs/numeric.rb +1 -1
  49. data/spec/{opal/filters → filters}/bugs/opal.rb +0 -0
  50. data/spec/filters/bugs/regexp.rb +7 -0
  51. data/spec/{opal/filters → filters}/bugs/set.rb +0 -0
  52. data/spec/{opal/filters → filters}/bugs/singleton.rb +0 -0
  53. data/spec/{opal/filters → filters}/bugs/string.rb +40 -13
  54. data/spec/{opal/filters → filters}/bugs/stringscanner.rb +1 -0
  55. data/spec/{opal/filters → filters}/bugs/struct.rb +7 -2
  56. data/spec/{opal/filters → filters}/bugs/symbol.rb +0 -0
  57. data/spec/{opal/filters → filters}/bugs/time.rb +23 -0
  58. data/spec/{opal/filters → filters}/bugs/unknown.rb +0 -0
  59. data/spec/{opal/filters → filters}/unsupported/encoding.rb +34 -1
  60. data/spec/{opal/filters → filters}/unsupported/enumerator.rb +1 -0
  61. data/spec/{opal/filters → filters}/unsupported/float.rb +0 -0
  62. data/spec/{opal/filters → filters}/unsupported/frozen.rb +3 -2
  63. data/spec/{opal/filters → filters}/unsupported/hash_compare_by_identity.rb +0 -0
  64. data/spec/{opal/filters → filters}/unsupported/integer_size.rb +0 -0
  65. data/spec/{opal/filters → filters}/unsupported/method_added.rb +0 -0
  66. data/spec/{opal/filters → filters}/unsupported/mutable_strings.rb +14 -0
  67. data/spec/{opal/filters → filters}/unsupported/private_constants.rb +0 -0
  68. data/spec/{opal/filters → filters}/unsupported/private_methods.rb +0 -0
  69. data/spec/{opal/filters → filters}/unsupported/random.rb +0 -0
  70. data/spec/{opal/filters → filters}/unsupported/ruby_exe.rb +0 -0
  71. data/spec/{opal/filters → filters}/unsupported/tainted.rb +11 -0
  72. data/spec/{opal/filters → filters}/unsupported/time.rb +0 -0
  73. data/spec/{opal/filters → filters}/unsupported/trusted.rb +14 -0
  74. data/spec/opal/core/kernel/methods_spec.rb +16 -2
  75. data/spec/opal/core/language/string_spec.rb +29 -1
  76. data/spec/opal/core/module/remove_const_spec.rb +1 -1
  77. data/spec/opal/stdlib/erb/erb_spec.rb +3 -3
  78. data/spec/opal/stdlib/native/native_reader_spec.rb +22 -0
  79. data/spec/opal/stdlib/native/native_writer_spec.rb +30 -0
  80. data/spec/rubyspecs +285 -0
  81. data/spec/{opal/spec_helper.rb → spec_helper.rb} +0 -0
  82. data/stdlib/native.rb +21 -0
  83. data/stdlib/opal-parser.rb +14 -3
  84. data/stdlib/promise.rb +2 -2
  85. metadata +113 -97
  86. data/spec/opal/filters/bugs/regexp.rb +0 -5
  87. data/spec/opal/rubyspecs +0 -285
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 9f894d4150a0535a93f352701ed5b9d204b74409
4
- data.tar.gz: 1551213eccd9d9177e3868722429c56624a40b5b
3
+ metadata.gz: 6c3f8f806c3ccc492181271b934421d199875687
4
+ data.tar.gz: 1793e3beab6345556bcb5d9255cbf0bbf6463f68
5
5
  SHA512:
6
- metadata.gz: a14ce6ec8c51a5a64d29c0b10865daaf426c17703f978fc99f2aad2d0bb9b2562f9de495cb1d0cf2f40281305ebe3f3cd4eb4442e68b3a92bbf9d6c5b5eb3d52
7
- data.tar.gz: b697aeeca8bfee4fcc2f70bbc6fd52df6bf140938983b114e905f3d08c01ba080756e21e331301d9713b735db090f9b5b670dee7c56d64d2f7655b55c7f238d3
6
+ metadata.gz: 1d3c05b2ef2434e3056b58981e4851964e207d92a5936914e1a54d73f04be7fe9651d43981dd5596c6b6244d3b652395af4cd99944c302d83b385cecfa6e2806
7
+ data.tar.gz: a2a98bee95fceb779251cd2cea489fac101aa936e32ff3bccb9395056c4e848c5b5c7907a6648970f0e4fc3658dd3853bf28bdf5ceb7692eda825247511f5182
data/.gitignore CHANGED
@@ -5,3 +5,4 @@
5
5
  Gemfile.lock
6
6
  build/
7
7
  /.github_access_token
8
+ /cdn
data/.gitmodules CHANGED
@@ -1,3 +1,27 @@
1
- [submodule "spec/opal/rubyspec"]
2
- path = spec/opal/rubyspec
3
- url = git://github.com/rubyspec/rubyspec.git
1
+ [submodule "spec/corelib"]
2
+ path = spec/corelib
3
+ url = https://github.com/rubyspec/rubyspec
4
+ [submodule "spec/stdlib/rubysl-singleton"]
5
+ path = spec/stdlib/rubysl-singleton
6
+ url = https://github.com/rubysl/rubysl-singleton
7
+ [submodule "spec/stdlib/rubysl-observer"]
8
+ path = spec/stdlib/rubysl-observer
9
+ url = https://github.com/rubysl/rubysl-observer
10
+ [submodule "spec/stdlib/rubysl-strscan"]
11
+ path = spec/stdlib/rubysl-strscan
12
+ url = https://github.com/rubysl/rubysl-strscan
13
+ [submodule "spec/stdlib/rubysl-delegate"]
14
+ path = spec/stdlib/rubysl-delegate
15
+ url = https://github.com/rubysl/rubysl-delegate
16
+ [submodule "spec/stdlib/rubysl-erb"]
17
+ path = spec/stdlib/rubysl-erb
18
+ url = https://github.com/rubysl/rubysl-erb
19
+ [submodule "spec/stdlib/rubysl-set"]
20
+ path = spec/stdlib/rubysl-set
21
+ url = https://github.com/rubysl/rubysl-set
22
+ [submodule "spec/stdlib/rubysl-pathname"]
23
+ path = spec/stdlib/rubysl-pathname
24
+ url = https://github.com/rubysl/rubysl-pathname
25
+ [submodule "spec/stdlib/rubysl-date"]
26
+ path = spec/stdlib/rubysl-date
27
+ url = https://github.com/rubysl/rubysl-date
data/.rspec CHANGED
@@ -1,3 +1,3 @@
1
1
  --color
2
2
  --format progress
3
- --pattern mri_spec/**/*_spec.rb
3
+ --pattern spec/cli/**/*_spec.rb
data/CHANGELOG.md CHANGED
@@ -1,11 +1,35 @@
1
- ## edge
1
+ ## 0.6.1 2014-04-15
2
+
3
+ * Updated RubySpecs to master and added `rubysl-*` specs. Thanks to Mike Owens (@mieko)
4
+
5
+ * Added `Kernel#require_remote(url)` in `opal-parser` that requires files with basic synchronous ajax
6
+ GET requests. It is used to load `<scripts type="text/ruby" src="…url…">`.
7
+
8
+ * Various parsing fixes (Hash parsing, `def` returns method name, cleanup `core/util`, Enumerator fixes)
9
+
10
+ * Added `#native_reader`, `#native_writer` and `#native_accessor`as class methods
11
+ donated by `include Native`
12
+
13
+ * Added specs for Sprockets' processors (both .js.rb and .opalerb), backported from `opal-rails`
14
+
15
+ * Set 2.1.1 as RUBY_VERSION
16
+
17
+ * Add `opal-build` command utility to easily build libraries to js
18
+
19
+ * Add `opal-repl` to gemspec executables,
20
+ previously was only available by using Opal from source
21
+
22
+ * Fix parsing `=>` in hash literals where it would sometimes incorrectly
23
+ parse as a key name.
24
+
25
+ ## 0.6.0 2014-03-05
2
26
 
3
27
  * Fix parsing of escapes in single-strings ('foo\n'). Only ' and \
4
28
  characters now get escaped in single quoted strings. Also, more escape
5
29
  sequences in double-quoted strings are now supported: `\a`, `\v`, `\f`,
6
30
  `\e`, `\s`, octal (`\314`), hex (`\xff`) and unicode (`\u1234`).
7
31
 
8
- * Sourcemaps revamp. Lexer now tracks column and line info for ever token to
32
+ * Sourcemaps revamp. Lexer now tracks column and line info for every token to
9
33
  produce much more accurate sourcemaps. All method calls are now located on
10
34
  the correct source line, and multi-line xstrings are now split to generate
11
35
  a map line-to-line for long inline javascript parts.
@@ -46,7 +70,7 @@
46
70
  * Add `time.rb` to stdlib and moved `Time.parse()` and `Time.iso8601()`
47
71
  methods there.
48
72
 
49
- * `!` is now treated as a unary method call on the object. Opal now parsed
73
+ * `!` is now treated as an unary method call on the object. Opal now parsed
50
74
  `!` as a def method name, and implements the method on `BasicObject`,
51
75
  `NilClass` and `Boolean`.
52
76
 
@@ -67,7 +91,7 @@
67
91
  `#to_f`, `#clone`, `#split`.
68
92
 
69
93
  * Fix `Array` method compliance: `#first`, `#fetch`, `#insert`, `#delete_at`,
70
- `#last, `#splice`, `.try_convert`.
94
+ `#last`, `#splice`, `.try_convert`.
71
95
 
72
96
  * Fix compliance of `Kernel#extend` and ensure it calls `#extended()` hook.
73
97
 
@@ -92,7 +116,7 @@
92
116
  * Support any Tilt template for `index_path` in `Opal::Server`. All index
93
117
  files are now run through `Tilt` (now supports haml etc).
94
118
 
95
- * Fix code generation of `op_asgn_1` calls (foo[val] += 10).
119
+ * Fix code generation of `op_asgn_1` calls (`foo[val] += 10`).
96
120
 
97
121
  * Add `base64` to stdlib.
98
122
 
data/README.md CHANGED
@@ -8,7 +8,7 @@ Opal is a ruby to javascript source-to-source compiler. It also has an
8
8
  implementation of the ruby corelib.
9
9
 
10
10
  Opal is [hosted on github](http://github.com/opal/opal), and there
11
- is a Freenode IRC channel at [#opal](http://webchat.freenode.net/?channels=opal),
11
+ is a Freenode IRC channel at [#opal](http://webchat.freenode.net/?channels=opal),
12
12
  ask questions on [stackoverflow#opalrb](http://stackoverflow.com/questions/ask?tags=opalrb).
13
13
 
14
14
 
@@ -58,17 +58,36 @@ First, install dependencies:
58
58
 
59
59
  $ bundle install
60
60
 
61
- Rubyspecs must be cloned as a gitsubmodule:
61
+ RubySpec related repos must be cloned as a gitsubmodules:
62
62
 
63
63
  $ git submodule update --init
64
64
 
65
- Tests can be run with phantomjs using:
65
+ The test suite can be run using (requires [phantomjs][]):
66
66
 
67
67
  $ rake
68
68
 
69
+ This will command will run all RSpec and MSpec examples in sequence.
70
+
71
+ ### MSpec
72
+
73
+ [MSpec][] tests can be run with:
74
+
75
+ $ rake mspec
76
+
69
77
  Alternatively, you can just load up a rack instance using `rackup spec/config.ru`, and
70
78
  visit `http://localhost:9292/` in any web browser.
71
79
 
80
+ ### Rspec
81
+
82
+ [RSpec][] tests can be run with
83
+
84
+ $ rake rspec
85
+
86
+ Alternatively [spectator][] can be used in an autotest fashion with this command:
87
+
88
+ BASE_DIR_GLOB='lib/opal' SPEC_DIR_GLOB='spec/cli' spectator
89
+
90
+
72
91
  ## Code Overview
73
92
 
74
93
  What code is supposed to run where?
@@ -95,6 +114,10 @@ StringScanner, Date, etc.
95
114
 
96
115
  ### spec
97
116
 
117
+ * **rubyspecs** (file) a whitelist of RubySpec files to be ran
118
+ * **corelib** RubySpec examples (submodule)
119
+ * **stdlib** `rubysl-*` examples (submodules)
120
+ * **filters** The list of MSpec/RubySpec examples that are either bugs or unsupported
98
121
  * **opal** opal additions/special behaviour in the runtime/corelib
99
122
  * **cli** specs for opal lib (parser, lexer, grammar, compiler etc)
100
123
 
@@ -145,3 +168,7 @@ THE SOFTWARE.
145
168
 
146
169
  [![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/opal/opal/trend.png)](https://bitdeli.com/free "Bitdeli Badge")
147
170
 
171
+ [phantomjs]: http://phantomjs.org
172
+ [spectator]: https://github.com/elia/spectator#readme
173
+ [MSpec]: https://github.com/rubyspec/mspec#readme
174
+ [RSpec]: https://github.com/rspec/rspec#readme
data/Rakefile CHANGED
@@ -15,20 +15,29 @@ MSpec::Opal::RakeTask.new(:mspec)
15
15
  task :default => [:rspec, :mspec]
16
16
 
17
17
 
18
- desc 'Build opal.js and opal-parser.js to build/'
18
+ desc <<-DESC
19
+ Build *corelib* and *stdlib* to "build/"
20
+
21
+ You can restrict the file list with the FILES env var (comma separated)
22
+ and the destination dir with the DIR env var.
23
+
24
+ Example: rake dist DIR=/tmp/foo FILES='opal.rb,base64.rb'
25
+ DESC
19
26
  task :dist do
20
27
  require 'opal/util'
21
28
 
22
29
  Opal::Processor.arity_check_enabled = false
23
30
  Opal::Processor.const_missing_enabled = false
24
-
25
31
  env = Opal::Environment.new
26
32
 
27
- Dir.mkdir 'build' unless File.directory? 'build'
28
- libs = Dir['{opal,stdlib}/*.rb'].map { |lib| File.basename(lib, '.rb') }
29
- width = libs.map(&:size).max
33
+ build_dir = ENV['DIR'] || 'build'
34
+ files = ENV['FILES'] ? ENV['FILES'].split(',') :
35
+ Dir['{opal,stdlib}/*.rb'].map { |lib| File.basename(lib, '.rb') }
36
+
37
+ Dir.mkdir build_dir unless File.directory? build_dir
38
+ width = files.map(&:size).max
30
39
 
31
- libs.each do |lib|
40
+ files.each do |lib|
32
41
  print "* building #{lib}...".ljust(width+'* building ... '.size)
33
42
  $stdout.flush
34
43
 
@@ -36,9 +45,9 @@ task :dist do
36
45
  min = Opal::Util.uglify src
37
46
  gzp = Opal::Util.gzip min
38
47
 
39
- File.open("build/#{lib}.js", 'w+') { |f| f << src }
40
- File.open("build/#{lib}.min.js", 'w+') { |f| f << min } if min
41
- File.open("build/#{lib}.min.js.gz", 'w+') { |f| f << gzp } if gzp
48
+ File.open("#{build_dir}/#{lib}.js", 'w+') { |f| f << src }
49
+ File.open("#{build_dir}/#{lib}.min.js", 'w+') { |f| f << min } if min
50
+ File.open("#{build_dir}/#{lib}.min.js.gz", 'w+') { |f| f << gzp } if gzp
42
51
 
43
52
  print "done. ("
44
53
  print "development: #{('%.2f' % (src.size/1000.0)).rjust(6)}KB"
data/bin/opal CHANGED
@@ -12,7 +12,7 @@ else
12
12
  cli = Opal::CLI.new options.options.merge(:filename => ARGV.first)
13
13
  begin
14
14
  cli.run
15
- rescue Opal::CLI::MissingNode => e
15
+ rescue Opal::CLI::MissingNodeJS => e
16
16
  $stderr.puts e.message
17
17
  exit 127
18
18
  end
data/bin/opal-build CHANGED
@@ -1,14 +1,77 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- require 'opal'
3
+ require 'optparse'
4
4
 
5
- if ARGV.first == '--gem'
6
- gem_name = ARGV[1]
5
+ module Opal
6
+ class BuilderOptions < OptionParser
7
+ def initialize
8
+ @options = {}
7
9
 
8
- require 'rubygems'
9
- Opal.use_gem gem_name
10
+ super do |opts|
11
+ opts.banner = 'Usage: opal-build [options] -- [libname]'
12
+
13
+ opts.separator ''
14
+ opts.separator 'Options:'
15
+
16
+ opts.on("-h", "--help", "Show this message") do
17
+ puts opts
18
+ exit
19
+ end
20
+
21
+ opts.on('-g', '--gem GEM_NAME', String,
22
+ 'Adds the specified GEM_NAME to Opal\'s load path.',
23
+ 'E.g.: opal-build --require opal-browser browser`',
24
+ 'Will build browser.rb from the Opal gem opal-browser') do |g|
25
+ options[:gems] ||= []
26
+ options[:gems] << g
27
+ end
28
+
29
+ opts.on('-s', '--stub STUB', String) do |stub|
30
+ options[:stubs] ||= []
31
+ options[:stubs] << stub
32
+ end
33
+
34
+ opts.on('-r', '--require LIBRARY', String,
35
+ 'Require the library before executing your script',
36
+ 'E.g.: opal-build --require opal-browser browser`',
37
+ 'Will build browser.rb from the Opal gem opal-browser') do |library|
38
+ options[:requires] ||= []
39
+ options[:requires] << library
40
+ end
41
+
42
+ opts.on('-o', '--output FILE', String,
43
+ 'Write the built lib to a file (defaults to STDOUT)') do |file|
44
+ options[:output] = file
45
+ end
46
+ end
47
+ end
48
+
49
+ attr_reader :options
50
+ end
51
+ end
52
+
53
+ option_parser = Opal::BuilderOptions.new
54
+ option_parser.parse!
55
+
56
+ if ARGV.empty?
57
+ puts options
58
+ else
59
+ require 'opal'
60
+ options = option_parser.options
61
+
62
+ if options[:gems]
63
+ require 'rubygems'
64
+ options[:gems].each { |gem_name| Opal.use_gem gem_name }
65
+ end
66
+
67
+ if options[:requires]
68
+ options[:requires].each { |required_lib| require required_lib }
69
+ end
70
+
71
+ lib_name = ARGV.first
72
+
73
+ output = options[:output] ? File.open(options[:output], 'w') : $stdout
74
+ output.puts Opal::Builder.build(lib_name.dup.untaint)
10
75
  end
11
76
 
12
- require_file = ARGV[1..-1].last || gem_name.dup.untaint.gsub('-','/')
13
- puts Opal::Builder.build require_file
14
77
 
@@ -5,7 +5,7 @@ class Opal::Nodes::CallNode
5
5
  add_special :language_version do
6
6
  if meth == :language_version and scope.top?
7
7
  lang_type = arglist[2][1]
8
- target = "rubyspec/language/versions/#{lang_type}_1.9"
8
+ target = "corelib/language/versions/#{lang_type}_1.9"
9
9
 
10
10
  if File.exist?(target)
11
11
  compiler.requires << target
@@ -25,7 +25,7 @@ require 'webrick'
25
25
  module MSpec
26
26
  module Opal
27
27
  DEFAULT_PATTERN = 'spec/opal/{parser,core,compiler,stdlib}/**/*_spec.rb'
28
- DEFAULT_BASEDIR = 'spec/opal'
28
+ DEFAULT_BASEDIR = 'spec'
29
29
 
30
30
  require 'rake'
31
31
  require 'rake/tasklib'
@@ -111,7 +111,6 @@ module MSpec
111
111
  @pattern = pattern || DEFAULT_PATTERN
112
112
  @basedir = basedir = File.expand_path(basedir || DEFAULT_BASEDIR)
113
113
  append_path basedir
114
- append_path "#{basedir}/rubyspec"
115
114
  use_gem 'mspec'
116
115
 
117
116
  stubs.each do |asset|
@@ -158,9 +157,8 @@ module MSpec
158
157
  end
159
158
 
160
159
  def rubyspec_paths
161
- rubyspec_dir = "#{basedir}/rubyspec"
162
160
  rubyspec_white_list.map do |path|
163
- dirname = File.join rubyspec_dir, path
161
+ dirname = File.join([basedir, path])
164
162
  if File.directory? dirname
165
163
  rubyspec_paths_in_dir(dirname, path)
166
164
  else
@@ -178,9 +176,9 @@ module MSpec
178
176
  end
179
177
 
180
178
  def rubyspec_white_list
181
- File.read("#{basedir}/rubyspecs").split("\n").reject do |line|
182
- line.empty? || line.start_with?('#')
183
- end
179
+ File.read("#{basedir}/rubyspecs").split("\n").map do |line|
180
+ line.sub(/#.*/, '').strip
181
+ end.reject(&:empty?)
184
182
  end
185
183
 
186
184
  def files_to_run(pattern=nil)
@@ -251,4 +249,3 @@ module MSpec
251
249
 
252
250
  end
253
251
  end
254
-
data/lib/opal/cli.rb CHANGED
@@ -76,7 +76,7 @@ module Opal
76
76
  begin
77
77
  stdin, stdout, stderr = Open3.popen3('node')
78
78
  rescue Errno::ENOENT
79
- raise MissingNode, 'Please install Node.js to be able to run Opal scripts.'
79
+ raise MissingNodeJS, 'Please install Node.js to be able to run Opal scripts.'
80
80
  end
81
81
 
82
82
  stdin.write code
@@ -88,7 +88,7 @@ module Opal
88
88
  end
89
89
  end
90
90
 
91
- class MissingNode < StandardError
91
+ class MissingNodeJS < StandardError
92
92
  end
93
93
 
94
94
  def start_server
@@ -98,7 +98,7 @@ module Opal
98
98
  if SPECIALS.include? meth
99
99
  if result = __send__("handle_#{meth}")
100
100
  push result
101
- return true
101
+ return true
102
102
  end
103
103
  elsif RuntimeHelpers.compatible?(recvr, meth, arglist)
104
104
  push(RuntimeHelpers.new(@sexp, @level, @compiler).compile)
@@ -114,7 +114,7 @@ module Opal
114
114
  unshift "def#{jsid} = "
115
115
  end
116
116
 
117
- wrap '(', ', nil)' if expr?
117
+ wrap '(', ", nil) && '#{mid}'" if expr?
118
118
  end
119
119
 
120
120
  # Returns code used in debug mode to check arity of method call
@@ -91,16 +91,17 @@ module Opal
91
91
 
92
92
  def compile
93
93
  push "if ("
94
-
95
- rescue_classes.each_with_index do |cls, idx|
96
- push ', ' unless idx == 0
97
- call = s(:call, cls, :===, s(:arglist, s(:js_tmp, '$err')))
98
- push expr(call)
94
+ if rescue_exprs.empty?
95
+ # if no expressions are given, then catch all errors
96
+ push "true"
97
+ else
98
+ push "$opal.$rescue($err, ["
99
+ rescue_exprs.each_with_index do |rexpr, idx|
100
+ push ', ' unless idx == 0
101
+ push expr(rexpr)
102
+ end
103
+ push "])"
99
104
  end
100
-
101
- # if no classes are given, then catch all errors
102
- push "true" if rescue_classes.empty?
103
-
104
105
  push ") {"
105
106
 
106
107
  if variable = rescue_variable
@@ -112,18 +113,18 @@ module Opal
112
113
  line "}"
113
114
  end
114
115
 
115
- def rescue_variable
116
- variable = args.last
116
+ def rescue_variable?(variable)
117
+ Sexp === variable and [:lasgn, :iasgn].include?(variable.type)
118
+ end
117
119
 
118
- if Sexp === variable and [:lasgn, :iasgn].include?(variable.type)
119
- variable.dup
120
- end
120
+ def rescue_variable
121
+ rescue_variable?(args.last) ? args.last.dup : nil
121
122
  end
122
123
 
123
- def rescue_classes
124
- classes = args.children
125
- classes.pop if classes.last and classes.last.type != :const
126
- classes
124
+ def rescue_exprs
125
+ exprs = args.dup
126
+ exprs.pop if rescue_variable?(exprs.last)
127
+ exprs.children
127
128
  end
128
129
 
129
130
  def rescue_body