On Tue, Sep 13, 2016 at 9:49 AM, Danny Dorfman <[email protected]> wrote:
> Here is a program that demonstrates this issue: (removing line #28
> eliminates the problem)
>
>   1 #include <iostream>
>   2 #include <string.h>
>   3 #include "v8/libplatform/libplatform.h"
>   4 #include "v8/v8.h"
>   5
>   6 class ArrayBufferAllocator : public v8::ArrayBuffer::Allocator {
>   7  public:
>   8   virtual void* Allocate(size_t length) {
>   9     void* data = AllocateUninitialized(length);
>  10     return data == NULL ? data : memset(data, 0, length);
>  11   }
>  12   virtual void* AllocateUninitialized(size_t length) { return
> malloc(length); }
>  13   virtual void Free(void* data, size_t) { free(data); }
>  14 };
>  15
>  16 void GetProperty(v8::Local<v8::String> property, const
> v8::PropertyCallbackInfo<v8::Value>& info)
>  17 {
>  18     v8::String::Utf8Value asciiprop(property);
>  19     std::cout << "GETTER: property=" << *asciiprop << std::endl;
>  20 }
>  21
>  22 void SetProperty(v8::Local<v8::String> property, v8::Local<v8::Value>
> value, const v8::PropertyCallbackInfo<v8::Value>& info)
>  23 {
>  24     v8::Isolate *isolate = info.GetIsolate();
>  25     v8::String::Utf8Value asciiproperty(property);
>  26     v8::String::Utf8Value asciivalue(value);
>  27     std::cout << "SETTER: property=" << *asciiproperty << ", value=" <<
> *asciivalue << std::endl;
>  28     std::cout << "SETTER: hash=" << info.This()->GetIdentityHash() <<
> std::endl;
>  29 }
>  30
>  31 int main(int argc, char* argv[])
>  32 {
>  33   // Initialize V8.
>  34   v8::V8::InitializeICU();
>  35   v8::V8::InitializeExternalStartupData(argv[0]);
>  36   v8::Platform* platform = v8::platform::CreateDefaultPlatform();
>  37   v8::V8::InitializePlatform(platform);
>  38   v8::V8::Initialize();
>  39
>  40   // Create a new Isolate and make it the current one.
>  41   ArrayBufferAllocator allocator;
>  42   v8::Isolate::CreateParams create_params;
>  43   create_params.array_buffer_allocator = &allocator;
>  44   v8::Isolate* isolate = v8::Isolate::New(create_params);
>  45   {
>  46     v8::Isolate::Scope isolate_scope(isolate);
>  47     v8::HandleScope handle_scope(isolate);
>  48     v8::Local<v8::ObjectTemplate> objectTemplate =
> v8::ObjectTemplate::New();
>  49     objectTemplate->SetNamedPropertyHandler(GetProperty,SetProperty);
>  50     v8::Local<v8::Context> ctx = v8::Context::New(isolate);
>  51     v8::Context::Scope context_scope(ctx);
> 52
>  53     // run tests
>  54     v8::Local<v8::String> fooStr = v8::String::NewFromUtf8(isolate,
> "foo");
>  55     v8::Local<v8::String> barStr = v8::String::NewFromUtf8(isolate,
> "bar");
>  56     v8::Local<v8::Object> obj = objectTemplate->NewInstance();
>  57     obj->Set(fooStr, barStr);
>  58   }
>  59
>  60   // Dispose the isolate and tear down V8.
>  61   isolate->Dispose();
>  62   v8::V8::Dispose();
>  63   v8::V8::ShutdownPlatform();
>  64   delete platform;
>  65   return 0;
>  66 }

I think you found a bug.

JSObject::GetOrCreateIdentityHash() computes the hash lazily and
caches it as a symbol property on the object but it looks up that
property with the OWN flag instead of OWN_SKIP_INTERCEPTOR.  That
looks incorrect because it means it's going to call your interceptor
again.

There is a debug check that verifies it's a data property but it's
skipped in release builds.  I'd file an issue if I were you.

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

Reply via email to