Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(509)

Unified Diff: src/handles.h

Issue 1423833003: Canonicalize handles for optimized compilation. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: fix Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/compiler.cc ('k') | src/handles.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/handles.h
diff --git a/src/handles.h b/src/handles.h
index 85fa839f3f3981758ac28b8f7d934e210d2a75ba..4c10f2073892ba34558c292f829a517e6410c7f6 100644
--- a/src/handles.h
+++ b/src/handles.h
@@ -10,6 +10,7 @@
#include "src/base/macros.h"
#include "src/checks.h"
#include "src/globals.h"
+#include "src/zone.h"
namespace v8 {
namespace internal {
@@ -92,6 +93,9 @@ class Handle final : public HandleBase {
V8_INLINE explicit Handle(T* object) : Handle(object, object->GetIsolate()) {}
V8_INLINE Handle(T* object, Isolate* isolate) : HandleBase(object, isolate) {}
+ // Allocate a new handle for the object, do not canonicalize.
+ V8_INLINE static Handle<T> New(T* object, Isolate* isolate);
+
// Constructor for handling automatic up casting.
// Ex. Handle<JSFunction> can be passed when Handle<Object> is expected.
template <typename S>
@@ -254,9 +258,11 @@ class HandleScope {
// Counts the number of allocated handles.
static int NumberOfHandles(Isolate* isolate);
+ // Create a new handle or lookup a canonical handle.
+ V8_INLINE static Object** GetHandle(Isolate* isolate, Object* value);
+
// Creates a new handle with the given value.
- template <typename T>
- static inline T** CreateHandle(Isolate* isolate, T* value);
+ V8_INLINE static Object** CreateHandle(Isolate* isolate, Object* value);
// Deallocates any extensions used by the current scope.
static void DeleteExtensions(Isolate* isolate);
@@ -305,11 +311,44 @@ class HandleScope {
friend class v8::HandleScope;
friend class DeferredHandles;
+ friend class DeferredHandleScope;
friend class HandleScopeImplementer;
friend class Isolate;
};
+// Forward declarations for CanonicalHandleScope.
+template <typename V>
+class IdentityMap;
+class RootIndexMap;
+
+
+// A CanonicalHandleScope does not open a new HandleScope. It changes the
+// existing HandleScope so that Handles created within are canonicalized.
+// This does not apply to nested inner HandleScopes unless a nested
+// CanonicalHandleScope is introduced. Handles are only canonicalized within
+// the same CanonicalHandleScope, but not across nested ones.
+class CanonicalHandleScope final {
+ public:
+ explicit CanonicalHandleScope(Isolate* isolate);
+ ~CanonicalHandleScope();
+
+ private:
+ Object** Lookup(Object* object);
+
+ Isolate* isolate_;
+ Zone zone_;
+ RootIndexMap* root_index_map_;
+ IdentityMap<Object**>* identity_map_;
+ // Ordinary nested handle scopes within the current one are not canonical.
+ int canonical_level_;
+ // We may have nested canonical scopes. Handles are canonical within each one.
+ CanonicalHandleScope* prev_canonical_scope_;
+
+ friend class HandleScope;
+};
+
+
class DeferredHandleScope final {
public:
explicit DeferredHandleScope(Isolate* isolate);
@@ -345,8 +384,8 @@ class SealHandleScope final {
inline ~SealHandleScope();
private:
Isolate* isolate_;
- Object** limit_;
- int level_;
+ Object** prev_limit_;
+ int prev_sealed_level_;
#endif
};
@@ -355,10 +394,13 @@ struct HandleScopeData final {
Object** next;
Object** limit;
int level;
+ int sealed_level;
+ CanonicalHandleScope* canonical_scope;
void Initialize() {
next = limit = NULL;
- level = 0;
+ sealed_level = level = 0;
+ canonical_scope = NULL;
}
};
« no previous file with comments | « src/compiler.cc ('k') | src/handles.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698