Javascript 访问持久性函数时V8崩溃
有人知道为什么对持久函数pfunc_on_open的调用会崩溃吗Javascript 访问持久性函数时V8崩溃,javascript,v8,Javascript,V8,有人知道为什么对持久函数pfunc_on_open的调用会崩溃吗 Locker lock(isolate); HandleScope scope(isolate); v8::Local<v8::Context> context = v8::Local<v8::Context>::New(isolate, p_context); Context::Scope context_scope(context); Handle < v8::Object > globa
Locker lock(isolate);
HandleScope scope(isolate);
v8::Local<v8::Context> context = v8::Local<v8::Context>::New(isolate, p_context);
Context::Scope context_scope(context);
Handle < v8::Object > global = context->Global();
Handle < Value > args[1];
if (event.compare(event_onopen) == 0) {
args[0] = v8::String::NewFromUtf8(isolate,message.c_str());
v8::Local<v8::Function> processOnOpen = v8::Local<v8::Function>::New(isolate, pfunc_on_open);
processOnOpen->Call(global, 1, args);
}
锁柜锁(隔离);
手镜范围(隔离);
v8::Local context=v8::Local::New(隔离,p_context);
上下文::范围上下文\范围(上下文);
句柄global=context->global();
句柄<值>参数[1];
if(event.compare(event_onopen)==0){
args[0]=v8::String::NewFromUtf8(隔离,message.c_str());
v8::Local processOnOpen=v8::Local::New(隔离,pfunc打开);
processOnOpen->Call(全局,1,参数);
}
该函数通过以下代码与javascript方法关联:
void WebSocket::exposeWebSocket(Handle<ObjectTemplate> globalTemplate)
{
globalTemplate->Set(String::NewFromUtf8(isolate,"WebSocket"),
FunctionTemplate::New(isolate,WebSocketConstructor));}
void WebSocket::exposeWebSocket(句柄globalTemplate)
{
globalTemplate->Set(字符串::NewFromUtf8(隔离“WebSocket”),
FunctionTemplate::New(隔离,WebSocketConstructor));}
void WebSocketConstructor(const v8::FunctionCallbackInfo&args)
{
LOGD(LOG_标记,“在WebSocketConstructor()中”);
锁柜(隔离);
手镜范围(隔离);
Handle websocket_templ=ObjectTemplate::New();
websocket_templ->SetInternalFieldCount(1);
//对象方法
websocket_temp->Set(字符串::NewFromUtf8(隔离,“发送”),函数模板::New(隔离,websocket::公开的方法_发送));
websocket_temp->Set(字符串::NewFromUtf8(隔离,“关闭”),函数模板::New(隔离,websocket::公开的方法_关闭));
//将属性设置为事件处理程序
websocket_templ->SetAccessor(字符串::NewFromUtf8(隔离,“onopen”)、AccessorGetterCallback(websocket::GetOnCallback)、AccessorSetterCallback(websocket::SetOnOpen));
websocket_templ->SetAccessor(字符串::NewFromUtf8(隔离,“onmessage”)、AccessorGetterCallback(websocket::GetOnCallback)、AccessorSetterCallback(websocket::SetOnMessage));
websocket_templ->SetAccessor(字符串::NewFromUtf8(隔离,“onerror”)、AccessorGetterCallback(websocket::GetOnCallback)、AccessorSetterCallback(websocket::SetOnFail));
websocket_templ->SetAccessor(字符串::NewFromUtf8(隔离,“onclose”)、AccessorGetterCallback(websocket::GetOnCallback)、AccessorSetterCallback(websocket::SetOnClose));
处理ws_实例;
如果(!args[0].IsEmpty()&&args[0]->IsString()){
字符串::Utf8Value p1(args[0]->ToString());
LOGD(LOG_标记,“WebSocketConstructor()-URL=%s”,*p1);
/创建这种类型的C++实例
WebSocket*wsObject=新WebSocket(*p1);
//Handle self=Handle::New(隔离,args.Holder());
ws_instance=websocket_temp->NewInstance();
ws_instance->SetInternalField(0,v8::External::New(隔离,wsObject));
args.GetReturnValue().Set(ws_实例);
}
}
void WebSocket::SetOnOpen(本地属性、本地值、常量
v8::PropertyCallbackInfo&info){
锁柜锁(隔离);
手镜范围(隔离);
字符串::Utf8Value str(prop);
LOGD(LOG_标记,“SetOnOpen():属性=%s”,*str);
//检索与此回调关联的WebSocket实例,以便
//可以使用适当的映射对象来存储回调地址
Handle
}
LOGD(LOG_TAG, "In WebSocketConstructor()");
Locker lock(isolate);
HandleScope scope(isolate);
Handle<ObjectTemplate> websocket_templ= ObjectTemplate::New();
websocket_templ->SetInternalFieldCount(1);
// Object methods
websocket_templ->Set(String::NewFromUtf8(isolate,"send"), FunctionTemplate::New(isolate,WebSocket::exposed_method_send));
websocket_templ->Set(String::NewFromUtf8(isolate,"close"), FunctionTemplate::New(isolate,WebSocket::exposed_method_close));
// Set up properties as event handlers
websocket_templ->SetAccessor(String::NewFromUtf8(isolate,"onopen"), AccessorGetterCallback(WebSocket::GetOnCallback), AccessorSetterCallback(WebSocket::SetOnOpen));
websocket_templ->SetAccessor(String::NewFromUtf8(isolate,"onmessage"), AccessorGetterCallback(WebSocket::GetOnCallback), AccessorSetterCallback(WebSocket::SetOnMessage));
websocket_templ->SetAccessor(String::NewFromUtf8(isolate,"onerror"), AccessorGetterCallback(WebSocket::GetOnCallback), AccessorSetterCallback(WebSocket::SetOnFail));
websocket_templ->SetAccessor(String::NewFromUtf8(isolate,"onclose"), AccessorGetterCallback(WebSocket::GetOnCallback), AccessorSetterCallback(WebSocket::SetOnClose));
Handle<Object> ws_instance;
if (!args[0].IsEmpty() && args[0]->IsString()) {
String::Utf8Value p1(args[0]->ToString());
LOGD(LOG_TAG, "WebSocketConstructor() - URL = %s", *p1);
// Create a C++ instance of this type
WebSocket* wsObject = new WebSocket(*p1);
//Handle<Object> self = Handle<Object>::New(isolate, args.Holder() );
ws_instance = websocket_templ->NewInstance();
ws_instance->SetInternalField(0, v8::External::New(isolate, wsObject));
args.GetReturnValue().Set(ws_instance);
}
Locker lock(isolate);
HandleScope scope(isolate);
String::Utf8Value str(prop);
LOGD(LOG_TAG, "SetOnOpen(): property = %s", *str);
// Retrieve the WebSocket instance associated with this callback so the
// appropriate map object can be used to store the callback address
Handle < Object > self = info.Holder();
Handle < External > wrap = Handle < External > ::Cast(self->GetInternalField(0));
void* ptr = wrap->Value();
WebSocket* ws = static_cast<WebSocket*>(ptr);
if (value->IsFunction()) {
// Store a persistent function handle in the callback map
Handle<Function> callback = Handle<Function>::Cast(value);
ws->pfunc_on_open.Reset(isolate, callback);
if(callback.IsEmpty())
{
LOGD(LOG_TAG, "callback is null");
}
// We may have a connection error to report
if (!ws->m_connection_error.empty() && std::string(*str).compare("onfail") == 0)
{
ws->callEventCallback(event_onfail, ws->m_connection_error);
ws->m_connection_error.clear();
}
} else {
LOGE(LOG_TAG, "SetOnOpen(): invalid parameter type - value is not a function");
}