public/sourcepawn/sp_vm_types.h
author David Anderson <dvander@alliedmods.net>
Fri Feb 16 03:47:10 2007 +0000 (2007-02-16)
changeset 501 e209a7296936
parent 381 6cdf2043513c
child 525 d36c45088e36
permissions -rw-r--r--
removed this potential feature, not useful enough
dvander@372
     1
/**
dvander@375
     2
 * vim: set ts=4 :
dvander@372
     3
 * ================================================================
dvander@376
     4
 * SourcePawn, Copyright (C) 2004-2007 AlliedModders LLC. 
dvander@376
     5
 * All rights reserved.
dvander@372
     6
 * ================================================================
dvander@372
     7
 *
dvander@379
     8
 *  This file is part of the SourceMod/SourcePawn SDK.  This file may only be 
dvander@379
     9
 * used or modified under the Terms and Conditions of its License Agreement, 
dvander@379
    10
 * which is found in public/licenses/LICENSE.txt.  As of this notice, derivative 
dvander@379
    11
 * works must be licensed under the GNU General Public License (version 2 or 
dvander@379
    12
 * greater).  A copy of the GPL is included under public/licenses/GPL.txt.
dvander@379
    13
 * 
dvander@379
    14
 * To view the latest information, see: http://www.sourcemod.net/license.php
dvander@372
    15
 *
dvander@372
    16
 * Version: $Id$
dvander@372
    17
 */
dvander@372
    18
dvander@324
    19
#ifndef _INCLUDE_SOURCEPAWN_VM_TYPES_H
dvander@324
    20
#define _INCLUDE_SOURCEPAWN_VM_TYPES_H
dvander@324
    21
dvander@372
    22
/**
dvander@372
    23
 * @file sp_vm_types.h
dvander@372
    24
 * @brief Contains all run-time SourcePawn structures.
dvander@372
    25
 */
dvander@372
    26
dvander@324
    27
#include "sp_file_headers.h"
dvander@324
    28
dvander@372
    29
typedef	uint32_t	ucell_t;			/**< Unsigned 32bit integer */
dvander@372
    30
typedef int32_t		cell_t;				/**< Basic 32bit signed integer type for plugins */
dvander@372
    31
typedef uint32_t	funcid_t;			/**< Function index code */
dvander@324
    32
dvander@324
    33
#include "sp_typeutil.h"
dvander@324
    34
dvander@372
    35
#define SP_MAX_EXEC_PARAMS				32	/**< Maximum number of parameters in a function */
dvander@324
    36
dvander@324
    37
/**
dvander@372
    38
 * @brief Error codes for SourcePawn routines.
dvander@324
    39
 */
dvander@372
    40
#define SP_ERROR_NONE					0	/**< No error occurred */
dvander@372
    41
#define SP_ERROR_FILE_FORMAT			1	/**< File format unrecognized */
dvander@372
    42
#define SP_ERROR_DECOMPRESSOR			2	/**< A decompressor was not found */
dvander@372
    43
#define SP_ERROR_HEAPLOW				3	/**< Not enough space left on the heap */
dvander@372
    44
#define SP_ERROR_PARAM					4	/**< Invalid parameter or parameter type */
dvander@372
    45
#define SP_ERROR_INVALID_ADDRESS		5	/**< A memory address was not valid */
dvander@372
    46
#define SP_ERROR_NOT_FOUND				6	/**< The object in question was not found */
dvander@372
    47
#define SP_ERROR_INDEX					7	/**< Invalid index parameter */
dvander@372
    48
#define SP_ERROR_STACKLOW				8	/**< Nnot enough space left on the stack */
dvander@372
    49
#define SP_ERROR_NOTDEBUGGING			9	/**< Debug mode was not on or debug section not found */
dvander@372
    50
#define SP_ERROR_INVALID_INSTRUCTION	10	/**< Invalid instruction was encountered */
dvander@372
    51
#define SP_ERROR_MEMACCESS				11	/**< Invalid memory access */
dvander@372
    52
#define SP_ERROR_STACKMIN				12	/**< Stack went beyond its minimum value */
dvander@372
    53
#define SP_ERROR_HEAPMIN				13  /**< Heap went beyond its minimum value */
dvander@372
    54
#define SP_ERROR_DIVIDE_BY_ZERO			14	/**< Division by zero */
dvander@372
    55
#define SP_ERROR_ARRAY_BOUNDS			15	/**< Array index is out of bounds */
dvander@372
    56
