aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-xmain.py1
-rwxr-xr-xmisc.py47
-rw-r--r--resources/wasm.xml34
3 files changed, 78 insertions, 4 deletions
diff --git a/main.py b/main.py
index 51e1dfe..46d550e 100755
--- a/main.py
+++ b/main.py
@@ -12,6 +12,7 @@ import sys
from text import text
import datetime
import xml.etree.ElementTree
+from misc import *
def SigHandler_SIGINT(signum, frame):
print()
diff --git a/misc.py b/misc.py
new file mode 100755
index 0000000..b7120e2
--- /dev/null
+++ b/misc.py
@@ -0,0 +1,47 @@
+
+def LEB128UnsignedDecode(bytelist):
+ result = 0
+ shift = 0
+ for byte in bytelist:
+ result |= (byte & 0x7f) << shift
+ if (byte & 0x80) == 0:
+ break
+ shift += 7
+ return(result)
+
+def LEB128SignedDecode(bytelist):
+ result = 0
+ shift = 0
+ for byte in bytelist:
+ result |= (byte & 0x7f) << shift
+ last_byte = byte
+ shift += 7
+ if (byte & 0x80) == 0:
+ break
+ if last_byte & 0x40:
+ result |= - (1 << shift)
+ return(result)
+
+def LEB128UnsignedEncode(int_val):
+ if int_val < 0:
+ raise Exception("value must not be negative")
+ elif int_val == 0:
+ return bytes([0])
+ byte_array = bytearray()
+ while int_val:
+ byte = int_val & 0x7f
+ byte_array.append(byte | 0x80)
+ int_val >>= 7
+ byte_array[-1] ^= 0x80
+ return(byte_array)
+
+def LEB128SignedEncode(int_val):
+ byte_array = bytearray()
+ while True:
+ byte = int_val & 0x7f
+ byte_array.append(byte | 0x80)
+ int_val >>= 7
+ if (int_val == 0 and byte&0x40 == 0) or (int_val == -1 and byte&0x40):
+ byte_array[-1] ^= 0x80
+ break
+ return(byte_array)
diff --git a/resources/wasm.xml b/resources/wasm.xml
index f1402bb..f0935c6 100644
--- a/resources/wasm.xml
+++ b/resources/wasm.xml
@@ -3,8 +3,14 @@
<Read>
<Magic_Number size="4"></Magic_Number>
<Version size="4"></Version>
- <Type_Section count="1" type="" isaggregate="true"></Type_Section>
- <Import_Section count="1" type="" isaggregate="true"></Import_Section>
+ <Type_Section count="1" type="" isaggregate="true">
+ <Count name="count" encoding="leb128u" type="uint32" count="1"/>
+ <Type_Section_Entry count="self::Count"/>
+ </Type_Section>
+ <Import_Section count="1" type="" isaggregate="true">
+ <Count name="count" encoding="leb128u" type="uint32" count="1"/>
+ <Entries name="entries" type="self::Import_Section_Entry" count="self::Count"/>
+ </Import_Section>
<Function_Section count="1" type="" isaggregate="true"></Function_Section>
<Table_Section count="1" type="" isaggregate="true"></Table_Section>
<Memory_Section count="1" type="" isaggregate="true"></Memory_Section>
@@ -19,7 +25,7 @@
<Definition>
<Init_Expr name="init_expr_t" isaggregate="true">
<Size name="size" encoding="leb128u" type="varuint32" count="1"></Size>
- <Code name="code" type="char*" coutn="1"></Code>
+ <Code name="code" type="string" coutn="1" size="self::Size"></Code>
</Init_Expr>
<Resizable_Limit name="resizable_limit_t" isaggregate="true">
<Flags name="flags" encoding="leb128u" type="uint8" count="1"></Flags>
@@ -34,8 +40,28 @@
<Element_Type name="element_type" encoding="leb128s" type="int8" count="1"></Element_Type>
<Resizable_Limit count="1"></Resizable_Limit>
</Table_Type>
- <Memory_Type>
+ <Memory_Type name="memory_type_t" isaggregate="true">
<Resizable_Limit count="1"></Resizable_Limit>
</Memory_Type>
+ <Type_Section_Entry name="W_Type_Section_Entry" isaggregate="true">
+ <Form name="form" encoding="leb128s" type="int8" count="1"/>
+ <Param_Count name="param_count" encoding="leb128s" type="uint32" count="1"/>
+ <Param_Types name="param_types" encoding="leb128s" type="int8" count="self::Param_Count"/>
+ <Return_Count name="return_count" encoding="leb128u" type="uint8"/>
+ <Return_Types name="return_types" encoding="leb128s" type="int8"/>
+ </Type_Section_Entry>
+ <Import_Section_Entry name="W_Import_Section_Entry" isaggregate="true">
+ <Module_Length name="module_length" encoding="leb128u" type="uint32" count="1"/>
+ <Module_Str name="module_str" type="string" count="1" size="self::Module_Length"/>
+ <Field_Len name="field_len" encoding="leb128u" type="uint32" couny="1"/>
+ <Field_Str name="field_str" type="string" count="1" size="self::Field_Len"/>
+ <Kind name="kind" encoding="leb128u" type="uint8" count="1"/>
+ <Type name="type" conditional="true" condition="self::Kind">
+ <condition0 encoding="leb128u" type="uint32">0</condition0>
+ <condition1 type="Table_Type">1</condition1>
+ <condition2 type="Memory_Type">2</condition2>
+ <condition3 type="Global_Type">3</condition3>
+ </Type>
+ </Import_Section_Entry>
</Definition>
</wasm:Structure>