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 < v8-users@googlegroups.com> 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 > v8-users@googlegroups.com > 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 v8-users+unsubscr...@googlegroups.com. > 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 v8-users@googlegroups.com 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 v8-users+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.