core/vm/sp_vm_engine.h
author Scott Ehlert <ds@alliedmods.net>
Sun Jul 15 08:00:26 2007 +0000 (2007-07-15)
changeset 1116 40cc5e9f0f1b
parent 653 ef60870067ff
child 1147 437e1f00a590
permissions -rw-r--r--
Removed strange debugging code
dvander@371
     1
/**
ds@653
     2
 * vim: set ts=4 :
dvander@371
     3
 * ================================================================
dvander@371
     4
 * SourcePawn (C)2004-2007 AlliedModders LLC.  All rights reserved.
dvander@371
     5
 * ================================================================
dvander@371
     6
 *
dvander@371
     7
 * This file is not open source and may not be copied without explicit
dvander@371
     8
 * written permission of AlliedModders LLC.  This file may not be redistributed 
dvander@371
     9
 * in whole or significant part.
dvander@371
    10
 * For information, see LICENSE.txt or http://www.sourcemod.net/license.php
dvander@371
    11
 *
dvander@371
    12
 * Version: $Id$
dvander@371
    13
 */
dvander@371
    14
dvander@159
    15
#ifndef _INCLUDE_SOURCEPAWN_VM_ENGINE_H_
dvander@159
    16
#define _INCLUDE_SOURCEPAWN_VM_ENGINE_H_
dvander@159
    17
dvander@159
    18
#include "sp_vm_api.h"
dvander@327
    19
#include "sp_vm_function.h"
dvander@159
    20
dvander@327
    21
struct TracedCall
dvander@159
    22
{
dvander@327
    23
	uint32_t cip;
dvander@327
    24
	uint32_t frm;
dvander@327
    25
	sp_context_t *ctx;
dvander@327
    26
	TracedCall *next;
dvander@327
    27
	unsigned int chain;
dvander@327
    28
};
dvander@240
    29
dvander@240
    30
dvander@327
    31
class CContextTrace : public IContextTrace
dvander@327
    32
{
dvander@327
    33
public:
dvander@327
    34
	CContextTrace(TracedCall *pStart, int error, const char *msg, uint32_t native);
dvander@327
    35
public:
faluco@641
    36
	int GetErrorCode();
faluco@641
    37
	const char *GetErrorString();
faluco@641
    38
	bool DebugInfoAvailable();
faluco@641
    39
	const char *GetCustomErrorString();
faluco@641
    40
	bool GetTraceInfo(CallStackInfo *trace);
faluco@641
    41
	void ResetTrace();
faluco@641
    42
	const char *GetLastNative(uint32_t *index);
dvander@327
    43
private:
dvander@351
    44
	int m_Error;
dvander@351
    45
	const char *m_pMsg;
dvander@327
    46
	TracedCall *m_pStart;
dvander@327
    47
	TracedCall *m_pIterator;
dvander@327
    48
	uint32_t m_Native;
dvander@327
    49
};
dvander@240
    50
dvander@327
    51
class SourcePawnEngine : public ISourcePawnEngine
dvander@327
    52
{
dvander@327
    53
public:
dvander@327
    54
	SourcePawnEngine();
dvander@327
    55
	~SourcePawnEngine();
dvander@327
    56
public: //ISourcePawnEngine
dvander@327
    57
	sp_plugin_t *LoadFromFilePointer(FILE *fp, int *err);
dvander@327
    58
	sp_plugin_t *LoadFromMemory(void *base, sp_plugin_t *plugin, int *err);
dvander@327
    59
	int FreeFromMemory(sp_plugin_t *plugin);
dvander@327
    60
	IPluginContext *CreateBaseContext(sp_context_t *ctx);
dvander@327
    61
	void FreeBaseContext(IPluginContext *ctx);
dvander@327
    62
	void *BaseAlloc(size_t size);
dvander@327
    63
	void BaseFree(void *memory);
dvander@327
    64
	void *ExecAlloc(size_t size);
dvander@327
    65
	void ExecFree(void *address);
dvander@327
    66
	IDebugListener *SetDebugListener(IDebugListener *pListener);
dvander@327
    67
	unsigned int GetContextCallCount();
dvander@327
    68
public: //Debugger Stuff
dvander@327
    69
	/**
dvander@327
    70
	 * @brief Pushes a context onto the top of the call tracer.
dvander@327
    71
	 * 
dvander@327
    72
	 * @param ctx		Plugin context.
dvander@327
    73
	 */
dvander@327
    74
	void PushTracer(sp_context_t *ctx);
dvander@159
    75
dvander@327
    76
	/**
dvander@327
    77
	 * @brief Pops a plugin off the call tracer.
dvander@327
    78
	 */
dvander@327
    79
	void PopTracer(int error, const char *msg);
dvander@159
    80
dvander@327
    81
	/**
dvander@327
    82
	 * @brief Runs tracer from a debug break.
dvander@327
    83
	 */
dvander@327
    84
	void RunTracer(sp_context_t *ctx, uint32_t frame, uint32_t codeip);
dvander@327
    85
public: //Plugin function stuff
dvander@327
    86
	CFunction *GetFunctionFromPool(funcid_t f, IPluginContext  *plugin);
dvander@327
    87
	void ReleaseFunctionToPool(CFunction *func);
dvander@327
    88
private:
dvander@327
    89
	TracedCall *MakeTracedCall(bool new_chain);
dvander@327
    90
	void FreeTracedCall(TracedCall *pCall);
dvander@327
    91
private:
dvander@327
    92
	IDebugListener *m_pDebugHook;
dvander@327
    93
	TracedCall *m_FreedCalls;
dvander@327
    94
	TracedCall *m_CallStack;
dvander@327
    95
	unsigned int m_CurChain;
dvander@327
    96
	//CFunction *m_pFreeFuncs;
dvander@159
    97
};
dvander@159
    98
dvander@159
    99
#endif //_INCLUDE_SOURCEPAWN_VM_ENGINE_H_