1
0
Fork 0
mirror of https://github.com/rubyjs/therubyracer synced 2023-03-27 23:21:42 -04:00
therubyracer/lib/v8/context.rb
2012-06-07 10:02:26 -05:00

69 lines
No EOL
1.3 KiB
Ruby

module V8
class Context
include Conversion
attr_reader :native
def initialize
@native = V8::C::Context::New()
end
def enter(&block)
if !entered?
lock_scope_and_enter(&block)
else
yield
end
end
def entered?
Context.current == self
end
def self.current
Thread.current[:v8_context]
end
def self.current=(context)
Thread.current[:v8_context] = context
end
def lock_scope_and_enter
current = Context.current
Context.current = self
V8::C::Locker() do
V8::C::HandleScope() do
begin
@native.Enter()
yield if block_given?
ensure
@native.Exit()
end
end
end
ensure
Context.current = current
end
def eval(source, filename = '<eval>', line = 1)
enter do
source = V8::C::String::New(source.to_s)
filename = V8::C::String::New(filename.to_s)
script = V8::C::Script::New(source, filename)
to_ruby script.Run()
end
end
def []=(key, value)
enter do
@native.Global().Set(to_v8(key), to_v8(value))
end
return value
end
def [](key)
enter do
to_ruby(@native.Global().Get(to_v8(key)))
end
end
end
end