summaryrefslogtreecommitdiff
path: root/Source/JavaScriptCore/wasm/WASMFunctionSyntaxChecker.h
diff options
context:
space:
mode:
authorKonstantin Tokarev <annulen@yandex.ru>2016-08-25 19:20:41 +0300
committerKonstantin Tokarev <annulen@yandex.ru>2017-02-02 12:30:55 +0000
commit6882a04fb36642862b11efe514251d32070c3d65 (patch)
treeb7959826000b061fd5ccc7512035c7478742f7b0 /Source/JavaScriptCore/wasm/WASMFunctionSyntaxChecker.h
parentab6df191029eeeb0b0f16f127d553265659f739e (diff)
downloadqtwebkit-6882a04fb36642862b11efe514251d32070c3d65.tar.gz
Imported QtWebKit TP3 (git b57bc6801f1876c3220d5a4bfea33d620d477443)
Change-Id: I3b1d8a2808782c9f34d50240000e20cb38d3680f Reviewed-by: Konstantin Tokarev <annulen@yandex.ru>
Diffstat (limited to 'Source/JavaScriptCore/wasm/WASMFunctionSyntaxChecker.h')
-rw-r--r--Source/JavaScriptCore/wasm/WASMFunctionSyntaxChecker.h287
1 files changed, 287 insertions, 0 deletions
diff --git a/Source/JavaScriptCore/wasm/WASMFunctionSyntaxChecker.h b/Source/JavaScriptCore/wasm/WASMFunctionSyntaxChecker.h
new file mode 100644
index 000000000..edfe42808
--- /dev/null
+++ b/Source/JavaScriptCore/wasm/WASMFunctionSyntaxChecker.h
@@ -0,0 +1,287 @@
+/*
+ * Copyright (C) 2015 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 WASMFunctionSyntaxChecker_h
+#define WASMFunctionSyntaxChecker_h
+
+#if ENABLE(WEBASSEMBLY)
+
+#define UNUSED 0
+
+namespace JSC {
+
+class WASMFunctionSyntaxChecker {
+public:
+ typedef int Expression;
+ typedef int Statement;
+ typedef int ExpressionList;
+ struct MemoryAddress {
+ MemoryAddress(void*) { }
+ MemoryAddress(int, uint32_t) { }
+ };
+ typedef int JumpTarget;
+ enum class JumpCondition { Zero, NonZero };
+
+ void startFunction(const Vector<WASMType>& arguments, uint32_t numberOfI32LocalVariables, uint32_t numberOfF32LocalVariables, uint32_t numberOfF64LocalVariables)
+ {
+ m_numberOfLocals = arguments.size() + numberOfI32LocalVariables + numberOfF32LocalVariables + numberOfF64LocalVariables;
+ }
+
+ void endFunction()
+ {
+ ASSERT(!m_tempStackTop);
+ }
+
+ int buildSetLocal(WASMOpKind opKind, uint32_t, int, WASMType)
+ {
+ if (opKind == WASMOpKind::Statement)
+ m_tempStackTop--;
+ return UNUSED;
+ }
+
+ int buildSetGlobal(WASMOpKind opKind, uint32_t, int, WASMType)
+ {
+ if (opKind == WASMOpKind::Statement)
+ m_tempStackTop--;
+ return UNUSED;
+ }
+
+ void buildReturn(int, WASMExpressionType returnType)
+ {
+ if (returnType != WASMExpressionType::Void)
+ m_tempStackTop--;
+ }
+
+ int buildImmediateI32(uint32_t)
+ {
+ m_tempStackTop++;
+ updateTempStackHeight();
+ return UNUSED;
+ }
+
+ int buildImmediateF32(float)
+ {
+ m_tempStackTop++;
+ updateTempStackHeight();
+ return UNUSED;
+ }
+
+ int buildImmediateF64(double)
+ {
+ m_tempStackTop++;
+ updateTempStackHeight();
+ return UNUSED;
+ }
+
+ int buildGetLocal(uint32_t, WASMType)
+ {
+ m_tempStackTop++;
+ updateTempStackHeight();
+ return UNUSED;
+ }
+
+ int buildGetGlobal(uint32_t, WASMType)
+ {
+ m_tempStackTop++;
+ updateTempStackHeight();
+ return UNUSED;
+ }
+
+ int buildConvertType(int, WASMExpressionType, WASMExpressionType, WASMTypeConversion)
+ {
+ return UNUSED;
+ }
+
+ int buildLoad(const MemoryAddress&, WASMExpressionType, WASMMemoryType, MemoryAccessConversion)
+ {
+ return UNUSED;
+ }
+
+ int buildStore(WASMOpKind opKind, const MemoryAddress&, WASMExpressionType, WASMMemoryType, int)
+ {
+ m_tempStackTop -= 2;
+ if (opKind == WASMOpKind::Expression)
+ m_tempStackTop++;
+ return UNUSED;
+ }
+
+ int buildUnaryI32(int, WASMOpExpressionI32)
+ {
+ return UNUSED;
+ }
+
+ int buildUnaryF32(int, WASMOpExpressionF32)
+ {
+ return UNUSED;
+ }
+
+ int buildUnaryF64(int, WASMOpExpressionF64)
+ {
+ return UNUSED;
+ }
+
+ int buildBinaryI32(int, int, WASMOpExpressionI32)
+ {
+ m_tempStackTop--;
+ return UNUSED;
+ }
+
+ int buildBinaryF32(int, int, WASMOpExpressionF32)
+ {
+ m_tempStackTop--;
+ return UNUSED;
+ }
+
+ int buildBinaryF64(int, int, WASMOpExpressionF64)
+ {
+ m_tempStackTop--;
+ return UNUSED;
+ }
+
+ int buildRelationalI32(int, int, WASMOpExpressionI32)
+ {
+ m_tempStackTop--;
+ return UNUSED;
+ }
+
+ int buildRelationalF32(int, int, WASMOpExpressionI32)
+ {
+ m_tempStackTop--;
+ return UNUSED;
+ }
+
+ int buildRelationalF64(int, int, WASMOpExpressionI32)
+ {
+ m_tempStackTop--;
+ return UNUSED;
+ }
+
+ int buildMinOrMaxI32(int, int, WASMOpExpressionI32)
+ {
+ m_tempStackTop--;
+ return UNUSED;
+ }
+
+ int buildMinOrMaxF64(int, int, WASMOpExpressionF64)
+ {
+ m_tempStackTop--;
+ return UNUSED;
+ }
+
+ int buildCallInternal(uint32_t, int, const WASMSignature& signature, WASMExpressionType returnType)
+ {
+ size_t argumentCount = signature.arguments.size();
+ updateTempStackHeightForCall(argumentCount);
+ m_tempStackTop -= argumentCount;
+ if (returnType != WASMExpressionType::Void) {
+ m_tempStackTop++;
+ updateTempStackHeight();
+ }
+ return UNUSED;
+ }
+
+ int buildCallImport(uint32_t, int, const WASMSignature& signature, WASMExpressionType returnType)
+ {
+ size_t argumentCount = signature.arguments.size();
+ updateTempStackHeightForCall(argumentCount);
+ m_tempStackTop -= argumentCount;
+ if (returnType != WASMExpressionType::Void) {
+ m_tempStackTop++;
+ updateTempStackHeight();
+ }
+ return UNUSED;
+ }
+
+ int buildCallIndirect(uint32_t, int, int, const WASMSignature& signature, WASMExpressionType returnType)
+ {
+ size_t argumentCount = signature.arguments.size();
+ updateTempStackHeightForCall(argumentCount);
+ m_tempStackTop -= argumentCount + 1;
+ if (returnType != WASMExpressionType::Void)
+ m_tempStackTop++;
+ return UNUSED;
+ }
+
+ void appendExpressionList(int&, int) { }
+
+ void discard(int)
+ {
+ m_tempStackTop--;
+ }
+
+ void linkTarget(const int&) { }
+ void jumpToTarget(const int&) { }
+ void jumpToTargetIf(JumpCondition, int, const int&)
+ {
+ m_tempStackTop--;
+ }
+
+ void startLoop() { }
+ void endLoop() { }
+ void startSwitch() { }
+ void endSwitch() { }
+ void startLabel() { }
+ void endLabel() { }
+
+ int breakTarget() { return UNUSED; }
+ int continueTarget() { return UNUSED; }
+ int breakLabelTarget(uint32_t) { return UNUSED; }
+ int continueLabelTarget(uint32_t) { return UNUSED; }
+
+ void buildSwitch(int, const Vector<int64_t>&, const Vector<int>&, const int&)
+ {
+ m_tempStackTop--;
+ }
+
+ unsigned stackHeight()
+ {
+ return m_numberOfLocals + m_tempStackHeight;
+ }
+
+private:
+ void updateTempStackHeight()
+ {
+ if (m_tempStackTop > m_tempStackHeight)
+ m_tempStackHeight = m_tempStackTop;
+ }
+
+ void updateTempStackHeightForCall(size_t argumentCount)
+ {
+ // Boxed arguments + this argument + call frame header + maximum padding.
+ m_tempStackTop += argumentCount + 1 + JSStack::CallFrameHeaderSize + 1;
+ updateTempStackHeight();
+ m_tempStackTop -= argumentCount + 1 + JSStack::CallFrameHeaderSize + 1;
+ }
+
+ unsigned m_numberOfLocals;
+ unsigned m_tempStackTop { 0 };
+ unsigned m_tempStackHeight { 0 };
+};
+
+} // namespace JSC
+
+#endif // ENABLE(WEBASSEMBLY)
+
+#endif // WASMFunctionSyntaxChecker_h