ForceSet worked in 3.24.  It is not working in 4.6.88.  So I do not have a 
way to override an accessor once it is set.

I am showing read and print for simplicity to demonstrate the issue using 
v8 shell.cc.  In my embedding app, before using accessors, creating a 
context used to take ~2.9ms; after, ~0.5ms.  Measured against 3.24.

On Saturday, October 31, 2015 at 3:56:50 PM UTC-7, Alex Kodat wrote
>
> Sorry, you're right -- I should have researched the history and behavior 
> of CreateDataProperty and DefineOwnProperty. And, in fact, it does appear 
> that they will not replace an exisiting object property. Given that, it 
> seems like you have no choice other than to use ForceSet (until 
> CreateDataProperty and DefineOwnProperty are fixed?).
>
> While I guess ForceSet was a little uncool in that it allowed replacing 
> even non-configurable (v8::DontDelete) properties, IMO CreateDataProperty 
> and DefineOwnProperty seem to go too far in the other direction.
>
> Just out of curiosity, were your examples of read and print used for 
> simplicity or are these really the functions you're lazily instantiating? 
> If the latter, is an accessor really that much cheaper to set up then just 
> adding the function right away as an object property? I can definitely see 
> using lazy instantiation for a function if it's a constructor and comes 
> along with a bunch of other stuff but if it's just a simple function, I 
> would think the FunctionTemplate::New()->GetFunction() isn't going to be 
> noticably slower than SetAccessor. Of course, you might be doing tricky 
> stuff like dynamically loading the functions or maybe compiling JavaScript 
> callbacks with your function or whatever, in which case lazy instantiation 
> would make perfect sense. 
>
> On Saturday, October 31, 2015 at 11:03:10 AM UTC-7, Jane Chen wrote:
>>
>> Yes, the first time the property is accessed, it gets the correct native 
>> function.  In my accessor before I return, I have:
>>
>>     global->SetAccessor(context,property,0); 
>>     global->CreateDataProperty(context,property,obj);
>>
>> Then the property becomes undefined the second time on.
>>
>> On Saturday, October 31, 2015 at 10:04:24 AM UTC-7, Alex Kodat wrote:
>>>
>>> CreateDataProperty or DefineOwnProperty should work. Of course, you have 
>>> to make sure that the first time the function is accessed via the accessor 
>>> when you do your override, you have to return the function from the 
>>> accessor. But I assume you're doing that?
>>>
>>> On Friday, October 30, 2015 at 3:03:27 PM UTC-7, Jane Chen wrote:
>>>>
>>>> Is there anyway to use something like CreateDataProperty to override 
>>>> the accessor so that the actual function is associated with the property, 
>>>> albeit lazily created?
>>>>
>>>> I tried to use CreateDataProperty in place of ForceSet, since ForceSet 
>>>> is deprecated, but that didn't do it, and my property becomes undefined.
>>>>
>>>> On Friday, October 30, 2015 at 2:12:12 AM UTC-7, Jakob Kummerow wrote:
>>>>>
>>>>> Well, the profile tells you which function was executed. It doesn't 
>>>>> know or care what name you used to refer to this function -- it can't, as 
>>>>> it's a sampling profiler. Pure-JS example:
>>>>>
>>>>> function f() { /* long-running stuff */ }
>>>>> var g = f;
>>>>> g();  // Shows up as "f" in the profile.
>>>>>
>>>>> In your example, the function is a C++ object, so it doesn't even have 
>>>>> a name, so V8 tries to infer a name that it hopes is meaningful to a 
>>>>> human 
>>>>> reader. The point is that for a single function, it can only infer a 
>>>>> single 
>>>>> name.
>>>>>
>>>>> I think this is working as intended.
>>>>>
>>>>> On Thu, Oct 29, 2015 at 11:57 PM, Jane Chen <[email protected]> wrote:
>>>>>
>>>>>> A test case to demonstrate the issue can be found at:
>>>>>>
>>>>>> https://code.google.com/p/v8/issues/detail?id=4527
>>>>>>
>>>>>>
>>>>>> On Thursday, October 29, 2015 at 3:46:21 PM UTC-7, Jane Chen wrote:
>>>>>>>
>>>>>>> Testing profiling against v8 4.6.88.
>>>>>>>
>>>>>>> I have functions that are exposed through accessor callbacks.  If a 
>>>>>>> native function is set for multiple accessor properties, the last 
>>>>>>> property 
>>>>>>> shows up as the function name in the CpuProfileNode, regardless what 
>>>>>>> name 
>>>>>>> you set to the function returned by the accessor function.  For example:
>>>>>>>
>>>>>>> global->SetAccessor(
>>>>>>>     v8::String::NewFromUtf8(isolate, "print", 
>>>>>>> v8::NewStringType::kNormal)
>>>>>>>           .ToLocalChecked(),
>>>>>>>     getFunction);
>>>>>>> global->SetAccessor(
>>>>>>>     v8::String::NewFromUtf8(isolate, "read", 
>>>>>>> v8::NewStringType::kNormal)
>>>>>>>           .ToLocalChecked(),
>>>>>>>     getFunction);
>>>>>>>
>>>>>>> Now "get read" is the function name in CpuProfileNode although print 
>>>>>>> is called.
>>>>>>>
>>>>>>> Test script: 
>>>>>>>  
>>>>>>> function isPrime(num) { 
>>>>>>>   for (var count = 2; count < num; count++) 
>>>>>>>     if (num % count == 0) return false; 
>>>>>>>   return true; 
>>>>>>> }; 
>>>>>>>  
>>>>>>> var total = 0; 
>>>>>>> for (var i = 2; i < 100000; i++) { 
>>>>>>>   if (isPrime(i)) { 
>>>>>>>     print(i); 
>>>>>>>     total++ 
>>>>>>>   } 
>>>>>>> }; 
>>>>>>> total; 
>>>>>>>  
>>>>>>> TotalHitCount:2233
>>>>>>>
>>>>>>> FunctionName:(root)
>>>>>>> LineNumber:0
>>>>>>> ColumnNumber:0
>>>>>>> HitCount:0
>>>>>>>     FunctionName:(program)
>>>>>>>     LineNumber:0
>>>>>>>     ColumnNumber:0
>>>>>>>     HitCount:7
>>>>>>>     FunctionName:
>>>>>>>     LineNumber:0
>>>>>>>     ColumnNumber:0
>>>>>>>     HitCount:13
>>>>>>>         FunctionName:isPrime
>>>>>>>         LineNumber:1
>>>>>>>         ColumnNumber:17
>>>>>>>         HitCount:8
>>>>>>>     FunctionName:
>>>>>>>     LineNumber:1
>>>>>>>     ColumnNumber:1
>>>>>>>     HitCount:2196
>>>>>>>         FunctionName:get read
>>>>>>>         LineNumber:0
>>>>>>>         ColumnNumber:0
>>>>>>>         HitCount:2
>>>>>>>     FunctionName:(garbage collector)
>>>>>>>     LineNumber:0
>>>>>>>     ColumnNumber:0
>>>>>>>     HitCount:7
>>>>>>>
>>>>>>>
>>>>>>> Given that an accessor callback takes a property name, it should 
>>>>>>> allow one native function to handle multiple properties.  Is this a 
>>>>>>> bug, or 
>>>>>>> am I doing something wrong?  
>>>>>>>
>>>>>> -- 
>>>>>> -- 
>>>>>> 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