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