From 1b5111d06729031ecd46c9a6b89b48721fe64074 Mon Sep 17 00:00:00 2001 From: bi Date: Mon, 11 Jun 2018 19:52:40 +0300 Subject: [PATCH] Safe Calls: moved to a separate file --- .../mods/vmf/modules/core/safe_calls.lua | 63 ++++++++++++++++++ .../mods/vmf/modules/vmf_mod_manager.lua | 65 ------------------- vmf/scripts/mods/vmf/vmf_loader.lua | 1 + 3 files changed, 64 insertions(+), 65 deletions(-) create mode 100644 vmf/scripts/mods/vmf/modules/core/safe_calls.lua diff --git a/vmf/scripts/mods/vmf/modules/core/safe_calls.lua b/vmf/scripts/mods/vmf/modules/core/safe_calls.lua new file mode 100644 index 0000000..f07d52e --- /dev/null +++ b/vmf/scripts/mods/vmf/modules/core/safe_calls.lua @@ -0,0 +1,63 @@ +local vmf = get_mod("VMF") + +-- ##################################################################################################################### +-- ##### Local functions ############################################################################################### +-- ##################################################################################################################### + +local function pack_pcall(status, ...) + return status, {n = select('#', ...), ...} +end + + +local function print_error_callstack(error_message) + if type(error_message) == "table" and error_message.error then + error_message = error_message.error + end + print("Error: " .. tostring(error_message) .. "\n" .. Script.callstack()) + return error_message +end + +-- ##################################################################################################################### +-- ##### VMFMod ######################################################################################################## +-- ##################################################################################################################### + +function VMFMod:pcall(...) + return vmf.xpcall(self, "(pcall)", ...) +end + + +function VMFMod:dofile(file_path) + local _, return_values = pack_pcall(vmf.xpcall_dofile(self, "(dofile)", file_path)) + return unpack(return_values, 1, return_values.n) +end + +-- ##################################################################################################################### +-- ##### VMF internal functions and variables ########################################################################## +-- ##################################################################################################################### + +function vmf.xpcall(mod, error_prefix, func, ...) + local success, return_values = pack_pcall(xpcall(func, print_error_callstack, ...)) + if not success then + mod:error("%s: %s", error_prefix, return_values[1]) + return success + end + return success, unpack(return_values, 1, return_values.n) +end + + +function vmf.xpcall_no_return_values(mod, error_prefix, func, ...) + local success, error_message = xpcall(func, print_error_callstack, ...) + if not success then + mod:error("%s: %s", error_prefix, error_message) + end + return success +end + + +function vmf.xpcall_dofile(mod, error_prefix, file_path) + if type(file_path) ~= "string" then + mod:error("%s: file path should be a string.", error_prefix) + return false + end + return vmf.xpcall(mod, error_prefix, dofile, file_path) +end \ No newline at end of file diff --git a/vmf/scripts/mods/vmf/modules/vmf_mod_manager.lua b/vmf/scripts/mods/vmf/modules/vmf_mod_manager.lua index f7c37a0..d515fc1 100644 --- a/vmf/scripts/mods/vmf/modules/vmf_mod_manager.lua +++ b/vmf/scripts/mods/vmf/modules/vmf_mod_manager.lua @@ -7,24 +7,6 @@ local _mods_unloading_order = {} -- ##### Local functions ############################################################################################### -- ##################################################################################################################### --- WORKING WITH XPCALL - -local function pack_pcall(status, ...) - return status, {n = select('#', ...), ...} -end - -local function print_error_callstack(error_message) - - if type(error_message) == "table" and error_message.error then - error_message = error_message.error - end - - print("Error: " .. tostring(error_message) .. "\n" .. Script.callstack()) - return error_message -end - --- CREATING MOD - local function create_mod(mod_name) if _mods[mod_name] then @@ -150,18 +132,6 @@ function VMFMod:get_config() return self._data.config end - --- CORE FUNCTIONS - -function VMFMod:pcall(...) - return vmf.xpcall(self, "(pcall)", ...) -end - -function VMFMod:dofile(file_path) - local _, return_values = pack_pcall(vmf.xpcall_dofile(self, "(dofile)", file_path)) - return unpack(return_values, 1, return_values.n) -end - -- ##################################################################################################################### -- ##### VMF Initialization ############################################################################################ -- ##################################################################################################################### @@ -172,41 +142,6 @@ vmf = create_mod("VMF") -- ##### VMF internal functions and variables ########################################################################## -- ##################################################################################################################### --- XPCALL - -function vmf.xpcall(mod, error_prefix, func, ...) - - local success, return_values = pack_pcall(xpcall(func, print_error_callstack, ...)) - - if not success then - mod:error("%s: %s", error_prefix, return_values[1]) - return success - end - - return success, unpack(return_values, 1, return_values.n) -end - -function vmf.xpcall_no_return_values(mod, error_prefix, func, ...) - - local success, error_message = xpcall(func, print_error_callstack, ...) - - if not success then - mod:error("%s: %s", error_prefix, error_message) - end - - return success -end - -function vmf.xpcall_dofile(mod, error_prefix, file_path) - - if type(file_path) ~= "string" then - mod:error("%s: file path should be a string.", error_prefix) - return false - end - - return vmf.xpcall(mod, error_prefix, dofile, file_path) -end - -- MOD DATA INITIALIZATION function vmf.initialize_mod_data(mod, mod_data) diff --git a/vmf/scripts/mods/vmf/vmf_loader.lua b/vmf/scripts/mods/vmf/vmf_loader.lua index 5fb7ae7..ecda424 100644 --- a/vmf/scripts/mods/vmf/vmf_loader.lua +++ b/vmf/scripts/mods/vmf/vmf_loader.lua @@ -12,6 +12,7 @@ local vmf_mod_object = {} function vmf_mod_object:init() dofile("scripts/mods/vmf/modules/vmf_mod_manager") + dofile("scripts/mods/vmf/modules/core/safe_calls") dofile("scripts/mods/vmf/modules/core/events") dofile("scripts/mods/vmf/modules/core/settings") dofile("scripts/mods/vmf/modules/core/logging")