void ABPFilterParserWrap::Serialize(const FunctionCallbackInfo<Value>& args) { Isolate* isolate = args.GetIsolate(); ABPFilterParserWrap* obj = ObjectWrap::Unwrap<ABPFilterParserWrap>(args.Holder()); int totalSize = 0; // Serialize data char* data = obj->serialize(&totalSize); if (nullptr == data) { isolate->ThrowException(Exception::TypeError( String::NewFromUtf8(isolate, "Could not serialize"))); return; } MaybeLocal<Object> buffer = node::Buffer::New(isolate, totalSize); Local<Object> localBuffer; if (!buffer.ToLocal(&localBuffer)) { isolate->ThrowException(Exception::TypeError( String::NewFromUtf8(isolate, "Could not convert MaybeLocal to Local"))); return; } memcpy(node::Buffer::Data(localBuffer), data, totalSize); delete[] data; args.GetReturnValue().Set(localBuffer); }
/* static */ void V8Runtime::bootstrap(Local<Context> context) { Isolate* isolate = context->GetIsolate(); EventEmitter::initTemplate(context); Local<Object> kroll = Object::New(isolate); krollGlobalObject.Reset(isolate, kroll); Local<Array> mc = Array::New(isolate); moduleContexts.Reset(isolate, mc); KrollBindings::initFunctions(kroll, context); SetMethod(isolate, kroll, "log", krollLog); // Move this into the EventEmitter::initTemplate call? Local<FunctionTemplate> eect = Local<FunctionTemplate>::New(isolate, EventEmitter::constructorTemplate); { v8::TryCatch tryCatch(isolate); Local<Function> eventEmitterConstructor; MaybeLocal<Function> maybeEventEmitterConstructor = eect->GetFunction(context); if (!maybeEventEmitterConstructor.ToLocal(&eventEmitterConstructor)) { titanium::V8Util::fatalException(isolate, tryCatch); return; } kroll->Set(NEW_SYMBOL(isolate, "EventEmitter"), eventEmitterConstructor); } kroll->Set(NEW_SYMBOL(isolate, "runtime"), STRING_NEW(isolate, "v8")); kroll->Set(NEW_SYMBOL(isolate, "DBG"), v8::Boolean::New(isolate, V8Runtime::DBG)); kroll->Set(NEW_SYMBOL(isolate, "moduleContexts"), mc); LOG_TIMER(TAG, "Executing kroll.js"); TryCatch tryCatch(isolate); Local<Value> result = V8Util::executeString(isolate, KrollBindings::getMainSource(isolate), STRING_NEW(isolate, "ti:/kroll.js")); if (tryCatch.HasCaught()) { V8Util::reportException(isolate, tryCatch, true); } if (!result->IsFunction()) { LOGF(TAG, "kroll.js result is not a function"); V8Util::reportException(isolate, tryCatch, true); } // Add a reference to the global object Local<Object> global = context->Global(); // Expose the global object as a property on itself // (Allows you to set stuff on `global` from anywhere in JavaScript.) global->Set(NEW_SYMBOL(isolate, "global"), global); Local<Function> mainFunction = result.As<Function>(); Local<Value> args[] = { kroll }; mainFunction->Call(context, global, 1, args); if (tryCatch.HasCaught()) { V8Util::reportException(isolate, tryCatch, true); LOGE(TAG, "Caught exception while bootstrapping Kroll"); } }
/* * Class: org_appcelerator_kroll_runtime_v8_V8Runtime * Method: nativeRunModule * Signature: (Ljava/lang/String;Ljava/lang/String;)V */ JNIEXPORT void JNICALL Java_org_appcelerator_kroll_runtime_v8_V8Runtime_nativeRunModule (JNIEnv *env, jobject self, jstring source, jstring filename, jobject activityProxy) { HandleScope scope(V8Runtime::v8_isolate); titanium::JNIScope jniScope(env); Local<Context> context = V8Runtime::v8_isolate->GetCurrentContext(); if (V8Runtime::moduleObject.IsEmpty()) { Local<Object> module; { v8::TryCatch tryCatch(V8Runtime::v8_isolate); Local<Value> moduleValue; MaybeLocal<Value> maybeModule = V8Runtime::Global()->Get(context, STRING_NEW(V8Runtime::v8_isolate, "Module")); if (!maybeModule.ToLocal(&moduleValue)) { titanium::V8Util::fatalException(V8Runtime::v8_isolate, tryCatch); return; } module = moduleValue.As<Object>(); V8Runtime::moduleObject.Reset(V8Runtime::v8_isolate, module); } { v8::TryCatch tryCatch(V8Runtime::v8_isolate); Local<Value> runModule; MaybeLocal<Value> maybeRunModule = module->Get(context, STRING_NEW(V8Runtime::v8_isolate, "runModule")); if (!maybeRunModule.ToLocal(&runModule)) { titanium::V8Util::fatalException(V8Runtime::v8_isolate, tryCatch); return; } V8Runtime::runModuleFunction.Reset(V8Runtime::v8_isolate, runModule.As<Function>()); } } Local<Value> jsSource = TypeConverter::javaStringToJsString(V8Runtime::v8_isolate, env, source); Local<Value> jsFilename = TypeConverter::javaStringToJsString(V8Runtime::v8_isolate, env, filename); Local<Value> jsActivity = TypeConverter::javaObjectToJsValue(V8Runtime::v8_isolate, env, activityProxy); Local<Value> args[] = { jsSource, jsFilename, jsActivity }; TryCatch tryCatch(V8Runtime::v8_isolate); V8Runtime::RunModuleFunction()->Call(context, V8Runtime::ModuleObject(), 3, args); if (tryCatch.HasCaught()) { V8Util::openJSErrorDialog(V8Runtime::v8_isolate, tryCatch); V8Util::reportException(V8Runtime::v8_isolate, tryCatch, true); } }