summaryrefslogtreecommitdiff
path: root/Source/JavaScriptCore/wasm/generateWasm.py
diff options
context:
space:
mode:
Diffstat (limited to 'Source/JavaScriptCore/wasm/generateWasm.py')
-rwxr-xr-xSource/JavaScriptCore/wasm/generateWasm.py96
1 files changed, 96 insertions, 0 deletions
diff --git a/Source/JavaScriptCore/wasm/generateWasm.py b/Source/JavaScriptCore/wasm/generateWasm.py
new file mode 100755
index 000000000..6e1ddc24b
--- /dev/null
+++ b/Source/JavaScriptCore/wasm/generateWasm.py
@@ -0,0 +1,96 @@
+#! /usr/bin/python
+
+# Copyright (C) 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
+# 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 AND ITS CONTRIBUTORS "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 OR ITS 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.
+
+# This tool has a couple of helpful macros to process Wasm files from the wasm.json.
+
+import json
+import re
+
+class Wasm:
+ def __init__(self, scriptName, jsonPath):
+ wasmFile = open(jsonPath, "r")
+ wasm = json.load(open(jsonPath, "r"))
+ wasmFile.close()
+ for pre in wasm["preamble"]:
+ if pre["name"] == "version":
+ self.expectedVersionNumber = str(pre["value"])
+ self.preamble = wasm["preamble"]
+ self.types = wasm["type"]
+ self.opcodes = wasm["opcode"]
+ self.header = """/*
+ * Copyright (C) 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
+ * 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 AND ITS CONTRIBUTORS "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 OR ITS 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.
+ */
+
+// DO NO EDIT! - This file was generated by """ + scriptName
+
+ def opcodeIterator(self, filter, ret=None):
+ # We need to do this because python is dumb and won't let me use self in the lambda, which is ridiculous.
+ if ret == None:
+ ret = lambda op: {"name": op, "opcode": self.opcodes[op]}
+ for op in self.opcodes.iterkeys():
+ if filter(self.opcodes[op]):
+ yield ret(op)
+
+ def toCpp(self, name):
+ camelCase = re.sub(r'([^a-z0-9].)', lambda c: c.group(0)[1].upper(), name)
+ CamelCase = camelCase[:1].upper() + camelCase[1:]
+ return CamelCase
+
+
+def isNormal(op):
+ return op["category"] == "arithmetic" or op["category"] == "comparison" or op["category"] == "conversion"
+
+
+def isUnary(op):
+ return isNormal(op) and len(op["parameter"]) == 1
+
+
+def isBinary(op):
+ return isNormal(op) and len(op["parameter"]) == 2
+
+
+def isSimple(op):
+ return "b3op" in op