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 -~----------~----~----~----~------~----~------~--~---
