Skip to content
Browse files

Move Get,Set,Constructor and friends out of Class

Even though they had been moved into the
`ClassAction` module, that module still had the
potential for conflict. Instead, we'll just put 
evenything in the Conversion namespace. That way
we need not worry.
  • Loading branch information...
1 parent 7f3a8cb commit c5b13ea1150ffc3a14b48e8dec5d04cc0e486a0c @cowboyd committed Jul 24, 2012
Showing with 88 additions and 99 deletions.
  1. +76 −78 lib/v8/conversion/class.rb
  2. +0 −21 spec/class_scope_spec.rb
  3. +12 −0 spec/v8/conversion_spec.rb
View
154 lib/v8/conversion/class.rb
@@ -4,117 +4,115 @@ module Class
def to_template
weakcell(:constructor) do
- template = V8::C::FunctionTemplate::New(V8::Conversion::ClassActions::Constructor.new(self))
+ template = V8::C::FunctionTemplate::New(V8::Conversion::Constructor.new(self))
prototype = template.InstanceTemplate()
- prototype.SetNamedPropertyHandler(V8::Conversion::ClassActions::Get, V8::Conversion::ClassActions::Set)
- prototype.SetIndexedPropertyHandler(V8::Conversion::ClassActions::IGet, V8::Conversion::ClassActions::ISet)
+ prototype.SetNamedPropertyHandler(V8::Conversion::Get, V8::Conversion::Set)
+ prototype.SetIndexedPropertyHandler(V8::Conversion::IGet, V8::Conversion::ISet)
if self != ::Object && superclass != ::Object && superclass != ::Class
template.Inherit(superclass.to_template)
end
template
end
- end
+ end
end
- module ClassActions
- class Constructor
- include V8::Error::Protect
+ class Constructor
+ include V8::Error::Protect
- def initialize(cls)
- @class = cls
- end
+ def initialize(cls)
+ @class = cls
+ end
- def call(arguments)
- arguments.extend Args
- protect do
- if arguments.linkage_call?
- arguments.link
- else
- arguments.construct @class
- end
+ def call(arguments)
+ arguments.extend Args
+ protect do
+ if arguments.linkage_call?
+ arguments.link
+ else
+ arguments.construct @class
end
- return arguments.This()
end
+ return arguments.This()
+ end
- module Args
- def linkage_call?
- self.Length() == 1 && self[0].IsExternal()
- end
+ module Args
+ def linkage_call?
+ self.Length() == 1 && self[0].IsExternal()
+ end
- def link
- external = self[0]
- This().SetHiddenValue("rr::implementation", external)
- context.link external.Value(), This()
- end
+ def link
+ external = self[0]
+ This().SetHiddenValue("rr::implementation", external)
+ context.link external.Value(), This()
+ end
- def construct(cls)
- context.link cls.new(*to_args), This()
- end
+ def construct(cls)
+ context.link cls.new(*to_args), This()
+ end
- def context
- V8::Context.current
- end
+ def context
+ V8::Context.current
+ end
- def to_args
- args = ::Array.new(Length())
- 0.upto(args.length - 1) do |i|
- args[i] = self[i]
- end
- return args
+ def to_args
+ args = ::Array.new(Length())
+ 0.upto(args.length - 1) do |i|
+ args[i] = self[i]
end
+ return args
end
end
+ end
- module Accessor
- include V8::Error::Protect
- def intercept(info, key, &block)
- context = V8::Context.current
- access = context.access
- object = context.to_ruby(info.This())
- handles_property = true
- dontintercept = proc do
- handles_property = false
- end
- protect do
- result = block.call(context, access, object, context.to_ruby(key), dontintercept)
- handles_property ? context.to_v8(result) : V8::C::Value::Empty
- end
+ module Accessor
+ include V8::Error::Protect
+ def intercept(info, key, &block)
+ context = V8::Context.current
+ access = context.access
+ object = context.to_ruby(info.This())
+ handles_property = true
+ dontintercept = proc do
+ handles_property = false
+ end
+ protect do
+ result = block.call(context, access, object, context.to_ruby(key), dontintercept)
+ handles_property ? context.to_v8(result) : V8::C::Value::Empty
end
end
+ end
- class Get
- extend Accessor
- def self.call(property, info)
- intercept(info, property) do |context, access, object, key, dontintercept|
- access.get(object, key, &dontintercept)
- end
+ class Get
+ extend Accessor
+ def self.call(property, info)
+ intercept(info, property) do |context, access, object, key, dontintercept|
+ access.get(object, key, &dontintercept)
end
end
+ end
- class Set
- extend Accessor
- def self.call(property, value, info)
- intercept(info, property) do |context, access, object, key, dontintercept|
- access.set(object, key, context.to_ruby(value), &dontintercept)
- end
+ class Set
+ extend Accessor
+ def self.call(property, value, info)
+ intercept(info, property) do |context, access, object, key, dontintercept|
+ access.set(object, key, context.to_ruby(value), &dontintercept)
end
end
+ end
- class IGet
- extend Accessor
- def self.call(property, info)
- intercept(info, property) do |context, access, object, key, dontintercept|
- access.iget(object, key, &dontintercept)
- end
+ class IGet
+ extend Accessor
+ def self.call(property, info)
+ intercept(info, property) do |context, access, object, key, dontintercept|
+ access.iget(object, key, &dontintercept)
end
end
+ end
- class ISet
- extend Accessor
- def self.call(property, value, info)
- intercept(info, property) do |context, access, object, key, dontintercept|
- access.iset(object, key, context.to_ruby(value), &dontintercept)
- end
+ class ISet
+ extend Accessor
+ def self.call(property, value, info)
+ intercept(info, property) do |context, access, object, key, dontintercept|
+ access.iset(object, key, context.to_ruby(value), &dontintercept)
end
end
end
View
21 spec/class_scope_spec.rb
@@ -1,21 +0,0 @@
-require 'spec_helper'
-
-# NOTE: This was written to reproduce a bug where V8::Conversion would load the wrong class
-# when inside of an eigen class scope.
-
-# We use Set because ::Set is a existing class and V8::Conversion::Class::Set also exists
-require "set"
-
-describe "Class scope" do
- it "doesn't try to use V8::Conversion::Class::* as root objects" do
- klass = Class.new do
- class << self
- def test
- Set.new
- end
- end
- end
-
- klass.test.should be_instance_of(::Set)
- end
-end
View
12 spec/v8/conversion_spec.rb
@@ -6,4 +6,16 @@
cxt['big'] = BigDecimal.new('1.1')
cxt['big'].should eql BigDecimal.new('1.1')
end
+
+ it "doesn't try to use V8::Conversion::Class::* as root objects" do
+ klass = Class.new do
+ class << self
+ def test
+ Set.new
+ end
+ end
+ end
+
+ klass.test.should be_instance_of(::Set)
+ end
end

0 comments on commit c5b13ea

Please sign in to comment.
Something went wrong with that request. Please try again.