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