/**********************************************************************************************************************/ /*first line intentionally left blank.*/ /*wasm interpreter*/ /*Copyright (C) 2018 Farzad Sadeghi This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.*/ /**********************************************************************************************************************/ #ifndef WASM_H #define WASM_H #include //#include #ifdef __cplusplus extern "C" { #endif typedef uint8_t varint1; typedef uint8_t varint7; typedef uint32_t varint32; typedef int8_t varuint1; typedef int8_t varuint7; typedef int32_t varuint32; enum value_type_t { f64_vt = -4, f32_vt, i64_vt, i32_vt }; enum external_kind_t { Function, Table, Memory, Global }; enum type_ctor_t { i32_ctor = -1, i64_ctor = -2, f32_ctor = -3, f64_ctor = -4, anyfunc_ctor = -16, func_ctor = -32, block_type_ctor = -64 }; typedef struct { varuint32 size; char *code; } init_expr_t; typedef struct { varuint1 flags; varuint32 initial; varuint32 maximum; } resizable_limit_t; typedef struct { enum value_type_t value_type; varuint1 mutability; } global_type_t; typedef struct { varint7 element_type; resizable_limit_t *resizable_limit; } table_type_t; typedef struct { resizable_limit_t *resizable_limit; } memory_type_t; // func_type typedef struct { varint7 form; varuint32 param_count; varint7 *param_types; varuint1 return_count; varint7 *return_types; } W_Type_Section_Entry; typedef struct { varuint32 count; W_Type_Section_Entry **entries; } W_Type_Section; typedef struct { varuint32 module_length; char *module_str; varuint32 field_len; char *field_str; enum external_kind_t kind; // based on external_kind it can be 4 different types. thats why im casting to // void*. void *type; } W_Import_Section_Entry; typedef struct { varuint32 count; W_Import_Section_Entry **entries; } W_Import_Section; typedef struct { varuint32 count; // indexes into the type section varuint32 *types; } W_Function_Section; typedef struct W_Table_Section { varuint32 count; table_type_t **entries; } W_Table_Section; typedef struct { varuint32 count; memory_type_t **entries; } W_Memory_Section; typedef struct { global_type_t *type; init_expr_t *init; } W_Global_Entry; typedef struct { varuint32 count; W_Global_Entry **globals; } W_Global_Section; typedef struct { varuint32 field_len; char *field_str; enum external_kind_t kind; varuint32 index; } W_Export_Entry; typedef struct { int count; W_Export_Entry **entries; } W_Export_Section; typedef struct { varuint32 index; } W_Start_Section; typedef struct { varuint32 index; init_expr_t *offset; varuint32 num_length; varuint32 *elems; } W_Elem_Segment; typedef struct { varuint32 count; W_Elem_Segment **entries; } W_Element_Section; typedef struct { varuint32 count; enum value_type_t type; } W_Local_Entry; typedef struct W_Function_Body { varuint32 body_size; varuint32 local_count; W_Local_Entry **locals; char *code; // char end = 0x0b; } W_Function_Body; typedef struct { varuint32 count; W_Function_Body **bodies; } W_Code_Section; typedef struct { varuint32 index; init_expr_t *offset; varuint32 size; char *data; } W_Data_Segment; typedef struct { varuint32 count; W_Data_Segment **entries; } W_Data_Section; #if 0 typedef struct W_Custom_Section {}; typedef struct W_Name_Section {}; typedef struct W_Relocation_Section {}; #endif typedef struct Wasm_Module { W_Type_Section *type_section; W_Import_Section *import_section; W_Function_Section *function_section; W_Table_Section *table_section; W_Memory_Section *memory_section; W_Global_Section *global_section; W_Export_Section *export_section; W_Start_Section *start_section; W_Element_Section *element_section; W_Code_Section *code_section; W_Data_Section *data_section; void **W_Custom_Sections; char *name; } Wasm_Module; // get the raw binary of the wasm module // char* getWRaw(); // get wasm section raw binary by name // char* get_W_Section_Raw(const char* section_name); #ifdef __cplusplus } #endif // end of extern c #endif // end of header guard /**********************************************************************************************************************/ /*last line intentionally left blank.*/