Tag: v8

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: […]

为什么“readFile”使用比读取文件的内容长度更多的内存?

我有一个约300.000的日志文件在其中的path。 当我使用“readFile”方法读取所有这些文件时,我注意到内存消耗(泄漏)。 这里是一个NodeJS代码的例子: var fs = require('fs'); var path = './parseLogFiles/reports'; var counter = 0; var totalFileSize = 0; var fileName; var fullPath; function toMb (byteVal) { return (byteVal / 1048576).toFixed(2); } var filesList = fs.readdirSync(path); console.log('Memory usage before files read:', toMb(process.memoryUsage()['heapUsed']) + ' MB'); for (var i = 0, len = filesList.length; i < […]

JavaScript引擎启用脚本支持/应用程序自动化

我打算将JavaScript作为我们应用程序的脚本语言,目前我们正在使用VBScript和Microsoft VB脚本引擎 。 通过公开的API,脚本范围被用于应用程序自动化,并且脚本执行可以是按需,基于时间,基于条件或基于事件的。 为了对我的应用程序启用JavaScript支持,我有一个入围的Google V8引擎,但有人build议使用Node.js而不是Google V8 。 众所周知Node.js也支持Google V8 ,而Node.js的主要用途是创buildnetworking应用程序。 根据上述情况,上述哪个选项( Google V8或Node.js )将是最佳select。 select参数是: 履行 积分 框架复杂性 性能 保养

如何从NanAsyncWorker返回一个新的对象?

我正在做一个node.js / io.js本地插件,我需要从asynchronouscallback中创build一个新的本地对象。 使用南帮助者,我有这样的东西: class MyObject : public node::ObjectWrap { /* definition */ }; class MyWorker : public NanAsyncWorker { bool varForMyObject; virtual void Execute() {/* do stuff and sets varForMyObject */} virtual void HandleOKCallback() { NanScope(); MyObject* obj = new MyObject(varForMyObject); Local<Value> argv[] = { NanNull(), obj // ??? }; callback->Call(2, argv); } }; […]

在void *中为Node.js插件检索和存储V8对象

我试图存储从JavaScript传递到Node.js插件在void * 。 我似乎无法得到这个编译; 用node-gyp构build会产生error: no matching function for call to 'Cast' 。 我试图做的长版本是编写一个运行Csound的Node.js插件。 Csound从鸟瞰的angular度出发,用C函数作为(通常)第一个参数,将一个指向不透明的Csound结构的指针。 这个结构包含一个void *到“ hostData ”,由一个托pipeCsound的程序设置的任意数据。 Csound所做的一些事情,比如发布消息,在这种情况下用callback函数指针进行修改。 我需要一个地方为Csound的每个实例存储callback,所以我想让某人从JavaScript设置hostData到一个对象,但是我也想把Csound实例的callback设置为这个hostData对象的隐藏属性 。 我认为代码将需要看起来像 #include "csound.h" #include <node.h> static void CsoundMessageCallback(CSOUND *Csound, int attributes, const char *format, va_list valist) { // Call the JavaScript function we stored in the hostData of Csound. } static void _wrap_csoundSetMessageCallback( […]

V8 / JS运行时:JavaScript窗口函数如何在没有前缀“window”的情况下使用

我不太了解JS控制台,但是我正在进入命令行编程,在开始使用外部程序的shell / node之前,最好先了解我的本地环境 我的猜测是所有的命令行语句都是with (window) eval(/* whatever user typed before hitting enter/*)来调用的with (window) eval(/* whatever user typed before hitting enter/*)但是这看起来很糟糕。 上下文肯定绑定为“窗口”,如果我console.log(this)但我不知道为什么/如何 这几乎就像用户cd到窗口对象中,将其设置为上下文

如何更新我的function以使用新的v8 FunctionTemplates?

我有一些使用V8 FunctionTemplates的代码。 它是一个较老的Node.js模块的一部分,充当一个C ++库的包装器。 void NNet::PrototypeInit(Local<FunctionTemplate> t) { … t->InstanceTemplate()->SetAccessor(Nan::New<String>("training_algorithm").ToLocalChecked(), GetTrainingAlgorithm, SetTrainingAlgorithm); t->InstanceTemplate()->SetAccessor(Nan::New<String>("learning_rate").ToLocalChecked(), GetLearningRate, SetLearningRate); t->InstanceTemplate()->SetAccessor(Nan::New<String>("learning_momentum").ToLocalChecked(), GetLearningMomentum, SetLearningMomentum); t->InstanceTemplate()->SetAccessor(Nan::New<String>("layers").ToLocalChecked(), GetLayerArray); } 但是,当代码运行时,编译器会提供这些错误。 In static member function 'static void NNet::PrototypeInit(v8::Local<v8::FunctionTemplate>)': error: invalid conversion from 'Nan::NAN_GETTER_RETURN_TYPE (*)(v8::Local<v8::String>, Nan::NAN_GETTER_ARGS_TYPE) {aka void (*)(v8::Local<v8::String>, const Nan::PropertyCallbackInfo<v8::Value>&)}' to 'v8::AccessorGetterCallback {aka void (*)(v8::Local<v8::String>, const v8::PropertyCallbackInfo<v8::Value>&)}' [-fpermissive] t->InstanceTemplate()->SetAccessor(Nan::New<String>("training_algorithm").ToLocalChecked(), GetTrainingAlgorithm, SetTrainingAlgorithm); ^ error: initializing […]

将参数添加到“参数”数组对象,性能testing

你好,我做了一些简单的testing:更好的方式添加参数在javascript中的数组类似的对象: 这表明使用Array.prototype.push.call比Chrome慢3倍左右,为什么? http://jsfiddle.net/vhrs56nm/ function test() { Array.prototype.push.call(arguments, 123); } function test2() { arguments[arguments.length] = 123; arguments.length++; } console.time("test1"); for ( var i=0; i<1000000; i++ ) { test(1,2,3); } console.timeEnd("test1"); console.time("test2"); for ( var i=0; i<1000000; i++ ) { test2(1,2,3); } console.timeEnd("test2");

Native Node.JS模块 – 从参数中parsingint

我正在尝试编写一个本地C ++模块来包含在一个Node.js项目中 – 我遵循这里的指南,并且设置得非常好。 总的想法是,我想要传递一个整数数组到我的C ++模块进行sorting; 该模块然后返回sorting的数组。 但是,我不能编译使用node-gyp build因为我遇到以下错误: 错误:没有可行的从“本地”转换为“int *” 它在我的C ++中抱怨这个代码: void Method(const FunctionCallbackInfo<Value>& args) { Isolate* isolate = args.GetIsolate(); int* inputArray = args[0]; // <– ERROR! sort(inputArray, 0, sizeof(inputArray) – 1); args.GetReturnValue().Set(inputArray); } 这一切对我来说都是有意义的 – 编译器不能将arg[0] (大概是typesv8::Local )转换成int* 。 话虽如此,我似乎无法find任何方法让我的参数成功转换成一个C + +整数数组。 应该知道,我的C ++是相当生锈的,我对V8一无所知。 任何人都可以指向正确的方向吗?

节点NAN:在AsyncWorker的Execute方法中调用GetFromPersistent

我正在为节点构build一个本地扩展,其中包含一个完成时的callback函数。 我正在传递一个节点缓冲区到通话。 它包含要由扩展处理的内容的有效载荷。 我应该能够将我的缓冲区存储在我的AsyncWorker的构造函数中的持久性存储中,并在需要时稍后检索它。 这个例子(来自nantesting套件)是我通常基于我的代码: https : //github.com/nodejs/nan/blob/master/test/cpp/bufferworkerpersistent.cpp 这个testing是有效的,但是直到HandleOKCallback方法对缓冲区没有任何作用,这对我来说并不是很有趣。 我需要在Execute方法中访问缓冲区。 如果我只是在testing的Execute()方法中添加一行来尝试访问缓冲区,如下所示: void Execute () { printf("before GetFromPersistent\n"); v8::Local<v8::Value> handle = GetFromPersistent("buffer"); printf("after GetFromPersistent\n"); printf("buffer @%llux len %ld\n", (uint64_t)node::Buffer::Data(handle), node::Buffer::Length(handle)); Sleep(milliseconds); } 我在GetFromPersistent调用中遇到seg错误。 我的问题是:我错过了什么? 我应该不能将一个持久对象拖入Execute方法吗? 如果是这样,为什么不呢?