]> git.saurik.com Git - apple/javascriptcore.git/blobdiff - bytecode/ResolveOperation.h
JavaScriptCore-1218.tar.gz
[apple/javascriptcore.git] / bytecode / ResolveOperation.h
diff --git a/bytecode/ResolveOperation.h b/bytecode/ResolveOperation.h
new file mode 100644 (file)
index 0000000..1543ef2
--- /dev/null
@@ -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