mirror of
https://github.com/rails/execjs
synced 2023-03-27 23:21:20 -04:00
Merge branch 'SamSaffron/master'
This commit is contained in:
commit
975c80bf03
5 changed files with 138 additions and 6 deletions
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -1,2 +1,3 @@
|
||||||
Gemfile.lock
|
Gemfile.lock
|
||||||
pkg/*
|
pkg/*
|
||||||
|
.bundle/*
|
||||||
|
|
29
.travis.yml
29
.travis.yml
|
@ -1,11 +1,13 @@
|
||||||
language: ruby
|
language: ruby
|
||||||
cache: bundler
|
cache: bundler
|
||||||
sudo: false
|
sudo: false
|
||||||
|
# we need trust so correct gcc runs for mini_racer, latest v8 requires gcc 4.8+
|
||||||
|
|
||||||
before_install:
|
before_install:
|
||||||
- if [ "$EXECJS_RUNTIME" == "V8" ]; then brew update; fi
|
- if [ "$EXECJS_RUNTIME" == "V8" ]; then brew update; fi
|
||||||
- if [ "$EXECJS_RUNTIME" == "V8" ]; then brew install v8; fi
|
- if [ "$EXECJS_RUNTIME" == "V8" ]; then brew install v8; fi
|
||||||
script: bundle exec ruby test/test_execjs.rb
|
- if [ "$EXECJS_RUNTIME" == "MiniRacer" ]; then gem install bundler -v 1.12.0; fi
|
||||||
|
script: bundle && bundle exec ruby test/test_execjs.rb
|
||||||
|
|
||||||
matrix:
|
matrix:
|
||||||
include:
|
include:
|
||||||
|
@ -15,6 +17,10 @@ matrix:
|
||||||
env: EXECJS_RUNTIME=Duktape
|
env: EXECJS_RUNTIME=Duktape
|
||||||
- rvm: 2.0.0
|
- rvm: 2.0.0
|
||||||
env: EXECJS_RUNTIME=RubyRacer
|
env: EXECJS_RUNTIME=RubyRacer
|
||||||
|
- rvm: 2.0.0
|
||||||
|
env: EXECJS_RUNTIME=MiniRacer
|
||||||
|
dist: trusty
|
||||||
|
sudo: true
|
||||||
|
|
||||||
- rvm: 2.1
|
- rvm: 2.1
|
||||||
env: EXECJS_RUNTIME=Node
|
env: EXECJS_RUNTIME=Node
|
||||||
|
@ -22,6 +28,10 @@ matrix:
|
||||||
env: EXECJS_RUNTIME=Duktape
|
env: EXECJS_RUNTIME=Duktape
|
||||||
- rvm: 2.1
|
- rvm: 2.1
|
||||||
env: EXECJS_RUNTIME=RubyRacer
|
env: EXECJS_RUNTIME=RubyRacer
|
||||||
|
- rvm: 2.1
|
||||||
|
env: EXECJS_RUNTIME=MiniRacer
|
||||||
|
dist: trusty
|
||||||
|
sudo: true
|
||||||
|
|
||||||
- rvm: 2.2
|
- rvm: 2.2
|
||||||
env: EXECJS_RUNTIME=Node
|
env: EXECJS_RUNTIME=Node
|
||||||
|
@ -29,13 +39,21 @@ matrix:
|
||||||
env: EXECJS_RUNTIME=Duktape
|
env: EXECJS_RUNTIME=Duktape
|
||||||
- rvm: 2.2
|
- rvm: 2.2
|
||||||
env: EXECJS_RUNTIME=RubyRacer
|
env: EXECJS_RUNTIME=RubyRacer
|
||||||
|
- rvm: 2.2
|
||||||
|
env: EXECJS_RUNTIME=MiniRacer
|
||||||
|
dist: trusty
|
||||||
|
sudo: true
|
||||||
|
|
||||||
- rvm: 2.3.0
|
- rvm: 2.3.1
|
||||||
env: EXECJS_RUNTIME=Node
|
env: EXECJS_RUNTIME=Node
|
||||||
- rvm: 2.3.0
|
- rvm: 2.3.1
|
||||||
env: EXECJS_RUNTIME=Duktape
|
env: EXECJS_RUNTIME=Duktape
|
||||||
- rvm: 2.3.0
|
- rvm: 2.3.1
|
||||||
env: EXECJS_RUNTIME=RubyRacer
|
env: EXECJS_RUNTIME=RubyRacer
|
||||||
|
- rvm: 2.3.1
|
||||||
|
env: EXECJS_RUNTIME=MiniRacer
|
||||||
|
dist: trusty
|
||||||
|
sudo: true
|
||||||
|
|
||||||
- rvm: jruby-19mode
|
- rvm: jruby-19mode
|
||||||
env: EXECJS_RUNTIME=Node
|
env: EXECJS_RUNTIME=Node
|
||||||
|
@ -52,3 +70,6 @@ matrix:
|
||||||
env: EXECJS_RUNTIME=RubyRacer
|
env: EXECJS_RUNTIME=RubyRacer
|
||||||
- os: osx
|
- os: osx
|
||||||
env: EXECJS_RUNTIME=V8
|
env: EXECJS_RUNTIME=V8
|
||||||
|
- os: osx
|
||||||
|
env: EXECJS_RUNTIME=MiniRacer
|
||||||
|
osx_image: xcode7.3
|
||||||
|
|
8
Gemfile
8
Gemfile
|
@ -4,7 +4,11 @@ gemspec
|
||||||
|
|
||||||
group :test do
|
group :test do
|
||||||
gem 'duktape', platform: :mri
|
gem 'duktape', platform: :mri
|
||||||
gem 'therubyracer', platform: :mri
|
if ENV['EXECJS_RUNTIME'] == 'MiniRacer'
|
||||||
gem 'therubyrhino', ">=1.73.3", platform: :jruby
|
gem 'mini_racer', '0.1.0.beta.3', platform: :mri
|
||||||
|
else
|
||||||
|
gem 'therubyracer', platform: :mri
|
||||||
|
end
|
||||||
|
gem 'therubyrhino', '>=1.73.3', platform: :jruby
|
||||||
gem 'minitest', require: false
|
gem 'minitest', require: false
|
||||||
end
|
end
|
||||||
|
|
102
lib/execjs/mini_racer_runtime.rb
Normal file
102
lib/execjs/mini_racer_runtime.rb
Normal file
|
@ -0,0 +1,102 @@
|
||||||
|
require "execjs/runtime"
|
||||||
|
|
||||||
|
module ExecJS
|
||||||
|
class MiniRacerRuntime < Runtime
|
||||||
|
class Context < Runtime::Context
|
||||||
|
def initialize(runtime, source = "", options={})
|
||||||
|
source = encode(source)
|
||||||
|
@context = ::MiniRacer::Context.new
|
||||||
|
translate do
|
||||||
|
@context.eval(source)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def exec(source, options = {})
|
||||||
|
source = encode(source)
|
||||||
|
|
||||||
|
if /\S/ =~ source
|
||||||
|
eval "(function(){#{source}})()"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def eval(source, options = {})
|
||||||
|
source = encode(source)
|
||||||
|
|
||||||
|
if /\S/ =~ source
|
||||||
|
translate do
|
||||||
|
@context.eval("(#{source})")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def call(identifier, *args)
|
||||||
|
# TODO optimise generate
|
||||||
|
eval "#{identifier}.apply(this, #{::JSON.generate(args)})"
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def strip_functions!(value)
|
||||||
|
if Array === value
|
||||||
|
value.map! do |v|
|
||||||
|
if MiniRacer::JavaScriptFunction === value
|
||||||
|
nil
|
||||||
|
else
|
||||||
|
strip_functions!(v)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
elsif Hash === value
|
||||||
|
value.each do |k,v|
|
||||||
|
if MiniRacer::JavaScriptFunction === v
|
||||||
|
value.delete k
|
||||||
|
else
|
||||||
|
value[k] = strip_functions!(v)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
value
|
||||||
|
elsif MiniRacer::JavaScriptFunction === value
|
||||||
|
nil
|
||||||
|
else
|
||||||
|
value
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def translate
|
||||||
|
begin
|
||||||
|
strip_functions! yield
|
||||||
|
rescue MiniRacer::RuntimeError => e
|
||||||
|
ex = ProgramError.new e.message
|
||||||
|
if backtrace = e.backtrace
|
||||||
|
backtrace = backtrace.map { |line|
|
||||||
|
if line =~ /JavaScript at/
|
||||||
|
line.sub("JavaScript at ", "")
|
||||||
|
.sub("<anonymous>", "(execjs)")
|
||||||
|
.strip
|
||||||
|
else
|
||||||
|
line
|
||||||
|
end
|
||||||
|
}
|
||||||
|
ex.set_backtrace backtrace
|
||||||
|
end
|
||||||
|
raise ex
|
||||||
|
rescue MiniRacer::ParseError => e
|
||||||
|
ex = RuntimeError.new e.message
|
||||||
|
ex.set_backtrace(["(execjs):1"] + e.backtrace)
|
||||||
|
raise ex
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
def name
|
||||||
|
"mini_racer (V8)"
|
||||||
|
end
|
||||||
|
|
||||||
|
def available?
|
||||||
|
require "mini_racer"
|
||||||
|
true
|
||||||
|
rescue LoadError
|
||||||
|
false
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -4,6 +4,7 @@ require "execjs/duktape_runtime"
|
||||||
require "execjs/external_runtime"
|
require "execjs/external_runtime"
|
||||||
require "execjs/ruby_racer_runtime"
|
require "execjs/ruby_racer_runtime"
|
||||||
require "execjs/ruby_rhino_runtime"
|
require "execjs/ruby_rhino_runtime"
|
||||||
|
require "execjs/mini_racer_runtime"
|
||||||
|
|
||||||
module ExecJS
|
module ExecJS
|
||||||
module Runtimes
|
module Runtimes
|
||||||
|
@ -15,6 +16,8 @@ module ExecJS
|
||||||
|
|
||||||
RubyRhino = RubyRhinoRuntime.new
|
RubyRhino = RubyRhinoRuntime.new
|
||||||
|
|
||||||
|
MiniRacer = MiniRacerRuntime.new
|
||||||
|
|
||||||
Node = ExternalRuntime.new(
|
Node = ExternalRuntime.new(
|
||||||
name: "Node.js (V8)",
|
name: "Node.js (V8)",
|
||||||
command: ["nodejs", "node"],
|
command: ["nodejs", "node"],
|
||||||
|
@ -79,6 +82,7 @@ module ExecJS
|
||||||
RubyRacer,
|
RubyRacer,
|
||||||
RubyRhino,
|
RubyRhino,
|
||||||
Duktape,
|
Duktape,
|
||||||
|
MiniRacer,
|
||||||
Node,
|
Node,
|
||||||
JavaScriptCore,
|
JavaScriptCore,
|
||||||
SpiderMonkey,
|
SpiderMonkey,
|
||||||
|
|
Loading…
Reference in a new issue