#define SP_ERROR_INSTRUCTION_PARAM		16	/**< Instruction had an invalid parameter */
dvander@372
    57
#define SP_ERROR_STACKLEAK				17  /**< A native leaked an item on the stack */
dvander@372
    58
#define SP_ERROR_HEAPLEAK				18  /**< A native leaked an item on the heap */
dvander@372
    59
#define SP_ERROR_ARRAY_TOO_BIG			19	/**< A dynamic array is too big */
dvander@372
    60
#define SP_ERROR_TRACKER_BOUNDS			20	/**< Tracker stack is out of bounds */
dvander@372
    61
#define SP_ERROR_INVALID_NATIVE			21	/**< Native was pending or invalid */
dvander@372
    62
#define SP_ERROR_PARAMS_MAX				22	/**< Maximum number of parameters reached */
dvander@372
    63
#define SP_ERROR_NATIVE					23	/**< Error originates from a native */
dvander@372
    64
#define SP_ERROR_NOT_RUNNABLE			24	/**< Function or plugin is not runnable */
dvander@372
    65
//Hey you! Update the string table if you add to the end of me! */
dvander@324
    66
dvander@324
    67
/**********************************************
dvander@324
    68
 *** The following structures are reference structures.
dvander@324
    69
 *** They are not essential to the API, but are used
dvander@324
    70
 ***  to hold the back end database format of the plugin
dvander@324
    71
 ***  binary.
dvander@324
    72
 **********************************************/
dvander@324
    73
dvander@324
    74
/**
dvander@372
    75
 * @brief Information about the core plugin tables.  These may or may not be present!
dvander@324
    76
 */
dvander@324
    77
typedef struct sp_plugin_infotab_s
dvander@324
    78
{
dvander@372
    79
	const char *stringbase;		/**< base of string table */
dvander@372
    80
	uint32_t	publics_num;	/**< number of publics */
dvander@372
    81
	sp_file_publics_t *publics;	/**< public table */
dvander@372
    82
	uint32_t	natives_num;	/**< number of natives */
dvander@372
    83
	sp_file_natives_t *natives; /**< native table */
dvander@372
    84
	uint32_t	pubvars_num;	/**< number of pubvars */
faluco@381
    85
	sp_file_pubvars_t *pubvars;	/**< pubvars table */
dvander@324
    86
} sp_plugin_infotab_t;
dvander@324
    87
dvander@324
    88
/**
dvander@372
    89
 * @brief Information about the plugin's debug tables.  These are all present if one is present.
dvander@324
    90
 */
dvander@324
    91
typedef struct sp_plugin_debug_s
dvander@324
    92
{
dvander@372
    93
	const char *stringbase;		/**< base of string table */
dvander@372
    94
	uint32_t	files_num;		/**< number of files */
dvander@372
    95
	sp_fdbg_file_t *files;		/**< files table */
dvander@372
    96
	uint32_t	lines_num;		/**< number of lines */
dvander@372
    97
	sp_fdbg_line_t *lines;		/**< lines table */
dvander@372
    98
	uint32_t	syms_num;		/**< number of symbols */
dvander@372
    99
	sp_fdbg_symbol_t *symbols;	/**< symbol table */
dvander@324
   100
} sp_plugin_debug_t;
dvander@324
   101
dvander@372
   102
#define SP_FA_SELF_EXTERNAL		(1<<0)		/**< Allocation of structure is external */
dvander@372
   103
#define SP_FA_BASE_EXTERNAL		(1<<1)		/**< Allocation of base is external */
dvander@324
   104
dvander@324
   105
/**
dvander@372
   106
 * @brief The rebased memory format of a plugin.  This differs from the on-disk structure 
dvander@372
   107
 * to ensure that the format is properly read.
dvander@324
   108
 */
dvander@324
   109
typedef struct sp_plugin_s
dvander@324
   110
{
dvander@372
   111
	uint8_t		*base;			/**< Base of memory for this plugin. */
dvander@372
   112
	uint8_t		*pcode;			/**< P-Code of plugin */
dvander@372
   113
	uint32_t	pcode_size;		/**< Size of p-code */
dvander@372
   114
	uint8_t		*data;			/**< Data/memory layout */
dvander@372
   115
	uint32_t	data_size;		/**< Size of data */
dvander@372
   116
	uint32_t	memory;			/**< Required memory space */
dvander@372
   117
	uint16_t	flags;			/**< Code flags */
dvander@372
   118
	uint32_t	allocflags;		/**< Allocation flags */
dvander@372
   119
	sp_plugin_infotab_t info;	/**< Base info table */
dvander@372
   120
	sp_plugin_debug_t   debug;	/**< Debug info table */
dvander@324
   121
} sp_plugin_t;
dvander@324
   122
