dvander@371: /** ds@653: * vim: set ts=4 : dvander@371: * ================================================================ dvander@371: * SourcePawn (C)2004-2007 AlliedModders LLC. All rights reserved. dvander@371: * ================================================================ dvander@371: * dvander@371: * This file is not open source and may not be copied without explicit dvander@371: * written permission of AlliedModders LLC. This file may not be redistributed dvander@371: * in whole or significant part. dvander@371: * For information, see LICENSE.txt or http://www.sourcemod.net/license.php dvander@371: * dvander@371: * Version: $Id$ dvander@371: */ dvander@371: dvander@159: #ifndef _INCLUDE_SOURCEPAWN_BASECONTEXT_H_ dvander@159: #define _INCLUDE_SOURCEPAWN_BASECONTEXT_H_ dvander@159: dvander@159: #include "sp_vm_api.h" dvander@327: #include "sp_vm_function.h" dvander@327: dvander@327: /** dvander@327: * :TODO: Make functions allocate as a lump instead of individual allocations! dvander@327: */ dvander@159: dvander@159: namespace SourcePawn dvander@159: { dvander@159: class BaseContext : dvander@159: public IPluginContext, dvander@159: public IPluginDebugInfo dvander@159: { dvander@159: public: dvander@159: BaseContext(sp_context_t *ctx); dvander@327: ~BaseContext(); dvander@159: public: //IPluginContext dvander@159: IVirtualMachine *GetVirtualMachine(); dvander@159: sp_context_t *GetContext(); dvander@159: bool IsDebugging(); dvander@159: int SetDebugBreak(SPVM_DEBUGBREAK newpfn, SPVM_DEBUGBREAK *oldpfn); dvander@159: IPluginDebugInfo *GetDebugInfo(); faluco@641: int HeapAlloc(unsigned int cells, cell_t *local_addr, cell_t **phys_addr); faluco@641: int HeapPop(cell_t local_addr); faluco@641: int HeapRelease(cell_t local_addr); faluco@641: int FindNativeByName(const char *name, uint32_t *index); faluco@641: int GetNativeByIndex(uint32_t index, sp_native_t **native); faluco@641: uint32_t GetNativesNum(); faluco@641: int FindPublicByName(const char *name, uint32_t *index); faluco@641: int GetPublicByIndex(uint32_t index, sp_public_t **publicptr); faluco@641: uint32_t GetPublicsNum(); faluco@641: int GetPubvarByIndex(uint32_t index, sp_pubvar_t **pubvar); faluco@641: int FindPubvarByName(const char *name, uint32_t *index); faluco@641: int GetPubvarAddrs(uint32_t index, cell_t *local_addr, cell_t **phys_addr); faluco@641: uint32_t GetPubVarsNum(); faluco@641: int LocalToPhysAddr(cell_t local_addr, cell_t **phys_addr); faluco@641: int LocalToString(cell_t local_addr, char **addr); faluco@641: int StringToLocal(cell_t local_addr, size_t chars, const char *source); faluco@641: int StringToLocalUTF8(cell_t local_addr, size_t maxbytes, const char *source, size_t *wrtnbytes); faluco@641: int PushCell(cell_t value); faluco@641: int PushCellArray(cell_t *local_addr, cell_t **phys_addr, cell_t array[], unsigned int numcells); faluco@641: int PushString(cell_t *local_addr, char **phys_addr, const char *string); faluco@641: int PushCellsFromArray(cell_t array[], unsigned int numcells); faluco@641: int BindNatives(const sp_nativeinfo_t *natives, unsigned int num, int overwrite); faluco@641: int BindNative(const sp_nativeinfo_t *native); faluco@641: int BindNativeToAny(SPVM_NATIVE_FUNC native); faluco@641: int Execute(uint32_t code_addr, cell_t *result); faluco@641: cell_t ThrowNativeErrorEx(int error, const char *msg, ...); faluco@641: cell_t ThrowNativeError(const char *msg, ...); faluco@641: IPluginFunction *GetFunctionByName(const char *public_name); faluco@641: IPluginFunction *GetFunctionById(funcid_t func_id); dvander@262: #if defined SOURCEMOD_BUILD faluco@641: SourceMod::IdentityToken_t *GetIdentity(); dvander@262: void SetIdentity(SourceMod::IdentityToken_t *token); dvander@938: cell_t *GetNullRef(SP_NULL_TYPE type); dvander@1000: int LocalToStringNULL(cell_t local_addr, char **addr); dvander@262: #endif dvander@159: public: //IPluginDebugInfo faluco@641: int LookupFile(ucell_t addr, const char **filename); faluco@641: int LookupFunction(ucell_t addr, const char **name); faluco@641: int LookupLine(ucell_t addr, uint32_t *line); faluco@290: public: faluco@290: void SetContext(sp_context_t *_ctx); dvander@159: private: dvander@240: void SetErrorMessage(const char *msg, va_list ap); dvander@692: void FlushFunctionCache(); dvander@692: void RefreshFunctionCache(); dvander@240: private: dvander@159: sp_context_t *ctx; dvander@262: #if defined SOURCEMOD_BUILD dvander@262: SourceMod::IdentityToken_t *m_pToken; dvander@938: cell_t *m_pNullVec; dvander@1000: cell_t *m_pNullString; dvander@262: #endif dvander@240: char m_MsgCache[1024]; dvander@240: bool m_CustomMsg; dvander@240: bool m_InExec; dvander@327: unsigned int m_funcsnum; dvander@692: #if 0 dvander@327: CFunction **m_priv_funcs; dvander@692: #endif dvander@327: CFunction **m_pub_funcs; dvander@159: }; dvander@159: }; dvander@159: dvander@159: #endif //_INCLUDE_SOURCEPAWN_BASECONTEXT_H_