therubyrhino 2.0.1 → 2.0.2

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.
@@ -1,3 +1,15 @@
1
+ === 2.0.2 2012-12-05
2
+
3
+ * handle Rhino's 64K code generation (method) limit on the fly (#23)
4
+ * correct explicit Ruby equality == and eql? (JRuby 1.7.1 compat)
5
+ * allow to set javascript version programatically - globally also allow
6
+ reading it from system properties by default
7
+ * allow to set optimization level globally also allow reading it from
8
+ system properties by default
9
+ * make sure Ruby function wrapper has (Ruby) #call semantics just like
10
+ JavaScript functions exposed into the Ruby side
11
+ * function's return value should be converted to Ruby (Ruby #call style)
12
+
1
13
  === 2.0.1 2012-08-24
2
14
 
3
15
  * JSError improvement to preserve nested Ruby error message
@@ -176,6 +176,36 @@ methods "defined in their classes" are exposed by default e.g.
176
176
  cxt.eval("b.a()") # => 'TypeError: undefined property 'a' is not a function'
177
177
  end
178
178
 
179
+ ==== Using a custom Rhino version
180
+
181
+ Officially supported versions of Rhino's _js.jar_ are packaged separately as
182
+ *therubyrhino_jar* gem. Make sure you're using the latest gem version if you
183
+ feel like missing something available with Rhino. For experimenters the jar can
184
+ be overriden by defining a +Rhino::JAR_PATH+ before +require 'rhino'+ e.g. :
185
+
186
+ module Rhino
187
+ JAR_PATH = File.expand_path('lib/rhino/build/rhino1_7R5pre/js.jar')
188
+ end
189
+ # ...
190
+ require 'rhino'
191
+
192
+ ==== Context customizations
193
+
194
+ Just like the JVM packaged Rhino scripting engine, therubyrhino gem supports
195
+ specifying JavaScript context properies (optimization level and language version)
196
+ using system properties e.g. to force interpreted mode :
197
+
198
+ jruby -J-Drhino.opt.level=-1 -rtherubyrhino -S ...
199
+
200
+ You might also set these programatically as a default for all created contexts :
201
+
202
+ Rhino::Context.default_optimization_level = 1
203
+ Rhino::Context.default_javascript_version = 1.6
204
+
205
+ Or using plain old JAVA_OPTS e.g. when setting JavaScript version :
206
+
207
+ -Drhino.js.version=1.7
208
+
179
209
  == Rhino
180
210
 
181
211
  Rhino is currently maintained at https://github.com/mozilla/rhino
@@ -4,8 +4,8 @@ module Rhino
4
4
 
5
5
  # allow for rhino.jar overrides for "experimental" jrubyists
6
6
  # fallback to rhino/jar_path provided therubyrhino_jar gem :
7
- require 'rhino/jar_path' unless defined?(Rhino::JAR_PATH)
8
- load Rhino::JAR_PATH
7
+ require 'rhino/jar_path' unless const_defined?(:JAR_PATH)
8
+ load JAR_PATH
9
9
 
10
10
  # This module contains all the native Rhino objects implemented in Java
11
11
  # e.g. Rhino::JS::NativeObject # => org.mozilla.javascript.NativeObject
@@ -16,7 +16,7 @@ module Rhino
16
16
  end
17
17
  end
18
18
 
19
- @@implementation_version = nil
19
+ @@implementation_version = nil # :nodoc
20
20
  # Helper to resolve what version of Rhino's .jar we're really using.
21
21
  def self.implementation_version
22
22
  @@implementation_version ||= begin
@@ -33,6 +33,24 @@ module Rhino
33
33
  end
34
34
  end
35
35
 
36
+ @@silence = java.lang.Boolean.getBoolean('rhino.silence') # :nodoc
37
+ # Should we be silent - no warnings will be printed.
38
+ def self.silence?; @@silence; end
39
+ # Silence ! (... or I kill you)
40
+ def self.silence!; @@silence = true; end
41
+
42
+ @@warnings = {} # :nodoc
43
+
44
+ def self.warn(msg) # :nodoc
45
+ return if silence?
46
+ # only print out deprecations once (even when non-silent)
47
+ if msg[0, 13] == '[DEPRECATION]'
48
+ return nil if @@warnings[msg]
49
+ @@warnings[msg] = true
50
+ end
51
+ super # Kernel.warn
52
+ end
53
+
36
54
  end
37
55
 
38
56
  require 'rhino/version'
@@ -58,6 +58,24 @@ module Rhino
58
58
  @@default_factory = factory
59
59
  end
60
60
 
61
+ @@default_optimization_level = java.lang.Integer.getInteger('rhino.opt.level')
62
+ def self.default_optimization_level
63
+ @@default_optimization_level
64
+ end
65
+
66
+ def self.default_optimization_level=(level)
67
+ @@default_optimization_level = level
68
+ end
69
+
70
+ @@default_javascript_version = java.lang.System.getProperty('rhino.js.version')
71
+ def self.default_javascript_version
72
+ @@default_javascript_version
73
+ end
74
+
75
+ def self.default_javascript_version=(version)
76
+ @@default_javascript_version = version
77
+ end
78
+
61
79
  attr_reader :scope
