summaryrefslogtreecommitdiff
path: root/Source/JavaScriptCore/runtime/JSScope.h
diff options
context:
space:
mode:
authorLorry Tar Creator <lorry-tar-importer@lorry>2016-04-10 09:28:39 +0000
committerLorry Tar Creator <lorry-tar-importer@lorry>2016-04-10 09:28:39 +0000
commit32761a6cee1d0dee366b885b7b9c777e67885688 (patch)
treed6bec92bebfb216f4126356e55518842c2f476a1 /Source/JavaScriptCore/runtime/JSScope.h
parenta4e969f4965059196ca948db781e52f7cfebf19e (diff)
downloadWebKitGtk-tarball-32761a6cee1d0dee366b885b7b9c777e67885688.tar.gz
webkitgtk-2.4.11webkitgtk-2.4.11
Diffstat (limited to 'Source/JavaScriptCore/runtime/JSScope.h')
-rw-r--r--Source/JavaScriptCore/runtime/JSScope.h148
1 files changed, 125 insertions, 23 deletions
diff --git a/Source/JavaScriptCore/runtime/JSScope.h b/Source/JavaScriptCore/runtime/JSScope.h
index 4b17972c2..3f62a45ac 100644
--- a/Source/JavaScriptCore/runtime/JSScope.h
+++ b/Source/JavaScriptCore/runtime/JSScope.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2012-2015 Apple Inc. All Rights Reserved.
+ * Copyright (C) 2012, 2013 Apple Inc. All Rights Reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -26,47 +26,138 @@
#ifndef JSScope_h
#define JSScope_h
-#include "GetPutInfo.h"
#include "JSObject.h"
-#include "VariableEnvironment.h"
namespace JSC {
class ScopeChainIterator;
-class WatchpointSet;
+class VariableWatchpointSet;
+
+enum ResolveMode {
+ ThrowIfNotFound,
+ DoNotThrowIfNotFound
+};
+
+enum ResolveType {
+ // Lexical scope guaranteed a certain type of variable access.
+ GlobalProperty,
+ GlobalVar,
+ ClosureVar,
+
+ // Ditto, but at least one intervening scope used non-strict eval, which
+ // can inject an intercepting var delcaration at runtime.
+ GlobalPropertyWithVarInjectionChecks,
+ GlobalVarWithVarInjectionChecks,
+ ClosureVarWithVarInjectionChecks,
+
+ // Lexical scope didn't prove anything -- probably because of a 'with' scope.
+ Dynamic
+};
+
+inline ResolveType makeType(ResolveType type, bool needsVarInjectionChecks)
+{
+ if (!needsVarInjectionChecks)
+ return type;
+
+ switch (type) {
+ case GlobalProperty:
+ return GlobalPropertyWithVarInjectionChecks;
+ case GlobalVar:
+ return GlobalVarWithVarInjectionChecks;
+ case ClosureVar:
+ return ClosureVarWithVarInjectionChecks;
+ case GlobalPropertyWithVarInjectionChecks:
+ case GlobalVarWithVarInjectionChecks:
+ case ClosureVarWithVarInjectionChecks:
+ case Dynamic:
+ return type;
+ }
+
+ RELEASE_ASSERT_NOT_REACHED();
+ return type;
+}
+
+inline bool needsVarInjectionChecks(ResolveType type)
+{
+ switch (type) {
+ case GlobalProperty:
+ case GlobalVar:
+ case ClosureVar:
+ return false;
+ case GlobalPropertyWithVarInjectionChecks:
+ case GlobalVarWithVarInjectionChecks:
+ case ClosureVarWithVarInjectionChecks:
+ case Dynamic:
+ return true;
+ default:
+ RELEASE_ASSERT_NOT_REACHED();
+ return true;
+ }
+}
+
+struct ResolveOp {
+ ResolveOp(ResolveType type, size_t depth, Structure* structure, JSActivation* activation, VariableWatchpointSet* watchpointSet, uintptr_t operand)
+ : type(type)
+ , depth(depth)
+ , structure(structure)
+ , activation(activation)
+ , watchpointSet(watchpointSet)
+ , operand(operand)
+ {
+ }
+
+ ResolveType type;
+ size_t depth;
+ Structure* structure;
+ JSActivation* activation;
+ VariableWatchpointSet* watchpointSet;
+ uintptr_t operand;
+};
+
+class ResolveModeAndType {
+ typedef unsigned Operand;
+public:
+ static const size_t shift = sizeof(Operand) * 8 / 2;
+ static const unsigned mask = (1 << shift) - 1;
+
+ ResolveModeAndType(ResolveMode resolveMode, ResolveType resolveType)
+ : m_operand((resolveMode << shift) | resolveType)
+ {
+ }
+
+ explicit ResolveModeAndType(unsigned operand)
+ : m_operand(operand)
+ {
+ }
+
+ ResolveMode mode() { return static_cast<ResolveMode>(m_operand >> shift); }
+ ResolveType type() { return static_cast<ResolveType>(m_operand & mask); }
+ unsigned operand() { return m_operand; }
+
+private:
+ Operand m_operand;
+};
+
+enum GetOrPut { Get, Put };
class JSScope : public JSNonFinalObject {
public:
typedef JSNonFinalObject Base;
- static const unsigned StructureFlags = Base::StructureFlags;
friend class LLIntOffsetsExtractor;
static size_t offsetOfNext();
- static JSObject* objectAtScope(JSScope*);
+ JS_EXPORT_PRIVATE static JSObject* objectAtScope(JSScope*);
static JSValue resolve(ExecState*, JSScope*, const Identifier&);
- static ResolveOp abstractResolve(ExecState*, size_t depthOffset, JSScope*, const Identifier&, GetOrPut, ResolveType, InitializationMode);
-
- static bool hasConstantScope(ResolveType);
- static JSScope* constantScopeForCodeBlock(ResolveType, CodeBlock*);
-
- static void collectVariablesUnderTDZ(JSScope*, VariableEnvironment& result);
+ static ResolveOp abstractResolve(ExecState*, JSScope*, const Identifier&, GetOrPut, ResolveType);
static void visitChildren(JSCell*, SlotVisitor&);
- bool isVarScope();
- bool isLexicalScope();
- bool isModuleScope();
- bool isGlobalLexicalEnvironment();
- bool isCatchScope();
- bool isFunctionNameScopeObject();
-
- bool isNestedLexicalScope();
-
ScopeChainIterator begin();
ScopeChainIterator end();
JSScope* next();
+ int depth();
JSGlobalObject* globalObject();
VM* vm();
@@ -74,6 +165,7 @@ public:
protected:
JSScope(VM&, Structure*, JSScope* next);
+ static const unsigned StructureFlags = OverridesVisitChildren | Base::StructureFlags;
private:
WriteBarrier<JSScope> m_next;
@@ -94,7 +186,6 @@ public:
JSObject* get() const { return JSScope::objectAtScope(m_node); }
JSObject* operator->() const { return JSScope::objectAtScope(m_node); }
- JSScope* scope() const { return m_node; }
ScopeChainIterator& operator++() { m_node = m_node->next(); return *this; }
@@ -143,9 +234,20 @@ inline JSScope* Register::scope() const
return jsCast<JSScope*>(jsValue());
}
+inline VM& ExecState::vm() const
+{
+ ASSERT(scope()->vm());
+ return *scope()->vm();
+}
+
inline JSGlobalObject* ExecState::lexicalGlobalObject() const
{
- return callee()->globalObject();
+ return scope()->globalObject();
+}
+
+inline JSObject* ExecState::globalThisValue() const
+{
+ return scope()->globalThis();
}
inline size_t JSScope::offsetOfNext()