Skip to content
This repository has been archived by the owner on Jan 12, 2024. It is now read-only.

Commit

Permalink
feat(PxDaedalusScript): add additional symbol APIs
Browse files Browse the repository at this point in the history
  • Loading branch information
lmichaelis committed Aug 5, 2023
1 parent b2af7fc commit 854258d
Show file tree
Hide file tree
Showing 5 changed files with 130 additions and 23 deletions.
51 changes: 51 additions & 0 deletions include/phoenix/cffi/DaedalusScript.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
6 changes: 0 additions & 6 deletions include/phoenix/cffi/Vm.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,9 @@
#ifdef __cplusplus
#include <phoenix/vm.hh>
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

Expand Down Expand Up @@ -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*
Expand Down
78 changes: 78 additions & 0 deletions src/DaedalusScript.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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<int>(i.op);

switch (i.op) {
case phoenix::opcode::bl:
case phoenix::opcode::bz:
case phoenix::opcode::b:
info->p1 = static_cast<int32_t>(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<int32_t>(i.symbol);
return 5;
case phoenix::opcode::pushvv:
info->p1 = static_cast<int32_t>(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<PxDaedalusSymbolType>(sym->type());
info->return_type = static_cast<PxDaedalusSymbolType>(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();
}
16 changes: 0 additions & 16 deletions src/Vm.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
2 changes: 1 addition & 1 deletion vendor/phoenix

0 comments on commit 854258d

Please sign in to comment.