62
80
 
63
81
  # Create a new javascript environment for executing javascript and ruby code.
@@ -82,6 +100,12 @@ module Rhino
82
100
  end
83
101
  end
84
102
  end
103
+ if optimization_level = options[:optimization_level] || self.class.default_optimization_level
104
+ self.optimization_level = optimization_level
105
+ end
106
+ if javascript_version = options[:javascript_version] || self.class.default_javascript_version
107
+ self.javascript_version = javascript_version
108
+ end
85
109
  yield(self) if block_given?
86
110
  end
87
111
 
@@ -191,16 +215,17 @@ module Rhino
191
215
 
192
216
  # Get the JS interpreter version.
193
217
  # Returns a number e.g. 1.7, nil if unknown and 0 for default.
194
- def version
218
+ def javascript_version
195
219
  case const_value = @native.getLanguageVersion
196
220
  when -1 then nil # VERSION_UNKNOWN
197
221
  when 0 then 0 # VERSION_DEFAULT
198
222
  else const_value / 100.0 # VERSION_1_1 (1.1 = 110 / 100)
199
223
  end
200
224
  end
225
+ alias :version :javascript_version
201
226
 
202
227
  # Sets interpreter mode a.k.a. JS language version e.g. 1.7 (if supported).
203
- def version=(version)
228
+ def javascript_version=(version)
204
229
  const = version.to_s.gsub('.', '_').upcase
205
230
  const = "VERSION_#{const}" if const[0, 7] != 'VERSION'
206
231
  if JS::Context.constants.find { |c| c.to_s == const }
@@ -212,26 +237,59 @@ module Rhino
212
237
  nil
213
238
  end
214
239
  end
240
+ alias :version= :javascript_version=
215
241
 
216
242
  # Enter this context for operations.
217
- # Some methods such as eval() will fail unless this context is open !
243
+ # Some methods such as eval() will fail unless the context is open.
218
244
  def open(&block)
219
245
  do_open(&block)
220
246
  rescue JS::RhinoException => e
247
+ if code_generation_error?(e)
248
+ warn "[INFO] Rhino byte-code generation failed forcing #{@native} into interpreted mode"
249
+ self.optimization_level = -1
250
+ retry
251
+ end
221
252
  raise Rhino::JSError.new(e)
222
253
  end
223
254
 
224
255
  private
225
256
 
226
- def do_open
227
- factory.enterContext(@native)
228
- begin
229
- yield self
230
- ensure
231
- factory.exit
232
- end
257
+ def do_open # :nodoc
258
+ factory.enterContext(@native)
259
+ begin
260
+ yield self
261
+ ensure
262
+ factory.exit
233
263
  end
264
+ end
234
265
 
266
+ CODE_GENERATION_ERROR_MESSAGE = 'generated bytecode for method exceeds 64K limit' # :nodoc
267
+
268
+ CODE_GENERATION_TRACE_CLASS_NAME = 'org.mozilla.javascript.optimizer.Codegen' # :nodoc
269
+ CODE_GENERATION_TRACE_METHOD_NAME = 'reportClassFileFormatException' # :nodoc
270
+ # at org.mozilla.javascript.optimizer.Codegen.reportClassFileFormatException
271
+
272
+ def code_generation_error?(exception) # :nodoc
273
+ if ( exception.is_a?(NativeException) rescue nil ) # JRuby 1.6 wrapping
274
+ exception = exception.cause
275
+ end
276
+ if exception.class == Rhino::JS::EvaluatorException
277
+ if exception.message.index(CODE_GENERATION_ERROR_MESSAGE)
278
+ return true
279
+ end
280
+ # NOTE: unfortunately Rhino localizes the error messages!
281
+ # and the ClassFileFormatException is not kept as a cause
282
+ class_name = CODE_GENERATION_TRACE_CLASS_NAME
283
+ method_name = CODE_GENERATION_TRACE_METHOD_NAME
284
+ for trace in exception.getStackTrace()
285
+ if class_name == trace.class_name && method_name == trace.method_name
286
+ return true
287
+ end
288
+ end
289
+ end
290
+ false
291
+ end
292
+
235
293
  end
236
294
 
237
295
  class IOReader < java.io.Reader # :nodoc:
@@ -1,9 +1,9 @@
1
1
 
2
2
  module Rhino
3
3
 
4
- @@stub_class = Class.new(Object)
4
+ @@stub_class = Class.new(Object) # :nodoc
5
5
 
6
- def self.const_missing(name)
6
+ def self.const_missing(name) # :nodoc
7
7
  case name.to_s
8
8
  when 'J' then
9
9
  warn "[DEPRECATION] `Rhino::J` is deprecated, use `Rhino::JS` instead."
