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.

Reply via email to