Articles of embedded v8

节点插件和v8 GlobalTemplate

我正在构build节点插件与节点0.10.17并在我的一个类我正在做一个上下文的V8。 我有这个代码: v8::Locker locker; v8::HandleScope handle_scope; v8::Handle<v8::ObjectTemplate> globalTemplate; // vvv————— Exception here at ->Set() globalTemplate->Set(v8::String::New("version"), v8::FunctionTemplate::New(NodeVersion)); context = v8::Context::New(NULL, globalTemplate); if (context.IsEmpty()) { fprintf(stderr, "Error creating context\n"); } 这是给我例外->Set()函数调用。 应用程序正在打破。 我该怎么办 ?

运行V8 JavaScript引擎的示例代码时出错

尝试在链接1上运行代码时出现以下错误。请帮助如何解决此问题 链接1: https : //developers.google.com/v8/get_started#audience ————————————错误开始———— ————————– amit-macbook:v8 amit.sood$ g++ -Iinclude hello_world.cpp -o hello_world -Wl,–start-group out/x64.release/obj.target/{tools/gyp/libv8_{base,libbase.x64,snapshot},third_party/icu/libicu{uc,i18n,data}}.a -Wl,–end-group -lrt clang: error: no such file or directory: 'out/x64.release/obj.target/tools/gyp/libv8_base.a' clang: error: no such file or directory: 'out/x64.release/obj.target/tools/gyp/libv8_libbase.x64.a' clang: error: no such file or directory: 'out/x64.release/obj.target/tools/gyp/libv8_snapshot.a' clang: error: no such file or directory: 'out/x64.release/obj.target/third_party/icu/libicuuc.a' clang: error: no such file […]

在“callback”函数中无法访问V8上下文

我正在写一个NodeJS插件,我使用了一个C库,可以让你在某些事件中注册一个callback函数。 当callback被触发时,我想调用一个NodeJScallback函数。 问题是,在我的Ccallback函数中,当尝试执行与V8相关的任何操作时(例如创buildHandleScope),我会遇到分段错误。 在test.js中: … myaddon.register(function(data) { console.log("data: " + JSON.stringify(data)); }); … 在test.c中: #include <stdlib.h> #include <stdio.h> #include <string.h> #include <unistd.h> #include <node.h> #include <v8.h> using namespace v8; void WINAPI myEvent(int num, void * context) { HandleScope scope; // Segmentation fault here! Local<Function> * cb = (Local<Function>*)(context); Local<Object> obj = Object::New(); obj->Set(String::NewSymbol("id"), Number::New(num)); const […]

使用非ASCII字符从wchar_t创buildv8 :: String的安全方法是什么?

我正在为DAB开发板编写Node.js前端,后者最终将运行在Raspberry Pi上。 我是一个Java和Web开发人员,我正在努力与C ++和不同types的string之间转换。 DAB板带有一个C ++ SDK,有许多方便的function。 它允许我用GetTotalProgram()获得可用程序的数量。 对于每个程序,我可以调用GetProgramName来获取程序的名称: GetProgramName(char mode, long dabIndex, char namemode, wchar_t * programName) … mode意味着FM或DAB , namemode意味着长名或短名。 该程序的名称将在programName中返回。 为了将wchar_t *programName转换为v8::String ,我find了我正在使用的这个片段,并且理解了以下基本知识: wchar_t buff[300]; char cbuff[600]; GetProgramName(0, i, 1, buff); wcstombs( cbuff, buff, wcslen(buff) ); Local<String> str = String::NewFromUtf8(isolate, (const char *) cbuff, v8::String::kNormalString, wcslen(buff)); 我遍历可用的程序,并build立一个v8::Array : void GetPrograms(const FunctionCallbackInfo<Value>& args) […]

V8 Javascript引擎:v8 ::参数和函数模板