@@ -21,30 +21,19 @@ module Rhino
21
21
  end
22
22
  end
23
23
 
24
- @@warnings = {}
25
-
26
- def self.warn(msg)
27
- # only print out deprecation warnings once
28
- if msg[0, 13] == '[DEPRECATION]'
29
- return nil if @@warnings[msg]
30
- @@warnings[msg] = true
31
- end
32
- super # Kernel.warn
33
- end
34
-
35
- module To
24
+ module To # :nodoc
36
25
 
37
26
  extend self
38
27
 
39
- # @deprecated use {#to_ruby} instead
28
+ # #deprecated use {Rhino#to_ruby} instead
40
29
  def self.ruby(object)
41
- Rhino.warn "[DEPRECATION] `Rhino::To.ruby` is deprecated, use `Rhino.to_ruby` instead."
30
+ warn "[DEPRECATION] `Rhino::To.ruby` is deprecated, use `Rhino.to_ruby` instead."
42
31
  to_ruby(object)
43
32
  end
44
33
 
45
- # @deprecated use {#to_javascript} instead
34
+ # #deprecated use {Rhino#to_javascript} instead
46
35
  def self.javascript(object, scope = nil)
47
- Rhino.warn "[DEPRECATION] `Rhino::To.javascript` is deprecated, use `Rhino.to_javascript` instead."
36
+ warn "[DEPRECATION] `Rhino::To.javascript` is deprecated, use `Rhino.to_javascript` instead."
48
37
  to_javascript(object, scope)
49
38
  end
50
39
 
@@ -80,6 +80,14 @@ class Java::OrgMozillaJavascript::ScriptableObject
80
80
  hash
81
81
  end
82
82
 
83
+ def ==(other)
84
+ equivalentValues(other) == true # JS ==
85
+ end
86
+
87
+ def eql?(other)
88
+ self.class == other.class && self.==(other)
89
+ end
90
+
83
91
  # Convert this javascript object into a json string.
84
92
  def to_json(*args)
85
93
  to_h.to_json(*args)
@@ -91,7 +99,7 @@ class Java::OrgMozillaJavascript::ScriptableObject
91
99
  def inspect
92
100
  toString
93
101
  end
94
-
102
+
95
103
  # Delegate methods to JS object if possible when called from Ruby.
96
104
  def method_missing(name, *args)
97
105
  name_str = name.to_s
@@ -147,6 +155,22 @@ class Java::OrgMozillaJavascript::NativeObject
147
155
  ScriptableObject.putProperty(self, key.to_s, Rhino.to_javascript(value, scope))
148
156
  end
149
157
 
158
+ def ==(other)
159
+ return true if super
160
+ if other.is_a?(Hash) || other.is_a?(java.util.Map)
161
+ for key, val in other
162
+ return false if self[key] != val
163
+ end
164
+ return true
165
+ end
166
+ false
167
+ end
168
+
169
+ # NOTE: need to re-implement this as JRuby 1.7.1 seems to be not routing to super
170
+ def eql?(other) # :nodoc
171
+ self.class == other.class && self.==(other)
172
+ end
173
+
150
174
  end
151
175
 
152
176
  # The base class for all JavaScript function objects.
@@ -165,7 +189,8 @@ class Java::OrgMozillaJavascript::BaseFunction
165
189
  # calling as a (var) stored function - no this === undefined "use strict"
166
190
  # TODO can't pass Undefined.instance as this - it's not a Scriptable !?
167
191
  this = Rhino::JS::ScriptRuntime.getGlobal(context)
168
- __call__(context, scope, this, Rhino.args_to_javascript(args, scope))
192
+ js_args = Rhino.args_to_javascript(args, scope)
193
+ Rhino.to_ruby __call__(context, scope, this, js_args)
169
194
  rescue Rhino::JS::JavaScriptException => e
170
195
  raise Rhino::JSError.new(e)
171
196
  ensure
@@ -176,7 +176,11 @@ module Rhino
176
176
 
177
177
  # override Object BaseFunction#call(Context context, Scriptable scope,
178
178
  # Scriptable thisObj, Object[] args)
179
- def call(context, scope, this, args)
179
+ def call(*args)
180
+ unless args.first.is_a?(JS::Context)
181
+ return super # assume a Ruby #call
182
+ end
183
+ _, scope, this, args = *args # Java Function#call dispatch
180
184
  args = args.to_a # java.lang.Object[] -> Array
181
185
  # JS function style :
182
186
  if ( arity = @callable.arity ) != -1 # (a1, *a).arity == -2
@@ -268,8 +272,8 @@ module Rhino
268
272
 
269
273
  end
270
274
 
271
- RubyObject = Ruby::Object
272
- RubyFunction = Ruby::Function
273
- RubyConstructor = Ruby::Constructor
275
+ RubyObject = Ruby::Object # :nodoc
276
+ RubyFunction = Ruby::Function # :nodoc
277
+ RubyConstructor = Ruby::Constructor # :nodoc
274
278
 
275
279
  end
