Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 访问持久性函数时V8崩溃_Javascript_V8 - Fatal编程技术网

Javascript 访问持久性函数时V8崩溃

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

有人知道为什么对持久函数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 > 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实例,以便
//可以使用适当的映射对象来存储回调地址
Handleself=info.Holder();
Handlewrap=Handle::强制转换(self->GetInternalField(0));
void*ptr=wrap->Value();
WebSocket*ws=静态_-cast(ptr);
如果(值->IsFunction()){
//在回调映射中存储持久函数句柄
句柄回调=句柄::强制转换(值);
ws->pfunc\U打开。重置(隔离、回调);
if(callback.IsEmpty())
{
LOGD(LOG_标记,“回调为空”);
}
//我们可能要报告连接错误
如果(!ws->m_connection_error.empty()&&std::string(*str).compare(“onfail”)==0)
{
ws->callEventCallback(事件失败,ws->m\U连接错误);
ws->m_连接_错误。清除();
}
}否则{
LOGE(LOG_标记,“SetOnOpen():无效参数类型-值不是函数”);
}

}

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");
}