/**********************************************************************************************************************/
/*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 <inttypes.h>
//#include <Python.h>
#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.*/