@@ -1,3 +1,3 @@
1
1
  module Rhino
2
- VERSION = "2.0.1"
2
+ VERSION = "2.0.2"
3
3
  end
@@ -140,4 +140,45 @@ describe Rhino::Context do
140
140
  }.should raise_error(Rhino::RunawayScriptError)
141
141
  end
142
142
 
143
+ it "allows to set (default) optimization level" do
144
+ context = Rhino::Context.new :optimization_level => 2
145
+ context.eval %Q{ for (var i = 0; i < 42; i++) Number(i).toString(); }
146
+ context.optimization_level.should == 2
147
+ begin
148
+ Rhino::Context.default_optimization_level = 3
149
+ context = Rhino::Context.new
150
+ context.eval %Q{ for (var i = 0; i < 42; i++) Number(i).toString(); }
151
+ context.optimization_level.should == 3
152
+ ensure
153
+ Rhino::Context.default_optimization_level = nil
154
+ end
155
+ end
156
+
157
+ it "allows to set (default) language version" do
158
+ context = Rhino::Context.new :javascript_version => '1.6'
159
+ context.javascript_version.should == 1.6
160
+ begin
161
+ Rhino::Context.default_javascript_version = '1.5'
162
+ context = Rhino::Context.new
163
+ context.javascript_version.should == 1.5
164
+ ensure
165
+ Rhino::Context.default_javascript_version = nil
166
+ end
167
+ end
168
+
169
+ it "handles code generation error when 'generated bytecode for method exceeds 64K limit'" do
170
+ context = Rhino::Context.new
171
+
172
+ big_script = ''
173
+ 10000.times { |i| big_script << "var s#{i} = '#{i}';\n" }
174
+ 10000.times { |i| big_script << "var n#{i} = +#{i} ;\n" }
175
+
176
+ lambda {
177
+ context.eval big_script
178
+ }.should_not raise_error
179
+
180
+ context.eval('( s9999 )').should == '9999'
181
+ context.eval('( n9999 )').should == +9999
182
+ end
183
+
143
184
  end
@@ -87,14 +87,14 @@ describe "NativeObject (scoped)" do
87
87
 
88
88
  before do
89
89
  factory = Rhino::JS::ContextFactory.new
90
- context, scope = nil, nil
90
+ @context, @scope = nil, nil
91
91
  factory.call do |ctx|
92
- context = ctx
93
- scope = context.initStandardObjects(nil, false)
92
+ @context = ctx
93
+ @scope = @context.initStandardObjects(nil, false)
94
94
  end
95
- factory.enterContext(context)
95
+ factory.enterContext(@context)
96
96
 
97
- @object = context.newObject(scope)
97
+ @object = @context.newObject(@scope)
98
98
  end
99
99
 
100
100
  after do
@@ -104,7 +104,7 @@ describe "NativeObject (scoped)" do
104
104
  it_should_behave_like 'ScriptableObject'
105
105
 
106
106
  it 'routes rhino methods' do
107
- @object.prototype.should == {}
107
+ @object.prototype.should_not be nil
108
108
  @object.getTypeOf.should == 'object'
109
109
  end
110
110
 
@@ -128,6 +128,35 @@ describe "NativeObject (scoped)" do
128
128
  @object.foo.should == 42
129
129
  end
130
130
 
131
+ it 'is == to an empty Hash / Map' do
132
+ ( @object == {} ).should be true
133
+ ( @object == java.util.HashMap.new ).should be true
134
+ end
135
+
136
+ it 'is === to an empty Hash' do
137
+ ( @object === {} ).should be true
138
+ end
139
+
140
+ it 'is not eql? to an empty Hash / Map' do
141
+ ( @object.eql?( {} ) ).should be false
142
+ ( @object.eql?( java.util.HashMap.new ) ).should be false
143
+ end
144
+
145
+ it 'is eql? to another native object' do
146
+ object = @context.newObject(scope)
147
+ ( @object.eql?( object ) ).should be true
148
+ ( object.eql?( @object ) ).should be true
149
+ ( @object == object ).should be true
150
+ ( object === @object ).should be true
151
+ end
152
+
153
+ it 'native objects with same values are equal' do
154
+ obj1 = @context.evaluateString @scope, "( { ferko: 'suska', answer: 42 } )", '<eval>', 0, nil
155
+ obj2 = @context.evaluateString @scope, "var obj = {}; obj['answer'] = 42; obj.ferko = 'suska'; obj", '<eval>', 0, nil
156
+ ( obj1 == obj2 ).should be true
157
+ ( obj1.eql?( obj2 ) ).should be true
158
+ end
159
+
131
160
  end
132
161
 
133
162
  describe "NativeFunction" do
@@ -158,10 +187,22 @@ describe "NativeFunction" do
158
187
 
159
188
  it_should_behave_like 'ScriptableObject'
160
189
 
161
- it 'is callable' do
190
+ it 'is (Ruby) callable' do
162
191
  # NOTE: no implicit or bound this thus this === global
