mirror of
https://github.com/rails/execjs
synced 2023-03-27 23:21:20 -04:00
Add Rhino runtime
This commit is contained in:
parent
c00ee391d2
commit
cc7dfe6610
5 changed files with 55 additions and 3 deletions
|
@ -10,17 +10,18 @@ Gem::Specification.new do |s|
|
||||||
EOS
|
EOS
|
||||||
|
|
||||||
s.files = [
|
s.files = [
|
||||||
"lib/execjs",
|
"lib/execjs.rb",
|
||||||
"lib/execjs/external_runtime.rb",
|
"lib/execjs/external_runtime.rb",
|
||||||
|
"lib/execjs/rhino_runtime.rb",
|
||||||
"lib/execjs/runners",
|
"lib/execjs/runners",
|
||||||
"lib/execjs/runners/basic.js",
|
"lib/execjs/runners/basic.js",
|
||||||
"lib/execjs/runners/node.js",
|
"lib/execjs/runners/node.js",
|
||||||
"lib/execjs/runtimes.rb",
|
"lib/execjs/runtimes.rb",
|
||||||
"lib/execjs/v8_runtime.rb",
|
"lib/execjs/v8_runtime.rb"
|
||||||
"lib/execjs.rb"
|
|
||||||
]
|
]
|
||||||
|
|
||||||
s.add_development_dependency "therubyracer"
|
s.add_development_dependency "therubyracer"
|
||||||
|
s.add_development_dependency "therubyrhino"
|
||||||
|
|
||||||
s.authors = ["Sam Stephenson"]
|
s.authors = ["Sam Stephenson"]
|
||||||
s.email = "sstephenson@gmail.com"
|
s.email = "sstephenson@gmail.com"
|
||||||
|
|
|
@ -4,6 +4,7 @@ module ExecJS
|
||||||
class ProgramError < Error; end
|
class ProgramError < Error; end
|
||||||
|
|
||||||
autoload :ExternalRuntime, "execjs/external_runtime"
|
autoload :ExternalRuntime, "execjs/external_runtime"
|
||||||
|
autoload :RhinoRuntime, "execjs/rhino_runtime"
|
||||||
autoload :Runtimes, "execjs/runtimes"
|
autoload :Runtimes, "execjs/runtimes"
|
||||||
autoload :V8Runtime, "execjs/v8_runtime"
|
autoload :V8Runtime, "execjs/v8_runtime"
|
||||||
|
|
||||||
|
|
46
lib/execjs/rhino_runtime.rb
Normal file
46
lib/execjs/rhino_runtime.rb
Normal file
|
@ -0,0 +1,46 @@
|
||||||
|
module ExecJS
|
||||||
|
class RhinoRuntime
|
||||||
|
def initialize(options)
|
||||||
|
end
|
||||||
|
|
||||||
|
def exec(source)
|
||||||
|
if /\S/ =~ source
|
||||||
|
eval "(function(){#{source}})()"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def eval(source)
|
||||||
|
if /\S/ =~ source
|
||||||
|
context = ::Rhino::Context.new
|
||||||
|
unbox context.eval("(#{source})")
|
||||||
|
end
|
||||||
|
rescue ::Rhino::JavascriptError => e
|
||||||
|
if e.message == "syntax error"
|
||||||
|
raise RuntimeError, e
|
||||||
|
else
|
||||||
|
raise ProgramError, e
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def available?
|
||||||
|
require "rhino"
|
||||||
|
true
|
||||||
|
rescue LoadError
|
||||||
|
false
|
||||||
|
end
|
||||||
|
|
||||||
|
def unbox(value)
|
||||||
|
case value
|
||||||
|
when ::Rhino::NativeFunction
|
||||||
|
nil
|
||||||
|
when ::Rhino::NativeObject
|
||||||
|
value.inject({}) do |vs, (k, v)|
|
||||||
|
vs[k] = unbox(v) unless v.is_a?(::Rhino::NativeFunction)
|
||||||
|
vs
|
||||||
|
end
|
||||||
|
else
|
||||||
|
value
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -38,5 +38,8 @@ module ExecJS
|
||||||
define_runtime :Spidermonkey,
|
define_runtime :Spidermonkey,
|
||||||
:command => "js",
|
:command => "js",
|
||||||
:runner_path => runner_path("basic.js")
|
:runner_path => runner_path("basic.js")
|
||||||
|
|
||||||
|
define_runtime :Rhino,
|
||||||
|
:as => RhinoRuntime
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -63,3 +63,4 @@ test_runtime :ExternalV8
|
||||||
test_runtime :Node
|
test_runtime :Node
|
||||||
test_runtime :JSC
|
test_runtime :JSC
|
||||||
test_runtime :Spidermonkey
|
test_runtime :Spidermonkey
|
||||||
|
test_runtime :Rhino
|
||||||
|
|
Loading…
Reference in a new issue