I don't think you're using the FunctionTemplate correctly.  See [0].

[0] https://code.google.com/p/v8/source/browse/trunk/include/v8.h#3572

On Tue, Oct 28, 2014 at 11:41 PM, Jane Chen <[email protected]> wrote:
> Found FunctionTemplate::HasInstance().  Please let me know if there's a
> better way to do it.
>
> On Tuesday, October 21, 2014 8:03:40 PM UTC-7, Jane Chen wrote:
>>
>> I'm using 3.24.
>>
>> I create a FunctionTemplate with my own callback function for toString:
>>
>>   v8::Local<v8::FunctionTemplate> result =
>>     v8::FunctionTemplate::New(isolate,valueCstor);
>>   result->SetClassName(className);
>>   result->InstanceTemplate()->SetInternalFieldCount(VALUE_TEMP_ID_COUNT);
>>   result->PrototypeTemplate()->Set(
>>     v8::String::NewFromUtf8(isolate, "toString"),
>>     v8::FunctionTemplate::New(isolate, valueToString));
>>
>> Everything works fine with functions created through the above, except
>> when I try to get the prototype of it:
>>
>> var v = new Value();
>> v.__proto__;
>>
>> Removing the highlighted lines fixes the issue.
>>
>> Here's the stack:
>>
>> Stacktrace (dead0000-dead0001) 0x3cc891104221 0x3cc891104149:
>> ==== JS stack trace =========================================
>>
>> Security context: 0x1fa4ac285451 <JS Object>#0#
>>     1: DefaultNumber [native runtime.js:381] (this=0x1fa4ac263541 <JS
>> Object>#1#,a=0x3cc891104221 <Map(elements=0)>#2#)
>>     2: ToNumber(aka ToNumber) [native runtime.js:317] (this=0x1fa4ac204121
>> <undefined>,a=0x3cc891104221 <Map(elements=0)>#2#)
>>     3: ToInteger [native runtime.js:357] (this=0x1fa4ac285561 <JS Global
>> Object>#3#,a=0x3cc891104221 <Map(elements=0)>#2#)
>>     7: DefaultString [native runtime.js:396] (this=0x1fa4ac263541 <JS
>> Object>#1#,a=0xb357401bcf9 <JS Object>#4#)
>>     8: ToString [native runtime.js:334] (this=0x1fa4ac285561 <JS Global
>> Object>#3#,a=0xb357401bcf9 <JS Object>#4#)
>>
>> ==== Details ================================================
>>
>> [1]: DefaultNumber [native runtime.js:381] (this=0x1fa4ac263541 <JS
>> Object>#1#,a=0x3cc891104221 <Map(elements=0)>#2#) {
>>   // stack-allocated locals
>>   var b = 0x1fa4ac204121 <undefined>
>>   var c = 0x1fa4ac204121 <undefined>
>>   var d = 0x1fa4ac204121 <undefined>
>>   var e = 0x1fa4ac204121 <undefined>
>>   // expression stack (top to bottom)
>>   [05] : 0x8824290ee39 <String[7]: valueOf>
>>   [04] : 0x3cc891104221 <Map(elements=0)>#2#
>> --------- s o u r c e   c o d e ---------
>> function DefaultNumber(a){?var
>> b=a.valueOf;?if((%_ClassOf(b)==='Function')){?var
>> c=%_CallFunction(a,b);?if(%IsPrimitive(c))return c;?}?var
>> d=a.toString;?if((%_ClassOf(d)==='Function')){?var
>> e=%_CallFunction(a,d);?if(%IsPrimitive(e))return e;?}?throw
>> %MakeTypeError('cannot_convert_to_primitive',[]);?}
>> -----------------------------------------
>> }
>>
>> [2]: ToNumber(aka ToNumber) [native runtime.js:317] (this=0x1fa4ac204121
>> <undefined>,a=0x3cc891104221 <Map(elements=0)>#2#) {
>>   // expression stack (top to bottom)
>>   [04] : 0x3cc891104221 <Map(elements=0)>#2#
>>   [03] : 0x1fa4ac263541 <JS Object>#1#
>>   [02] : 0x1fa4ac282c49 <JS Function DefaultNumber (SharedFunctionInfo
>> 0x1fa4ac21f9c1)>#5#
>>   [01] : 0x1fa4ac204121 <undefined>
>>   [00] : 0x1fa4ac273191 <JS Function ToNumber (SharedFunctionInfo
>> 0x1fa4ac21f161)>#6#
>> --------- s o u r c e   c o d e ---------
>> function ToNumber(a){?if((typeof(a)==='number'))return
>> a;?if((typeof(a)==='string')){?return
>> %_HasCachedArrayIndex(a)?%_GetCachedArrayIndex(a)?:%StringToNumber(a);?}?if((typeof(a)==='boolean'))return
>> a?1:0;?if((typeof(a)==='undefined'))return
>> $NaN;?if((typeof(a)==='symbol'))return
>> $NaN;?return((a===null))?0:ToNumber...
>>
>> -----------------------------------------
>> }
>>
>> [3]: ToInteger [native runtime.js:357] (this=0x1fa4ac285561 <JS Global
>> Object>#3#,a=0x3cc891104221 <Map(elements=0)>#2#) {
>>   // expression stack (top to bottom)
>>   [02] : 0x3cc891104221 <Map(elements=0)>#2#
>>   [01] : 0x1fa4ac204121 <undefined>
>>   [00] : 0x1fa4ac273191 <JS Function ToNumber (SharedFunctionInfo
>> 0x1fa4ac21f161)>#6#
>> --------- s o u r c e   c o d e ---------
>> function ToInteger(a){?if(%_IsSmi(a))return a;?return
>> %NumberToInteger(ToNumber(a));?}
>> -----------------------------------------
>> }
>>
>> [7]: DefaultString [native runtime.js:396] (this=0x1fa4ac263541 <JS
>> Object>#1#,a=0xb357401bcf9 <JS Object>#4#) {
>>   // stack-allocated locals
>>   var b = 0x1fa4ac287621 <JS Function toString (SharedFunctionInfo
>> 0x1fa4ac287591)>#7#
>>   var c = 0x1fa4ac204121 <undefined>
>>   var d = 0x1fa4ac204121 <undefined>
>>   var e = 0x1fa4ac204121 <undefined>
>>   // expression stack (top to bottom)
>>   [05] : 0x1fa4ac287621 <JS Function toString (SharedFunctionInfo
>> 0x1fa4ac287591)>#7#
>>   [04] : 0xb357401bcf9 <JS Object>#4#
>> --------- s o u r c e   c o d e ---------
>> function DefaultString(a){?var
>> b=a.toString;?if((%_ClassOf(b)==='Function')){?var
>> c=%_CallFunction(a,b);?if(%IsPrimitive(c))return c;?}?var
>> d=a.valueOf;?if((%_ClassOf(d)==='Function')){?var
>> e=%_CallFunction(a,d);?if(%IsPrimitive(e))return e;?}?throw
>> %MakeTypeError('cannot_convert_to_primitive',[]);?}
>> -----------------------------------------
>> }
>>
>> [8]: ToString [native runtime.js:334] (this=0x1fa4ac285561 <JS Global
>> Object>#3#,a=0xb357401bcf9 <JS Object>#4#) {
>>   // expression stack (top to bottom)
>>   [04] : 0xb357401bcf9 <JS Object>#4#
>>   [03] : 0x1fa4ac263541 <JS Object>#1#
>>   [02] : 0x1fa4ac279a39 <JS Function DefaultString (SharedFunctionInfo
>> 0x1fa4ac21fa51)>#8#
>>   [01] : 0x1fa4ac263541 <JS Object>#1#
>>   [00] : 0x1fa4ac26db11 <JS Function ToString (SharedFunctionInfo
>> 0x1fa4ac21f2d9)>#9#
>> --------- s o u r c e   c o d e ---------
>> function ToString(a){?if((typeof(a)==='string'))return
>> a;?if((typeof(a)==='number'))return
>> %_NumberToString(a);?if((typeof(a)==='boolean'))return
>> a?'true':'false';?if((typeof(a)==='undefined'))return'undefined';?return((a===null))?'null':%ToString(%DefaultString(a));?}
>> -----------------------------------------
>> }
>>
>> ==== Key         ============================================
>>
>>  #0# 0x1fa4ac285451: 0x1fa4ac285451 <JS Object>
>>  #1# 0x1fa4ac263541: 0x1fa4ac263541 <JS Object>
>>  #2# 0x3cc891104221: 0x3cc891104221 <Map(elements=0)>
>>  #3# 0x1fa4ac285561: 0x1fa4ac285561 <JS Global Object>
>>  #4# 0xb357401bcf9: 0xb357401bcf9 <JS Object>
>>  #5# 0x1fa4ac282c49: 0x1fa4ac282c49 <JS Function DefaultNumber
>> (SharedFunctionInfo 0x1fa4ac21f9c1)>
>>  #6# 0x1fa4ac273191: 0x1fa4ac273191 <JS Function ToNumber
>> (SharedFunctionInfo 0x1fa4ac21f161)>
>>  #7# 0x1fa4ac287621: 0x1fa4ac287621 <JS Function toString
>> (SharedFunctionInfo 0x1fa4ac287591)>
>>  #8# 0x1fa4ac279a39: 0x1fa4ac279a39 <JS Function DefaultString
>> (SharedFunctionInfo 0x1fa4ac21fa51)>
>>  #9# 0x1fa4ac26db11: 0x1fa4ac26db11 <JS Function ToString
>> (SharedFunctionInfo 0x1fa4ac21f2d9)>
>> =====================
>>
>> Questions:  Is this a bug or am I doing something wrong?  Anyway I can
>> work around it?
>>
>> Thanks,
>> Jane
>
> --
> --
> 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