My codebase is currently running on V8 3.30 in case it matters.
I'm writing a marshalling system to link JS function calls to native C++
code. As part of this system, I need to convert function arguments into
native C++ types. For the sake of example, lets say I'm implementing a
simple binding to C's "atan2" function.
double atan2(double y, double x);
So, an example v8::FunctionCallback for this case
void V8CallAtan2( const v8::FunctionCallbackInfo<v8::Value>& info )
{
v8::Isolate* isolate = info.GetIsolate();
// Not sure if this is required, since we must be in an isolate
scope already to be getting called from script
v8::Isolate::Scope isolateScope(isolate);
// Don't hold onto Local handles allocated by this function
v8::Handle::Scope handleScope(isolate);
// Some simple checks that we're not being stupid
if(info.IsConstructCall())
{
isolate->ThrowException( v8::String::NewFromUtf8( isolate,
"Called 'atan2' as a constructor" ) );
return;
}
if(info.Length() != 2)
{
isolate->ThrowException( v8::String::NewFromUtf8( isolate,
"Called 'atan2' with incorrect number of arguments." ) );
return;
}
// Extract arguments from the call
v8::Local<v8::Value> yVal = info[0];
v8::Local<v8::Value> xVal = info[1];
// Marshal into native C++ types
double y = yVal->NumberValue(); // HERE1
double x = xVal->NumberValue(); // HERE2
// Call native function
double result = atan2(y,x);
// Marshal return value back into a JS type
v8::Local<v8::Value> resultVal = v8::Number::New(isolate, result);
// and return it to the caller
info.GetReturnValue().Set( resultVal );
}
>From reading the source code to NumberValue() it looks like this call could
potentially throw a JS exception, which makes sense--the arguments could be
of some type that isn't convertible to double. So, if the line at HERE1
throws a JS exception, if my understanding of ThrowException is correct,
I'm not allowed to do any further JS operations (including calling
NumberValue() at HERE2), and instead need to immediately return control to
v8 by returning from my callback -- as I do in the sanity checks before
reading the arguments.
But I haven't been able to find a way to ask the Isoalte if there is a
pending exception, at least not in the public API. How do I detect this
case?
I noticed that newer versions of v8 have Value::NumberValue() return
Maybe<double> instead, and I'm considering pushing a v8 upgrade for that
reason. But first I want to know if there's a fix without impacting the
other users on my team.
Thanks!
-- ryan
--
--
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.