diff options
Diffstat (limited to 'Source/JavaScriptCore/bytecode/ResolveOperation.h')
-rw-r--r-- | Source/JavaScriptCore/bytecode/ResolveOperation.h | 178 |
1 files changed, 178 insertions, 0 deletions
diff --git a/Source/JavaScriptCore/bytecode/ResolveOperation.h b/Source/JavaScriptCore/bytecode/ResolveOperation.h new file mode 100644 index 000000000..1543ef209 --- /dev/null +++ b/Source/JavaScriptCore/bytecode/ResolveOperation.h @@ -0,0 +1,178 @@ +/* + * Copyright (C) 2012 Apple Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef ResolveOperation_h +#define ResolveOperation_h + +#include "PropertyOffset.h" +#include "WriteBarrier.h" + +#include <wtf/Vector.h> + +namespace JSC { + +class Structure; + +struct ResolveOperation { + typedef enum { + Fail, + SetBaseToUndefined, + ReturnScopeAsBase, + SetBaseToScope, + SetBaseToGlobal, + GetAndReturnScopedVar, + GetAndReturnGlobalVar, + GetAndReturnGlobalVarWatchable, + SkipTopScopeNode, + SkipScopes, + ReturnGlobalObjectAsBase, + GetAndReturnGlobalProperty, + CheckForDynamicEntriesBeforeGlobalScope + } ResolveOperationType; + + ResolveOperationType m_operation; + WriteBarrier<Structure> m_structure; + union { + PropertyOffset m_offset; + WriteBarrier<Unknown>* m_registerAddress; + int m_scopesToSkip; + int m_activationRegister; + }; + static ResolveOperation getAndReturnScopedVar(PropertyOffset offset) + { + ResolveOperation op; + op.m_operation = GetAndReturnScopedVar; + op.m_offset = offset; + return op; + } + static ResolveOperation checkForDynamicEntriesBeforeGlobalScope() + { + ResolveOperation op; + op.m_operation = CheckForDynamicEntriesBeforeGlobalScope; + return op; + } + + static ResolveOperation getAndReturnGlobalVar(WriteBarrier<Unknown>* registerAddress, bool couldBeWatched) + { + ResolveOperation op; + op.m_operation = couldBeWatched ? GetAndReturnGlobalVarWatchable : GetAndReturnGlobalVar; + op.m_registerAddress = registerAddress; + return op; + } + static ResolveOperation getAndReturnGlobalProperty() + { + ResolveOperation op; + op.m_operation = GetAndReturnGlobalProperty; + return op; + } + static ResolveOperation resolveFail() + { + ResolveOperation op; + op.m_operation = Fail; + return op; + } + static ResolveOperation skipTopScopeNode(int activationRegister) + { + ResolveOperation op; + op.m_operation = SkipTopScopeNode; + op.m_activationRegister = activationRegister; + return op; + } + static ResolveOperation skipScopes(int scopesToSkip) + { + ResolveOperation op; + op.m_operation = SkipScopes; + op.m_scopesToSkip = scopesToSkip; + return op; + } + static ResolveOperation returnGlobalObjectAsBase() + { + ResolveOperation op; + op.m_operation = ReturnGlobalObjectAsBase; + return op; + } + static ResolveOperation setBaseToGlobal() + { + ResolveOperation op; + op.m_operation = SetBaseToGlobal; + return op; + } + static ResolveOperation setBaseToUndefined() + { + ResolveOperation op; + op.m_operation = SetBaseToUndefined; + return op; + } + static ResolveOperation setBaseToScope() + { + ResolveOperation op; + op.m_operation = SetBaseToScope; + return op; + } + static ResolveOperation returnScopeAsBase() + { + ResolveOperation op; + op.m_operation = ReturnScopeAsBase; + return op; + } +}; + +typedef Vector<ResolveOperation> ResolveOperations; + +struct PutToBaseOperation { + PutToBaseOperation(bool isStrict) + : m_kind(Uninitialised) + , m_isDynamic(false) + , m_isStrict(isStrict) + , m_predicatePointer(0) + { + + } + enum Kind { Uninitialised, Generic, Readonly, GlobalVariablePut, GlobalVariablePutChecked, GlobalPropertyPut, VariablePut }; + union { + Kind m_kind : 8; + uint8_t m_kindAsUint8; + }; + bool m_isDynamic : 8; + bool m_isStrict : 8; + union { + bool* m_predicatePointer; + unsigned m_scopeDepth; + }; + WriteBarrier<Structure> m_structure; + union { + // Used for GlobalVariablePut + WriteBarrier<Unknown>* m_registerAddress; + + // Used for GlobalPropertyPut and VariablePut + struct { + PropertyOffset m_offset; + int32_t m_offsetInButterfly; + }; + }; +}; +} + +#endif // ResolveOperation_h |