Okay, I think I have figured it out. The 2nd call goes to global object's 
prototype, and not the global object per se.

On Monday, May 16, 2016 at 4:54:52 PM UTC+3, Danny Dorfman wrote:
>
> Hello again,
>
> I'm trying to use v8::NativeWeakMap on the global object, and I'm getting 
> inconsistent results. It looks like "this" (on the outer scope)
> and just using plain variables (on the outer scope) get me to two 
> different places. How is that possible? Here is a sample program:
>
> #include <iostream>
> #include <string.h>
> #include "libplatform/libplatform.h"
> #include "v8/v8.h"
>
> void runit(v8::Isolate *isolate, const char *script_text)
> {
>   std::cout << "------------------------------------------" << std::endl;
>   std::cout << "/" << script_text << "/ <==" << std::endl;
>   v8::Local<v8::String> source = 
> v8::String::NewFromUtf8(isolate,script_text);
>   v8::Local<v8::Script> script = v8::Script::Compile(source);
>   v8::Local<v8::Value> result = script->Run();
>   v8::String::Utf8Value ascii(result);
>   std::cout << "/" << script_text << "/ ==> " << *ascii << std::endl;
> }
>
> v8::Persistent<v8::NativeWeakMap, 
> v8::CopyablePersistentTraits<v8::NativeWeakMap> > gWeakMap;
>
> void GetNamedAccessor(v8::Local<v8::Name> name, const 
> v8::PropertyCallbackInfo<v8::Value>& info)
> {
>   std::cout << "[" << std::hex << info.This()->GetIdentityHash() << "] 
> GetNamedAccessor, name=" << *v8::String::Utf8Value(name) << std::endl;
> }
>
> void SetNamedAccessor(v8::Local<v8::Name> name, v8::Local<v8::Value> 
> value, const v8::PropertyCallbackInfo<void>& info)
> {
>   std::cout << "[" << std::hex << info.This()->GetIdentityHash() << "] 
> SetNamedAccessor, name=" << *v8::String::Utf8Value(name)
>             << ", value=" << *v8::String::Utf8Value(value) << std::endl;
>   auto myWeakMap = 
> v8::Local<v8::NativeWeakMap>::New(info.GetIsolate(),gWeakMap);
>   v8::Local<v8::Value> val = myWeakMap->Get(info.This());
>   std::cout << "[ weak map holds " << *v8::String::Utf8Value(val) << " ]" 
> << std::endl;
> }
>
> class ArrayBufferAllocator : public v8::ArrayBuffer::Allocator {
>  public:
>   virtual void* Allocate(size_t length) {
>     std::cout << "!!! Allocate runs !!! length = " << length << std::endl;
>     void* data = AllocateUninitialized(length);
>     return data == NULL ? data : memset(data, 0, length);
>   }
>   virtual void* AllocateUninitialized(size_t length) { return 
> malloc(length); }
>   virtual void Free(void* data, size_t) { free(data); }
> };
>
> int main(int argc, char* argv[])
> {
>   // initialize v8
>   v8::V8::InitializeICU();
>   v8::V8::InitializeExternalStartupData(argv[0]);
>   v8::Platform* platform = v8::platform::CreateDefaultPlatform();
>   v8::V8::InitializePlatform(platform);
>   v8::V8::Initialize();
>   ArrayBufferAllocator allocator;
>   v8::Isolate::CreateParams create_params;
>   create_params.array_buffer_allocator = &allocator;
>   auto isolate = v8::Isolate::New(create_params);
>   v8::Isolate::Scope isolate_scope(isolate);
>   v8::HandleScope handle_scope(isolate);
>   auto context = v8::Context::New(isolate);
>   auto glob = context->Global();
>   v8::Context::Scope context_scope(context);
>
>   // set up the map
>   auto myWeakMap = v8::NativeWeakMap::New(isolate);
>   auto vvvStr = v8::String::NewFromUtf8(isolate,"vvv");
>   myWeakMap->Set(glob, vvvStr);
>   gWeakMap.Reset(isolate,myWeakMap);
>
>   // create accessor
>   auto onStr = v8::String::NewFromUtf8(isolate,"on");
>   glob->SetAccessor(onStr, GetNamedAccessor, SetNamedAccessor);
>
>   // do some testing
>   runit(isolate,"this.on = 1");
>   runit(isolate,"on = 2");
>   return 0;
> }
>
>
> When I run it, I get this output:
>
> ------------------------------------------
> /this.on = 1/ <==
> [37cec19f] SetNamedAccessor, name=on, value=1
> [ weak map holds vvv ]
> /this.on = 1/ ==> 1
> ------------------------------------------
> /on = 2/ <==
> [3c587822] SetNamedAccessor, name=on, value=2
> [ weak map holds undefined ]
> /on = 2/ ==> 2
>
>
> As you can see, the hash value for the second case is different, and 
> theNativeWeakMap doesn't work at all.
> Please note, that the named accessor works properly in both cases.
>
> Any ideas why this is happening?
>
>
> On Thursday, May 12, 2016 at 12:37:13 PM UTC+3, Jochen Eisinger wrote:
>>
>> You can e.g. create a v8::NativeWeakMap and map from the object to 
>> whatever private value you want to store on it.
>>
>> The map won't keep the object alive, but if it's GC'd, the entry is 
>> deleted automatically.
>>
>> On Wed, May 11, 2016 at 9:45 AM Danny Dorfman <[email protected]> 
>> wrote:
>>
>>> Hello Jochen,
>>>
>>> I tried caching the keys after creating them using ForApi(), and this is 
>>> somewhat faster.
>>> Still, I see that the GetPrivate/SetPrivate API's are considerably 
>>> slower than their Get/Set counterparts.
>>> What did you mean by maintaining a weak map? Can you please be more 
>>> specific?
>>>
>>> Thank you in advance.
>>>
>>>
>>> On Friday, May 6, 2016 at 9:58:38 AM UTC+3, Jochen Eisinger wrote:
>>>
>>>> You don't have to use ForApi() to create privates, you can create the 
>>>> once and then keep them around as keys.
>>>>
>>>> Another alternative is to maintain a weak map from the objects to your 
>>>> properties.
>>>>
>>>> On Thu, May 5, 2016 at 2:46 PM Danny Dorfman <[email protected]> 
>>>> wrote:
>>>>
>>> Hello there,
>>>>>
>>>>> I am looking for a time-efficient way to store private (hidden) values 
>>>>> in an object. I get key-value pairs
>>>>> (where key is of type v8::String and value of type v8::Value), and I 
>>>>> need to attach them to existing objects.
>>>>>
>>>>> What I came up with so far - is using v8::Object's SetPrivate() 
>>>>> function. The only problem with it, is that this method
>>>>> takes a v8::Private as its first argument. There is a costly 
>>>>> conversion between v8::String to v8::Private (using the ForApi method).
>>>>> Performance goes down, and after profiling with callgrind, I see that 
>>>>> ForApi is taking up too many cycles.
>>>>>
>>>>> Is there a quicker way to accomplish this? (I am running 4.9)
>>>>>
>>>>> Regards,
>>>>> Danny
>>>>>
>>>>> -- 
>>>>> -- 
>>>>> 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.
>>>>>
>>>> -- 
>>> -- 
>>> 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.
>>>
>>

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