summaryrefslogtreecommitdiff
path: root/Source/JavaScriptCore/runtime/JSScope.h
diff options
context:
space:
mode:
Diffstat (limited to 'Source/JavaScriptCore/runtime/JSScope.h')
-rw-r--r--Source/JavaScriptCore/runtime/JSScope.h165
1 files changed, 31 insertions, 134 deletions
diff --git a/Source/JavaScriptCore/runtime/JSScope.h b/Source/JavaScriptCore/runtime/JSScope.h
index 3f62a45ac..71545746d 100644
--- a/Source/JavaScriptCore/runtime/JSScope.h
+++ b/Source/JavaScriptCore/runtime/JSScope.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2012, 2013 Apple Inc. All Rights Reserved.
+ * Copyright (C) 2012-2016 Apple Inc. All Rights Reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -23,149 +23,58 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-#ifndef JSScope_h
-#define JSScope_h
+#pragma once
+#include "GetPutInfo.h"
#include "JSObject.h"
namespace JSC {
class ScopeChainIterator;
-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 SymbolTable;
+class VariableEnvironment;
+class WatchpointSet;
class JSScope : public JSNonFinalObject {
public:
typedef JSNonFinalObject Base;
+ static const unsigned StructureFlags = Base::StructureFlags;
friend class LLIntOffsetsExtractor;
static size_t offsetOfNext();
- JS_EXPORT_PRIVATE static JSObject* objectAtScope(JSScope*);
+ static JSObject* objectAtScope(JSScope*);
+
+ static JSObject* resolve(ExecState*, JSScope*, const Identifier&);
+ static ResolveOp abstractResolve(ExecState*, size_t depthOffset, JSScope*, const Identifier&, GetOrPut, ResolveType, InitializationMode);
- static JSValue resolve(ExecState*, JSScope*, const Identifier&);
- static ResolveOp abstractResolve(ExecState*, JSScope*, const Identifier&, GetOrPut, ResolveType);
+ static bool hasConstantScope(ResolveType);
+ static JSScope* constantScopeForCodeBlock(ResolveType, CodeBlock*);
+
+ static void collectClosureVariablesUnderTDZ(JSScope*, VariableEnvironment& result);
static void visitChildren(JSCell*, SlotVisitor&);
+ bool isVarScope();
+ bool isLexicalScope();
+ bool isModuleScope();
+ bool isCatchScope();
+ bool isFunctionNameScopeObject();
+
+ bool isNestedLexicalScope();
+
ScopeChainIterator begin();
ScopeChainIterator end();
JSScope* next();
- int depth();
JSGlobalObject* globalObject();
- VM* vm();
+ JSGlobalObject* globalObject(VM&);
JSObject* globalThis();
+ SymbolTable* symbolTable(VM&);
+
protected:
JSScope(VM&, Structure*, JSScope* next);
- static const unsigned StructureFlags = OverridesVisitChildren | Base::StructureFlags;
private:
WriteBarrier<JSScope> m_next;
@@ -186,6 +95,7 @@ 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; }
@@ -218,9 +128,9 @@ inline JSGlobalObject* JSScope::globalObject()
return structure()->globalObject();
}
-inline VM* JSScope::vm()
+inline JSGlobalObject* JSScope::globalObject(VM& vm)
{
- return MarkedBlock::blockFor(this)->vm();
+ return structure(vm)->globalObject();
}
inline Register& Register::operator=(JSScope* scope)
@@ -231,23 +141,12 @@ inline Register& Register::operator=(JSScope* scope)
inline JSScope* Register::scope() const
{
- return jsCast<JSScope*>(jsValue());
-}
-
-inline VM& ExecState::vm() const
-{
- ASSERT(scope()->vm());
- return *scope()->vm();
+ return jsCast<JSScope*>(unboxedCell());
}
inline JSGlobalObject* ExecState::lexicalGlobalObject() const
{
- return scope()->globalObject();
-}
-
-inline JSObject* ExecState::globalThisValue() const
-{
- return scope()->globalThis();
+ return jsCallee()->globalObject();
}
inline size_t JSScope::offsetOfNext()
@@ -256,5 +155,3 @@ inline size_t JSScope::offsetOfNext()
}
} // namespace JSC
-
-#endif // JSScope_h