diff options
author | Lorry Tar Creator <lorry-tar-importer@lorry> | 2016-04-10 09:28:39 +0000 |
---|---|---|
committer | Lorry Tar Creator <lorry-tar-importer@lorry> | 2016-04-10 09:28:39 +0000 |
commit | 32761a6cee1d0dee366b885b7b9c777e67885688 (patch) | |
tree | d6bec92bebfb216f4126356e55518842c2f476a1 /Source/JavaScriptCore/runtime/JSScope.h | |
parent | a4e969f4965059196ca948db781e52f7cfebf19e (diff) | |
download | WebKitGtk-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.h | 148 |
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() |