219 lines
6.4 KiB
C++
219 lines
6.4 KiB
C++
// vim: set sts=2 ts=8 sw=2 tw=99 et:
|
|
// =============================================================================
|
|
// SourcePawn
|
|
// Copyright (C) 2004-2014 AlliedModders LLC. All rights RESERVED.
|
|
// =============================================================================
|
|
//
|
|
// This program is free software; you can redistribute it and/or modify it under
|
|
// the terms of the GNU General Public License, version 3.0, as published by the
|
|
// Free Software Foundation.
|
|
//
|
|
// This program is distributed in the hope that it will be useful, but WITHOUT
|
|
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
|
// FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
|
|
// details.
|
|
//
|
|
// You should have received a copy of the GNU General Public License along with
|
|
// this program. If not, see <http://www.gnu.org/licenses/>.
|
|
//
|
|
// As a special exception, AlliedModders LLC gives you permission to link the
|
|
// code of this program (as well as its derivative works) to "Half-Life 2," the
|
|
// "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
|
|
// by the Valve Corporation. You must obey the GNU General Public License in
|
|
// all respects for all other code used. Additionally, AlliedModders LLC grants
|
|
// this exception to all derivative works. AlliedModders LLC defines further
|
|
// exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
|
|
// or <http://www.sourcemod.net/license.php>.
|
|
|
|
#ifndef _INCLUDE_SPFILE_HEADERS_v2_H
|
|
#define _INCLUDE_SPFILE_HEADERS_v2_H
|
|
|
|
#include <smx-headers.h>
|
|
|
|
namespace sp {
|
|
|
|
// These structures are byte-packed.
|
|
#if defined __GNUC__
|
|
# pragma pack(1)
|
|
#else
|
|
# pragma pack(push)
|
|
# pragma pack(1)
|
|
#endif
|
|
|
|
// Tables present in smx v2:
|
|
// .names Blob of null-terminated strings.
|
|
// .methods Table of smx_method_t entries.
|
|
// .pcode Blob of smx_pcode_header_t entries.
|
|
// .globals Table of smx_global_var_t entries.
|
|
// .types Blob of type information.
|
|
|
|
// TypeSpec is a variable-length encoding referenced anywhere that "typespec"
|
|
// is specified.
|
|
//
|
|
// Whenever a TypeSpec is referenced from outside the .types table, specifically
|
|
// as a "typeid", it has an encoding to save space: If the id is < 0x20, then
|
|
// the id is a single-byte TypeSpec. Otherwise, the |id - 0x20| is an offset
|
|
// into the .types section.
|
|
enum class TypeSpec : uint8_t
|
|
{
|
|
// The void type is special in that it is not a storable type.
|
|
void_t = 0x0,
|
|
|
|
// Standard C++ datatypes.
|
|
boolean = 0x1,
|
|
RESERVED_int8 = 0x2,
|
|
RESERVED_uint8 = 0x3,
|
|
RESERVED_int16 = 0x4,
|
|
RESERVED_uint16 = 0x5,
|
|
int32 = 0x6,
|
|
RESERVED_uint32 = 0x7,
|
|
RESERVED_int64 = 0x8,
|
|
RESERVED_uint64 = 0x9,
|
|
|
|
// platform-width int and uint.
|
|
RESERVED_intptr = 0xA,
|
|
RESERVED_uintptr = 0xB,
|
|
|
|
float32 = 0xC,
|
|
RESERVED_float64 = 0xD,
|
|
|
|
// char8 is semantically an alias for int8.
|
|
char8 = 0xE,
|
|
|
|
RESERVED_char32 = 0xF, // Full unicode point.
|
|
|
|
RESERVED_string = 0x16, // String reference.
|
|
RESERVED_object = 0x17, // Opaque object reference.
|
|
|
|
// Followed by an int32 index into the .classes table.
|
|
RESERVED_classdef = 0x40,
|
|
|
|
// Followed by an int32 index into the .structs table.
|
|
RESERVED_structdef = 0x41,
|
|
|
|
// Followed by:
|
|
// [int8 formalCount] ; Number of formal parameters, counting varargs.
|
|
// [typespec *formals] ; Sequence of formal parameter specifications.
|
|
//
|
|
// When the type spec is for a method definition (for example, the .method
|
|
// table), then each type in |formals| must begin with "named" (0x7e) or,
|
|
// if it is the last formal, may be "variadic" (0x7a).
|
|
method = 0x50,
|
|
|
|
// Fixed arrays have their size as part of their type, are copied by-value,
|
|
// and passed by-reference.
|
|
//
|
|
// Followed by:
|
|
// typespec type ; Type specification of innermost elements.
|
|
// uint8 rank ; Number of dimensions
|
|
// int32* dims ; One dimension for each rank.
|
|
fixedarray = 0x60,
|
|
|
|
// Arrays are true arrays. They are copied by-reference and passed by-
|
|
// reference.
|
|
//
|
|
// Followed by:
|
|
// typesec type ; Type specification of innermost elements.
|
|
// uint8 rank ; Number of dimensions.
|
|
RESERVED_array = 0x61,
|
|
|
|
// Only legal as the initial byte or byte following "named" (0x7e) in a
|
|
// parameter for a method signature.
|
|
//
|
|
// Followed by a typespec. Only typespecs < 0x60 ar elegal.
|
|
byref = 0x70,
|
|
|
|
// Only legal as the initial byte or byte following "named" (0x7e) in a
|
|
// parameter for a method signature.
|
|
//
|
|
// Followed by a typespec.
|
|
variadic = 0x7A,
|
|
|
|
// Only legal as the initial byte in a parameter or local variable signature.
|
|
//
|
|
// Followed by:
|
|
// uint32 name ; Index into the .names section.
|
|
// typespec type ; Type.
|
|
named = 0x7E,
|
|
|
|
// For readability, this may be emitted at the end of typespec lists. It must
|
|
// not be emitted at the end of nested typespecs.
|
|
terminator = 0x7F
|
|
};
|
|
|
|
// Flags for method definitions.
|
|
enum class MethodFlags : uint32_t
|
|
{
|
|
STATIC = 0x1,
|
|
VARIADIC = 0x2,
|
|
PUBLIC = 0x4,
|
|
NATIVE = 0x8,
|
|
OPTIONAL = 0x10
|
|
};
|
|
|
|
// Specifies an entry in the .methods table.
|
|
struct smx_method_t
|
|
{
|
|
// Offset into the .names section.
|
|
uint32_t name;
|
|
|
|
MethodFlags flags;
|
|
|
|
// Offset into .types, which must point at a TypeSpec::method.
|
|
uint32_t typespec;
|
|
|
|
// Offset into .pcode. If flags contains NATIVE, this must be 0.
|
|
uint32_t address;
|
|
};
|
|
|
|
enum class GlobalVarFlags : uint32_t
|
|
{
|
|
PUBLIC = 0x04,
|
|
CONST = 0x08
|
|
};
|
|
|
|
// Specifies an entry in the .globals table.
|
|
struct smx_global_var_t
|
|
{
|
|
// Offset into the .names section.
|
|
uint32_t name;
|
|
|
|
GlobalVarFlags flags;
|
|
|
|
// TypeId of the global.
|
|
uint32_t type_id;
|
|
};
|
|
|
|
// Specifies the layout we expect at a valid pcode starting position.
|
|
struct smx_pcode_header_t
|
|
{
|
|
// Must be 0.
|
|
uint32_t reserved;
|
|
|
|
// Number of local variables.
|
|
uint16_t nlocals;
|
|
|
|
// Maximum depth of the operand stack.
|
|
uint16_t max_depth;
|
|
|
|
// Pointer to .types section where local information begins.
|
|
uint32_t local_specs;
|
|
|
|
// Number of bytes of pcode in the method.
|
|
uint32_t length;
|
|
};
|
|
|
|
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
// DO NOT DEFINE NEW STRUCTURES BELOW.
|
|
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
|
|
#if defined __GNUC__
|
|
# pragma pack()
|
|
#else
|
|
# pragma pack(pop)
|
|
#endif
|
|
|
|
} // namespace sp
|
|
|
|
#endif // _INCLUDE_SPFILE_HEADERS_v2_H
|