More details: Stepping through HandleApiCallHelper and the constructor for
FunctionCallbackArguments, I get to this line:
values[T::kDataIndex] = data;
with data = 0x0baddeaf
which seems like a sentinel value for 'something went wrong'.
On Monday, May 16, 2016 at 3:22:34 PM UTC-7, Ryan Ingram wrote:
>
> What am I doing wrong here? Does FunctionTemplate only support primitives
> for callback data? (Its type should suggest that, if so...)
>
> I'm trying to register native functions to be called back in my embedder,
> but my function callback data is getting corrupted. I tried saving off the
> data passed to FunctionTemplate::New and I'm not getting the same data in
> my callback!
>
> Here's a code snippet:
>
> v8::Persistent<v8::Value> gDebugData;
>
> void RegisterTestFunction( v8::Handle<v8::String> name, v8::Isolate*
> isolate, v8::Context* context )
> {
> v8::Local<v8::Object> data = v8::Object::New(isolate); // In the
> actual code this is SomeFunctionTemplate->InstanceTemplate()->NewInstance()
> gDebugData.Reset(isolate, data); // save off pointer for debugging
>
> v8::Local<v8::FunctionTemplate> template =
> FunctionTemplate::New(isolate, &TestFunctionCallback, data);
> context->Enter();
> context->Global()->Set( name, template->GetFunction() );
> context->Exit();
> }
>
> void TestFunctionCallback(const v8::FunctionCallbackInfo<v8::Value>
> &arguments)
> {
> v8::Isolate* isolate = arguments.GetIsolate();
>
> // Let's get our context
> v8::Local<v8::Value> dataValue = arguments.Data();
> assert( dataValue->IsObject() ); // Fails??
>
> // Hmm, let's look at our original context variable...
> v8::Local<v8::Value> expectedDataValue = v8::Local<v8::Value>::New(
> isolate, gDebugData );
> assert( dataValue == expectedDataValue ); // Also fails...
>
> assert( expectedDataValue->IsObject() ); // The original pointer is
> still valid...
>
> // Lets find out what we are getting passed
> v8::TryCatch tryCatch;
>
> // This function crashes...
> v8::Local<v8::String> whatIsIt = dataValue->ToString();
>
> if(tryCatch.HasCaught() { tryCatch.ReThrow(); return; }
> }
>
> Crash callstack:
> 3eb50f46()
> 3eb483e1()
> 3eb2fa55()
> 3eb2b8ea()
> v8.dll!v8::internal::Invoke(bool is_construct,
> v8::internal::Handle<v8::internal::JSFunction> function,
> v8::internal::Handle<v8::internal::Object> receiver, int argc,
> v8::internal::Handle<v8::internal::Object> * args) Line 108 C++
> v8.dll!v8::internal::Execution::Call(v8::internal::Isolate * isolate,
> v8::internal::Handle<v8::internal::Object> callable,
> v8::internal::Handle<v8::internal::Object> receiver, int argc,
> v8::internal::Handle<v8::internal::Object> * argv, bool convert_receiver)
> Line 157 + 0x13 bytes C++
> v8.dll!v8::internal::Execution::ToString(v8::internal::Isolate *
> isolate, v8::internal::Handle<v8::internal::Object> obj) Line 517 + 0x95
> bytes C++
> v8.dll!v8::Value::ToString() Line 2594 + 0x9 bytes C++
>
> If I use "expectedDataValue" in my callback, everything works as desired.
> But that's not getting passed through to the FunctionCallbackInfo.
>
> I am on a relatively old version of v8 (3.30). Is there a way to tell
> what is inside of dataValue's handle more safely? In the debugger it has a
> pointer value, although it doesn't look particularly valid...
>
> dataValue
> v8::Handle<v8::Value> {val_=0x0023d608 }
> expectedDataValue
> v8::Handle<v8::Value> {val_=0x128daab0 }
> gDebugData
> v8::PersistentBase<v8::Value> {val_=0x128d6a90 }
>
--
--
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.