dvander@371: /** 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_VM_ENGINE_H_ dvander@159: #define _INCLUDE_SOURCEPAWN_VM_ENGINE_H_ dvander@159: dvander@159: #include "sp_vm_api.h" dvander@327: #include "sp_vm_function.h" dvander@159: dvander@327: struct TracedCall dvander@159: { dvander@327: uint32_t cip; dvander@327: uint32_t frm; dvander@327: sp_context_t *ctx; dvander@327: TracedCall *next; dvander@327: unsigned int chain; dvander@327: }; dvander@240: dvander@240: dvander@327: class CContextTrace : public IContextTrace dvander@327: { dvander@327: public: dvander@327: CContextTrace(TracedCall *pStart, int error, const char *msg, uint32_t native); dvander@327: public: dvander@327: virtual int GetErrorCode(); dvander@327: virtual const char *GetErrorString(); dvander@327: virtual bool DebugInfoAvailable(); dvander@327: virtual const char *GetCustomErrorString(); dvander@327: virtual bool GetTraceInfo(CallStackInfo *trace); dvander@327: virtual void ResetTrace(); dvander@327: virtual const char *GetLastNative(uint32_t *index); dvander@327: private: dvander@351: int m_Error; dvander@351: const char *m_pMsg; dvander@327: TracedCall *m_pStart; dvander@327: TracedCall *m_pIterator; dvander@327: uint32_t m_Native; dvander@327: }; dvander@240: dvander@240: dvander@327: class SourcePawnEngine : public ISourcePawnEngine dvander@327: { dvander@327: public: dvander@327: SourcePawnEngine(); dvander@327: ~SourcePawnEngine(); dvander@327: public: //ISourcePawnEngine dvander@327: sp_plugin_t *LoadFromFilePointer(FILE *fp, int *err); dvander@327: sp_plugin_t *LoadFromMemory(void *base, sp_plugin_t *plugin, int *err); dvander@327: int FreeFromMemory(sp_plugin_t *plugin); dvander@327: IPluginContext *CreateBaseContext(sp_context_t *ctx); dvander@327: void FreeBaseContext(IPluginContext *ctx); dvander@327: void *BaseAlloc(size_t size); dvander@327: void BaseFree(void *memory); dvander@327: void *ExecAlloc(size_t size); dvander@327: void ExecFree(void *address); dvander@327: IDebugListener *SetDebugListener(IDebugListener *pListener); dvander@327: unsigned int GetContextCallCount(); dvander@327: public: //Debugger Stuff dvander@327: /** dvander@327: * @brief Pushes a context onto the top of the call tracer. dvander@327: * dvander@327: * @param ctx Plugin context. dvander@327: */ dvander@327: void PushTracer(sp_context_t *ctx); dvander@159: dvander@327: /** dvander@327: * @brief Pops a plugin off the call tracer. dvander@327: */ dvander@327: void PopTracer(int error, const char *msg); dvander@159: dvander@327: /** dvander@327: * @brief Runs tracer from a debug break. dvander@327: */ dvander@327: void RunTracer(sp_context_t *ctx, uint32_t frame, uint32_t codeip); dvander@327: public: //Plugin function stuff dvander@327: CFunction *GetFunctionFromPool(funcid_t f, IPluginContext *plugin); dvander@327: void ReleaseFunctionToPool(CFunction *func); dvander@327: private: dvander@327: TracedCall *MakeTracedCall(bool new_chain); dvander@327: void FreeTracedCall(TracedCall *pCall); dvander@327: private: dvander@327: IDebugListener *m_pDebugHook; dvander@327: TracedCall *m_FreedCalls; dvander@327: TracedCall *m_CallStack; dvander@327: unsigned int m_CurChain; dvander@327: //CFunction *m_pFreeFuncs; dvander@159: }; dvander@159: dvander@159: #endif //_INCLUDE_SOURCEPAWN_VM_ENGINE_H_