core/vm/sp_vm_engine.h
author David Anderson <dvander@alliedmods.net>
Mon Jan 01 03:40:29 2007 +0000 (2007-01-01)
changeset 246 e27e6519c856
parent 240 1360e8aa47d7
child 327 e244337a9b38
permissions -rw-r--r--
implemented debugger
dvander@159
     1
#ifndef _INCLUDE_SOURCEPAWN_VM_ENGINE_H_
dvander@159
     2
#define _INCLUDE_SOURCEPAWN_VM_ENGINE_H_
dvander@159
     3
dvander@159
     4
#include "sp_vm_api.h"
dvander@159
     5
dvander@159
     6
namespace SourcePawn
dvander@159
     7
{
dvander@240
     8
	struct TracedCall
dvander@240
     9
	{
dvander@240
    10
		uint32_t cip;
dvander@240
    11
		uint32_t frm;
dvander@240
    12
		sp_context_t *ctx;
dvander@240
    13
		TracedCall *next;
dvander@240
    14
		unsigned int chain;
dvander@240
    15
	};
dvander@240
    16
dvander@240
    17
dvander@240
    18
	class CContextTrace : public IContextTrace
dvander@240
    19
	{
dvander@240
    20
	public:
dvander@246
    21
		CContextTrace(TracedCall *pStart, int error, const char *msg, uint32_t native);
dvander@240
    22
	public:
dvander@240
    23
		virtual int GetErrorCode();
dvander@240
    24
		virtual const char *GetErrorString();
dvander@240
    25
		virtual bool DebugInfoAvailable();
dvander@240
    26
		virtual const char *GetCustomErrorString();
dvander@240
    27
		virtual bool GetTraceInfo(CallStackInfo *trace);
dvander@240
    28
		virtual void ResetTrace();
dvander@246
    29
		virtual const char *GetLastNative(uint32_t *index);
dvander@240
    30
	private:
dvander@240
    31
		TracedCall *m_pStart;
dvander@240
    32
		TracedCall *m_pIterator;
dvander@240
    33
		const char *m_pMsg;
dvander@240
    34
		int m_Error;
dvander@246
    35
		uint32_t m_Native;
dvander@240
    36
	};
dvander@240
    37
dvander@240
    38
dvander@159
    39
	class SourcePawnEngine : public ISourcePawnEngine
dvander@159
    40
	{
dvander@159
    41
	public:
dvander@240
    42
		SourcePawnEngine();
dvander@240
    43
		~SourcePawnEngine();
dvander@240
    44
	public: //ISourcePawnEngine
dvander@159
    45
		sp_plugin_t *LoadFromFilePointer(FILE *fp, int *err);
dvander@240
    46
		sp_plugin_t *LoadFromMemory(void *base, sp_plugin_t *plugin, int *err);
dvander@240
    47
		int FreeFromMemory(sp_plugin_t *plugin);
dvander@240
    48
		IPluginContext *CreateBaseContext(sp_context_t *ctx);
dvander@240
    49
		void FreeBaseContext(IPluginContext *ctx);
dvander@240
    50
		void *BaseAlloc(size_t size);
dvander@240
    51
		void BaseFree(void *memory);
dvander@240
    52
		void *ExecAlloc(size_t size);
dvander@240
    53
		void ExecFree(void *address);
dvander@240
    54
		IDebugListener *SetDebugListener(IDebugListener *pListener);
dvander@240
    55
		unsigned int GetContextCallCount();
dvander@240
    56
	public: //Debugger Stuff
dvander@159
    57
		/**
dvander@240
    58
		 * @brief Pushes a context onto the top of the call tracer.
dvander@240
    59
		 * 
dvander@240
    60
		 * @param ctx		Plugin context.
dvander@159
    61
		 */
dvander@240
    62
		void PushTracer(sp_context_t *ctx);
dvander@159
    63
dvander@159
    64
		/**
dvander@240
    65
		 * @brief Pops a plugin off the call tracer.
dvander@159
    66
		 */
dvander@240
    67
		void PopTracer(int error, const char *msg);
dvander@159
    68
dvander@159
    69
		/**
dvander@240
    70
		 * @brief Runs tracer from a debug break.
dvander@159
    71
		 */
dvander@240
    72
		void RunTracer(sp_context_t *ctx, uint32_t frame, uint32_t codeip);
dvander@240
    73
	private:
dvander@240
    74
		TracedCall *MakeTracedCall(bool new_chain);
dvander@240
    75
		void FreeTracedCall(TracedCall *pCall);
dvander@240
    76
	private:
dvander@240
    77
		IDebugListener *m_pDebugHook;
dvander@240
    78
		TracedCall *m_FreedCalls;
dvander@240
    79
		TracedCall *m_CallStack;
dvander@240
    80
		unsigned int m_CurChain;
dvander@159
    81
	};
dvander@159
    82
};
dvander@159
    83
dvander@159
    84
#endif //_INCLUDE_SOURCEPAWN_VM_ENGINE_H_