我包装了一个C ++标准库std::map<T1,T2> ,我想作为一个Node.JS插件公开。 我想要有两个函数,一个是为哈希表添加一个新的值,另一个是从地图上查找值。 我想要一个适用于“任意”types的函数。 这意味着Get必须从Args[0]提取typesT1值(请注意, Args是v8::Argumentstypes的)。 请参阅下面的代码。 template<typename T1, typename T2> class Hash : public node::ObjectWrap { public: static v8::Persistent<v8::FunctionTemplate> constructor; static void Init(v8::Handle<v8::Object> target); protected: /* … */ static v8::Handle<v8::Value> New(const v8::Arguments& Args); // new object static v8::Handle<v8::Value> Set(const v8::Arguments& Args); // set H[x]=y static v8::Handle<v8::Value> Get(const v8::Arguments& Args); // return H[x] private: […]

Google的v8引擎与C + + 11

可以V8(Google的开源JavaScript引擎)与C ++ 11一起使用吗?

node.js的v8扩展 – 无法将FunctionTemplate设置为目标

我刚刚开始通过v8扩展(根据Node.JS文档和v8 API文档的说明 )编写一个绑定到C库(准确地说是链接语法)。 我的问题是,我得到以下的生成错误: /usr/include/v8.h: In constructor âv8::Handle<T>::Handle(v8::Handle<S>) [with S = v8::FunctionTemplate, T = v8::Value]â: node.cc:85:68: instantiated from here /usr/include/v8.h:195:5: error: cannot convert âv8::FunctionTemplate*â to âv8::Value* volatileâ in assignment …当试图build立下面的代码: #include <v8.h> #include <locale.h> #include <stdio.h> #include <stdlib.h> #include "link-includes.h" using namespace v8; Dictionary dict; Parse_Options opts; static Handle<Value> v8parse(const Arguments& args) { /* snip […]

调用处理程序数据的垃圾回收

我试图提供数据给函数调用处理程序,但我无法正确地收集垃圾。 如果我注释掉包含“ tpl->SetCallHandler(callFn, external); ”的行,则调用ObjWeakCallback 。 该函数从来没有被收集,但(至lessFnWeakCallback从来没有被调用,不pipe是什么)。 请注意,静态数据不是一个选项,因为这需要准备好每个进程的多个隔离。 isolate->setData也不是一个选项。 我完全错过了什么吗? 在v8::Function存储数据的正确方法是什么? 编辑:让我重新说明这个问题,以更好地描述我的意图… 我想创build一个函数模板(因为我需要使用它作为JS端的构造函数)。 我需要一些方法来发送一个void *给它的调用处理程序,但是这个数据必须是垃圾回收。 关于我到目前为止一直在尝试的一些笔记: 使用Function::New(isolate, callHandler, External::New(isolate, data))工作,但不提供JS端构造函数的function(对于创build的对象不可能用SetInternalFieldCount) FunctionTemplate::New(isolate, callHandler, External::New(isolate, data))提供了将数据传递给调用处理程序的能力,但是从不被垃圾回收(下面的工作示例) 我尝试使用一个普通的函数,并返回一个新创build的Object ,但接下来的假设new Fn() instanceof Fn失败 #include <v8.h> #include <iostream> // made static, just to simplify the example and prevent crashes // the persistents would normally be wrapped inside a "baton" together […]

使指向已删除的C ++对象的句柄无效

当暴露给v8的C ++对象被删除时,我怎样才能使可能指向这个对象的句柄失效。 我正在使用v8作为一个更大的应用程序的脚本接口。 更大的应用程序中的对象在v8中使用节点的ObjectWrap类进行封装和访问。 问题是,包装对象的生命周期是有限的。 如果在JavaScript中,我执行如下所示: var win = app.getWindow(); win.close(); // The C++ object that win references goes away console.log(win.width()); // This should fail. 我希望它的行为就像评论说的那样。 在win.close()之后(或者其他一些事件也许在JS控制之外),任何对win或者duplicate处理的访问都需要失败。 目前,我必须将封装的C ++对象标记为无效,并检查每个方法调用的有效性。 这是做到这一点的唯一方法,还是有办法标记一个不再有效的句柄?

如何从C ++调用JavaScriptcallback

我试图从我的函数的另一个angular度调用V8中的callback。 所以这段代码注册callback: if (args.Length()) { String::Utf8Value event(args[0]->ToString()); if (event.length()) { Isolate* isolate = V8Interface::getCurrent()->getIsolate(); Locker locker(isolate); HandleScope scope(isolate); callback cb = callback(isolate, Local<Function>::Cast(args[1])); if(!events.count(*event)) { events[*event] = callbacks({ cb }); } else { events.find(*event)->second.push_back(cb); } } } 这个叫它: void trigger(std::string event) { Isolate* isolate = V8Interface::getCurrent()->getIsolate(); Locker locker(isolate); HandleScope scope(isolate); if(events.count(event)) { for(callback cb : […]