Skip to content
This repository has been archived by the owner on Dec 4, 2023. It is now read-only.

Commit

Permalink
Move Get,Set,Constructor and friends out of Class
Browse files Browse the repository at this point in the history
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
cowboyd committed Jul 24, 2012
1 parent 7f3a8cb commit c5b13ea
Show file tree
Hide file tree
Showing 3 changed files with 88 additions and 99 deletions.
154 changes: 76 additions & 78 deletions lib/v8/conversion/class.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
21 changes: 0 additions & 21 deletions spec/class_scope_spec.rb

This file was deleted.

12 changes: 12 additions & 0 deletions spec/v8/conversion_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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.