dvander@324
   123
dvander@324
   124
namespace SourcePawn
dvander@324
   125
{
dvander@324
   126
	class IPluginContext;
dvander@324
   127
	class IVirtualMachine;
dvander@324
   128
};
dvander@324
   129
dvander@324
   130
struct sp_context_s;
dvander@324
   131
dvander@372
   132
/**
dvander@372
   133
 * @brief Native callback prototype, passed a context and a parameter stack (0=count, 1+=args).  
dvander@372
   134
 * A cell must be returned.
dvander@372
   135
 */
dvander@324
   136
typedef cell_t (*SPVM_NATIVE_FUNC)(SourcePawn::IPluginContext *, const cell_t *);
dvander@324
   137
dvander@324
   138
/**********************************************
dvander@324
   139
 *** The following structures are bound to the VM/JIT.
dvander@324
   140
 *** Changing them will result in necessary recompilation.
dvander@324
   141
 **********************************************/
dvander@324
   142
dvander@324
   143
/**
dvander@372
   144
 * @brief Offsets and names to a public function.
dvander@324
   145
 */
dvander@324
   146
typedef struct sp_public_s
dvander@324
   147
{
dvander@372
   148
	funcid_t	funcid;		/**< Encoded function id */
dvander@372
   149
	uint32_t	code_offs;	/**< Relocated code offset */
dvander@372
   150
	const char *name;		/**< Name of function */
dvander@324
   151
} sp_public_t;
dvander@324
   152
dvander@324
   153
/**
dvander@372
   154
 * @brief Offsets and names to public variables.
dvander@372
   155
 *
dvander@372
   156
 * The offset is relocated and the name by default points back to the sp_plugin_infotab_t structure.
dvander@324
   157
 */
dvander@324
   158
typedef struct sp_pubvar_s
dvander@324
   159
{
dvander@372
   160
	cell_t	   *offs;		/**< Pointer to data */
dvander@372
   161
	const char *name;		/**< Name */
dvander@324
   162
} sp_pubvar_t;
dvander@324
   163
dvander@372
   164
#define SP_NATIVE_UNBOUND		(0)		/**< Native is undefined */
dvander@372
   165
#define SP_NATIVE_BOUND			(1)		/**< Native is bound */
dvander@324
   166
dvander@324
   167
/** 
dvander@372
   168
 * @brief Native lookup table, by default names point back to the sp_plugin_infotab_t structure.
dvander@324
   169
 */
dvander@324
   170
typedef struct sp_native_s
dvander@324
   171
{
dvander@372
   172
	SPVM_NATIVE_FUNC	pfn;	/**< Function pointer */
dvander@372
   173
	const char *		name;	/**< Name of function */
dvander@372
   174
	uint32_t			status;	/**< Status flags */
dvander@324
   175
} sp_native_t;
dvander@324
   176
dvander@324
   177
/** 
dvander@372
   178
 * @brief Used for setting natives from modules/host apps.
dvander@324
   179
 */
dvander@324
   180
typedef struct sp_nativeinfo_s
dvander@324
   181
{
dvander@372
   182
	const char		*name;	/**< Name of the native */
dvander@372
   183
	SPVM_NATIVE_FUNC func;	/**< Address of native implementation */
dvander@324
   184
} sp_nativeinfo_t;
dvander@324
   185
dvander@324
   186
/** 
dvander@372
   187
 * @brief Run-time debug file table
dvander@324
   188
 */
dvander@324
   189
typedef struct sp_debug_file_s
dvander@324
   190
{
dvander@372
   191
	uint32_t		addr;	/**< Address into code */
dvander@372
   192
	const char *	name;	/**< Name of file */
dvander@324
   193
} sp_debug_file_t;
dvander@324
   194
dvander@324
   195
/**
dvander@372
   196
 * @brief Contains run-time debug line table.
dvander@324
   197
 */
dvander@324
   198
typedef struct sp_debug_line_s
dvander@324
   199
{
dvander@372
   200
	uint32_t		addr;	/**< Address into code */
dvander@372
   201
	uint32_t		line;	/**< Line number */
dvander@324
   202
} sp_debug_line_t;
dvander@324
   203
