class ExecJS::NashornRuntime::Context

Public Class Methods

new(_, source = nil, _ = nil) click to toggle source
# File lib/nashorn/execjs/runtime.rb, line 8
def initialize(_, source = nil, _ = nil)
  source = encode(source) if source
  @nashorn_context = ::Nashorn::Context.new
  @nashorn_context.eval(source) if source
rescue Exception => e
  raise wrap_error(e)
end

Public Instance Methods

call(prop, *args) click to toggle source
# File lib/nashorn/execjs/runtime.rb, line 28
def call(prop, *args)
#  evaled = @nashorn_context.eval(prop)
#  unbox evaled.call(*args)
#rescue Exception => e
#  raise wrap_error(e)
  eval "#{prop}.apply(this, #{::JSON.generate(args)})"
end
eval(source, _ = nil) click to toggle source
# File lib/nashorn/execjs/runtime.rb, line 21
def eval(source, _ = nil) # options not used
  source = encode(source)
  unbox @nashorn_context.eval("(#{source})") if /\S/ =~ source
rescue Exception => e
  raise wrap_error(e)
end
exec(source, options = nil) click to toggle source
# File lib/nashorn/execjs/runtime.rb, line 16
def exec(source, options = nil) # options not used
  source = encode(source)
  eval "(function(){#{source}})()", options if /\S/ =~ source
end
unbox(value) click to toggle source
# File lib/nashorn/execjs/runtime.rb, line 36
def unbox(value)
  value = ::Nashorn::to_rb(value, false) # ExecJS likes its own way :

  if value.is_a?(::Nashorn::JS::JSObject)
    return nil if value.isFunction
    return value.values.map { |v| unbox(v) } if value.isArray
    hash = {}; value.each_raw do |key, val|
      next if val.respond_to?(:isFunction) && val.isFunction
      hash[key] = unbox(val)
    end
    return hash
  end
  value
end
wrap_error(e) click to toggle source
# File lib/nashorn/execjs/runtime.rb, line 51
def wrap_error(e)
  return e unless e.is_a?(::Nashorn::JSError)

  error_class = ::Nashorn::JSError.parse_error?(e.cause) ? RuntimeError : ProgramError

  backtrace = e.backtrace

  if js_stack = e.javascript_backtrace
    backtrace = backtrace - js_stack
    # ["<<eval>>.<anonymous>(<eval>:1)", "<<eval>>.<program>(<eval>:1)"]
    js_stack = js_stack.map { |line| line.sub(/\<eval\>\:/, "(execjs):") }
    backtrace = js_stack + backtrace
  elsif backtrace
    backtrace = backtrace.dup; backtrace.unshift('(execjs):1')
  end

  error = error_class.new e.value ? e.value.to_s : e.message
  error.set_backtrace(backtrace)
  error
end