Oh I see, somehow I missed your CL link. Thanks! :)
-Kenton On Thu, Apr 20, 2017 at 12:09 PM, Toon Verwaest <[email protected]> wrote: > That's exactly why I'm fixing the problem :-) The fix was temporarily > reverted since there are tests in Blink for which the expectations change, > and that takes a while to sync; but you can try with the CL I linked above. > > On Thu, Apr 20, 2017 at 6:40 PM 'Kenton Varda' via v8-users < > [email protected]> wrote: > >> Thanks, but what if I don't control the scripts and can't force them to >> prefix global property access with "this."? >> >> -Kenton >> >> On Thu, Apr 20, 2017 at 1:39 AM, Toon Verwaest <[email protected]> >> wrote: >> >>> The problem is that since you're accessing the global property via >>> 'contextual access', we're passing out the global object rather than the >>> global proxy (see https://developer.mozilla.org/ >>> en-US/docs/Mozilla/Projects/SpiderMonkey/Split_object for background). >>> If you replace >>> >>> v8::Local<v8::String> source = >>> v8::String::NewFromUtf8(isolate, "func(); prop;", >>> v8::NewStringType::kNormal). >>> >>> with >>> >>> v8::Local<v8::String> source = >>> v8::String::NewFromUtf8(isolate, "func(); this.prop;", >>> v8::NewStringType::kNormal). >>> >>> it works. Changing it so it works as expected: >>> >>> https://chromium-review.googlesource.com/c/483199/ >>> >>> cheers, >>> Toon >>> >>> On Thu, Apr 20, 2017 at 3:14 AM kenton via v8-users < >>> [email protected]> wrote: >>> >>>> Hi, >>>> >>>> I'm trying to understand what I'm doing wrong here. >>>> >>>> I have created an ObjectTemplate for the global object which contains a >>>> method, a property, and an internal field. After creating the context, I >>>> use Global()->SetAlignedPointerInInternalField() to set a pointer on >>>> the object, then I call the function and read the property. >>>> >>>> In the function callback, I'm able to read the pointer from the >>>> internal field as expected. >>>> >>>> However, in the property callback, GetAlignedPointerInInternalField() >>>> crashes! >>>> >>>> InternalFieldCount(), though, still returns the actual number of >>>> internal fields I allocated. So it seems like it's *supposed* to be the >>>> right object. >>>> >>>> OTOH, GetIdentityHash() returns something that doesn't match >>>> context.Global()->GetIdentityHash(), whereas in the function callback >>>> these do match. >>>> >>>> I'm using v8 at commit 49d32849b3e67b1fa05f5f7aeea57dd83634adb9 (April >>>> 14). >>>> >>>> Sample code and output below. >>>> >>>> Surely people have created properties on the global object before, so I >>>> must be doing it wrong. What's the right way to do it? >>>> >>>> Thanks, >>>> -Kenton >>>> >>>> ================================== >>>> CODE >>>> ================================== >>>> >>>> #include <stdio.h> >>>> #include <stdlib.h> >>>> #include <string.h> >>>> >>>> #include <libplatform/libplatform.h> >>>> #include <v8.h> >>>> >>>> void funcCallback(const v8::FunctionCallbackInfo<v8::Value>& info) { >>>> printf("in func()\n"); >>>> printf(" this identity = %x\n", info.This()->GetIdentityHash()); >>>> printf(" holder identity = %x\n", info.Holder()->GetIdentityHash()); >>>> printf(" InternalFieldCount = %d\n", info.This()-> >>>> InternalFieldCount()); >>>> >>>> // This works fine. >>>> printf(" GetAlignedPointerFromInternalField(0) = %s\n", >>>> (const char*)info.This()->GetAlignedPointerFromInternalField(0)); >>>> } >>>> >>>> void propCallback(v8::Local<v8::Name>, const >>>> v8::PropertyCallbackInfo<v8::Value>& info) { >>>> printf("getting prop\n"); >>>> printf(" this identity = %x\n", info.This()->GetIdentityHash()); >>>> printf(" holder identity = %x\n", info.Holder()->GetIdentityHash()); >>>> printf(" InternalFieldCount = %d\n", info.This()-> >>>> InternalFieldCount()); >>>> >>>> // THIS CRASHES >>>> printf(" GetAlignedPointerFromInternalField(0) = %s\n", >>>> (const char*)info.This()->GetAlignedPointerFromInternalField(0)); >>>> } >>>> >>>> int main(int argc, char* argv[]) { >>>> // Initialize V8. >>>> v8::V8::SetFlagsFromCommandLine(&argc, argv, true); >>>> v8::V8::InitializeICUDefaultLocation(argv[0]); >>>> v8::V8::InitializeExternalStartupData(argv[0]); >>>> v8::Platform* platform = v8::platform::CreateDefaultPlatform(); >>>> v8::V8::InitializePlatform(platform); >>>> v8::V8::Initialize(); >>>> >>>> v8::Isolate::CreateParams create_params; >>>> create_params.array_buffer_allocator = >>>> v8::ArrayBuffer::Allocator::NewDefaultAllocator(); >>>> v8::Isolate* isolate = v8::Isolate::New(create_params); >>>> >>>> { >>>> v8::Isolate::Scope isolate_scope(isolate); >>>> v8::HandleScope handle_scope(isolate); >>>> >>>> // Create global ObjectTemplate. >>>> auto globalInstanceTmpl = v8::ObjectTemplate::New(isolate); >>>> globalInstanceTmpl->SetInternalFieldCount(123); >>>> globalInstanceTmpl->Set(isolate, "func", >>>> v8::FunctionTemplate::New(isolate, >>>> &funcCallback)); >>>> globalInstanceTmpl->SetAccessor( >>>> v8::String::NewFromUtf8(isolate, "prop", v8::NewStringType:: >>>> kInternalized).ToLocalChecked(), >>>> &propCallback); >>>> >>>> v8::Local<v8::Context> context = v8::Context::New(isolate, nullptr, >>>> globalInstanceTmpl); >>>> >>>> // Set internal field pointer on global. >>>> alignas(long long) const char TEXT[] = "internal-field-value"; >>>> context->Global()->SetAlignedPointerInInternalField(0, >>>> (void*)TEXT); >>>> printf("global identity = %x\n", context->Global()-> >>>> GetIdentityHash()); >>>> >>>> // Call func() then read prop. >>>> v8::Context::Scope context_scope(context); >>>> v8::Local<v8::String> source = >>>> v8::String::NewFromUtf8(isolate, "func(); prop;", >>>> v8::NewStringType::kNormal). >>>> ToLocalChecked(); >>>> v8::Local<v8::Script> script = v8::Script::Compile(context, >>>> source).ToLocalChecked(); >>>> (void)script->Run(context); >>>> } >>>> >>>> isolate->Dispose(); >>>> v8::V8::Dispose(); >>>> v8::V8::ShutdownPlatform(); >>>> delete platform; >>>> delete create_params.array_buffer_allocator; >>>> return 0; >>>> } >>>> >>>> ================================== >>>> OUTPUT >>>> ================================== >>>> >>>> global identity = 31be67ae >>>> in func() >>>> this identity = 31be67ae >>>> holder identity = 31be67ae >>>> InternalFieldCount = 123 >>>> GetAlignedPointerFromInternalField(0) = internal-field-value >>>> getting prop >>>> this identity = 56231851 >>>> holder identity = 56231851 >>>> InternalFieldCount = 123 >>>> >>>> # >>>> # Fatal error in v8::Object::GetAlignedPointerFromInternalField() >>>> # Not a Smi >>>> # >>>> >>>> Received signal 4 ILL_ILLOPN 7fac7e6bdde1 >>>> >>>> ==== C stack trace =============================== >>>> >>>> [0x7fac7e6bfe5e] >>>> [0x7fac7e6bfdb5] >>>> [0x7fac7baea0c0] >>>> [0x7fac7e6bdde1] >>>> [0x7fac7d10f38c] >>>> [0x7fac7d14f12f] >>>> [0x7fac7d11269e] >>>> [0x7fac7d133a8d] >>>> [0x000000401f23] >>>> [0x7fac7d9a2304] >>>> [0x7fac7da7095e] >>>> [0x7fac7da6f7c9] >>>> [0x7fac7d989d72] >>>> [0x7fac7d98ac53] >>>> [0x7fac7d995c91] >>>> [0x7fac7d995930] >>>> [0x35f10fd84264] >>>> [end of stack trace] >>>> Illegal instruction >>>> >>>> -- >>>> -- >>>> v8-users mailing list >>>> [email protected] >>>> http://groups.google.com/group/v8-users >>>> --- >>>> You received this message because you are subscribed to the Google >>>> Groups "v8-users" group. >>>> To unsubscribe from this group and stop receiving emails from it, send >>>> an email to [email protected]. >>>> For more options, visit https://groups.google.com/d/optout. >>>> >>> -- >>> >>> Toon Verwaest | Software Engineer, V8 | Google Germany GmbH | Erika-Mann >>> Str. 33, 80636 München >>> >>> Registergericht und -nummer: Hamburg, HRB 86891 | Sitz der >>> Gesellschaft: Hamburg | Geschäftsführer: Matthew Scott Sucherman, Paul >>> Terence Manicle >>> >> -- >>> -- >>> v8-users mailing list >>> [email protected] >>> http://groups.google.com/group/v8-users >>> --- >>> >> You received this message because you are subscribed to a topic in the >>> Google Groups "v8-users" group. >>> To unsubscribe from this topic, visit https://groups.google.com/d/ >>> topic/v8-users/RET5b3KOa5E/unsubscribe. >>> To unsubscribe from this group and all its topics, send an email to >>> [email protected]. >>> >> >>> For more options, visit https://groups.google.com/d/optout. >>> >> -- >> -- >> v8-users mailing list >> [email protected] >> http://groups.google.com/group/v8-users >> --- >> You received this message because you are subscribed to the Google Groups >> "v8-users" group. >> To unsubscribe from this group and stop receiving emails from it, send an >> email to [email protected]. >> For more options, visit https://groups.google.com/d/optout. >> > -- > > Toon Verwaest | Software Engineer, V8 | Google Germany GmbH | Erika-Mann > Str. 33, 80636 München > > Registergericht und -nummer: Hamburg, HRB 86891 | Sitz der Gesellschaft: > Hamburg | Geschäftsführer: Matthew Scott Sucherman, Paul Terence Manicle > > -- > -- > v8-users mailing list > [email protected] > http://groups.google.com/group/v8-users > --- > You received this message because you are subscribed to a topic in the > Google Groups "v8-users" group. > To unsubscribe from this topic, visit https://groups.google.com/d/ > topic/v8-users/RET5b3KOa5E/unsubscribe. > To unsubscribe from this group and all its topics, send an email to > [email protected]. > For more options, visit https://groups.google.com/d/optout. > -- -- v8-users mailing list [email protected] http://groups.google.com/group/v8-users --- You received this message because you are subscribed to the Google Groups "v8-users" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. For more options, visit https://groups.google.com/d/optout.