dvander@372
   204
/**
dvander@372
   205
 * @brief These structures are equivalent.
dvander@372
   206
 */
dvander@324
   207
typedef sp_fdbg_arraydim_t	sp_debug_arraydim_t;
dvander@324
   208
dvander@324
   209
/**
dvander@372
   210
 * @brief The majority of this struct is already located in the parent 
dvander@372
   211
 * block.  Thus, only the relocated portions are required.
dvander@324
   212
 */
dvander@324
   213
typedef struct sp_debug_symbol_s
dvander@324
   214
{
dvander@372
   215
	uint32_t		codestart;	/**< Relocated code address */
dvander@372
   216
	uint32_t		codeend;	/**< relocated code end address */
dvander@372
   217
	const char *	name;		/**< Relocated name */
dvander@372
   218
	sp_debug_arraydim_t *dims;	/**< Relocated dimension struct, if any */
dvander@372
   219
	sp_fdbg_symbol_t	*sym;	/**< Pointer to original symbol */
dvander@324
   220
} sp_debug_symbol_t;
dvander@324
   221
dvander@324
   222
/**
dvander@324
   223
 * Breaks into a debugger
dvander@324
   224
 * Params:
dvander@324
   225
 *  [0] - plugin context
dvander@324
   226
 *  [1] - frm
dvander@324
   227
 *  [2] - cip
dvander@324
   228
 */
dvander@324
   229
typedef int (*SPVM_DEBUGBREAK)(struct sp_context_s *, uint32_t, uint32_t);
dvander@324
   230
dvander@372
   231
#define SPFLAG_PLUGIN_DEBUG		(1<<0)		/**< plugin is in debug mode */
dvander@324
   232
dvander@324
   233
/**
dvander@372
   234
 * @brief This is the heart of the VM.  It contains all of the runtime 
dvander@372
   235
 * information about a plugin context. Note that user[0..3] can be used for any user based pointers.  
dvander@372
   236
 * However, vm[0..3] should not be touched, as it is reserved for the VM.
dvander@324
   237
 */
dvander@324
   238
typedef struct sp_context_s
dvander@324
   239
{
dvander@372
   240
	void			*codebase;	/**< Base of generated code and memory */
dvander@372
   241
	sp_plugin_t		*plugin;	/**< Pointer back to parent information */
dvander@372
   242
	SourcePawn::IPluginContext *context;	/**< Pointer to IPluginContext */
dvander@372
   243
	SourcePawn::IVirtualMachine *vmbase;	/**< Pointer to IVirtualMachine */
dvander@372
   244
	void			*user[4];	/**< User specific pointers */
dvander@372
   245
	void			*vm[4];		/**< VM specific pointers */
dvander@372
   246
	uint32_t		flags;		/**< Compilation flags */
dvander@372
   247
	SPVM_DEBUGBREAK dbreak;		/**< Debug break function */
dvander@372
   248
	uint8_t			*memory;	/**< Data chunk */
dvander@372
   249
	ucell_t			mem_size;	/**< Total memory size; */
dvander@372
   250
	cell_t			data_size;	/**< Data chunk size, always starts at 0 */
dvander@372
   251
	cell_t			heap_base;	/**< Where the heap starts */
dvander@372
   252
	cell_t			hp;			/**< Heap pointer */
dvander@372
   253
	cell_t			sp;			/**< Stack pointer */
dvander@372
   254
	cell_t			frm;		/**< Frame pointer */
dvander@372
   255
	uint32_t		pushcount;	/**< Push count */
dvander@372
   256
	int32_t			n_err;		/**< Error code set by a native */
dvander@372
   257
	uint32_t		n_idx;		/**< Current native index being executed */
dvander@372
   258
	sp_public_t		*publics;	/**< Public functions table */
dvander@372
   259
	sp_pubvar_t		*pubvars;	/**< Public variables table */
dvander@372
   260
	sp_native_t		*natives;	/**< Natives table */
dvander@372
   261
	sp_debug_file_t	*files;		/**< Files */
dvander@372
   262
	sp_debug_line_t	*lines;		/**< Lines */
dvander@372
   263
	sp_debug_symbol_t *symbols;	/**< Symbols */
dvander@324
   264
} sp_context_t;
dvander@324
   265
dvander@324
   266
#endif //_INCLUDE_SOURCEPAWN_VM_TYPES_H