diff --git a/sourcepawn/jit/AMBuilder b/sourcepawn/jit/AMBuilder index e06bab24..903f6195 100644 --- a/sourcepawn/jit/AMBuilder +++ b/sourcepawn/jit/AMBuilder @@ -4,7 +4,6 @@ import os Includes = [ os.path.join(SM.mms_root, 'core', 'sourcehook'), os.path.join(builder.sourcePath, 'sourcepawn', 'jit'), - os.path.join(builder.sourcePath, 'sourcepawn', 'jit', 'x86'), os.path.join(builder.sourcePath, 'public'), os.path.join(builder.sourcePath, 'public', 'sourcepawn'), os.path.join(builder.sourcePath, 'public', 'amtl'), @@ -31,13 +30,12 @@ def setup(binary): # Build the static library. library = setup(builder.compiler.StaticLibrary('sourcepawn')) library.sources += [ + 'api.cpp', 'plugin-runtime.cpp', 'compiled-function.cpp', 'debug-trace.cpp', - 'engine2.cpp', 'environment.cpp', 'sp_vm_basecontext.cpp', - 'sp_vm_engine.cpp', 'scripted-invoker.cpp', 'opcodes.cpp', 'interpreter.cpp', diff --git a/sourcepawn/jit/engine2.cpp b/sourcepawn/jit/api.cpp similarity index 68% rename from sourcepawn/jit/engine2.cpp rename to sourcepawn/jit/api.cpp index c11e7d3e..cfee47ea 100644 --- a/sourcepawn/jit/engine2.cpp +++ b/sourcepawn/jit/api.cpp @@ -1,267 +1,415 @@ -// vim: set sts=2 ts=8 sw=2 tw=99 et: -// -// Copyright (C) 2006-2015 AlliedModders LLC -// -// This file is part of SourcePawn. SourcePawn is free software: you can -// redistribute it and/or modify it under the terms of the GNU General Public -// License as published by the Free Software Foundation, either version 3 of -// the License, or (at your option) any later version. -// -// You should have received a copy of the GNU General Public License along with -// SourcePawn. If not, see http://www.gnu.org/licenses/. -// -#include -#include -#include -#include "engine2.h" -#include "x86/jit_x86.h" -#include "zlib/zlib.h" -#include "plugin-runtime.h" -#include "sp_vm_engine.h" -#include "watchdog_timer.h" -#include -#include "environment.h" - -using namespace SourcePawn; - -SourcePawnEngine2::SourcePawnEngine2() -{ -} - -IPluginRuntime * -SourcePawnEngine2::LoadPlugin(ICompilation *co, const char *file, int *err) -{ - sp_file_hdr_t hdr; - uint8_t *base; - int z_result; - int error; - size_t ignore; - PluginRuntime *pRuntime; - - FILE *fp = fopen(file, "rb"); - - if (!fp) { - error = SP_ERROR_NOT_FOUND; - goto return_error; - } - - /* Rewind for safety */ - ignore = fread(&hdr, sizeof(sp_file_hdr_t), 1, fp); - - if (hdr.magic != SmxConsts::FILE_MAGIC) { - error = SP_ERROR_FILE_FORMAT; - goto return_error; - } - - switch (hdr.compression) - { - case SmxConsts::FILE_COMPRESSION_GZ: - { - uint32_t uncompsize = hdr.imagesize - hdr.dataoffs; - uint32_t compsize = hdr.disksize - hdr.dataoffs; - uint32_t sectsize = hdr.dataoffs - sizeof(sp_file_hdr_t); - uLongf destlen = uncompsize; - - char *tempbuf = (char *)malloc(compsize); - void *uncompdata = malloc(uncompsize); - void *sectheader = malloc(sectsize); - - ignore = fread(sectheader, sectsize, 1, fp); - ignore = fread(tempbuf, compsize, 1, fp); - - z_result = uncompress((Bytef *)uncompdata, &destlen, (Bytef *)tempbuf, compsize); - free(tempbuf); - if (z_result != Z_OK) - { - free(sectheader); - free(uncompdata); - error = SP_ERROR_DECOMPRESSOR; - goto return_error; - } - - base = (uint8_t *)malloc(hdr.imagesize); - memcpy(base, &hdr, sizeof(sp_file_hdr_t)); - memcpy(base + sizeof(sp_file_hdr_t), sectheader, sectsize); - free(sectheader); - memcpy(base + hdr.dataoffs, uncompdata, uncompsize); - free(uncompdata); - break; - } - case SmxConsts::FILE_COMPRESSION_NONE: - { - base = (uint8_t *)malloc(hdr.imagesize); - rewind(fp); - ignore = fread(base, hdr.imagesize, 1, fp); - break; - } - default: - { - error = SP_ERROR_DECOMPRESSOR; - goto return_error; - } - } - - pRuntime = new PluginRuntime(); - if ((error = pRuntime->CreateFromMemory(&hdr, base)) != SP_ERROR_NONE) { - delete pRuntime; - goto return_error; - } - - size_t len; - - len = strlen(file); - for (size_t i = len - 1; i < len; i--) - { - if (file[i] == '/' - #if defined WIN32 - || file[i] == '\\' - #endif - ) - { - pRuntime->SetName(&file[i+1]); - break; - } - } - - (void)ignore; - - if (!pRuntime->plugin()->name) - pRuntime->SetName(file); - - pRuntime->ApplyCompilationOptions(co); - - fclose(fp); - - return pRuntime; - -return_error: - *err = error; - if (fp != NULL) - { - fclose(fp); - } - - return NULL; -} - -SPVM_NATIVE_FUNC -SourcePawnEngine2::CreateFakeNative(SPVM_FAKENATIVE_FUNC callback, void *pData) -{ - return g_Jit.CreateFakeNative(callback, pData); -} - -void -SourcePawnEngine2::DestroyFakeNative(SPVM_NATIVE_FUNC func) -{ - g_Jit.DestroyFakeNative(func); -} - -const char * -SourcePawnEngine2::GetEngineName() -{ - return "SourcePawn 1.7, jit-x86"; -} - -const char * -SourcePawnEngine2::GetVersionString() -{ - return SOURCEMOD_VERSION; -} - -IDebugListener * -SourcePawnEngine2::SetDebugListener(IDebugListener *listener) -{ - IDebugListener *old = Environment::get()->debugger(); - Environment::get()->SetDebugger(listener); - return old; -} - -unsigned int -SourcePawnEngine2::GetAPIVersion() -{ - return SOURCEPAWN_ENGINE2_API_VERSION; -} - -ICompilation * -SourcePawnEngine2::StartCompilation() -{ - return g_Jit.StartCompilation(); -} - -const char * -SourcePawnEngine2::GetErrorString(int err) -{ - return Environment::get()->GetErrorString(err); -} - -bool -SourcePawnEngine2::Initialize() -{ - return true; -} - -void -SourcePawnEngine2::Shutdown() -{ -} - -IPluginRuntime * -SourcePawnEngine2::CreateEmptyRuntime(const char *name, uint32_t memory) -{ - int err; - - PluginRuntime *rt = new PluginRuntime(); - if ((err = rt->CreateBlank(memory)) != SP_ERROR_NONE) { - delete rt; - return NULL; - } - - rt->SetName(name != NULL ? name : ""); - - rt->ApplyCompilationOptions(NULL); - - return rt; -} - -bool -SourcePawnEngine2::InstallWatchdogTimer(size_t timeout_ms) -{ - return Environment::get()->InstallWatchdogTimer(timeout_ms); -} - -bool -SourcePawnEngine2::SetJitEnabled(bool enabled) -{ - Environment::get()->SetJitEnabled(enabled); - return Environment::get()->IsJitEnabled() == enabled; -} - -bool -SourcePawnEngine2::IsJitEnabled() -{ - return Environment::get()->IsJitEnabled(); -} - -void -SourcePawnEngine2::SetProfiler(IProfiler *profiler) -{ - // Deprecated. -} - -void -SourcePawnEngine2::EnableProfiling() -{ - Environment::get()->EnableProfiling(); -} - -void -SourcePawnEngine2::DisableProfiling() -{ - Environment::get()->DisableProfiling(); -} - -void -SourcePawnEngine2::SetProfilingTool(IProfilingTool *tool) -{ - Environment::get()->SetProfiler(tool); -} +// vim: set sts=2 ts=8 sw=2 tw=99 et: +// +// Copyright (C) 2006-2015 AlliedModders LLC +// +// This file is part of SourcePawn. SourcePawn is free software: you can +// redistribute it and/or modify it under the terms of the GNU General Public +// License as published by the Free Software Foundation, either version 3 of +// the License, or (at your option) any later version. +// +// You should have received a copy of the GNU General Public License along with +// SourcePawn. If not, see http://www.gnu.org/licenses/. +// +#include +#include +#include +#include +#include "x86/jit_x86.h" +#include "environment.h" +#include "api.h" +#include "zlib/zlib.h" +#if defined __GNUC__ +#include +#endif + +#if defined WIN32 + #define WIN32_LEAN_AND_MEAN + #include +#elif defined __GNUC__ + #include +#endif + +#if defined __linux__ +#include +#endif + +#include + +using namespace sp; +using namespace SourcePawn; + +// ////// // +// API v1 +// ////// // + +SourcePawnEngine::SourcePawnEngine() +{ +} + +const char * +SourcePawnEngine::GetErrorString(int error) +{ + return Environment::get()->GetErrorString(error); +} + +void * +SourcePawnEngine::ExecAlloc(size_t size) +{ +#if defined WIN32 + return VirtualAlloc(NULL, size, MEM_COMMIT, PAGE_EXECUTE_READWRITE); +#elif defined __GNUC__ +# if defined __APPLE__ + void *base = valloc(size); +# else + void *base = memalign(sysconf(_SC_PAGESIZE), size); +# endif + if (mprotect(base, size, PROT_READ|PROT_WRITE|PROT_EXEC) != 0) { + free(base); + return NULL; + } + return base; +#endif +} + +void * +SourcePawnEngine::AllocatePageMemory(size_t size) +{ + return g_Jit.AllocCode(size); +} + +void +SourcePawnEngine::SetReadExecute(void *ptr) +{ + /* already re */ +} + +void +SourcePawnEngine::SetReadWrite(void *ptr) +{ + /* already rw */ +} + +void +SourcePawnEngine::FreePageMemory(void *ptr) +{ + g_Jit.FreeCode(ptr); +} + +void +SourcePawnEngine::ExecFree(void *address) +{ +#if defined WIN32 + VirtualFree(address, 0, MEM_RELEASE); +#elif defined __GNUC__ + free(address); +#endif +} + +void +SourcePawnEngine::SetReadWriteExecute(void *ptr) +{ + //:TODO: g_ExeMemory.SetRWE(ptr); + SetReadExecute(ptr); +} + +void * +SourcePawnEngine::BaseAlloc(size_t size) +{ + return malloc(size); +} + +void +SourcePawnEngine::BaseFree(void *memory) +{ + free(memory); +} + +sp_plugin_t * +SourcePawnEngine::LoadFromFilePointer(FILE *fp, int *err) +{ + if (err != NULL) + *err = SP_ERROR_ABORTED; + + return NULL; +} + +sp_plugin_t * +SourcePawnEngine::LoadFromMemory(void *base, sp_plugin_t *plugin, int *err) +{ + if (err != NULL) + *err = SP_ERROR_ABORTED; + + return NULL; +} + +int +SourcePawnEngine::FreeFromMemory(sp_plugin_t *plugin) +{ + return SP_ERROR_ABORTED; +} + +IDebugListener * +SourcePawnEngine::SetDebugListener(IDebugListener *pListener) +{ + IDebugListener *old = Environment::get()->debugger(); + Environment::get()->SetDebugger(pListener); + return old; +} + +unsigned int +SourcePawnEngine::GetEngineAPIVersion() +{ + return 4; +} + +unsigned int +SourcePawnEngine::GetContextCallCount() +{ + return 0; +} + +// ////// // +// API v2 +// ////// // + +SourcePawnEngine2::SourcePawnEngine2() +{ +} + +IPluginRuntime * +SourcePawnEngine2::LoadPlugin(ICompilation *co, const char *file, int *err) +{ + sp_file_hdr_t hdr; + uint8_t *base; + int z_result; + int error; + size_t ignore; + PluginRuntime *pRuntime; + + FILE *fp = fopen(file, "rb"); + + if (!fp) { + error = SP_ERROR_NOT_FOUND; + goto return_error; + } + + /* Rewind for safety */ + ignore = fread(&hdr, sizeof(sp_file_hdr_t), 1, fp); + + if (hdr.magic != SmxConsts::FILE_MAGIC) { + error = SP_ERROR_FILE_FORMAT; + goto return_error; + } + + switch (hdr.compression) + { + case SmxConsts::FILE_COMPRESSION_GZ: + { + uint32_t uncompsize = hdr.imagesize - hdr.dataoffs; + uint32_t compsize = hdr.disksize - hdr.dataoffs; + uint32_t sectsize = hdr.dataoffs - sizeof(sp_file_hdr_t); + uLongf destlen = uncompsize; + + char *tempbuf = (char *)malloc(compsize); + void *uncompdata = malloc(uncompsize); + void *sectheader = malloc(sectsize); + + ignore = fread(sectheader, sectsize, 1, fp); + ignore = fread(tempbuf, compsize, 1, fp); + + z_result = uncompress((Bytef *)uncompdata, &destlen, (Bytef *)tempbuf, compsize); + free(tempbuf); + if (z_result != Z_OK) + { + free(sectheader); + free(uncompdata); + error = SP_ERROR_DECOMPRESSOR; + goto return_error; + } + + base = (uint8_t *)malloc(hdr.imagesize); + memcpy(base, &hdr, sizeof(sp_file_hdr_t)); + memcpy(base + sizeof(sp_file_hdr_t), sectheader, sectsize); + free(sectheader); + memcpy(base + hdr.dataoffs, uncompdata, uncompsize); + free(uncompdata); + break; + } + case SmxConsts::FILE_COMPRESSION_NONE: + { + base = (uint8_t *)malloc(hdr.imagesize); + rewind(fp); + ignore = fread(base, hdr.imagesize, 1, fp); + break; + } + default: + { + error = SP_ERROR_DECOMPRESSOR; + goto return_error; + } + } + + pRuntime = new PluginRuntime(); + if ((error = pRuntime->CreateFromMemory(&hdr, base)) != SP_ERROR_NONE) { + delete pRuntime; + goto return_error; + } + + size_t len; + + len = strlen(file); + for (size_t i = len - 1; i < len; i--) + { + if (file[i] == '/' + #if defined WIN32 + || file[i] == '\\' + #endif + ) + { + pRuntime->SetName(&file[i+1]); + break; + } + } + + (void)ignore; + + if (!pRuntime->plugin()->name) + pRuntime->SetName(file); + + pRuntime->ApplyCompilationOptions(co); + + fclose(fp); + + return pRuntime; + +return_error: + *err = error; + if (fp != NULL) + { + fclose(fp); + } + + return NULL; +} + +SPVM_NATIVE_FUNC +SourcePawnEngine2::CreateFakeNative(SPVM_FAKENATIVE_FUNC callback, void *pData) +{ + return g_Jit.CreateFakeNative(callback, pData); +} + +void +SourcePawnEngine2::DestroyFakeNative(SPVM_NATIVE_FUNC func) +{ + g_Jit.DestroyFakeNative(func); +} + +const char * +SourcePawnEngine2::GetEngineName() +{ + return "SourcePawn 1.7, jit-x86"; +} + +const char * +SourcePawnEngine2::GetVersionString() +{ + return SOURCEMOD_VERSION; +} + +IDebugListener * +SourcePawnEngine2::SetDebugListener(IDebugListener *listener) +{ + IDebugListener *old = Environment::get()->debugger(); + Environment::get()->SetDebugger(listener); + return old; +} + +unsigned int +SourcePawnEngine2::GetAPIVersion() +{ + return SOURCEPAWN_ENGINE2_API_VERSION; +} + +ICompilation * +SourcePawnEngine2::StartCompilation() +{ + return g_Jit.StartCompilation(); +} + +const char * +SourcePawnEngine2::GetErrorString(int err) +{ + return Environment::get()->GetErrorString(err); +} + +bool +SourcePawnEngine2::Initialize() +{ + return true; +} + +void +SourcePawnEngine2::Shutdown() +{ +} + +IPluginRuntime * +SourcePawnEngine2::CreateEmptyRuntime(const char *name, uint32_t memory) +{ + int err; + + PluginRuntime *rt = new PluginRuntime(); + if ((err = rt->CreateBlank(memory)) != SP_ERROR_NONE) { + delete rt; + return NULL; + } + + rt->SetName(name != NULL ? name : ""); + + rt->ApplyCompilationOptions(NULL); + + return rt; +} + +bool +SourcePawnEngine2::InstallWatchdogTimer(size_t timeout_ms) +{ + return Environment::get()->InstallWatchdogTimer(timeout_ms); +} + +bool +SourcePawnEngine2::SetJitEnabled(bool enabled) +{ + Environment::get()->SetJitEnabled(enabled); + return Environment::get()->IsJitEnabled() == enabled; +} + +bool +SourcePawnEngine2::IsJitEnabled() +{ + return Environment::get()->IsJitEnabled(); +} + +void +SourcePawnEngine2::SetProfiler(IProfiler *profiler) +{ + // Deprecated. +} + +void +SourcePawnEngine2::EnableProfiling() +{ + Environment::get()->EnableProfiling(); +} + +void +SourcePawnEngine2::DisableProfiling() +{ + Environment::get()->DisableProfiling(); +} + +void +SourcePawnEngine2::SetProfilingTool(IProfilingTool *tool) +{ + Environment::get()->SetProfiler(tool); +} diff --git a/sourcepawn/jit/sp_vm_engine.h b/sourcepawn/jit/api.h similarity index 51% rename from sourcepawn/jit/sp_vm_engine.h rename to sourcepawn/jit/api.h index 7f35f4e3..88fa9688 100644 --- a/sourcepawn/jit/sp_vm_engine.h +++ b/sourcepawn/jit/api.h @@ -1,47 +1,75 @@ -// vim: set sts=2 ts=8 sw=2 tw=99 et: -// -// Copyright (C) 2006-2015 AlliedModders LLC -// -// This file is part of SourcePawn. SourcePawn is free software: you can -// redistribute it and/or modify it under the terms of the GNU General Public -// License as published by the Free Software Foundation, either version 3 of -// the License, or (at your option) any later version. -// -// You should have received a copy of the GNU General Public License along with -// SourcePawn. If not, see http://www.gnu.org/licenses/. -// -#ifndef _INCLUDE_SOURCEPAWN_VM_ENGINE_H_ -#define _INCLUDE_SOURCEPAWN_VM_ENGINE_H_ - -#include -#include // Replace with am-cxx.h later. -#include "scripted-invoker.h" - -class BaseContext; - -class SourcePawnEngine : public ISourcePawnEngine -{ - public: - SourcePawnEngine(); - ~SourcePawnEngine(); - - public: //ISourcePawnEngine - sp_plugin_t *LoadFromFilePointer(FILE *fp, int *err) KE_OVERRIDE; - sp_plugin_t *LoadFromMemory(void *base, sp_plugin_t *plugin, int *err) KE_OVERRIDE; - int FreeFromMemory(sp_plugin_t *plugin) KE_OVERRIDE; - void *BaseAlloc(size_t size) KE_OVERRIDE; - void BaseFree(void *memory) KE_OVERRIDE; - void *ExecAlloc(size_t size) KE_OVERRIDE; - void ExecFree(void *address) KE_OVERRIDE; - IDebugListener *SetDebugListener(IDebugListener *pListener) KE_OVERRIDE; - unsigned int GetContextCallCount() KE_OVERRIDE; - unsigned int GetEngineAPIVersion() KE_OVERRIDE; - void *AllocatePageMemory(size_t size) KE_OVERRIDE; - void SetReadWrite(void *ptr) KE_OVERRIDE; - void SetReadExecute(void *ptr) KE_OVERRIDE; - void FreePageMemory(void *ptr) KE_OVERRIDE; - void SetReadWriteExecute(void *ptr); - const char *GetErrorString(int err); -}; - -#endif //_INCLUDE_SOURCEPAWN_VM_ENGINE_H_ +// vim: set sts=2 ts=8 sw=2 tw=99 et: +// +// Copyright (C) 2006-2015 AlliedModders LLC +// +// This file is part of SourcePawn. SourcePawn is free software: you can +// redistribute it and/or modify it under the terms of the GNU General Public +// License as published by the Free Software Foundation, either version 3 of +// the License, or (at your option) any later version. +// +// You should have received a copy of the GNU General Public License along with +// SourcePawn. If not, see http://www.gnu.org/licenses/. +// +#ifndef _include_sourcepawn_vm_api_h_ +#define _include_sourcepawn_vm_api_h_ + +#include +#include // Replace with am-cxx later. + +namespace sp { + +using namespace SourcePawn; + +class SourcePawnEngine : public ISourcePawnEngine +{ + public: + SourcePawnEngine(); + + sp_plugin_t *LoadFromFilePointer(FILE *fp, int *err) KE_OVERRIDE; + sp_plugin_t *LoadFromMemory(void *base, sp_plugin_t *plugin, int *err) KE_OVERRIDE; + int FreeFromMemory(sp_plugin_t *plugin) KE_OVERRIDE; + void *BaseAlloc(size_t size) KE_OVERRIDE; + void BaseFree(void *memory) KE_OVERRIDE; + void *ExecAlloc(size_t size) KE_OVERRIDE; + void ExecFree(void *address) KE_OVERRIDE; + IDebugListener *SetDebugListener(IDebugListener *pListener) KE_OVERRIDE; + unsigned int GetContextCallCount() KE_OVERRIDE; + unsigned int GetEngineAPIVersion() KE_OVERRIDE; + void *AllocatePageMemory(size_t size) KE_OVERRIDE; + void SetReadWrite(void *ptr) KE_OVERRIDE; + void SetReadExecute(void *ptr) KE_OVERRIDE; + void FreePageMemory(void *ptr) KE_OVERRIDE; + void SetReadWriteExecute(void *ptr); + const char *GetErrorString(int err); +}; + +class SourcePawnEngine2 : public ISourcePawnEngine2 +{ + public: + SourcePawnEngine2(); + + unsigned int GetAPIVersion() KE_OVERRIDE; + const char *GetEngineName() KE_OVERRIDE; + const char *GetVersionString() KE_OVERRIDE; + IPluginRuntime *LoadPlugin(ICompilation *co, const char *file, int *err) KE_OVERRIDE; + SPVM_NATIVE_FUNC CreateFakeNative(SPVM_FAKENATIVE_FUNC callback, void *pData) KE_OVERRIDE; + void DestroyFakeNative(SPVM_NATIVE_FUNC func) KE_OVERRIDE; + IDebugListener *SetDebugListener(IDebugListener *listener) KE_OVERRIDE; + ICompilation *StartCompilation() KE_OVERRIDE; + const char *GetErrorString(int err) KE_OVERRIDE; + bool Initialize() KE_OVERRIDE; + void Shutdown() KE_OVERRIDE; + IPluginRuntime *CreateEmptyRuntime(const char *name, uint32_t memory) KE_OVERRIDE; + bool InstallWatchdogTimer(size_t timeout_ms) KE_OVERRIDE; + + bool SetJitEnabled(bool enabled) KE_OVERRIDE; + bool IsJitEnabled() KE_OVERRIDE; + void SetProfiler(IProfiler *profiler) KE_OVERRIDE; + void EnableProfiling() KE_OVERRIDE; + void DisableProfiling() KE_OVERRIDE; + void SetProfilingTool(IProfilingTool *tool) KE_OVERRIDE; +}; + +} // namespace SourcePawn + +#endif // _include_sourcepawn_vm_api_h_ diff --git a/sourcepawn/jit/compiled-function.cpp b/sourcepawn/jit/compiled-function.cpp index 2cfcfbbc..11944a7f 100644 --- a/sourcepawn/jit/compiled-function.cpp +++ b/sourcepawn/jit/compiled-function.cpp @@ -11,8 +11,7 @@ // SourcePawn. If not, see http://www.gnu.org/licenses/. // #include "compiled-function.h" -#include "sp_vm_engine.h" -#include "jit_x86.h" +#include "x86/jit_x86.h" CompiledFunction::CompiledFunction(void *entry_addr, cell_t pcode_offs, FixedArray *edges) : entry_(entry_addr), diff --git a/sourcepawn/jit/dll_exports.cpp b/sourcepawn/jit/dll_exports.cpp index 6e410914..e7fa3c42 100644 --- a/sourcepawn/jit/dll_exports.cpp +++ b/sourcepawn/jit/dll_exports.cpp @@ -34,16 +34,12 @@ #include #include // Replace with am-cxx later. #include "dll_exports.h" -#include "sp_vm_engine.h" -#include "engine2.h" #include "environment.h" using namespace ke; using namespace sp; using namespace SourcePawn; -SourcePawnEngine2 g_engine2; - class SourcePawnFactory : public ISourcePawnFactory { public: @@ -192,14 +188,14 @@ static cell_t PrintFloat(IPluginContext *cx, const cell_t *params) static int Execute(const char *file) { - ICompilation *co = g_engine2.StartCompilation(); + ICompilation *co = sEnv->APIv2()->StartCompilation(); if (!co) { fprintf(stderr, "Could not create a compilation context\n"); return 1; } int err; - AutoT rt(g_engine2.LoadPlugin(co, file, &err)); + AutoT rt(sEnv->APIv2()->LoadPlugin(co, file, &err)); if (!rt) { fprintf(stderr, "Could not load plugin: %s\n", sEnv->GetErrorString(err)); return 1; diff --git a/sourcepawn/jit/engine2.h b/sourcepawn/jit/engine2.h deleted file mode 100644 index 4a436711..00000000 --- a/sourcepawn/jit/engine2.h +++ /dev/null @@ -1,54 +0,0 @@ -// vim: set sts=2 ts=8 sw=2 tw=99 et: -// -// Copyright (C) 2006-2015 AlliedModders LLC -// -// This file is part of SourcePawn. SourcePawn is free software: you can -// redistribute it and/or modify it under the terms of the GNU General Public -// License as published by the Free Software Foundation, either version 3 of -// the License, or (at your option) any later version. -// -// You should have received a copy of the GNU General Public License along with -// SourcePawn. If not, see http://www.gnu.org/licenses/. -// -#ifndef _INCLUDE_SOURCEPAWN_ENGINE_2_H_ -#define _INCLUDE_SOURCEPAWN_ENGINE_2_H_ - -#include -#include // Replace with am-cxx later. - -namespace SourcePawn { - -/** - * @brief Outlines the interface a Virtual Machine (JIT) must expose - */ -class SourcePawnEngine2 : public ISourcePawnEngine2 -{ - public: - SourcePawnEngine2(); - - public: - unsigned int GetAPIVersion(); - const char *GetEngineName(); - const char *GetVersionString(); - IPluginRuntime *LoadPlugin(ICompilation *co, const char *file, int *err); - SPVM_NATIVE_FUNC CreateFakeNative(SPVM_FAKENATIVE_FUNC callback, void *pData); - void DestroyFakeNative(SPVM_NATIVE_FUNC func); - IDebugListener *SetDebugListener(IDebugListener *listener); - ICompilation *StartCompilation(); - const char *GetErrorString(int err); - bool Initialize(); - void Shutdown(); - IPluginRuntime *CreateEmptyRuntime(const char *name, uint32_t memory); - bool InstallWatchdogTimer(size_t timeout_ms); - - bool SetJitEnabled(bool enabled) KE_OVERRIDE; - bool IsJitEnabled() KE_OVERRIDE; - void SetProfiler(IProfiler *profiler) KE_OVERRIDE; - void EnableProfiling() KE_OVERRIDE; - void DisableProfiling() KE_OVERRIDE; - void SetProfilingTool(IProfilingTool *tool) KE_OVERRIDE; -}; - -} // namespace SourcePawn - -#endif //_INCLUDE_SOURCEPAWN_ENGINE_2_H_ diff --git a/sourcepawn/jit/environment.cpp b/sourcepawn/jit/environment.cpp index bc4c78d0..5f5c8d6c 100644 --- a/sourcepawn/jit/environment.cpp +++ b/sourcepawn/jit/environment.cpp @@ -11,11 +11,10 @@ // SourcePawn. If not, see http://www.gnu.org/licenses/. // #include "environment.h" -#include "sp_vm_engine.h" -#include "engine2.h" #include "x86/jit_x86.h" #include "watchdog_timer.h" #include "debug-trace.h" +#include "api.h" using namespace sp; using namespace SourcePawn; diff --git a/sourcepawn/jit/plugin-runtime.cpp b/sourcepawn/jit/plugin-runtime.cpp index b460651d..1aa0962b 100644 --- a/sourcepawn/jit/plugin-runtime.cpp +++ b/sourcepawn/jit/plugin-runtime.cpp @@ -15,10 +15,8 @@ #include #include #include "plugin-runtime.h" -#include "sp_vm_engine.h" #include "x86/jit_x86.h" #include "sp_vm_basecontext.h" -#include "engine2.h" #include "md5/md5.h" diff --git a/sourcepawn/jit/scripted-invoker.h b/sourcepawn/jit/scripted-invoker.h index aa2bc257..653a5c10 100644 --- a/sourcepawn/jit/scripted-invoker.h +++ b/sourcepawn/jit/scripted-invoker.h @@ -37,8 +37,6 @@ class CPlugin; class ScriptedInvoker : public IPluginFunction { - friend class SourcePawnEngine; - public: ScriptedInvoker(PluginRuntime *pRuntime, funcid_t fnid, uint32_t pub_id); ~ScriptedInvoker(); diff --git a/sourcepawn/jit/sp_vm_basecontext.cpp b/sourcepawn/jit/sp_vm_basecontext.cpp index 8dbfb902..a7e39195 100644 --- a/sourcepawn/jit/sp_vm_basecontext.cpp +++ b/sourcepawn/jit/sp_vm_basecontext.cpp @@ -16,10 +16,8 @@ #include #include "sp_vm_api.h" #include "sp_vm_basecontext.h" -#include "sp_vm_engine.h" #include "watchdog_timer.h" #include "x86/jit_x86.h" -#include "engine2.h" #include "interpreter.h" #include "environment.h" diff --git a/sourcepawn/jit/sp_vm_engine.cpp b/sourcepawn/jit/sp_vm_engine.cpp index 5efda010..5c6718f0 100644 --- a/sourcepawn/jit/sp_vm_engine.cpp +++ b/sourcepawn/jit/sp_vm_engine.cpp @@ -10,159 +10,4 @@ // You should have received a copy of the GNU General Public License along with // SourcePawn. If not, see http://www.gnu.org/licenses/. // -#include -#include -#include -#include "sp_vm_types.h" -#include -#include "sp_vm_engine.h" -#include "jit_x86.h" -#include "zlib/zlib.h" -#include "sp_vm_basecontext.h" -#include "environment.h" -#if defined __GNUC__ -#include -#endif -#if defined WIN32 - #define WIN32_LEAN_AND_MEAN - #include -#elif defined __GNUC__ - #include -#endif - -#if defined __linux__ -#include -#endif - -using namespace SourcePawn; - -const char * -SourcePawnEngine::GetErrorString(int error) -{ - return Environment::get()->GetErrorString(error); -} - -SourcePawnEngine::SourcePawnEngine() -{ -} - -SourcePawnEngine::~SourcePawnEngine() -{ -} - -void * -SourcePawnEngine::ExecAlloc(size_t size) -{ -#if defined WIN32 - return VirtualAlloc(NULL, size, MEM_COMMIT, PAGE_EXECUTE_READWRITE); -#elif defined __GNUC__ -# if defined __APPLE__ - void *base = valloc(size); -# else - void *base = memalign(sysconf(_SC_PAGESIZE), size); -# endif - if (mprotect(base, size, PROT_READ|PROT_WRITE|PROT_EXEC) != 0) { - free(base); - return NULL; - } - return base; -#endif -} - -void * -SourcePawnEngine::AllocatePageMemory(size_t size) -{ - return g_Jit.AllocCode(size); -} - -void -SourcePawnEngine::SetReadExecute(void *ptr) -{ - /* already re */ -} - -void -SourcePawnEngine::SetReadWrite(void *ptr) -{ - /* already rw */ -} - -void -SourcePawnEngine::FreePageMemory(void *ptr) -{ - g_Jit.FreeCode(ptr); -} - -void -SourcePawnEngine::ExecFree(void *address) -{ -#if defined WIN32 - VirtualFree(address, 0, MEM_RELEASE); -#elif defined __GNUC__ - free(address); -#endif -} - -void -SourcePawnEngine::SetReadWriteExecute(void *ptr) -{ - //:TODO: g_ExeMemory.SetRWE(ptr); - SetReadExecute(ptr); -} - -void * -SourcePawnEngine::BaseAlloc(size_t size) -{ - return malloc(size); -} - -void -SourcePawnEngine::BaseFree(void *memory) -{ - free(memory); -} - -sp_plugin_t * -SourcePawnEngine::LoadFromFilePointer(FILE *fp, int *err) -{ - if (err != NULL) - *err = SP_ERROR_ABORTED; - - return NULL; -} - -sp_plugin_t * -SourcePawnEngine::LoadFromMemory(void *base, sp_plugin_t *plugin, int *err) -{ - if (err != NULL) - *err = SP_ERROR_ABORTED; - - return NULL; -} - -int -SourcePawnEngine::FreeFromMemory(sp_plugin_t *plugin) -{ - return SP_ERROR_ABORTED; -} - -IDebugListener * -SourcePawnEngine::SetDebugListener(IDebugListener *pListener) -{ - IDebugListener *old = Environment::get()->debugger(); - Environment::get()->SetDebugger(pListener); - return old; -} - -unsigned int -SourcePawnEngine::GetEngineAPIVersion() -{ - return 4; -} - -unsigned int -SourcePawnEngine::GetContextCallCount() -{ - return 0; -} diff --git a/sourcepawn/jit/x86/jit_x86.cpp b/sourcepawn/jit/x86/jit_x86.cpp index d1ad5886..99c6d4e9 100644 --- a/sourcepawn/jit/x86/jit_x86.cpp +++ b/sourcepawn/jit/x86/jit_x86.cpp @@ -33,8 +33,6 @@ #include #include #include "jit_x86.h" -#include "../sp_vm_engine.h" -#include "../engine2.h" #include "../plugin-runtime.h" #include "../sp_vm_basecontext.h" #include "watchdog_timer.h"