| Index: src/JsValue.cpp |
| diff --git a/src/JsValue.cpp b/src/JsValue.cpp |
| index 5ced82018eb46dcbeb017cb94e7791157a928260..52456a86d7131101fa1a7bd716d2fc3d9821b31e 100644 |
| --- a/src/JsValue.cpp |
| +++ b/src/JsValue.cpp |
| @@ -22,6 +22,8 @@ |
| #include "JsError.h" |
| #include "Utils.h" |
| +using namespace AdblockPlus; |
| + |
| AdblockPlus::JsValue::JsValue(AdblockPlus::JsEnginePtr jsEngine, |
| v8::Handle<v8::Value> value) |
| : jsEngine(jsEngine), |
| @@ -205,40 +207,46 @@ std::string AdblockPlus::JsValue::GetClass() const |
| return Utils::FromV8String(obj->GetConstructorName()); |
| } |
| -AdblockPlus::JsValuePtr AdblockPlus::JsValue::Call(const JsConstValueList& params, JsValuePtr thisPtr) const |
| +JsValue JsValue::Call(const JsConstValueList& params, JsValuePtr thisPtr) const |
| { |
| - if (!IsFunction()) |
| - throw new std::runtime_error("Attempting to call a non-function"); |
| - |
| const JsContext context(jsEngine); |
| - if (!thisPtr) |
| - { |
| - v8::Local<v8::Context> localContext = v8::Local<v8::Context>::New( |
| - jsEngine->GetIsolate(), *jsEngine->context); |
| - thisPtr = JsValuePtr(new JsValue(jsEngine, localContext->Global())); |
| - } |
| - if (!thisPtr->IsObject()) |
| - throw new std::runtime_error("`this` pointer has to be an object"); |
| - v8::Local<v8::Object> thisObj = v8::Local<v8::Object>::Cast(thisPtr->UnwrapValue()); |
| + v8::Local<v8::Object> thisObj = thisPtr ? |
| + v8::Local<v8::Object>::Cast(thisPtr->UnwrapValue()) : |
| + context.GetV8Context()->Global(); |
| std::vector<v8::Handle<v8::Value>> argv; |
| for (const auto& param : params) |
| argv.push_back(param->UnwrapValue()); |
| + return Call(argv, thisObj); |
| +} |
| + |
| +JsValue JsValue::Call(const JsValue& arg) const |
| +{ |
| + const JsContext context(jsEngine); |
| + |
| + std::vector<v8::Handle<v8::Value>> argv; |
| + argv.push_back(arg.UnwrapValue()); |
| + |
| + return Call(argv, context.GetV8Context()->Global()); |
| +} |
| + |
| +JsValue JsValue::Call(std::vector<v8::Handle<v8::Value>>& args, v8::Local<v8::Object> thisObj) const |
| +{ |
| + if (!IsFunction()) |
| + throw new std::runtime_error("Attempting to call a non-function"); |
| + if (!thisObj->IsObject()) |
| + throw new std::runtime_error("`this` pointer has to be an object"); |
| + |
| + const JsContext context(jsEngine); |
| + |
| const v8::TryCatch tryCatch; |
| v8::Local<v8::Function> func = v8::Local<v8::Function>::Cast(UnwrapValue()); |
| - v8::Local<v8::Value> result = func->Call(thisObj, argv.size(), |
| - argv.size() ? &argv.front() : 0); |
| + v8::Local<v8::Value> result = func->Call(thisObj, args.size(), |
| + args.size() ? &args[0] : nullptr); |
| if (tryCatch.HasCaught()) |
| throw JsError(tryCatch.Exception(), tryCatch.Message()); |
| - return JsValuePtr(new JsValue(jsEngine, result)); |
| -} |
| - |
| -AdblockPlus::JsValuePtr AdblockPlus::JsValue::Call(const JsConstValuePtr& arg) const |
| -{ |
| - JsConstValueList params; |
| - params.push_back(arg); |
| - return Call(params); |
| + return JsValue(jsEngine, result); |
| } |