From bcd88b443712c539aca685c409790795a9aa8692 Mon Sep 17 00:00:00 2001 From: "dvander@alliedmods.net" Date: Mon, 23 Feb 2015 13:01:00 -0800 Subject: [PATCH] Modernize sp_vm_function style. --- sourcepawn/jit/engine2.cpp | 2 +- sourcepawn/jit/engine2.h | 2 +- sourcepawn/jit/sp_vm_function.cpp | 482 ++++++++++++++---------------- sourcepawn/jit/sp_vm_function.h | 155 +++++----- 4 files changed, 297 insertions(+), 344 deletions(-) diff --git a/sourcepawn/jit/engine2.cpp b/sourcepawn/jit/engine2.cpp index 41c5a7b2..564af114 100644 --- a/sourcepawn/jit/engine2.cpp +++ b/sourcepawn/jit/engine2.cpp @@ -1,4 +1,4 @@ -// vim: set sts=2 ts=8 sw=2 tw=99 noet: +// vim: set sts=2 ts=8 sw=2 tw=99 et: // // Copyright (C) 2006-2015 AlliedModders LLC // diff --git a/sourcepawn/jit/engine2.h b/sourcepawn/jit/engine2.h index d75c63bb..ab9db988 100644 --- a/sourcepawn/jit/engine2.h +++ b/sourcepawn/jit/engine2.h @@ -1,4 +1,4 @@ -// vim: set sts=2 ts=8 sw=2 tw=99 noet: +// vim: set sts=2 ts=8 sw=2 tw=99 et: // // Copyright (C) 2006-2015 AlliedModders LLC // diff --git a/sourcepawn/jit/sp_vm_function.cpp b/sourcepawn/jit/sp_vm_function.cpp index 3daa77d8..ba5ea4e0 100644 --- a/sourcepawn/jit/sp_vm_function.cpp +++ b/sourcepawn/jit/sp_vm_function.cpp @@ -1,31 +1,15 @@ -/** - * vim: set ts=4 sw=4 tw=99 noet : - * ============================================================================= - * SourcePawn - * Copyright (C) 2004-2009 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 . - * - * 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 . - */ +// 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 @@ -38,319 +22,303 @@ CFunction::~CFunction() { - delete [] full_name_; + delete [] full_name_; } -bool CFunction::IsRunnable() +bool +CFunction::IsRunnable() { - return !m_pRuntime->IsPaused(); + return !m_pRuntime->IsPaused(); } -int CFunction::CallFunction(const cell_t *params, unsigned int num_params, cell_t *result) +int +CFunction::CallFunction(const cell_t *params, unsigned int num_params, cell_t *result) { - return CallFunction2(m_pRuntime->GetDefaultContext(), params, num_params, result); + return CallFunction2(m_pRuntime->GetDefaultContext(), params, num_params, result); } -int CFunction::CallFunction2(IPluginContext *pContext, const cell_t *params, unsigned int num_params, cell_t *result) +int +CFunction::CallFunction2(IPluginContext *pContext, const cell_t *params, unsigned int num_params, cell_t *result) { - return pContext->Execute2(this, params, num_params, result); + return pContext->Execute2(this, params, num_params, result); } -IPluginContext *CFunction::GetParentContext() +IPluginContext * +CFunction::GetParentContext() { - return m_pRuntime->GetDefaultContext(); + return m_pRuntime->GetDefaultContext(); } -CFunction::CFunction(BaseRuntime *runtime, funcid_t id, uint32_t pub_id) : - m_curparam(0), m_errorstate(SP_ERROR_NONE), m_FnId(id) +CFunction::CFunction(BaseRuntime *runtime, funcid_t id, uint32_t pub_id) + : m_curparam(0), + m_errorstate(SP_ERROR_NONE), + m_FnId(id) { - m_pRuntime = runtime; + m_pRuntime = runtime; - runtime->GetPublicByIndex(pub_id, &public_); + runtime->GetPublicByIndex(pub_id, &public_); - size_t rt_len = strlen(runtime->plugin()->name); - size_t len = rt_len + strlen("::") + strlen(public_->name); + size_t rt_len = strlen(runtime->plugin()->name); + size_t len = rt_len + strlen("::") + strlen(public_->name); - full_name_ = new char[len + 1]; - strcpy(full_name_, runtime->plugin()->name); - strcpy(&full_name_[rt_len], "::"); - strcpy(&full_name_[rt_len + 2], public_->name); + full_name_ = new char[len + 1]; + strcpy(full_name_, runtime->plugin()->name); + strcpy(&full_name_[rt_len], "::"); + strcpy(&full_name_[rt_len + 2], public_->name); } int CFunction::PushCell(cell_t cell) { - if (m_curparam >= SP_MAX_EXEC_PARAMS) - { - return SetError(SP_ERROR_PARAMS_MAX); - } + if (m_curparam >= SP_MAX_EXEC_PARAMS) + return SetError(SP_ERROR_PARAMS_MAX); - m_info[m_curparam].marked = false; - m_params[m_curparam] = cell; - m_curparam++; + m_info[m_curparam].marked = false; + m_params[m_curparam] = cell; + m_curparam++; - return SP_ERROR_NONE; + return SP_ERROR_NONE; } -int CFunction::PushCellByRef(cell_t *cell, int flags) +int +CFunction::PushCellByRef(cell_t *cell, int flags) { - return PushArray(cell, 1, flags); + return PushArray(cell, 1, flags); } -int CFunction::PushFloat(float number) +int +CFunction::PushFloat(float number) { - cell_t val = *(cell_t *)&number; + cell_t val = *(cell_t *)&number; - return PushCell(val); + return PushCell(val); } -int CFunction::PushFloatByRef(float *number, int flags) +int +CFunction::PushFloatByRef(float *number, int flags) { - return PushCellByRef((cell_t *)number, flags); + return PushCellByRef((cell_t *)number, flags); } -int CFunction::PushArray(cell_t *inarray, unsigned int cells, int copyback) +int +CFunction::PushArray(cell_t *inarray, unsigned int cells, int copyback) { - if (m_curparam >= SP_MAX_EXEC_PARAMS) - { - return SetError(SP_ERROR_PARAMS_MAX); - } + if (m_curparam >= SP_MAX_EXEC_PARAMS) + { + return SetError(SP_ERROR_PARAMS_MAX); + } - ParamInfo *info = &m_info[m_curparam]; + ParamInfo *info = &m_info[m_curparam]; - info->flags = inarray ? copyback : 0; - info->marked = true; - info->size = cells; - info->str.is_sz = false; - info->orig_addr = inarray; + info->flags = inarray ? copyback : 0; + info->marked = true; + info->size = cells; + info->str.is_sz = false; + info->orig_addr = inarray; - m_curparam++; + m_curparam++; - return SP_ERROR_NONE; + return SP_ERROR_NONE; } -int CFunction::PushString(const char *string) +int +CFunction::PushString(const char *string) { - return _PushString(string, SM_PARAM_STRING_COPY, 0, strlen(string)+1); + return _PushString(string, SM_PARAM_STRING_COPY, 0, strlen(string)+1); } -int CFunction::PushStringEx(char *buffer, size_t length, int sz_flags, int cp_flags) +int +CFunction::PushStringEx(char *buffer, size_t length, int sz_flags, int cp_flags) { - return _PushString(buffer, sz_flags, cp_flags, length); + return _PushString(buffer, sz_flags, cp_flags, length); } -int CFunction::_PushString(const char *string, int sz_flags, int cp_flags, size_t len) +int +CFunction::_PushString(const char *string, int sz_flags, int cp_flags, size_t len) { - if (m_curparam >= SP_MAX_EXEC_PARAMS) - { - return SetError(SP_ERROR_PARAMS_MAX); - } + if (m_curparam >= SP_MAX_EXEC_PARAMS) + return SetError(SP_ERROR_PARAMS_MAX); - ParamInfo *info = &m_info[m_curparam]; + ParamInfo *info = &m_info[m_curparam]; - info->marked = true; - info->orig_addr = (cell_t *)string; - info->flags = cp_flags; - info->size = len; - info->str.sz_flags = sz_flags; - info->str.is_sz = true; + info->marked = true; + info->orig_addr = (cell_t *)string; + info->flags = cp_flags; + info->size = len; + info->str.sz_flags = sz_flags; + info->str.is_sz = true; - m_curparam++; + m_curparam++; - return SP_ERROR_NONE; + return SP_ERROR_NONE; } -void CFunction::Cancel() +void +CFunction::Cancel() { - if (!m_curparam) - { - return; - } + if (!m_curparam) + return; - m_errorstate = SP_ERROR_NONE; - m_curparam = 0; + m_errorstate = SP_ERROR_NONE; + m_curparam = 0; } -int CFunction::Execute(cell_t *result) +int +CFunction::Execute(cell_t *result) { - return Execute2(m_pRuntime->GetDefaultContext(), result); + return Execute2(m_pRuntime->GetDefaultContext(), result); } -int CFunction::Execute2(IPluginContext *ctx, cell_t *result) +int +CFunction::Execute2(IPluginContext *ctx, cell_t *result) { - int err = SP_ERROR_NONE; + int err = SP_ERROR_NONE; - if (!IsRunnable()) - { - m_errorstate = SP_ERROR_NOT_RUNNABLE; - } + if (!IsRunnable()) + m_errorstate = SP_ERROR_NOT_RUNNABLE; - if (m_errorstate != SP_ERROR_NONE) - { - err = m_errorstate; - Cancel(); - return err; - } + if (m_errorstate != SP_ERROR_NONE) { + err = m_errorstate; + Cancel(); + return err; + } - //This is for re-entrancy! - cell_t temp_params[SP_MAX_EXEC_PARAMS]; - ParamInfo temp_info[SP_MAX_EXEC_PARAMS]; - unsigned int numparams = m_curparam; - unsigned int i; - bool docopies = true; + //This is for re-entrancy! + cell_t temp_params[SP_MAX_EXEC_PARAMS]; + ParamInfo temp_info[SP_MAX_EXEC_PARAMS]; + unsigned int numparams = m_curparam; + unsigned int i; + bool docopies = true; - if (numparams) - { - //Save the info locally, then reset it for re-entrant calls. - memcpy(temp_info, m_info, numparams * sizeof(ParamInfo)); - } - m_curparam = 0; + if (numparams) + { + //Save the info locally, then reset it for re-entrant calls. + memcpy(temp_info, m_info, numparams * sizeof(ParamInfo)); + } + m_curparam = 0; - /* Browse the parameters and build arrays */ - for (i=0; iHeapAlloc(temp_info[i].size, - &(temp_info[i].local_addr), - &(temp_info[i].phys_addr))) - != SP_ERROR_NONE) - { - break; - } - if (temp_info[i].orig_addr) - { - memcpy(temp_info[i].phys_addr, temp_info[i].orig_addr, sizeof(cell_t) * temp_info[i].size); - } - } - else - { - /* Calculate cells required for the string */ - size_t cells = (temp_info[i].size + sizeof(cell_t) - 1) / sizeof(cell_t); + /* Browse the parameters and build arrays */ + for (i=0; iHeapAlloc(temp_info[i].size, + &(temp_info[i].local_addr), + &(temp_info[i].phys_addr))) + != SP_ERROR_NONE) + { + break; + } + if (temp_info[i].orig_addr) + { + memcpy(temp_info[i].phys_addr, temp_info[i].orig_addr, sizeof(cell_t) * temp_info[i].size); + } + } else { + /* Calculate cells required for the string */ + size_t cells = (temp_info[i].size + sizeof(cell_t) - 1) / sizeof(cell_t); - /* Allocate the buffer */ - if ((err=ctx->HeapAlloc(cells, - &(temp_info[i].local_addr), - &(temp_info[i].phys_addr))) - != SP_ERROR_NONE) - { - break; - } - /* Copy original string if necessary */ - if ((temp_info[i].str.sz_flags & SM_PARAM_STRING_COPY) && (temp_info[i].orig_addr != NULL)) - { - /* Cut off UTF-8 properly */ - if (temp_info[i].str.sz_flags & SM_PARAM_STRING_UTF8) - { - if ((err=ctx->StringToLocalUTF8(temp_info[i].local_addr, - temp_info[i].size, - (const char *)temp_info[i].orig_addr, - NULL)) - != SP_ERROR_NONE) - { - break; - } - } - /* Copy a binary blob */ - else if (temp_info[i].str.sz_flags & SM_PARAM_STRING_BINARY) - { - memmove(temp_info[i].phys_addr, temp_info[i].orig_addr, temp_info[i].size); - } - /* Copy ASCII characters */ - else - { - if ((err=ctx->StringToLocal(temp_info[i].local_addr, - temp_info[i].size, - (const char *)temp_info[i].orig_addr)) - != SP_ERROR_NONE) - { - break; - } - } - } - } /* End array/string calculation */ - /* Update the pushed parameter with the byref local address */ - temp_params[i] = temp_info[i].local_addr; - } - else - { - /* Just copy the value normally */ - temp_params[i] = m_params[i]; - } - } + /* Allocate the buffer */ + if ((err=ctx->HeapAlloc(cells, + &(temp_info[i].local_addr), + &(temp_info[i].phys_addr))) + != SP_ERROR_NONE) + { + break; + } + /* Copy original string if necessary */ + if ((temp_info[i].str.sz_flags & SM_PARAM_STRING_COPY) && (temp_info[i].orig_addr != NULL)) + { + /* Cut off UTF-8 properly */ + if (temp_info[i].str.sz_flags & SM_PARAM_STRING_UTF8) { + if ((err=ctx->StringToLocalUTF8(temp_info[i].local_addr, + temp_info[i].size, + (const char *)temp_info[i].orig_addr, + NULL)) + != SP_ERROR_NONE) + { + break; + } + } + /* Copy a binary blob */ + else if (temp_info[i].str.sz_flags & SM_PARAM_STRING_BINARY) + { + memmove(temp_info[i].phys_addr, temp_info[i].orig_addr, temp_info[i].size); + } + /* Copy ASCII characters */ + else + { + if ((err=ctx->StringToLocal(temp_info[i].local_addr, + temp_info[i].size, + (const char *)temp_info[i].orig_addr)) + != SP_ERROR_NONE) + { + break; + } + } + } + } /* End array/string calculation */ + /* Update the pushed parameter with the byref local address */ + temp_params[i] = temp_info[i].local_addr; + } else { + /* Just copy the value normally */ + temp_params[i] = m_params[i]; + } + } - /* Make the call if we can */ - if (err == SP_ERROR_NONE) - { - if ((err = CallFunction2(ctx, temp_params, numparams, result)) != SP_ERROR_NONE) - { - docopies = false; - } - } - else - { - docopies = false; - } + /* Make the call if we can */ + if (err == SP_ERROR_NONE) { + if ((err = CallFunction2(ctx, temp_params, numparams, result)) != SP_ERROR_NONE) + docopies = false; + } else { + docopies = false; + } - /* i should be equal to the last valid parameter + 1 */ - while (i--) - { - if (!temp_info[i].marked) - { - continue; - } + /* i should be equal to the last valid parameter + 1 */ + while (i--) { + if (!temp_info[i].marked) + continue; - if (docopies && (temp_info[i].flags & SM_PARAM_COPYBACK)) - { - if (temp_info[i].orig_addr) - { - if (temp_info[i].str.is_sz) - { - memcpy(temp_info[i].orig_addr, temp_info[i].phys_addr, temp_info[i].size); - - } - else - { - if (temp_info[i].size == 1) - { - *temp_info[i].orig_addr = *(temp_info[i].phys_addr); - } - else - { - memcpy(temp_info[i].orig_addr, - temp_info[i].phys_addr, - temp_info[i].size * sizeof(cell_t)); - } - } - } - } + if (docopies && (temp_info[i].flags & SM_PARAM_COPYBACK)) { + if (temp_info[i].orig_addr) { + if (temp_info[i].str.is_sz) { + memcpy(temp_info[i].orig_addr, temp_info[i].phys_addr, temp_info[i].size); + + } else { + if (temp_info[i].size == 1) { + *temp_info[i].orig_addr = *(temp_info[i].phys_addr); + } else { + memcpy(temp_info[i].orig_addr, + temp_info[i].phys_addr, + temp_info[i].size * sizeof(cell_t)); + } + } + } + } - if ((err=ctx->HeapPop(temp_info[i].local_addr)) != SP_ERROR_NONE) - { - return err; - } - } + if ((err=ctx->HeapPop(temp_info[i].local_addr)) != SP_ERROR_NONE) + return err; + } - return err; + return err; } -IPluginRuntime *CFunction::GetParentRuntime() +IPluginRuntime * +CFunction::GetParentRuntime() { - return m_pRuntime; + return m_pRuntime; } -funcid_t CFunction::GetFunctionID() +funcid_t +CFunction::GetFunctionID() { - return m_FnId; + return m_FnId; } -int CFunction::SetError(int err) +int +CFunction::SetError(int err) { - m_errorstate = err; + m_errorstate = err; - return err; + return err; } diff --git a/sourcepawn/jit/sp_vm_function.h b/sourcepawn/jit/sp_vm_function.h index 6c9c0e13..ea1a722d 100644 --- a/sourcepawn/jit/sp_vm_function.h +++ b/sourcepawn/jit/sp_vm_function.h @@ -1,32 +1,15 @@ -/** - * vim: set ts=4 sw=4 tw=99 noet : - * ============================================================================= - * SourcePawn - * Copyright (C) 2004-2009 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 . - * - * 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 . - */ - +// 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_SOURCEMOD_BASEFUNCTION_H_ #define _INCLUDE_SOURCEMOD_BASEFUNCTION_H_ @@ -38,17 +21,16 @@ using namespace SourcePawn; struct ParamInfo { - int flags; /* Copy-back flags */ - bool marked; /* Whether this is marked as being used */ - cell_t local_addr; /* Local address to free */ - cell_t *phys_addr; /* Physical address of our copy */ - cell_t *orig_addr; /* Original address to copy back to */ - ucell_t size; /* Size of array in bytes */ - struct - { - bool is_sz; /* is a string */ - int sz_flags; /* has sz flags */ - } str; + int flags; /* Copy-back flags */ + bool marked; /* Whether this is marked as being used */ + cell_t local_addr; /* Local address to free */ + cell_t *phys_addr; /* Physical address of our copy */ + cell_t *orig_addr; /* Original address to copy back to */ + ucell_t size; /* Size of array in bytes */ + struct { + bool is_sz; /* is a string */ + int sz_flags; /* has sz flags */ + } str; }; class CPlugin; @@ -56,51 +38,54 @@ class JitFunction; class CFunction : public IPluginFunction { - friend class SourcePawnEngine; -public: - CFunction(BaseRuntime *pRuntime, - funcid_t fnid, - uint32_t pub_id); - ~CFunction(); -public: - virtual int PushCell(cell_t cell); - virtual int PushCellByRef(cell_t *cell, int flags); - virtual int PushFloat(float number); - virtual int PushFloatByRef(float *number, int flags); - virtual int PushArray(cell_t *inarray, unsigned int cells, int copyback); - virtual int PushString(const char *string); - virtual int PushStringEx(char *buffer, size_t length, int sz_flags, int cp_flags); - virtual int Execute(cell_t *result); - virtual void Cancel(); - virtual int CallFunction(const cell_t *params, unsigned int num_params, cell_t *result); - virtual IPluginContext *GetParentContext(); - bool IsRunnable(); - funcid_t GetFunctionID(); - int Execute2(IPluginContext *ctx, cell_t *result); - int CallFunction2(IPluginContext *ctx, - const cell_t *params, - unsigned int num_params, - cell_t *result); - IPluginRuntime *GetParentRuntime(); -public: - const char *FullName() const { - return full_name_; - } - sp_public_t *Public() const { - return public_; - } -private: - int _PushString(const char *string, int sz_flags, int cp_flags, size_t len); - int SetError(int err); -private: - BaseRuntime *m_pRuntime; - cell_t m_params[SP_MAX_EXEC_PARAMS]; - ParamInfo m_info[SP_MAX_EXEC_PARAMS]; - unsigned int m_curparam; - int m_errorstate; - funcid_t m_FnId; - char *full_name_; - sp_public_t *public_; + friend class SourcePawnEngine; + + public: + CFunction(BaseRuntime *pRuntime, funcid_t fnid, uint32_t pub_id); + ~CFunction(); + + public: + virtual int PushCell(cell_t cell); + virtual int PushCellByRef(cell_t *cell, int flags); + virtual int PushFloat(float number); + virtual int PushFloatByRef(float *number, int flags); + virtual int PushArray(cell_t *inarray, unsigned int cells, int copyback); + virtual int PushString(const char *string); + virtual int PushStringEx(char *buffer, size_t length, int sz_flags, int cp_flags); + virtual int Execute(cell_t *result); + virtual void Cancel(); + virtual int CallFunction(const cell_t *params, unsigned int num_params, cell_t *result); + virtual IPluginContext *GetParentContext(); + bool IsRunnable(); + funcid_t GetFunctionID(); + int Execute2(IPluginContext *ctx, cell_t *result); + int CallFunction2(IPluginContext *ctx, + const cell_t *params, + unsigned int num_params, + cell_t *result); + IPluginRuntime *GetParentRuntime(); + + public: + const char *FullName() const { + return full_name_; + } + sp_public_t *Public() const { + return public_; + } + + private: + int _PushString(const char *string, int sz_flags, int cp_flags, size_t len); + int SetError(int err); + + private: + BaseRuntime *m_pRuntime; + cell_t m_params[SP_MAX_EXEC_PARAMS]; + ParamInfo m_info[SP_MAX_EXEC_PARAMS]; + unsigned int m_curparam; + int m_errorstate; + funcid_t m_FnId; + char *full_name_; + sp_public_t *public_; }; #endif //_INCLUDE_SOURCEMOD_BASEFUNCTION_H_