00001 #ifndef _INCLUDE_SOURCEPAWN_VM_API_H_
00002 #define _INCLUDE_SOURCEPAWN_VM_API_H_
00003
00004 #include <stdio.h>
00005 #include "sp_vm_types.h"
00006
00007 #define SOURCEPAWN_VM_API_VERSION 1
00008
00009 #if defined SOURCEMOD_BUILD
00010 namespace SourceMod
00011 {
00012 struct IdentityToken_t;
00013 };
00014 #endif
00015
00016 namespace SourcePawn
00017 {
00018 class IVirtualMachine;
00019
00023 class IPluginDebugInfo
00024 {
00025 public:
00032 virtual int LookupFile(ucell_t addr, const char **filename) =0;
00033
00040 virtual int LookupFunction(ucell_t addr, const char **name) =0;
00041
00048 virtual int LookupLine(ucell_t addr, uint32_t *line) =0;
00049 };
00050
00054 class IPluginContext
00055 {
00056 public:
00057 virtual ~IPluginContext() { };
00058 public:
00064 virtual IVirtualMachine *GetVirtualMachine() =0;
00065
00071 virtual sp_context_t *GetContext() =0;
00072
00078 virtual bool IsDebugging() =0;
00079
00087 virtual int SetDebugBreak(SPVM_DEBUGBREAK newpfn, SPVM_DEBUGBREAK *oldpfn) =0;
00088
00094 virtual IPluginDebugInfo *GetDebugInfo() =0;
00095
00104 virtual int HeapAlloc(unsigned int cells, cell_t *local_addr, cell_t **phys_addr) =0;
00105
00114 virtual int HeapPop(cell_t local_addr) =0;
00115
00127 virtual int HeapRelease(cell_t local_addr) =0;
00128
00135 virtual int FindNativeByName(const char *name, uint32_t *index) =0;
00136
00143 virtual int GetNativeByIndex(uint32_t index, sp_native_t **native) =0;
00144
00150 virtual uint32_t GetNativesNum() =0;
00151
00158 virtual int FindPublicByName(const char *name, uint32_t *index) =0;
00159
00166 virtual int GetPublicByIndex(uint32_t index, sp_public_t **publicptr) =0;
00167
00173 virtual uint32_t GetPublicsNum() =0;
00174
00181 virtual int GetPubvarByIndex(uint32_t index, sp_pubvar_t **pubvar) =0;
00182
00189 virtual int FindPubvarByName(const char *name, uint32_t *index) =0;
00190
00198 virtual int GetPubvarAddrs(uint32_t index, cell_t *local_addr, cell_t **phys_addr) =0;
00199
00205 virtual uint32_t GetPubVarsNum() =0;
00206
00213 virtual int LocalToPhysAddr(cell_t local_addr, cell_t **phys_addr) =0;
00214
00221 virtual int LocalToString(cell_t local_addr, char **addr) =0;
00222
00230 virtual int StringToLocal(cell_t local_addr, size_t bytes, const char *source) =0;
00231
00242 virtual int StringToLocalUTF8(cell_t local_addr,
00243 size_t maxbytes,
00244 const char *source,
00245 size_t *wrtnbytes) =0;
00246
00252 virtual int PushCell(cell_t value) =0;
00253
00265 virtual int PushCellArray(cell_t *local_addr, cell_t **phys_addr, cell_t array[], unsigned int numcells) =0;
00266
00276 virtual int PushString(cell_t *local_addr, char **phys_addr, const char *string) =0;
00277
00286 virtual int PushCellsFromArray(cell_t array[], unsigned int numcells) =0;
00287
00297 virtual int BindNatives(sp_nativeinfo_t *natives, unsigned int num, int overwrite) =0;
00298
00306 virtual int BindNative(sp_nativeinfo_t *native) =0;
00307
00313 virtual int BindNativeToAny(SPVM_NATIVE_FUNC native) =0;
00314
00322 virtual int Execute(uint32_t funcid, cell_t *result) =0;
00323
00324
00332 virtual void ThrowNativeErrorEx(int error, const char *msg, ...) =0;
00333
00341 virtual cell_t ThrowNativeError(const char *msg, ...) =0;
00342
00343 #if defined SOURCEMOD_BUILD
00344
00350 virtual SourceMod::IdentityToken_t *GetIdentity() =0;
00351 #endif
00352 };
00353
00354
00358 struct CallStackInfo
00359 {
00360 const char *filename;
00361 unsigned int line;
00362 const char *function;
00363 };
00364
00368 class IContextTrace
00369 {
00370 public:
00376 virtual int GetErrorCode() =0;
00377
00383 virtual const char *GetErrorString() =0;
00384
00390 virtual bool DebugInfoAvailable() =0;
00391
00397 virtual const char *GetCustomErrorString() =0;
00398
00407 virtual bool GetTraceInfo(CallStackInfo *trace) =0;
00408
00412 virtual void ResetTrace() =0;
00413
00421 virtual const char *GetLastNative(uint32_t *index) =0;
00422 };
00423
00424
00428 class IDebugListener
00429 {
00430 public:
00431 virtual void OnContextExecuteError(IPluginContext *ctx, IContextTrace *error) =0;
00432 };
00433
00434
00438 class ISourcePawnEngine
00439 {
00440 public:
00449 virtual sp_plugin_t *LoadFromFilePointer(FILE *fp, int *err) =0;
00450
00460 virtual sp_plugin_t *LoadFromMemory(void *base, sp_plugin_t *plugin, int *err) =0;
00461
00467 virtual int FreeFromMemory(sp_plugin_t *plugin) =0;
00468
00475 virtual void *BaseAlloc(size_t size) =0;
00476
00482 virtual void BaseFree(void *memory) =0;
00483
00490 virtual void *ExecAlloc(size_t size) =0;
00491
00497 virtual void ExecFree(void *address) =0;
00498
00508 virtual IDebugListener *SetDebugListener(IDebugListener *listener) =0;
00509
00515 virtual unsigned int GetContextCallCount() =0;
00516 };
00517
00518
00522 class ICompilation
00523 {
00524 public:
00525 virtual ~ICompilation() { };
00526 };
00527
00528
00532 class IVirtualMachine
00533 {
00534 public:
00538 virtual unsigned int GetAPIVersion() =0;
00539
00543 virtual const char *GetVMName() =0;
00544
00551 virtual ICompilation *StartCompilation(sp_plugin_t *plugin) =0;
00552
00561 virtual bool SetCompilationOption(ICompilation *co, const char *key, const char *val) =0;
00562
00571 virtual sp_context_t *CompileToContext(ICompilation *co, int *err) =0;
00572
00578 virtual void AbortCompilation(ICompilation *co) =0;
00579
00585 virtual void FreeContext(sp_context_t *ctx) =0;
00586
00595 virtual int ContextExecute(sp_context_t *ctx, uint32_t code_addr, cell_t *result) =0;
00596
00605 virtual bool FunctionLookup(const sp_context_t *ctx, uint32_t code_addr, unsigned int *result) =0;
00606
00613 virtual unsigned int FunctionCount(const sp_context_t *ctx) =0;
00614
00620 virtual const char *GetVersionString() =0;
00621
00627 virtual const char *GetCPUOptimizations() =0;
00628 };
00629 };
00630
00631 #endif //_INCLUDE_SOURCEPAWN_VM_API_H_