163
192
  @object.call.should == '[object global]'
164
193
  end
194
+
195
+ it 'is (Ruby) callable passing arguments' do
196
+ js = "( function foo(arg) { return 'foo' + arg; } )"
197
+ foo = @context.evaluateString(@scope, js, '<eval>', 0, nil)
198
+ foo.call(42).should == 'foo42'
199
+ end
200
+
201
+ it 'is (Ruby) callable converting result' do
202
+ js = "( function foo(arg) { return [ 1, 2, arg ]; } )"
203
+ foo = @context.evaluateString(@scope, js, '<eval>', 0, nil)
204
+ foo.call('x').should == [ 1, 2, 'x' ]
205
+ end
165
206
 
166
207
  it 'might be bind and called' do
167
208
  @object.bind(@object).should be_a(Rhino::JS::Function)
@@ -208,14 +249,14 @@ describe "NativeFunction (constructor)" do
208
249
 
209
250
  before do
210
251
  factory = Rhino::JS::ContextFactory.new
211
- context, scope = nil, nil
252
+ @context, @scope = nil, nil
212
253
  factory.call do |ctx|
213
- context = ctx
214
- scope = context.initStandardObjects(nil, false)
254
+ @context = ctx
255
+ @scope = @context.initStandardObjects(nil, false)
215
256
  end
216
- factory.enterContext(context)
257
+ factory.enterContext(@context)
217
258
 
218
- @object = Rhino::JS::ScriptableObject.getProperty(context.newObject(scope), 'constructor')
259
+ @object = Rhino::JS::ScriptableObject.getProperty(@context.newObject(@scope), 'constructor')
219
260
  @object.instance_eval do
220
261
  def to_h_properties
