Never mind, that doesn't solve anything, just masks some of the problems.

On 2011-05-20, at 12:42 AM, Laurie Harper wrote:

> Added a comment to the gist with one possible work-around for the inheritance 
> issue:
> 
> https://gist.github.com/982157#gistcomment-31654
> 
> There must be a better way to deal with this though... Suggestions welcome.
> 
> L.
> 
> On 2011-05-19, at 9:34 PM, Laurie Harper wrote:
> 
>> I put all the code into a gist which can be downloaded, built and tested 
>> locally:
>> 
>> $ git clone git://gist.github.com/982157.git
>> $ cd 982157
>> $ node-waf configure build 
>> $ node VectorTests.js 
>> Vector is function Vector() { [native code] }
>> Vector.proto is [object Object]
>> v is { x: 1 }
>> v.x is  1
>> v is { x: 9 }
>> v.x is  9
>> Assertion failed: (handle->InternalFieldCount() > 0), function Wrap, file 
>> /Users/laurie/.nvm/v0.4.5/include/node/node_object_wrap.h, line 61.
>> Abort trap
>> 
>> L.
>> 
>> On 2011-05-19, at 8:22 PM, Laurie Harper wrote:
>> 
>>> Oops, there's a line missing from the JavaScript inheritance setup code; it 
>>> should read:
>>> 
>>> function f() {};  f.prototype = Vector.prototype;
>>> function g() { Vector.apply(this, arguments) } 
>>> g.prototype = new f();
>>> var v = new g(1,2,3); 
>>> 
>>> It's correct in my test suite, so my questions still stand...
>>> 
>>> On 2011-05-19, at 4:31 PM, Laurie Harper wrote:
>>> 
>>>> Hi, I posted these issues first to the Node mailing list as the errors I'm 
>>>> seeing are coming from assertions in Node's API, but they appear to be a 
>>>> direct result of how the v8 JavaScript <-> C++ bridge works, so I'm 
>>>> bringing them here for further clarification. I'll include the full 
>>>> stripped-down C++ code I'm testing with below.
>>>> 
>>>> So far I have two problems, both of which I think stem from the same 
>>>> underlying issue. The first is that if I set up accessors on the prototype 
>>>> of my c++ proxy I'm unable to unwrap the internal field object; switching 
>>>> from t->PrototypeTemplate()->SetAccessor() to 
>>>> t->InstanceTemplate()->SetAccessor() resolved the problem (see commented 
>>>> line in Initialize() in the code below. Strangely, setting a method on the 
>>>> prototype seems to work just fine. So, question: why does it not work to 
>>>> set an accessor on the prototype?
>>>> 
>>>> The second problem comes when I try to set up inheritance in JavaScript 
>>>> from an object defined in c++. I think I understand why this one fails, 
>>>> but have no idea how to fix it... I'm using test code like this, where 
>>>> Vector is defined in c++ as show below:
>>>> 
>>>> function f() {};  f.prototype = Vector.prototype;
>>>> function g() { Vector.apply(this, arguments) }
>>>> var v = new g(1,2,3);
>>>> 
>>>> That emulates a common pattern for inheritance in JavaScript to avoid 
>>>> calling the base type constructor when setting up the prototype of the 
>>>> inheriting class. I think the problem is that, since there is no explicit 
>>>> 'new Vector' anywhere, the c++ instantiation logic isn't fired at the 
>>>> right time. The result is that Arguments::This() returns an object of an 
>>>> unexpected type (?) and wrapping/unwrapping the proxied object fails. So, 
>>>> the question is how to adjust my code to work when a constructor is called 
>>>> without the 'new' operator I think?
>>>> 
>>>> Here's the test code I'm working with:
>>>> 
>>>> *** Vector.h:
>>>> 
>>>> class Vector: public node::ObjectWrap {
>>>> public:
>>>>  static Persistent<FunctionTemplate> ctor;
>>>>  static void Initialize(Handle<Object> target);
>>>> 
>>>>  static Handle<Value> GetX(Local<String> property, const AccessorInfo& 
>>>> info);
>>>>  static void SetX(Local<String> property, Local<Value> value, const 
>>>> AccessorInfo& info);
>>>> 
>>>> protected:
>>>>  static Handle<Value> New(const Arguments &args);
>>>>  Vector(btScalar &x, btScalar &y, btScalar &z);
>>>> 
>>>> private:
>>>>  btVector3* m_btVector3;
>>>> };
>>>> 
>>>> *** Vector.cc:
>>>> 
>>>> Persistent<FunctionTemplate> Vector::ctor;
>>>> 
>>>> void
>>>> Vector::Initialize(Handle<Object> target) {
>>>> HandleScope scope;
>>>> 
>>>> ctor = Persistent<FunctionTemplate>::New(FunctionTemplate::New(New));
>>>> ctor->InstanceTemplate()->SetInternalFieldCount(1);
>>>> ctor->SetClassName(String::NewSymbol("Vector"));
>>>> 
>>>> // ctor->PrototypeTemplate()->SetAccessor(String::NewSymbol("x"), GetX, 
>>>> SetX);
>>>> ctor->InstanceTemplate()->SetAccessor(String::NewSymbol("x"), GetX, SetX);
>>>> 
>>>> target->Set(String::NewSymbol("Vector"), ctor->GetFunction());
>>>> }
>>>> 
>>>> Handle<Value>
>>>> Vector::New(const Arguments &args) {
>>>> float x, y, z;
>>>> HandleScope scope;
>>>> 
>>>> if (args.Length() == 1 && args[0]->IsArray()) {
>>>> x = args[0]->ToObject()->Get(0)->NumberValue();
>>>> y = args[0]->ToObject()->Get(1)->NumberValue();
>>>> z = args[0]->ToObject()->Get(2)->NumberValue();
>>>> } else {
>>>> x = args[0]->IsNumber() ? args[0]->NumberValue() : 0;
>>>> y = args[1]->IsNumber() ? args[1]->NumberValue() : 0;
>>>> z = args[2]->IsNumber() ? args[2]->NumberValue() : 0;
>>>> }
>>>> 
>>>> Vector* obj = new Vector(x, y, z);
>>>> obj->Wrap(args.This());
>>>> return args.This();
>>>> }
>>>> 
>>>> Vector::Vector(btScalar &x, btScalar &y, btScalar &z) {
>>>> m_btVector3 = new btVector3(x, y, z);
>>>> }
>>>> 
>>>> Handle<Value> 
>>>> Vector::GetX(Local<String> property, const AccessorInfo& info) {
>>>> HandleScope scope;
>>>> // Vector* v = ObjectWrap::Unwrap<Vector>(info.This()); // This vs. Holder?
>>>> Vector* v = ObjectWrap::Unwrap<Vector>(info.Holder()); // This vs. Holder?
>>>> Local<Number> result = Number::New(v->m_btVector3->getX());
>>>> return scope.Close(result);
>>>> }
>>>> 
>>>> void
>>>> Vector::SetX(Local<String> property, Local<Value> value, const 
>>>> AccessorInfo& info) {
>>>> Vector* v = ObjectWrap::Unwrap<Vector>(info.Holder());
>>>> v->m_btVector3->setX(value->NumberValue());
>>>> }
>>>> 
>>>> -- 
>>>> Laurie Harper
>>>> http://laurie.holoweb.net/
>>>> 
>>>> -- 
>>>> v8-users mailing list
>>>> [email protected]
>>>> http://groups.google.com/group/v8-users
>>> 
>>> -- 
>>> Laurie Harper
>>> http://laurie.holoweb.net/
>>> 
>>> -- 
>>> v8-users mailing list
>>> [email protected]
>>> http://groups.google.com/group/v8-users
>> 
>> -- 
>> Laurie Harper
>> http://laurie.holoweb.net/
>> 
>> -- 
>> v8-users mailing list
>> [email protected]
>> http://groups.google.com/group/v8-users
> 
> -- 
> Laurie Harper
> http://laurie.holoweb.net/
> 
> 
> -- 
> v8-users mailing list
> [email protected]
> http://groups.google.com/group/v8-users

-- 
Laurie Harper
http://laurie.holoweb.net/

-- 
v8-users mailing list
[email protected]
http://groups.google.com/group/v8-users

Reply via email to