From 854258dc11a9d6caa82980d8efe1ab995961622f Mon Sep 17 00:00:00 2001 From: Luis Michaelis Date: Sat, 5 Aug 2023 16:58:51 +0200 Subject: [PATCH] feat(PxDaedalusScript): add additional symbol APIs --- include/phoenix/cffi/DaedalusScript.h | 51 ++++++++++++++++++ include/phoenix/cffi/Vm.h | 6 --- src/DaedalusScript.cc | 78 +++++++++++++++++++++++++++ src/Vm.cc | 16 ------ vendor/phoenix | 2 +- 5 files changed, 130 insertions(+), 23 deletions(-) diff --git a/include/phoenix/cffi/DaedalusScript.h b/include/phoenix/cffi/DaedalusScript.h index c2630c3..6129a72 100644 --- a/include/phoenix/cffi/DaedalusScript.h +++ b/include/phoenix/cffi/DaedalusScript.h @@ -16,10 +16,61 @@ typedef struct PxInternal_DaedalusScript PxDaedalusScript; typedef struct PxInternal_DaedalusSymbol PxDaedalusSymbol; #endif +typedef enum { + PxDaedalusSymbolType_Void = 0U, + PxDaedalusSymbolType_Float = 1U, + PxDaedalusSymbolType_Int = 2U, + PxDaedalusSymbolType_String = 3U, + PxDaedalusSymbolType_Class = 4U, + PxDaedalusSymbolType_Function = 5U, + PxDaedalusSymbolType_Prototype = 6U, + PxDaedalusSymbolType_Instance = 7U, +} PxDaedalusSymbolType; + +typedef struct { + char const* name; + PxBool const_; + PxBool member; + PxBool external; + PxBool merged; + PxBool generated; + PxBool return_; + + uint32_t address; + uint32_t parent; + uint32_t count; + uint32_t index; + + PxDaedalusSymbolType type; + PxDaedalusSymbolType return_type; +} PxDaedalusSymbolInfo; + +typedef struct { + int code; + int32_t p1; + uint8_t p2; +} PxDaedalusInstruction; + +typedef PxBool (*PxDaedalusEnumerateCallback)(PxDaedalusScript const*, PxDaedalusSymbol const*); + // TODO PXC_API PxDaedalusScript* pxScriptLoad(PxBuffer* buffer); PXC_API PxDaedalusScript* pxScriptLoadFromVfs(PxVfs const* vfs, char const* name); PXC_API void pxScriptDestroy(PxDaedalusScript* scr); PXC_API PxDaedalusSymbol const* pxScriptGetSymbolById(PxDaedalusScript const* scr, uint32_t id); +PXC_API PxDaedalusSymbol const* pxScriptGetSymbolByAddress(PxDaedalusScript const* scr, uint32_t address); PXC_API PxDaedalusSymbol const* pxScriptGetSymbolByName(PxDaedalusScript const* scr, char const* name); + +PXC_API uint8_t pxScriptGetInstruction(PxDaedalusScript const* scr, uint32_t ip, PxDaedalusInstruction* info); + +PXC_API size_t pxScriptGetSymbolCount(PxDaedalusScript const* scr); +PXC_API void pxScriptEnumerateSymbols(PxDaedalusScript const* scr, PxDaedalusEnumerateCallback cb); + +PXC_API size_t pxScriptSymbolGetId(PxDaedalusSymbol const* sym); +PXC_API char const* pxScriptSymbolGetName(PxDaedalusSymbol const* sym); +PXC_API void pxScriptSymbolGetInfo(PxDaedalusSymbol const* sym, PxDaedalusSymbolInfo* info); + +PXC_API int pxScriptSymbolGetInt(PxDaedalusSymbol const* sym, size_t index); +PXC_API float pxScriptSymbolGetFloat(PxDaedalusSymbol const* sym, size_t index); +PXC_API char const* pxScriptSymbolGetString(PxDaedalusSymbol const* sym, size_t index); diff --git a/include/phoenix/cffi/Vm.h b/include/phoenix/cffi/Vm.h index 2609182..7587bb3 100644 --- a/include/phoenix/cffi/Vm.h +++ b/include/phoenix/cffi/Vm.h @@ -10,11 +10,9 @@ #ifdef __cplusplus #include typedef struct PxInternal_Vm PxVm; -typedef phoenix::symbol PxVmSymbol; typedef phoenix::instance PxVmInstance; #else typedef struct PxInternal_Vm PxVm; -typedef struct PxInternal_VmSymbol PxVmSymbol; typedef struct PxInternal_VmInstance PxVmInstance; #endif @@ -61,10 +59,6 @@ PXC_API PxVmInstance* pxVmSetGlobalItem(PxVm* vm, PxVmInstance* instance); PXC_API PxBool pxVmCallFunction(PxVm* vm, char const* func, ...); PXC_API PxBool pxVmCallFunctionByIndex(PxVm* vm, uint32_t index, char const* args, ...); -PXC_API PxVmSymbol* pxVmGetSymbolByIndex(PxVm* vm, uint32_t index); -PXC_API PxVmSymbol* pxVmGetSymbolByName(PxVm* vm, char const* name); -PXC_API uint32_t pxVmSymbolGetId(PxVmSymbol* symbol); -PXC_API char const* pxVmSymbolGetName(PxVmSymbol* symbol); PXC_API PxVmInstance* pxVmInstanceAllocateByIndex(PxVm* vm, uint32_t index, PxVmInstanceType type); PXC_API PxVmInstance* pxVmInstanceAllocateByName(PxVm* vm, char const* name, PxVmInstanceType type); PXC_API PxVmInstance* diff --git a/src/DaedalusScript.cc b/src/DaedalusScript.cc index 5013539..4b2169f 100644 --- a/src/DaedalusScript.cc +++ b/src/DaedalusScript.cc @@ -37,6 +37,84 @@ PxDaedalusSymbol const* pxScriptGetSymbolById(PxDaedalusScript const* scr, uint3 return scr->find_symbol_by_index(id); } +PxDaedalusSymbol const* pxScriptGetSymbolByAddress(PxDaedalusScript const* scr, uint32_t address) { + return scr->find_symbol_by_address(address); +} + PxDaedalusSymbol const* pxScriptGetSymbolByName(PxDaedalusScript const* scr, char const* name) { return scr->find_symbol_by_name(name); } + +uint8_t pxScriptGetInstruction(PxDaedalusScript const* scr, uint32_t ip, PxDaedalusInstruction* info) { + auto i = scr->instruction_at(ip); + info->code = static_cast(i.op); + + switch (i.op) { + case phoenix::opcode::bl: + case phoenix::opcode::bz: + case phoenix::opcode::b: + info->p1 = static_cast(i.address); + return 5; + case phoenix::opcode::pushi: + info->p1 = i.immediate; + return 5; + case phoenix::opcode::be: + case phoenix::opcode::pushv: + case phoenix::opcode::pushvi: + case phoenix::opcode::gmovi: + info->p1 = static_cast(i.symbol); + return 5; + case phoenix::opcode::pushvv: + info->p1 = static_cast(i.symbol); + info->p2 = i.index; + return 6; + default: + return 1; + } +} + +size_t pxScriptGetSymbolCount(PxDaedalusScript const* scr) { + return scr->symbols().size(); +} + +void pxScriptEnumerateSymbols(PxDaedalusScript const* scr, PxDaedalusEnumerateCallback cb) { + for (auto& sym : scr->symbols()) { + if (!cb(scr, &sym)) break; + } +} + +size_t pxScriptSymbolGetId(PxDaedalusSymbol const* sym) { + return sym->index(); +} + +char const* pxScriptSymbolGetName(PxDaedalusSymbol const* sym) { + return sym->name().c_str(); +} + +void pxScriptSymbolGetInfo(PxDaedalusSymbol const* sym, PxDaedalusSymbolInfo* info) { + info->name = sym->name().c_str(); + info->const_ = sym->is_const(); + info->member = sym->is_member(); + info->external = sym->is_external(); + info->merged = sym->is_merged(); + info->generated = sym->is_generated(); + info->return_ = sym->has_return(); + info->address = sym->address(); + info->parent = sym->parent(); + info->count = sym->count(); + info->index = sym->index(); + info->type = static_cast(sym->type()); + info->return_type = static_cast(sym->rtype()); +} + +int pxScriptSymbolGetInt(PxDaedalusSymbol const* sym, size_t index) { + return sym->get_int(index); +} + +float pxScriptSymbolGetFloat(PxDaedalusSymbol const* sym, size_t index) { + return sym->get_float(index); +} + +char const* pxScriptSymbolGetString(PxDaedalusSymbol const* sym, size_t index) { + return sym->get_string(index).c_str(); +} diff --git a/src/Vm.cc b/src/Vm.cc index 1d8f070..47cff05 100644 --- a/src/Vm.cc +++ b/src/Vm.cc @@ -362,22 +362,6 @@ static PxVmInstance* pxInternalVmInstanceAllocate(PxVm* vm, phoenix::symbol* sym } } -PxVmSymbol* pxVmGetSymbolByIndex(PxVm* vm, uint32_t index) { - return vm->vm.find_symbol_by_index(index); -} - -PxVmSymbol* pxVmGetSymbolByName(PxVm* vm, char const* name) { - return vm->vm.find_symbol_by_name(name); -} - -uint32_t pxVmSymbolGetId(PxVmSymbol* symbol) { - return symbol->index(); -} - -char const* pxVmSymbolGetName(PxVmSymbol* symbol) { - return symbol->name().c_str(); -} - PxVmInstance* pxVmInstanceAllocateByIndex(PxVm* vm, uint32_t index, PxVmInstanceType type) { auto* sym = vm->vm.find_symbol_by_index(index); if (sym == nullptr) return nullptr; diff --git a/vendor/phoenix b/vendor/phoenix index bcb47c1..e481bca 160000 --- a/vendor/phoenix +++ b/vendor/phoenix @@ -1 +1 @@ -Subproject commit bcb47c1b545962efdc205db9494d1d734d1bed11 +Subproject commit e481bcae32572f3125dfd5a3aeb4ece3f1eff2bd