complete invoke method on v8
This commit is contained in:
@@ -72,6 +72,22 @@ void V8Executor::injectGlobalJSFunction(QString name, QObject *function,
|
||||
injectFunctions(nullptr, name.toUtf8().constData(), true);
|
||||
}
|
||||
|
||||
void V8Executor::invokeObject(QString objectName, QString functionName,
|
||||
QVariantList arguments) {
|
||||
std::string exception;
|
||||
v8::HandleScope handleScope(m_isolate);
|
||||
int valueSize = arguments.size();
|
||||
|
||||
auto js_values = new v8::Local<v8::Value>[valueSize];
|
||||
for (uint32_t i = 0; i < valueSize; i++) {
|
||||
js_values[i] = Variant2JS(arguments.at(i));
|
||||
}
|
||||
v8::Local<v8::Value> value = invokeMethod(objectName.toUtf8().constData(),
|
||||
functionName.toUtf8().constData(),
|
||||
valueSize, js_values, &exception);
|
||||
delete[] js_values;
|
||||
}
|
||||
|
||||
// private segment
|
||||
void V8Executor::injectObject(const char *string, v8::Local<v8::Value> local) {
|
||||
v8::Isolate *isolate = m_isolate;
|
||||
@@ -214,11 +230,11 @@ static void InjectedFunction(const v8::FunctionCallbackInfo<v8::Value> &args) {
|
||||
QMetaObject::invokeMethod(
|
||||
pair.first, pair.second.toUtf8().constData(), Qt::DirectConnection,
|
||||
QGenericReturnArgument(),
|
||||
Q_ARG(QString, QString::fromStdString(argString0)),
|
||||
Q_ARG(QString, QString::fromStdString(argString1)),
|
||||
Q_ARG(QString, QString::fromStdString(argString2)),
|
||||
Q_ARG(QString, QString::fromStdString(argString3)),
|
||||
Q_ARG(QString, QString::fromStdString(argString4)));
|
||||
Q_ARG(QString, QString::fromUtf8(argString0.c_str())),
|
||||
Q_ARG(QString, QString::fromUtf8(argString1.c_str())),
|
||||
Q_ARG(QString, QString::fromUtf8(argString2.c_str())),
|
||||
Q_ARG(QString, QString::fromUtf8(argString3.c_str())),
|
||||
Q_ARG(QString, QString::fromUtf8(argString4.c_str())));
|
||||
}
|
||||
|
||||
// begin check to perform micro task checkpoint
|
||||
@@ -281,3 +297,52 @@ void V8Executor::injectFunctions(const char *objectName,
|
||||
v8::Maybe<bool> result = object->Set(context, name, function);
|
||||
result.ToChecked();
|
||||
}
|
||||
|
||||
v8::Local<v8::Value> V8Executor::invokeMethod(const char *objectName,
|
||||
const char *functionName,
|
||||
int argc,
|
||||
v8::Local<v8::Value> argv[],
|
||||
std::string *exception_str) {
|
||||
v8::Isolate *isolate = m_isolate;
|
||||
v8::EscapableHandleScope handle_scope(isolate);
|
||||
v8::Local<v8::Context> context = isolate->GetEnteredOrMicrotaskContext();
|
||||
v8::Local<v8::Object> object = context->Global();
|
||||
v8::Local<v8::Value> result = Undefined(isolate);
|
||||
|
||||
if (objectName) {
|
||||
object = object->Get(context, NewV8String(objectName))
|
||||
.ToLocalChecked()
|
||||
->ToObject(context)
|
||||
.ToLocalChecked();
|
||||
}
|
||||
if (object.IsEmpty()) {
|
||||
*exception_str = std::string("Cannot find Object:") +
|
||||
std::string(objectName ? objectName : "global");
|
||||
return handle_scope.Escape(result);
|
||||
}
|
||||
v8::Local<v8::Value> target_value =
|
||||
object->Get(context, NewV8String(functionName)).ToLocalChecked();
|
||||
if (!target_value->IsFunction()) {
|
||||
*exception_str =
|
||||
std::string("In ") + std::string(objectName ? objectName : "global") +
|
||||
std::string("cannot find target function ") + std::string(functionName);
|
||||
return handle_scope.Escape(result);
|
||||
}
|
||||
v8::TryCatch try_catch(isolate);
|
||||
try_catch.SetVerbose(true);
|
||||
v8::Local<v8::Function> target_function =
|
||||
v8::Local<v8::Function>::Cast(target_value);
|
||||
result = target_function->Call(context, object, argc, argv).ToLocalChecked();
|
||||
v8::Local<v8::Value> exception = try_catch.Exception();
|
||||
if (!exception.IsEmpty()) {
|
||||
if (exception->IsObject()) {
|
||||
v8::Local<v8::Object> exc = v8::Local<v8::Object>::Cast(exception);
|
||||
v8::Local<v8::Value> stack =
|
||||
exc->Get(context, NewV8String("stack")).FromMaybe(exception);
|
||||
*exception_str = JS2String(stack);
|
||||
} else {
|
||||
*exception_str = JS2String(exception);
|
||||
}
|
||||
}
|
||||
return handle_scope.Escape(result);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user