forked from Mirrors/wasm3
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
269 lines
8.4 KiB
C
269 lines
8.4 KiB
C
//
|
|
// m3_env.h
|
|
//
|
|
// Created by Steven Massey on 4/19/19.
|
|
// Copyright © 2019 Steven Massey. All rights reserved.
|
|
//
|
|
|
|
#ifndef m3_env_h
|
|
#define m3_env_h
|
|
|
|
#include "wasm3.h"
|
|
#include "m3_code.h"
|
|
#include "m3_compile.h"
|
|
|
|
d_m3BeginExternC
|
|
|
|
M3Result AllocFuncType (IM3FuncType * o_functionType, u32 i_numTypes);
|
|
bool AreFuncTypesEqual (const IM3FuncType i_typeA, const IM3FuncType i_typeB);
|
|
|
|
|
|
//---------------------------------------------------------------------------------------------------------------------------------
|
|
typedef struct M3Function
|
|
{
|
|
struct M3Module * module;
|
|
|
|
M3ImportInfo import;
|
|
|
|
bytes_t wasm;
|
|
bytes_t wasmEnd;
|
|
|
|
u16 numNames; // maximum of d_m3MaxDuplicateFunctionImpl
|
|
cstr_t names[d_m3MaxDuplicateFunctionImpl];
|
|
|
|
IM3FuncType funcType;
|
|
|
|
pc_t compiled;
|
|
|
|
#if (d_m3EnableCodePageRefCounting)
|
|
IM3CodePage * codePageRefs; // array of all pages used
|
|
u32 numCodePageRefs;
|
|
#endif
|
|
|
|
#if defined(DEBUG)
|
|
u32 hits;
|
|
#endif
|
|
|
|
#if d_m3EnableStrace >= 2
|
|
u16 index;
|
|
#endif
|
|
u16 maxStackSlots;
|
|
|
|
u16 numArgSlots;
|
|
|
|
u16 numLocals; // not including args
|
|
u16 numLocalBytes;
|
|
|
|
void * constants;
|
|
u16 numConstantBytes;
|
|
|
|
bool ownsWasmCode;
|
|
}
|
|
M3Function;
|
|
|
|
void Function_Release (IM3Function i_function);
|
|
void Function_FreeCompiledCode (IM3Function i_function);
|
|
|
|
cstr_t GetFunctionImportModuleName (IM3Function i_function);
|
|
cstr_t * GetFunctionNames (IM3Function i_function, u16 * o_numNames);
|
|
u32 GetFunctionNumArgs (IM3Function i_function);
|
|
u32 GetFunctionNumReturns (IM3Function i_function);
|
|
u8 GetFunctionReturnType (IM3Function i_function, u32 i_index);
|
|
|
|
u32 GetFunctionNumArgsAndLocals (IM3Function i_function);
|
|
|
|
cstr_t SPrintFunctionArgList (IM3Function i_function, m3stack_t i_sp);
|
|
|
|
|
|
//---------------------------------------------------------------------------------------------------------------------------------
|
|
|
|
typedef struct M3MemoryInfo
|
|
{
|
|
u32 initPages;
|
|
u32 maxPages;
|
|
}
|
|
M3MemoryInfo;
|
|
|
|
|
|
typedef struct M3Memory
|
|
{
|
|
M3MemoryHeader * mallocated;
|
|
|
|
u32 numPages;
|
|
u32 maxPages;
|
|
}
|
|
M3Memory;
|
|
|
|
typedef M3Memory * IM3Memory;
|
|
|
|
|
|
//---------------------------------------------------------------------------------------------------------------------------------
|
|
|
|
typedef struct M3DataSegment
|
|
{
|
|
const u8 * initExpr; // wasm code
|
|
const u8 * data;
|
|
|
|
u32 initExprSize;
|
|
u32 memoryRegion;
|
|
u32 size;
|
|
}
|
|
M3DataSegment;
|
|
|
|
|
|
void FreeImportInfo (M3ImportInfo * i_info);
|
|
|
|
//---------------------------------------------------------------------------------------------------------------------------------
|
|
|
|
typedef struct M3Global
|
|
{
|
|
M3ImportInfo import;
|
|
|
|
union
|
|
{
|
|
i64 intValue;
|
|
#if d_m3HasFloat
|
|
f64 f64Value;
|
|
f32 f32Value;
|
|
#endif
|
|
};
|
|
|
|
cstr_t name;
|
|
bytes_t initExpr; // wasm code
|
|
u32 initExprSize;
|
|
u8 type;
|
|
bool imported;
|
|
bool isMutable;
|
|
}
|
|
M3Global;
|
|
typedef M3Global * IM3Global;
|
|
|
|
|
|
//---------------------------------------------------------------------------------------------------------------------------------
|
|
typedef struct M3Module
|
|
{
|
|
struct M3Runtime * runtime;
|
|
struct M3Environment * environment;
|
|
|
|
bytes_t wasmStart;
|
|
bytes_t wasmEnd;
|
|
|
|
cstr_t name;
|
|
|
|
u32 numFuncTypes;
|
|
IM3FuncType * funcTypes; // array of pointers to list of FuncTypes
|
|
|
|
u32 numImports;
|
|
//IM3Function * imports; b // notice: "I" prefix. imports are pointers to functions in another module.
|
|
|
|
u32 numFunctions;
|
|
M3Function * functions;
|
|
|
|
i32 startFunction;
|
|
|
|
u32 numDataSegments;
|
|
M3DataSegment * dataSegments;
|
|
|
|
//u32 importedGlobals;
|
|
u32 numGlobals;
|
|
M3Global * globals;
|
|
|
|
u32 numElementSegments;
|
|
bytes_t elementSection;
|
|
bytes_t elementSectionEnd;
|
|
|
|
IM3Function * table0;
|
|
u32 table0Size;
|
|
|
|
M3MemoryInfo memoryInfo;
|
|
bool memoryImported;
|
|
|
|
//bool hasWasmCodeCopy;
|
|
|
|
struct M3Module * next;
|
|
}
|
|
M3Module;
|
|
|
|
M3Result Module_AddGlobal (IM3Module io_module, IM3Global * o_global, u8 i_type, bool i_mutable, bool i_isImported);
|
|
|
|
M3Result Module_AddFunction (IM3Module io_module, u32 i_typeIndex, IM3ImportInfo i_importInfo /* can be null */);
|
|
IM3Function Module_GetFunction (IM3Module i_module, u32 i_functionIndex);
|
|
|
|
//---------------------------------------------------------------------------------------------------------------------------------
|
|
|
|
typedef struct M3Environment
|
|
{
|
|
// struct M3Runtime * runtimes;
|
|
|
|
IM3FuncType funcTypes; // linked list
|
|
|
|
IM3FuncType retFuncTypes [c_m3Type_unknown]; // these 'point' to elements in the linked list above.
|
|
// the number of elements must match the basic types as per M3ValueType
|
|
M3CodePage * pagesReleased;
|
|
}
|
|
M3Environment;
|
|
|
|
void Environment_Release (IM3Environment i_environment);
|
|
|
|
// takes ownership of io_funcType and returns a pointer to the persistent version (could be same or different)
|
|
void Environment_AddFuncType (IM3Environment i_environment, IM3FuncType * io_funcType);
|
|
|
|
//---------------------------------------------------------------------------------------------------------------------------------
|
|
|
|
typedef struct M3Runtime
|
|
{
|
|
M3Compilation compilation;
|
|
|
|
IM3Environment environment;
|
|
|
|
M3CodePage * pagesOpen; // linked list of code pages with writable space on them
|
|
M3CodePage * pagesFull; // linked list of at-capacity pages
|
|
|
|
u32 numCodePages;
|
|
u32 numActiveCodePages;
|
|
|
|
IM3Module modules; // linked list of imported modules
|
|
|
|
void * stack;
|
|
u32 stackSize;
|
|
u32 numStackSlots;
|
|
IM3Function lastCalled; // last function that successfully executed
|
|
|
|
void * userdata;
|
|
|
|
M3Memory memory;
|
|
u32 memoryLimit;
|
|
|
|
#if d_m3EnableStrace >= 2
|
|
u32 callDepth;
|
|
#endif
|
|
|
|
M3ErrorInfo error;
|
|
#if d_m3VerboseLogs
|
|
char error_message[256]; // the actual buffer. M3ErrorInfo can point to this
|
|
#endif
|
|
|
|
#if d_m3RecordBacktraces
|
|
M3BacktraceInfo backtrace;
|
|
#endif
|
|
}
|
|
M3Runtime;
|
|
|
|
void InitRuntime (IM3Runtime io_runtime, u32 i_stackSizeInBytes);
|
|
void Runtime_Release (IM3Runtime io_runtime);
|
|
|
|
M3Result ResizeMemory (IM3Runtime io_runtime, u32 i_numPages);
|
|
|
|
typedef void * (* ModuleVisitor) (IM3Module i_module, void * i_info);
|
|
void * ForEachModule (IM3Runtime i_runtime, ModuleVisitor i_visitor, void * i_info);
|
|
|
|
void * v_FindFunction (IM3Module i_module, const char * const i_name);
|
|
|
|
IM3CodePage AcquireCodePage (IM3Runtime io_runtime);
|
|
IM3CodePage AcquireCodePageWithCapacity (IM3Runtime io_runtime, u32 i_lineCount);
|
|
void ReleaseCodePage (IM3Runtime io_runtime, IM3CodePage i_codePage);
|
|
|
|
d_m3EndExternC
|
|
|
|
#endif // m3_env_h
|