| Index: src/FileSystemJsObject.cpp |
| =================================================================== |
| --- a/src/FileSystemJsObject.cpp |
| +++ b/src/FileSystemJsObject.cpp |
| @@ -33,24 +33,24 @@ |
| namespace |
| { |
| class ReadTask |
| + : public TaskFunctionInterface |
| { |
| /** |
| * Shared pointer keeps engine in existence for task thread. |
| */ |
| - JsEnginePtr jsEngine; |
| + JsEngineInternal* engine; |
| std::string path; |
| V8PersistentNG<v8::Function> callbackFunction; |
| public: |
| ReadTask(JsEngineInternal* engine, const std::string& path, |
| V8PersistentNG<v8::Function> callbackFunction) |
| - : jsEngine(engine->shared_from_this()), path(path), |
| + : engine(engine), path(path), |
| callbackFunction(callbackFunction) |
| {} |
| - void operator()() |
| + void operator()() override |
| { |
| - JsEngineInternal* engine = ToInternal(jsEngine); |
| std::string content; |
| std::string error; |
| // Read operation is long-lived. Do not lock engine during it. |
| @@ -79,11 +79,12 @@ |
| }; |
| class WriteTask |
| + : public TaskFunctionInterface |
| { |
| /** |
| * Shared pointer keeps engine in existence for task thread. |
| */ |
| - JsEnginePtr jsEngine; |
| + JsEngineInternal* engine; |
| std::string path; |
| std::string content; |
| V8PersistentNG<v8::Function> callbackFunction; |
| @@ -91,13 +92,12 @@ |
| WriteTask(JsEngineInternal* engine, |
| const std::string& path, const std::string& content, |
| V8PersistentNG<v8::Function> callbackFunction) |
| - : jsEngine(engine->shared_from_this()), path(path), content(content), |
| + : engine(engine), path(path), content(content), |
| callbackFunction(callbackFunction) |
| {} |
| - void operator()() |
| + void operator()() override |
| { |
| - JsEngineInternal* engine = ToInternal(jsEngine); |
| std::string error; |
| // Write operation is long-lived. Do not lock engine during it. |
| try |
| @@ -123,11 +123,12 @@ |
| }; |
| class MoveTask |
| + : public TaskFunctionInterface |
| { |
| /** |
| * Shared pointer keeps engine in existence for task thread. |
| */ |
| - JsEnginePtr jsEngine; |
| + JsEngineInternal* engine; |
| std::string fromPath; |
| std::string toPath; |
| V8PersistentNG<v8::Function> callbackFunction; |
| @@ -135,13 +136,12 @@ |
| public: |
| MoveTask(JsEngineInternal* engine, const std::string& fromPath, const std::string& toPath, |
| V8PersistentNG<v8::Function> callbackFunction) |
| - : jsEngine(engine->shared_from_this()), fromPath(fromPath), toPath(toPath), |
| + : engine(engine), fromPath(fromPath), toPath(toPath), |
| callbackFunction(callbackFunction) |
| {} |
| - void operator()() |
| + void operator()() override |
| { |
| - JsEngineInternal* engine(ToInternal(jsEngine)); |
| std::string error; |
| try |
| { |
| @@ -163,24 +163,24 @@ |
| }; |
| class RemoveTask |
| + : public TaskFunctionInterface |
| { |
| /** |
| * Shared pointer keeps engine in existence for task thread. |
| */ |
| - JsEnginePtr jsEngine; |
| + JsEngineInternal *engine; |
| std::string path; |
| V8PersistentNG<v8::Function> callbackFunction; |
| public: |
| RemoveTask(JsEngineInternal *engine, const std::string& path, |
| V8PersistentNG<v8::Function> callbackFunction) |
| - : jsEngine(engine->shared_from_this()), path(path), |
| + : engine(engine), path(path), |
| callbackFunction(callbackFunction) |
| {} |
| - void operator()() |
| + void operator()() override |
| { |
| - JsEngineInternal* engine(ToInternal(jsEngine)); |
| std::string error; |
| try |
| { |
| @@ -202,24 +202,24 @@ |
| }; |
| class StatTask |
| + : public TaskFunctionInterface |
| { |
| /** |
| * Shared pointer keeps engine in existence for task thread. |
| */ |
| - JsEnginePtr jsEngine; |
| + JsEngineInternal *engine; |
| std::string path; |
| V8PersistentNG<v8::Function> callbackFunction; |
| public: |
| StatTask(JsEngineInternal* engine, const std::string& path, |
| V8PersistentNG<v8::Function> callbackFunction) |
| - : jsEngine(engine->shared_from_this()), path(path), |
| + : engine(engine), path(path), |
| callbackFunction(callbackFunction) |
| {} |
| - void operator()() |
| + void operator()() override |
| { |
| - JsEngineInternal* engine(ToInternal(jsEngine)); |
| std::string error; |
| FileSystem::StatResult statResult; |
| try |
| @@ -251,7 +251,6 @@ |
| v8::Handle<v8::Value> ReadCallback(const v8::Arguments& arguments) |
| { |
| auto engine(JsEngineInternal::ExtractEngine(arguments)); |
| - std::shared_ptr<ReadTask> readTask; |
| try |
| { |
| if (arguments.Length() != 2) |
| @@ -269,26 +268,23 @@ |
| { |
| throw std::runtime_error("Second argument to _fileSystem.read must be a function"); |
| } |
| - readTask = std::make_shared<ReadTask>(engine, firstArgument, |
| + ReadTask readTask(engine, firstArgument, |
| V8PersistentNG<v8::Function>(engine->GetIsolate(), v8::Local<v8::Function>::Cast(arguments[1]))); |
| + // Run the task |
| + engine->ScheduleTask(std::move(readTask), ImmediateSingleUseThread); |
| + return v8::Undefined(); |
| } |
| catch (const std::exception& e) |
| { |
| return v8::ThrowException(engine->ToV8String(e.what())); |
| } |
| - // Run the task |
| - engine->Schedule(AdblockPlus::MakeHeapFunction(readTask), AdblockPlus::ImmediateSingleUseThread); |
| - return v8::Undefined(); |
| } |
| v8::Handle<v8::Value> WriteCallback(const v8::Arguments& arguments) |
| { |
| auto engine(JsEngineInternal::ExtractEngine(arguments)); |
| - std::shared_ptr<WriteTask> writeTask; |
| try |
| { |
| - v8::Isolate* isolate = arguments.GetIsolate(); |
| - |
| if (arguments.Length() != 3) |
| { |
| throw std::exception("_fileSystem.write requires 3 parameters"); |
| @@ -310,22 +306,21 @@ |
| { |
| throw std::runtime_error("Third argument to _fileSystem.write must be a function"); |
| } |
| - writeTask = std::make_shared<WriteTask>(engine, firstArgument, secondArgument, |
| + // Run the task |
| + WriteTask writeTask(engine, firstArgument, secondArgument, |
| V8PersistentNG<v8::Function>(engine->GetIsolate(), v8::Local<v8::Function>::Cast(arguments[2]))); |
| + engine->ScheduleTask(std::move(writeTask), ImmediateSingleUseThread); |
| + return v8::Undefined(); |
| } |
| catch (const std::exception& e) |
| { |
| return v8::ThrowException(engine->ToV8String(e.what())); |
| } |
| - engine->Schedule(AdblockPlus::MakeHeapFunction(writeTask), AdblockPlus::ImmediateSingleUseThread); |
| - return v8::Undefined(); |
| } |
| v8::Handle<v8::Value> MoveCallback(const v8::Arguments& arguments) |
| { |
| auto engine(JsEngineInternal::ExtractEngine(arguments)); |
| - std::shared_ptr<MoveTask> moveTask; |
| - std::string firstArgument, secondArgument; |
| try |
| { |
| if (arguments.Length() != 3) |
| @@ -333,6 +328,7 @@ |
| throw std::runtime_error("_fileSystem.move requires 3 parameters"); |
| } |
| bool argumentIsString; |
| + std::string firstArgument, secondArgument; |
| std::tie(argumentIsString, firstArgument) = ConvertString(arguments[0]); |
| if (!argumentIsString) |
| { |
| @@ -347,23 +343,21 @@ |
| { |
| throw std::runtime_error("Third argument to _fileSystem.move must be a function"); |
| } |
| + // Run the task |
| + MoveTask moveTask(engine, firstArgument, secondArgument, |
| + V8PersistentNG<v8::Function>(engine->GetIsolate(), v8::Local<v8::Function>::Cast(arguments[2]))); |
| + engine->ScheduleTask(std::move(moveTask), ImmediateSingleUseThread); |
| + return v8::Undefined(); |
| } |
| catch (const std::exception& e) |
| { |
| return v8::ThrowException(engine->ToV8String(e.what())); |
| } |
| - // Run the task |
| - moveTask = std::make_shared<MoveTask>(engine, firstArgument, secondArgument, |
| - V8PersistentNG<v8::Function>(engine->GetIsolate(), v8::Local<v8::Function>::Cast(arguments[2]))); |
| - engine->Schedule(AdblockPlus::MakeHeapFunction(moveTask), AdblockPlus::ImmediateSingleUseThread); |
| - return v8::Undefined(); |
| } |
| v8::Handle<v8::Value> RemoveCallback(const v8::Arguments& arguments) |
| { |
| auto engine(JsEngineInternal::ExtractEngine(arguments)); |
| - std::shared_ptr<RemoveTask> removeTask; |
| - std::string firstArgument; |
| try |
| { |
| if (arguments.Length() != 2) |
| @@ -371,6 +365,7 @@ |
| throw std::runtime_error("_fileSystem.remove requires 2 parameters"); |
| } |
| bool argumentIsString; |
| + std::string firstArgument; |
| std::tie(argumentIsString, firstArgument) = ConvertString(arguments[0]); |
| if (!argumentIsString) |
| { |
| @@ -380,23 +375,21 @@ |
| { |
| throw std::runtime_error("Second argument to _fileSystem.remove must be a function"); |
| } |
| + // Run the task |
| + RemoveTask removeTask(engine, firstArgument, |
| + V8PersistentNG<v8::Function>(engine->GetIsolate(), v8::Local<v8::Function>::Cast(arguments[1]))); |
| + engine->ScheduleTask(std::move(removeTask), ImmediateSingleUseThread); |
| + return v8::Undefined(); |
| } |
| catch (const std::exception& e) |
| { |
| return v8::ThrowException(engine->ToV8String(e.what())); |
| } |
| - // Run the task |
| - removeTask = std::make_shared<RemoveTask>(engine, firstArgument, |
| - V8PersistentNG<v8::Function>(engine->GetIsolate(), v8::Local<v8::Function>::Cast(arguments[1]))); |
| - engine->Schedule(AdblockPlus::MakeHeapFunction(removeTask), AdblockPlus::ImmediateSingleUseThread); |
| - return v8::Undefined(); |
| } |
| v8::Handle<v8::Value> StatCallback(const v8::Arguments& arguments) |
| { |
| auto engine(JsEngineInternal::ExtractEngine(arguments)); |
| - std::shared_ptr<StatTask> statTask; |
| - std::string firstArgument; |
| try |
| { |
| if (arguments.Length() != 2) |
| @@ -404,6 +397,7 @@ |
| throw std::runtime_error("_fileSystem.stat requires 2 parameters"); |
| } |
| bool argumentIsString; |
| + std::string firstArgument; |
| std::tie(argumentIsString, firstArgument) = ConvertString(arguments[0]); |
| if (!argumentIsString) |
| { |
| @@ -413,16 +407,16 @@ |
| { |
| throw std::runtime_error("Second argument to _fileSystem.stat must be a function"); |
| } |
| + // Run the task |
| + StatTask statTask(engine, firstArgument, |
| + V8PersistentNG<v8::Function>(engine->GetIsolate(), v8::Local<v8::Function>::Cast(arguments[1]))); |
| + engine->ScheduleTask(std::move(statTask), ImmediateSingleUseThread); |
| + return v8::Undefined(); |
| } |
| catch (const std::exception& e) |
| { |
| return v8::ThrowException(engine->ToV8String(e.what())); |
| } |
| - // Run the task |
| - statTask = std::make_shared<StatTask>(engine, firstArgument, |
| - V8PersistentNG<v8::Function>(engine->GetIsolate(), v8::Local<v8::Function>::Cast(arguments[1]))); |
| - engine->Schedule(AdblockPlus::MakeHeapFunction(statTask), AdblockPlus::ImmediateSingleUseThread); |
| - return v8::Undefined(); |
| } |
| v8::Handle<v8::Value> ResolveCallback(const v8::Arguments& arguments) |