core/vm/sp_vm_engine.h
author Scott Ehlert <ds@alliedmods.net>
Sun Mar 30 07:00:22 2008 +0000 (2008-03-30)
changeset 1952 b7aa2b626807
permissions -rw-r--r--
Spring Cleaning, Part Ichi (1)
Various minor things done to project files
Updated sample extension project file and updated makefile to the new unified version (more changes likely on the way)
Updated regex project file and makefile
ds@1952
     1
/**
ds@1952
     2
 * vim: set ts=4 :
ds@1952
     3
 * =============================================================================
ds@1952
     4
 * SourcePawn
ds@1952
     5
 * Copyright (C) 2004-2008 AlliedModders LLC.  All rights reserved.
ds@1952
     6
 * =============================================================================
ds@1952
     7
 *
ds@1952
     8
 * This program is free software; you can redistribute it and/or modify it under
ds@1952
     9
 * the terms of the GNU General Public License, version 3.0, as published by the
ds@1952
    10
 * Free Software Foundation.
ds@1952
    11
 * 
ds@1952
    12
 * This program is distributed in the hope that it will be useful, but WITHOUT
ds@1952
    13
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
ds@1952
    14
 * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
ds@1952
    15
 * details.
ds@1952
    16
 *
ds@1952
    17
 * You should have received a copy of the GNU General Public License along with
ds@1952
    18
 * this program.  If not, see <http://www.gnu.org/licenses/>.
ds@1952
    19
 *
ds@1952
    20
 * As a special exception, AlliedModders LLC gives you permission to link the
ds@1952
    21
 * code of this program (as well as its derivative works) to "Half-Life 2," the
ds@1952
    22
 * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
ds@1952
    23
 * by the Valve Corporation.  You must obey the GNU General Public License in
ds@1952
    24
 * all respects for all other code used.  Additionally, AlliedModders LLC grants
ds@1952
    25
 * this exception to all derivative works.  AlliedModders LLC defines further
ds@1952
    26
 * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
ds@1952
    27
 * or <http://www.sourcemod.net/license.php>.
ds@1952
    28
 *
ds@1952
    29
 * Version: $Id$
ds@1952
    30
 */
ds@1952
    31
ds@1952
    32
#ifndef _INCLUDE_SOURCEPAWN_VM_ENGINE_H_
ds@1952
    33
#define _INCLUDE_SOURCEPAWN_VM_ENGINE_H_
ds@1952
    34
ds@1952
    35
#include "sp_vm_api.h"
ds@1952
    36
#include "sp_vm_function.h"
ds@1952
    37
ds@1952
    38
struct TracedCall
ds@1952
    39
{
ds@1952
    40
	uint32_t cip;
ds@1952
    41
	uint32_t frm;
ds@1952
    42
	sp_context_t *ctx;
ds@1952
    43
	TracedCall *next;
ds@1952
    44
	unsigned int chain;
ds@1952
    45
};
ds@1952
    46
ds@1952
    47
class CContextTrace : public IContextTrace
ds@1952
    48
{
ds@1952
    49
public:
ds@1952
    50
	CContextTrace(TracedCall *pStart, int error, const char *msg, uint32_t native);
ds@1952
    51
public:
ds@1952
    52
	int GetErrorCode();
ds@1952
    53
	const char *GetErrorString();
ds@1952
    54
	bool DebugInfoAvailable();
ds@1952
    55
	const char *GetCustomErrorString();
ds@1952
    56
	bool GetTraceInfo(CallStackInfo *trace);
ds@1952
    57
	void ResetTrace();
ds@1952
    58
	const char *GetLastNative(uint32_t *index);
ds@1952
    59
private:
ds@1952
    60
	int m_Error;
ds@1952
    61
	const char *m_pMsg;
ds@1952
    62
	TracedCall *m_pStart;
ds@1952
    63
	TracedCall *m_pIterator;
ds@1952
    64
	uint32_t m_Native;
ds@1952
    65
};
ds@1952
    66
ds@1952
    67
class SourcePawnEngine : public ISourcePawnEngine
ds@1952
    68
{
ds@1952
    69
public:
ds@1952
    70
	SourcePawnEngine();
ds@1952
    71
	~SourcePawnEngine();
ds@1952
    72
public: //ISourcePawnEngine
ds@1952
    73
	sp_plugin_t *LoadFromFilePointer(FILE *fp, int *err);
ds@1952
    74
	sp_plugin_t *LoadFromMemory(void *base, sp_plugin_t *plugin, int *err);
ds@1952
    75
	int FreeFromMemory(sp_plugin_t *plugin);
ds@1952
    76
	IPluginContext *CreateBaseContext(sp_context_t *ctx);
ds@1952
    77
	void FreeBaseContext(IPluginContext *ctx);
ds@1952
    78
	void *BaseAlloc(size_t size);
ds@1952
    79
	void BaseFree(void *memory);
ds@1952
    80
	void *ExecAlloc(size_t size);
ds@1952
    81
	void ExecFree(void *address);
ds@1952
    82
	IDebugListener *SetDebugListener(IDebugListener *pListener);
ds@1952
    83
	unsigned int GetContextCallCount();
ds@1952
    84
	unsigned int GetEngineAPIVersion();
ds@1952
    85
	void *AllocatePageMemory(size_t size);
ds@1952
    86
	void SetReadWrite(void *ptr);
ds@1952
    87
	void SetReadExecute(void *ptr);
ds@1952
    88
	void FreePageMemory(void *ptr);
ds@1952
    89
public: //Debugger Stuff
ds@1952
    90
	/**
ds@1952
    91
	 * @brief Pushes a context onto the top of the call tracer.
ds@1952
    92
	 * 
ds@1952
    93
	 * @param ctx		Plugin context.
ds@1952
    94
	 */
ds@1952
    95
	void PushTracer(sp_context_t *ctx);
ds@1952
    96
ds@1952
    97
	/**
ds@1952
    98
	 * @brief Pops a plugin off the call tracer.
ds@1952
    99
	 */
ds@1952
   100
	void PopTracer(int error, const char *msg);
ds@1952
   101
ds@1952
   102
	/**
ds@1952
   103
	 * @brief Runs tracer from a debug break.
ds@1952
   104
	 */
ds@1952
   105
	void RunTracer(sp_context_t *ctx, uint32_t frame, uint32_t codeip);
ds@1952
   106
public: //Plugin function stuff
ds@1952
   107
	CFunction *GetFunctionFromPool(funcid_t f, IPluginContext  *plugin);
ds@1952
   108
	void ReleaseFunctionToPool(CFunction *func);
ds@1952
   109
private:
ds@1952
   110
	TracedCall *MakeTracedCall(bool new_chain);
ds@1952
   111
	void FreeTracedCall(TracedCall *pCall);
ds@1952
   112
private:
ds@1952
   113
	IDebugListener *m_pDebugHook;
ds@1952
   114
	TracedCall *m_FreedCalls;
ds@1952
   115
	TracedCall *m_CallStack;
ds@1952
   116
	unsigned int m_CurChain;
ds@1952
   117
	//CFunction *m_pFreeFuncs;
ds@1952
   118
};
ds@1952
   119
ds@1952
   120
#endif //_INCLUDE_SOURCEPAWN_VM_ENGINE_H_