I was not aware it was possible or supported to have an internal field  
for a global object. Out of curiosity, what are you trying to do with  
that functionality?


Alex

On Mar 27, 2009, at 1:38 PM, [email protected] wrote:

>
> Hi All!
>
> I have so many troubles using the global object thing. I am unable to
> correctly attach an underlying object to it. I've seeked this group
> for the first error that came up which was that eventhough when making
> a SetInternalFieldCount(1) on the global object template, it'll be
> lost when trying to access the global object instance. I've fixed this
> in the api.cc where the global object is cloned, however now I have
> updated to the latest trunk from version 0.4.9 to version 1.1.3 and
> this error doesn't have been fixed so how is one supposed to attach  
> a c
> ++ object instance to the global object at all?
>
> Anyway, I can fix it again however I still have one big issue I can't
> get resolved. I am accessing the c++ object class using the .Holder()
> info. Works like a charm with functions but doing the same with a
> property accessor, I get a fatal error that external::cast failed..
> seems because the holder object is not a Proxy but why!?
> Here's some code:
>
> Handle<Value> TestAccessorGetter(Local<String> property,
>                        const AccessorInfo &info) {
>  Local<Object> self = info.Holder();
>  Local<External> wrap = Local<External>::Cast(self->GetInternalField
> (0));
>  void* ptr = wrap->Value();
>
>  return Integer::New(123);
> }
>
>
> Handle<Value> TestFunction(const Arguments& args)
> {
>  Local<Object> self = args.Holder();
>  Local<External> wrap = Local<External>::Cast(self->GetInternalField
> (0));
>  void* ptr = wrap->Value();
>
>  return Integer::New(123);
> }
>
>
> int main()
> {
>  // Create a stack-allocated handle scope.
>  HandleScope handle_scope;
>
>  TestClass* testClass = new TestClass();
>
>  Handle<ObjectTemplate> global = ObjectTemplate::New();
>  global->SetAccessor(String::New("TestAccessor"),
> TestAccessorGetter);
>  global->Set(String::New("TestFunc"), FunctionTemplate::New
> (TestFunction));
>  global->SetInternalFieldCount(1);
>
>  // Create a new context.
>  Persistent<Context> context = Context::New(NULL, global);
>
>  // Enter the created context for compiling and
>  // running the hello world script.
>  Context::Scope context_scope(context);
>
>  Handle<Object> globalObj = context->Global();
>  globalObj->SetInternalField(0, External::New(testClass));
>
>  // Create a string containing the JavaScript source code.
>  Handle<String> source = String::New("TestFunc(); TestAccessor;");
>
>  // Compile the source code.
>  Handle<Script> script = Script::Compile(source);
>
>  // Run the script to get the result.
>  script->Run();
>
>  // Dispose the persistent context.
>  context.Dispose();
> }
>
> --> Call to TestFunction works perfectly. But the next call to
> TestAccessor throws within Local<External> wrap =  
> Local<External>::Cast
> (self->GetInternalField(0));...
>
> please, anyone?
>
> thanks _a lot_ as I've been spending days now to get this figured :(
>
> Alex
> >

Alex Iskander, TPSi






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

Reply via email to