class Less::JavaScript::V8Context

Public Class Methods

instance() click to toggle source
# File lib/less/java_script/v8_context.rb, line 14
def self.instance
  return new
end
new(globals = nil) click to toggle source
# File lib/less/java_script/v8_context.rb, line 18
def initialize(globals = nil)
  lock do
    @v8_context = V8::Context.new
    globals.each { |key, val| @v8_context[key] = val } if globals
  end
end

Public Instance Methods

call(properties, *args) click to toggle source
# File lib/less/java_script/v8_context.rb, line 41
def call(properties, *args)
  args.last.is_a?(::Hash) ? args.pop : nil # extract_options!

  lock do
    @v8_context.eval(properties).call(*args)
  end
end
eval(source, options = nil) click to toggle source
# File lib/less/java_script/v8_context.rb, line 33
def eval(source, options = nil) # passing options not supported
  source = source.encode('UTF-8') if source.respond_to?(:encode)

  lock do
    @v8_context.eval("(#{source})")
  end
end
exec(&block) click to toggle source
# File lib/less/java_script/v8_context.rb, line 29
def exec(&block)
  lock(&block)
end
method_missing(symbol, *args) click to toggle source
Calls superclass method
# File lib/less/java_script/v8_context.rb, line 49
def method_missing(symbol, *args)
  if @v8_context.respond_to?(symbol)
    @v8_context.send(symbol, *args)
  else
    super
  end
end
unwrap() click to toggle source
# File lib/less/java_script/v8_context.rb, line 25
def unwrap
  @v8_context
end

Private Instance Methods

do_lock() { || ... } click to toggle source
# File lib/less/java_script/v8_context.rb, line 86
def do_lock
  result, exception = nil, nil
  V8::C::Locker() do
    begin
      result = yield
    rescue Exception => e
      exception = e
    end
  end

  if exception
    raise exception
  else
    result
  end
end
lock(&block) click to toggle source
# File lib/less/java_script/v8_context.rb, line 59
def lock(&block)
  do_lock(&block)
rescue V8::JSError => e
  if e.in_javascript?
    js_value = e.value.respond_to?(:'[]')
    name = js_value && e.value["name"]
    constructor = js_value && e.value['constructor']
    if name == "SyntaxError" || 
        ( constructor && constructor.name == "LessError" )
      raise Less::ParseError.new(e, js_value ? e.value : nil)
    end
  # NOTE: less/parser.js :
  # 
  #   error = new(LessError)({
  #      index: i,
  #      type: 'Parse',
  #      message: "missing closing `}`",
  #      filename: env.filename
  #   }, env);
  # 
  # comes back as value: RuntimeError !
  elsif e.value.to_s == "missing closing `}`"
    raise Less::ParseError.new(e.value.to_s)
  end
  raise Less::Error.new(e)
end