221
262
  h = {
@@ -248,7 +289,21 @@ describe "NativeFunction (constructor)" do
248
289
  it_should_behave_like 'ScriptableObject'
249
290
 
250
291
  it 'is constructable' do
251
- @object.new.should == {}
292
+ @object.new.should be_a Rhino::JS::NativeObject
252
293
  end
253
294
 
295
+ it 'is not equal to an empty Hash' do
296
+ ( @object == {} ).should be false
297
+ ( @object === {} ).should be false
298
+ ( @object.eql?( {} ) ).should be false
299
+ end
300
+
301
+ it 'empty functions are not considered equal' do
302
+ fn1 = @context.evaluateString @scope, "( function() {} )", '<eval>', 0, nil
303
+ fn2 = @context.evaluateString @scope, "var f = function() {}", '<eval>', 0, nil
304
+ ( fn1 == fn2 ).should be false
305
+ ( fn1 === fn2 ).should be false
306
+ ( fn1.eql?( fn2 ) ).should be false
307
+ end
308
+
254
309
  end
@@ -172,13 +172,23 @@ describe Rhino::Ruby::Function do
172
172
  end
173
173
 
174
174
  it_should_behave_like Rhino::Ruby::Scriptable
175
+
176
+ it "is (JavaScript) callable as a function" do
177
+ rb_function = Rhino::Ruby::Function.wrap 'foo'.method(:upcase)
178
+ this = nil; args = nil
179
+ rb_function.call(context, scope, this, args).should == 'FOO'
180
+ end
175
181
 
176
- it "is callable as a function" do
177
- rb_function = Rhino::Ruby::Function.wrap method = 'foo'.method(:to_s)
178
- context = nil; scope = nil; this = nil; args = nil
179
- rb_function.call(context, scope, this, args).should == 'foo'
182
+ it 'is Ruby callable' do
183
+ rb_function = Rhino::Ruby::Function.wrap 'foo'.method(:upcase)
184
+ rb_function.call.should == 'FOO'
180
185
  end
181
186
 
187
+ it 'is Ruby callable passing arguments' do
188
+ rb_function = Rhino::Ruby::Function.wrap 'foo'.method(:scan)
189
+ rb_function.call('o').should == ['o', 'o']
190
+ end
191
+
182
192
  it "args get converted before delegating a ruby function call" do
183
193
  klass = Class.new(Object) do
184
194
  def foo(array)
@@ -186,7 +196,7 @@ describe Rhino::Ruby::Function do
186
196
  end
187
197
  end
188
198
  rb_function = Rhino::Ruby::Function.wrap method = klass.new.method(:foo)
189
- context = nil; scope = nil; this = nil
199
+ this = nil
190
200
  args = [ '1'.to_java, java.lang.String.new('2') ].to_java
191
201
  args = [ Rhino::JS::NativeArray.new(args) ].to_java
192
202
  rb_function.call(context, scope, this, args).should be(true)
@@ -199,7 +209,7 @@ describe Rhino::Ruby::Function do
199
209
  end
200
210
  end
201
211
  rb_function = Rhino::Ruby::Function.wrap method = klass.new.method(:foo)
202
- context = nil; scope = nil; this = nil; args = [].to_java
212
+ this = nil; args = [].to_java
203
213
  rb_function.call(context, scope, this, args).should be_a(Rhino::JS::NativeArray)
204
214
  end
205
215
 
@@ -209,8 +219,8 @@ describe Rhino::Ruby::Function do
209
219
  a1
210
220
  end
211
221
  end
212
- rb_function = Rhino::Ruby::Function.wrap method = klass.new.method(:foo)
213
- context = nil; scope = nil; this = nil
222
+ rb_function = Rhino::Ruby::Function.wrap klass.new.method(:foo)
223
+ this = nil
214
224
 
215
225
  args = [ 1.to_java, 2.to_java, 3.to_java ].to_java; js_return = nil
216
226
  lambda { js_return = rb_function.call(context, scope, this, args) }.should_not raise_error
@@ -224,7 +234,7 @@ describe Rhino::Ruby::Function do
224
234
  end
225
235
  end
226
236
  rb_function = Rhino::Ruby::Function.wrap klass.new.method(:foo)
227
- context = nil; scope = nil; this = nil
237
+ this = nil
228
238
 
229
239
  args = [ 1.to_java ].to_java; js_return = nil
230
240
  lambda { js_return = rb_function.call(context, scope, this, args) }.should_not raise_error
@@ -242,7 +252,7 @@ describe Rhino::Ruby::Function do
242
252
  end
243
253
  end
244
254
  rb_function = Rhino::Ruby::Function.wrap klass.new.method(:foo)
245
- context = nil; scope = nil; this = nil
255
+ this = nil
246
256
 
247
257
  args = [ ].to_java; js_return = nil
248
258
  lambda { js_return = rb_function.call(context, scope, this, args) }.should_not raise_error
@@ -292,22 +302,11 @@ describe Rhino::Ruby::Function do
292
302
 
293
303
  describe 'with scope' do
294
304
 
295
- before do
296
- factory = Rhino::JS::ContextFactory.new
297
- context = nil
298
- factory.call do |ctx|
299
- context = ctx
300
- @scope = context.initStandardObjects(nil, false)
301
- end
302
- factory.enterContext(context)
303
- end
304
-
305
- after do
306
- Rhino::JS::Context.exit
307
- end
305
+ before { context_factory.enterContext(context) }
306
+ after { Rhino::JS::Context.exit }
308
307
 
309
308
  it "sets up correct prototype" do
310
- rb_function = Rhino::Ruby::Function.wrap 'foo'.method(:concat), @scope
309
+ rb_function = Rhino::Ruby::Function.wrap 'foo'.method(:concat), scope
311
310
  rb_function.getPrototype.should_not be(nil)
312
311
  rb_function.getPrototype.should be_a(Rhino::JS::Function)
313
312
  end
@@ -338,7 +337,7 @@ describe Rhino::Ruby::Constructor do
338
337
 
339
338
  it "is callable as a function" do
340
339
  rb_new = Rhino::Ruby::Constructor.wrap Foo
341
- context = nil; scope = nil; this = nil; args = nil
340
+ this = nil; args = nil
342
341
  rb_new.call(context, scope, this, args).should be_a(Rhino::Ruby::Object)
343
342
  rb_new.call(context, scope, this, args).unwrap.should be_a(Foo)
344
343
  end
@@ -398,7 +397,7 @@ describe Rhino::Ruby::Exception do
398
397
  end
399
398
  end
400
399
  rb_function = Rhino::Ruby::Function.wrap klass.new.method(:foo)
401
- context = nil; scope = nil; this = nil; args = [ 42.to_java ].to_java
400
+ this = nil; args = [ 42.to_java ].to_java
402
401
  begin
403
402
  rb_function.call(context, scope, this, args)
404
403
  rescue java.lang.Exception => e
@@ -168,12 +168,12 @@ describe Rhino::To do
168
168
  it "converts procs and methods into native functions" do
169
169
  Rhino.to_javascript(lambda {|lhs,rhs| lhs * rhs}).tap do |f|
170
170
  f.should be_kind_of(Rhino::JS::Function)
171
- f.call(nil, nil, nil, [7, 6].to_java).should be(42)
171
+ f.call(context, scope, nil, [7, 6].to_java).should be(42)
172
172
  end
173
173
 
174
174
  Rhino.to_javascript("foo,bar,baz".method(:split)).tap do |f|
175
175
  f.should be_kind_of(Rhino::JS::Function)
176
- Rhino.to_ruby(f.call(nil, nil, nil, [','].to_java)).should == ['foo', 'bar', 'baz']
176
+ Rhino.to_ruby(f.call(context, scope, nil, [','].to_java)).should == ['foo', 'bar', 'baz']
177
177
  end
178
178
  end
179
179
 
@@ -10,6 +10,26 @@ module RedJS
10
10
  Error = Rhino::JSError
11
11
  end
12
12
 
13
+ module Rhino
14
+ module SpecHelpers
15
+
16
+ def context_factory
17
+ @context_factory ||= Rhino::JS::ContextFactory.new
18
+ end
19
+
20
+ def context
21
+ @context || context_factory.call { |ctx| @context = ctx }
22
+ @context
23
+ end
24
+
25
+ def scope
26
+ context.initStandardObjects(nil, false)
27
+ end
28
+
29
+ end
30
+ end
31
+
13
32
  RSpec.configure do |config|
14
- config.filter_run_excluding :compat => /(0.5.0)|(0.6.0)/
33
+ config.filter_run_excluding :compat => /(0.5.0)|(0.6.0)/ # RedJS
34
+ config.include Rhino::SpecHelpers
15
35
  end
metadata CHANGED
@@ -1,142 +1,148 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: therubyrhino
3
- version: !ruby/object:Gem::Version
4
- prerelease:
5
- version: 2.0.1
3
+ version: !ruby/object:Gem::Version
4
+ prerelease:
5
+ version: 2.0.2
6
6
  platform: ruby
7
- authors:
8
- - Charles Lowell
9
- autorequire:
7
+ authors:
8
+ - Charles Lowell
9
+ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-08-24 00:00:00.000000000Z
13
- dependencies:
14
- - !ruby/object:Gem::Dependency
15
- name: therubyrhino_jar
16
- version_requirements: &3954 !ruby/object:Gem::Requirement
17
- requirements:
18
- - - ! '>='
19
- - !ruby/object:Gem::Version
20
- version: 1.7.3
21
- none: false
22
- requirement: *3954
23
- prerelease: false
24
- type: :runtime
25
- - !ruby/object:Gem::Dependency
26
- name: rake
27
- version_requirements: &3972 !ruby/object:Gem::Requirement
28
- requirements:
29
- - - ! '>='
30
- - !ruby/object:Gem::Version
31
- version: '0'
32
- none: false
33
- requirement: *3972
34
- prerelease: false
35
- type: :development
36
- - !ruby/object:Gem::Dependency
37
- name: rspec
38
- version_requirements: &3990 !ruby/object:Gem::Requirement
39
- requirements:
40
- - - ~>
41
- - !ruby/object:Gem::Version
42
- version: '2.10'
43
- none: false
44
- requirement: *3990
45
- prerelease: false
46
- type: :development
47
- - !ruby/object:Gem::Dependency
48
- name: mocha
49
- version_requirements: &4006 !ruby/object:Gem::Requirement
50
- requirements:
51
- - - ! '>='
52
- - !ruby/object:Gem::Version
53
- version: '0'
54
- none: false
55
- requirement: *4006
56
- prerelease: false
57
- type: :development
58
- - !ruby/object:Gem::Dependency
59
- name: jruby-openssl
60
- version_requirements: &4022 !ruby/object:Gem::Requirement
61
- requirements:
62
- - - ! '>='
63
- - !ruby/object:Gem::Version
64
- version: '0'
65
- none: false
66
- requirement: *4022
67
- prerelease: false
68
- type: :development
12
+
13
+ date: 2012-12-05 00:00:00 Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: therubyrhino_jar
17
+ version_requirements: &id001 !ruby/object:Gem::Requirement
18
+ none: false
19
+ requirements:
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: 1.7.3
23
+ requirement: *id001
24
+ prerelease: false
25
+ type: :runtime
26
+ - !ruby/object:Gem::Dependency
27
+ name: rake
28
+ version_requirements: &id002 !ruby/object:Gem::Requirement
29
+ none: false
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: "0"
34
+ requirement: *id002
35
+ prerelease: false
36
+ type: :development
37
+ - !ruby/object:Gem::Dependency
38
+ name: rspec
39
+ version_requirements: &id003 !ruby/object:Gem::Requirement
40
+ none: false
41
+ requirements:
42
+ - - ~>
43
+ - !ruby/object:Gem::Version
44
+ version: "2.10"
45
+ requirement: *id003
46
+ prerelease: false
47
+ type: :development
48
+ - !ruby/object:Gem::Dependency
49
+ name: mocha
50
+ version_requirements: &id004 !ruby/object:Gem::Requirement
51
+ none: false
52
+ requirements:
53
+ - - ">="
54
+ - !ruby/object:Gem::Version
55
+ version: "0"
56
+ requirement: *id004
57
+ prerelease: false
58
+ type: :development
59
+ - !ruby/object:Gem::Dependency
60
+ name: jruby-openssl
61
+ version_requirements: &id005 !ruby/object:Gem::Requirement
62
+ none: false
63
+ requirements:
64
+ - - ">="
65
+ - !ruby/object:Gem::Version
66
+ version: "0"
67
+ requirement: *id005
68
+ prerelease: false
69
+ type: :development
69
70
  description: Call javascript code and manipulate javascript objects from ruby. Call ruby code and manipulate ruby objects from javascript.
70
71
  email: cowboyd@thefrontside.net
71
72
  executables: []
73
+
72
74
  extensions: []
73
- extra_rdoc_files:
74
- - README.rdoc
75
- files:
76
- - .gitignore
77
- - .travis.yml
78
- - Gemfile
79
- - History.txt
80
- - README.rdoc
81
- - Rakefile
82
- - lib/rhino.rb
83
- - lib/rhino/context.rb
84
- - lib/rhino/deprecations.rb
85
- - lib/rhino/error.rb
86
- - lib/rhino/object.rb
87
- - lib/rhino/rhino_ext.rb
88
- - lib/rhino/ruby.rb
89
- - lib/rhino/ruby/access.rb
90
- - lib/rhino/ruby/attribute_access.rb
91
- - lib/rhino/ruby/default_access.rb
92
- - lib/rhino/version.rb
93
- - lib/rhino/wormhole.rb
94
- - spec/rhino/access_spec.rb
95
- - spec/rhino/context_spec.rb
96
- - spec/rhino/deprecations_spec.rb
97
- - spec/rhino/error_spec.rb
98
- - spec/rhino/integration/bar.js
99
- - spec/rhino/integration/foo.js
100
- - spec/rhino/integration/index.js
101
- - spec/rhino/integration/loop.js
102
- - spec/rhino/integration/loop/element1.js
103
- - spec/rhino/integration/loop/element2.js
104
- - spec/rhino/integration_spec.rb
105
- - spec/rhino/redjs_spec.rb
106
- - spec/rhino/rhino_ext_spec.rb
107
- - spec/rhino/ruby_spec.rb
108
- - spec/rhino/wormhole_spec.rb
109
- - spec/spec_helper.rb
110
- - therubyrhino.gemspec
75
+
76
+ extra_rdoc_files:
77
+ - README.rdoc
78
+ files:
79
+ - .gitignore
80
+ - .travis.yml
81
+ - Gemfile
82
+ - History.txt
83
+ - README.rdoc
84
+ - Rakefile
85
+ - lib/rhino.rb
86
+ - lib/rhino/context.rb
87
+ - lib/rhino/deprecations.rb
88
+ - lib/rhino/error.rb
89
+ - lib/rhino/object.rb
90
+ - lib/rhino/rhino_ext.rb
91
+ - lib/rhino/ruby.rb
92
+ - lib/rhino/ruby/access.rb
93
+ - lib/rhino/ruby/attribute_access.rb
94
+ - lib/rhino/ruby/default_access.rb
95
+ - lib/rhino/version.rb
96
+ - lib/rhino/wormhole.rb
97
+ - spec/rhino/access_spec.rb
98
+ - spec/rhino/context_spec.rb
99
+ - spec/rhino/deprecations_spec.rb
100
+ - spec/rhino/error_spec.rb
101
+ - spec/rhino/integration/bar.js
102
+ - spec/rhino/integration/foo.js
103
+ - spec/rhino/integration/index.js
104
+ - spec/rhino/integration/loop.js
105
+ - spec/rhino/integration/loop/element1.js
106
+ - spec/rhino/integration/loop/element2.js
107
+ - spec/rhino/integration_spec.rb
108
+ - spec/rhino/redjs_spec.rb
109
+ - spec/rhino/rhino_ext_spec.rb
110
+ - spec/rhino/ruby_spec.rb
111
+ - spec/rhino/wormhole_spec.rb
112
+ - spec/spec_helper.rb
113
+ - therubyrhino.gemspec
111
114
  homepage: http://github.com/cowboyd/therubyrhino
112
115
  licenses: []
113
- post_install_message:
116
+
117
+ post_install_message:
114
118
  rdoc_options: []
115
- require_paths:
116
- - lib
117
- required_ruby_version: !ruby/object:Gem::Requirement
118
- requirements:
119
- - - ! '>='
120
- - !ruby/object:Gem::Version
121
- segments:
122
- - 0
123
- hash: 2
124
- version: '0'
119
+
120
+ require_paths:
121
+ - lib
122
+ required_ruby_version: !ruby/object:Gem::Requirement
125
123
  none: false
126
- required_rubygems_version: !ruby/object:Gem::Requirement
127
- requirements:
128
- - - ! '>='
129
- - !ruby/object:Gem::Version
130
- segments:
131
- - 0
132
- hash: 2
133
- version: '0'
124
+ requirements:
125
+ - - ">="
126
+ - !ruby/object:Gem::Version
127
+ hash: 2
128
+ segments:
129
+ - 0
130
+ version: "0"
131
+ required_rubygems_version: !ruby/object:Gem::Requirement
134
132
  none: false
133
+ requirements:
134
+ - - ">="
135
+ - !ruby/object:Gem::Version
136
+ hash: 2
137
+ segments:
138
+ - 0
139
+ version: "0"
135
140
  requirements: []
141
+
136
142
  rubyforge_project: therubyrhino
137
- rubygems_version: 1.8.15
138
- signing_key:
143
+ rubygems_version: 1.8.24
144
+ signing_key:
139
145
  specification_version: 3
140
146
  summary: Embed the Rhino JavaScript interpreter into JRuby
141
147
  test_files: []
142
- ...
148
+