core/sourcemod.cpp
author David Anderson <dvander@alliedmods.net>
Wed Nov 08 07:32:44 2006 +0000 (2006-11-08)
changeset 160 c056af9b4aaf
child 176 c1699993453c
permissions -rw-r--r--
began JIT integration
dvander@160
     1
#include <stdio.h>
dvander@160
     2
#include "sourcemod.h"
dvander@160
     3
#include "sourcemm_api.h"
dvander@160
     4
#include "systems/LibrarySys.h"
dvander@160
     5
#include "vm/sp_vm_engine.h"
dvander@160
     6
#include <sh_string.h>
dvander@160
     7
dvander@160
     8
SourcePawnEngine g_SourcePawn;
dvander@160
     9
SourceModBase g_SourceMod;
dvander@160
    10
dvander@160
    11
ILibrary *g_pJIT = NULL;
dvander@160
    12
SourceHook::String g_BaseDir;
dvander@160
    13
ISourcePawnEngine *g_pSourcePawn = &g_SourcePawn;
dvander@160
    14
IVirtualMachine *g_pVM;
dvander@160
    15
dvander@160
    16
typedef int (*GIVEENGINEPOINTER)(ISourcePawnEngine *);
dvander@160
    17
typedef unsigned int (*GETEXPORTCOUNT)();
dvander@160
    18
typedef IVirtualMachine *(*GETEXPORT)(unsigned int);
dvander@160
    19
typedef void (*NOTIFYSHUTDOWN)();
dvander@160
    20
dvander@160
    21
void ShutdownJIT()
dvander@160
    22
{
dvander@160
    23
	NOTIFYSHUTDOWN notify = (NOTIFYSHUTDOWN)g_pJIT->GetSymbolAddress("NotifyShutdown");
dvander@160
    24
	if (notify)
dvander@160
    25
	{
dvander@160
    26
		notify();
dvander@160
    27
	}
dvander@160
    28
dvander@160
    29
	g_pJIT->CloseLibrary();
dvander@160
    30
}
dvander@160
    31
dvander@160
    32
bool SourceModBase::InitializeSourceMod(char *error, size_t err_max, bool late)
dvander@160
    33
{
dvander@160
    34
	//:TODO: we need a localinfo system!
dvander@160
    35
	g_BaseDir.assign(g_SMAPI->GetBaseDir());
dvander@160
    36
dvander@160
    37
	/* Attempt to load the JIT! */
dvander@160
    38
	char file[PLATFORM_MAX_PATH];
dvander@160
    39
	char myerror[255];
dvander@160
    40
	g_SMAPI->PathFormat(file, sizeof(file), "%s/addons/sourcemod/bin/sourcepawn.jit.x86.%s",
dvander@160
    41
		g_BaseDir.c_str(),
dvander@160
    42
		PLATFORM_LIB_EXT
dvander@160
    43
		);
dvander@160
    44
dvander@160
    45
	g_pJIT = g_LibSys.OpenLibrary(file, myerror, sizeof(myerror));
dvander@160
    46
	if (!g_pJIT)
dvander@160
    47
	{
dvander@160
    48
		if (error && err_max)
dvander@160
    49
		{
dvander@160
    50
			snprintf(error, err_max, "%s (failed to load bin/sourcepawn.jit.x86.%s)", 
dvander@160
    51
				myerror,
dvander@160
    52
				PLATFORM_LIB_EXT);
dvander@160
    53
		}
dvander@160
    54
		return false;
dvander@160
    55
	}
dvander@160
    56
dvander@160
    57
	int err;
dvander@160
    58
	GIVEENGINEPOINTER jit_init = (GIVEENGINEPOINTER)g_pJIT->GetSymbolAddress("GiveEnginePointer");
dvander@160
    59
	if (!jit_init)
dvander@160
    60
	{
dvander@160
    61
		ShutdownJIT();
dvander@160
    62
		if (error && err_max)
dvander@160
    63
		{
dvander@160
    64
			snprintf(error, err_max, "Failed to find GiveEnginePointer in JIT!");
dvander@160
    65
		}
dvander@160
    66
		return false;
dvander@160
    67
	}
dvander@160
    68
dvander@160
    69
	if ((err=jit_init(g_pSourcePawn)) != 0)
dvander@160
    70
	{
dvander@160
    71
		ShutdownJIT();
dvander@160
    72
		if (error && err_max)
dvander@160
    73
		{
dvander@160
    74
			snprintf(error, err_max, "GiveEnginePointer returned %d in the JIT", err);
dvander@160
    75
		}
dvander@160
    76
		return false;
dvander@160
    77
	}
dvander@160
    78
dvander@160
    79
	GETEXPORTCOUNT jit_getnum = (GETEXPORTCOUNT)g_pJIT->GetSymbolAddress("GetExportCount");
dvander@160
    80
	GETEXPORT jit_get = (GETEXPORT)g_pJIT->GetSymbolAddress("GetExport");
dvander@160
    81
	if (!jit_get)
dvander@160
    82
	{
dvander@160
    83
		ShutdownJIT();
dvander@160
    84
		if (error && err_max)
dvander@160
    85
		{
dvander@160
    86
			snprintf(error, err_max, "JIT is missing a necessary export!");
dvander@160
    87
		}
dvander@160
    88
		return false;
dvander@160
    89
	}
dvander@160
    90
dvander@160
    91
	unsigned int num = jit_getnum();
dvander@160
    92
	if (!num || ((g_pVM=jit_get(0)) == NULL))
dvander@160
    93
	{
dvander@160
    94
		ShutdownJIT();
dvander@160
    95
		if (error && err_max)
dvander@160
    96
		{
dvander@160
    97
			snprintf(error, err_max, "JIT did not export any virtual machines!");
dvander@160
    98
		}
dvander@160
    99
		return false;
dvander@160
   100
	}
dvander@160
   101
dvander@160
   102
	return true;
dvander@160
   103
}