Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code

Unified Diff: include/AdblockPlus/JsEngine.h

Issue 4949583905947648: Issue 1280 - Update v8, the second part (Closed)
Patch Set: Created Oct. 27, 2014, 10:01 p.m.
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « include/AdblockPlus/FilterEngine.h ('k') | include/AdblockPlus/JsValue.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: include/AdblockPlus/JsEngine.h
===================================================================
--- a/include/AdblockPlus/JsEngine.h
+++ b/include/AdblockPlus/JsEngine.h
@@ -30,7 +30,6 @@
#include <AdblockPlus/WebRequest.h>
#include "tr1_memory.h"
-#include "V8ValueHolder.h"
namespace v8
{
@@ -40,6 +39,7 @@
class Context;
template<class T> class Handle;
typedef Handle<Value>(*InvocationCallback)(const Arguments &args);
+ typedef void(*FunctionCallback)(const FunctionCallbackInfo<Value>& info);
}
namespace AdblockPlus
@@ -49,21 +49,63 @@
/**
* Shared smart pointer to a `JsEngine` instance.
*/
- typedef std::tr1::shared_ptr<JsEngine> JsEnginePtr;
+ typedef std::shared_ptr<JsEngine> JsEnginePtr;
+
+ // These classes are inherited by JsEngine to avoid any mistake in the order of object destroying and
+ // disposing. The isolate should be disposed after the everything else. v8::Isolate::Scope
+ // requires a scope, there is no API to "close" it.
+ class IsolateManagerJsEngine
+ {
+ protected:
+ IsolateManagerJsEngine()
+ : isolate{v8::Isolate::New()}
+ {
+ }
+ ~IsolateManagerJsEngine()
+ {
+ isolate->Dispose();
+ }
+ v8::Isolate* isolate;
+ };
+
+ class IsolateScopeJsEngine : protected IsolateManagerJsEngine
+ {
+ protected:
+ IsolateScopeJsEngine()
+ : isolateScope{isolate}
+ {
+ }
+ ~IsolateScopeJsEngine()
+ {
+ }
+ v8::Isolate::Scope isolateScope;
+ };
+
+ class ContextScopeJsEngine : protected IsolateScopeJsEngine
+ {
+ protected:
+ ~ContextScopeJsEngine()
+ {
+ }
+ v8::UniquePersistent<v8::Context> context;
+ };
/**
* JavaScript engine used by `FilterEngine`, wraps v8.
*/
- class JsEngine : public std::tr1::enable_shared_from_this<JsEngine>
+ class JsEngine : public std::enable_shared_from_this<JsEngine>, protected ContextScopeJsEngine
{
friend class JsValue;
friend class JsContext;
+ struct PrivateCtrArg{};
+ public:
+ JsEngine(PrivateCtrArg);
+ ~JsEngine();
- public:
/**
* Event callback function.
*/
- typedef std::tr1::function<void(JsValueList& params)> EventCallback;
+ typedef std::function<void(JsValueList& params)> EventCallback;
/**
* Maps events to callback functions.
@@ -151,7 +193,7 @@
* the current `JsEngine`.
* @return New `JsValue` instance.
*/
- JsValuePtr NewCallback(v8::InvocationCallback callback);
+ JsValuePtr NewCallback(v8::FunctionCallback callback);
/**
* Returns a `JsEngine` instance contained in a `v8::Arguments` object.
@@ -161,7 +203,7 @@
* instance.
* @return `JsEngine` instance from `v8::Arguments`.
*/
- static JsEnginePtr FromArguments(const v8::Arguments& arguments);
+ static JsEnginePtr FromArguments(const v8::FunctionCallbackInfo<v8::Value>& arguments);
/**
* Converts v8 arguments to `JsValue` objects.
@@ -169,7 +211,7 @@
* convert.
* @return List of arguments converted to `JsValue` objects.
*/
- JsValueList ConvertArguments(const v8::Arguments& arguments);
+ JsValueList ConvertArguments(const v8::FunctionCallbackInfo<v8::Value>& arguments);
/**
* @see `SetFileSystem()`.
@@ -212,13 +254,9 @@
void SetLogSystem(LogSystemPtr val);
private:
- JsEngine();
-
FileSystemPtr fileSystem;
WebRequestPtr webRequest;
LogSystemPtr logSystem;
- v8::Isolate* isolate;
- V8ValueHolder<v8::Context> context;
EventMap eventCallbacks;
};
}
« no previous file with comments | « include/AdblockPlus/FilterEngine.h ('k') | include/AdblockPlus/JsValue.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld