1
0
Fork 0
mirror of https://github.com/rubyjs/therubyracer synced 2023-03-27 23:21:42 -04:00

make the global javascript object available on each context as Context#scope

This commit is contained in:
Charles Lowell 2010-05-25 23:49:43 +03:00
parent 117876a04d
commit f81cc92fca
5 changed files with 12 additions and 20 deletions

View file

@ -77,13 +77,7 @@ void rr_init_obj() {
VALUE rr_reflect_v8_object(Handle<Value> value) {
Local<Object> object(Object::Cast(*value));
Local<Value> peer = object->GetHiddenValue(String::New("TheRubyRacer::RubyObject"));
if (peer.IsEmpty()) {
VALUE obj = V8_Ref_Create(rr_cV8_C_Object, object);
rb_iv_set(obj, "@context", rr_v82rb(Context::GetEntered()));
return obj;
} else {
return (VALUE)External::Unwrap(peer);
}
return peer.IsEmpty() ? rr_v8_ref_create(rr_cV8_C_Object, object) : (VALUE)External::Unwrap(peer);
}

View file

@ -3,7 +3,7 @@ module V8
class Array < V8::Object
def each
for i in 0..(@native.Length() - 1)
for i in 0..(@native.Length() - 1)
yield To.ruby(@native.Get(i))
end
end

View file

@ -2,12 +2,13 @@ require 'stringio'
module V8
class Context
attr_reader :native
attr_reader :native, :scope
def initialize(opts = {})
@native = C::Context::New(opts[:with])
@scope = V8::Object.new(@native.Global(), @native)
yield(self) if block_given?
end
def open
@native.enter do
yield(self)

View file

@ -3,26 +3,28 @@ module V8
class Object
include Enumerable
def initialize(native)
def initialize(native, context = nil)
@native = native
@context = context || C::Context::GetEntered()
raise ScriptError, "V8::Object.new called without an open V8 context" unless @context
end
def [](key)
@native.context.enter do
@context.enter do
To.ruby(@native.Get(To.v8(key)))
end
end
def []=(key, value)
value.tap do
@native.context.enter do
@context.enter do
@native.Set(To.v8(key), To.v8(value))
end
end
end
def to_s
@native.context.enter do
@context.enter do
To.rb(@native.ToString())
end
end

View file

@ -4,12 +4,7 @@ module V8
class << self
def ruby(value)
case value
when V8::C::Function
V8::Function.new(value).tap do |f|
f.instance_eval do
@native.instance_variable_set(:@context, C::Context::GetEntered())
end
end
when V8::C::Function then V8::Function.new(value)
when V8::C::Array then V8::Array.new(value)
when V8::C::Object then V8::Object.new(value)
when V8::C::String then value.Utf8Value()