From c9f0e2b5e930d0f7786e61e32f169aff6cc2d315 Mon Sep 17 00:00:00 2001 From: RDW Date: Thu, 16 Jan 2025 04:50:28 +0100 Subject: [PATCH] Refactor: Introduce a shared constant for iconv errors There's no universal system for error handling in place yet, but since selene can't parse LuaJIT's ULL syntax extension, might as well move this constant to C++ already. --- Runtime/Bindings/FFI/iconv/iconv.lua | 7 ++++--- Runtime/Bindings/FFI/iconv/iconv_exports.h | 3 +++ Runtime/Bindings/FFI/iconv/iconv_ffi.cpp | 5 ++++- Runtime/Bindings/FFI/iconv/iconv_ffi.hpp | 2 ++ Tests/BDD/iconv-library.spec.lua | 11 +++++++---- 5 files changed, 20 insertions(+), 8 deletions(-) diff --git a/Runtime/Bindings/FFI/iconv/iconv.lua b/Runtime/Bindings/FFI/iconv/iconv.lua index 0c51a5b7..d4f02f2d 100644 --- a/Runtime/Bindings/FFI/iconv/iconv.lua +++ b/Runtime/Bindings/FFI/iconv/iconv.lua @@ -7,9 +7,7 @@ local ffi_string = ffi.string local tonumber = tonumber local tostring = tostring -local iconv = { - ERROR_CONVERSION_FAILED = ffi.cast("size_t", -1ULL), -} +local iconv = {} iconv.cdefs = [[ typedef void* iconv_t; @@ -24,6 +22,9 @@ struct static_iconv_exports_table { iconv_t (*iconv_open)(const char* input_encoding, const char* output_encoding); int (*iconv_close)(iconv_t conversion_descriptor); size_t (*iconv)(iconv_t conversion_descriptor, char** input, size_t* input_size, char** output, size_t* output_size); + + // Shared constants + size_t CHARSET_CONVERSION_FAILED; }; ]] diff --git a/Runtime/Bindings/FFI/iconv/iconv_exports.h b/Runtime/Bindings/FFI/iconv/iconv_exports.h index d4b6b86e..76b0351c 100644 --- a/Runtime/Bindings/FFI/iconv/iconv_exports.h +++ b/Runtime/Bindings/FFI/iconv/iconv_exports.h @@ -9,4 +9,7 @@ struct static_iconv_exports_table { iconv_t (*iconv_open)(const char* input_encoding, const char* output_encoding); int (*iconv_close)(iconv_t conversion_descriptor); size_t (*iconv)(iconv_t conversion_descriptor, char** input, size_t* input_size, char** output, size_t* output_size); + + // Shared constants + size_t CHARSET_CONVERSION_FAILED; }; \ No newline at end of file diff --git a/Runtime/Bindings/FFI/iconv/iconv_ffi.cpp b/Runtime/Bindings/FFI/iconv/iconv_ffi.cpp index 3c010f6c..2e84875c 100644 --- a/Runtime/Bindings/FFI/iconv/iconv_ffi.cpp +++ b/Runtime/Bindings/FFI/iconv/iconv_ffi.cpp @@ -18,7 +18,7 @@ iconv_result_t iconv_convert(char* input, size_t input_length, const char* input size_t num_input_bytes_left = input_length; iconv_t conversion_descriptor = iconv_open(output_encoding, input_encoding); - if(conversion_descriptor == (iconv_t)-1) { + if(reinterpret_cast(conversion_descriptor) == iconv_ffi::CHARSET_CONVERSION_FAILED) { result.message = strerror(errno); result.status_code = errno; result.num_bytes_written = 0; @@ -53,6 +53,9 @@ namespace iconv_ffi { .iconv_open = &iconv_open, .iconv_close = &iconv_close, .iconv = &iconv, + + // Shared constants + .CHARSET_CONVERSION_FAILED = CHARSET_CONVERSION_FAILED, }; return &exports; diff --git a/Runtime/Bindings/FFI/iconv/iconv_ffi.hpp b/Runtime/Bindings/FFI/iconv/iconv_ffi.hpp index 72d3ae85..03811283 100644 --- a/Runtime/Bindings/FFI/iconv/iconv_ffi.hpp +++ b/Runtime/Bindings/FFI/iconv/iconv_ffi.hpp @@ -7,5 +7,7 @@ #include "iconv_exports.h" namespace iconv_ffi { + constexpr std::size_t CHARSET_CONVERSION_FAILED = static_cast(-1); + void* getExportsTable(); } \ No newline at end of file diff --git a/Tests/BDD/iconv-library.spec.lua b/Tests/BDD/iconv-library.spec.lua index a7a39be0..ad4accfe 100644 --- a/Tests/BDD/iconv-library.spec.lua +++ b/Tests/BDD/iconv-library.spec.lua @@ -88,13 +88,13 @@ describe("iconv", function() it("should indicate an error if the requested conversion isn't supported", function() local descriptor = iconv.bindings.iconv_open("Not-a-real-encoding", "UTF-8") - assertEquals(ffi.cast("size_t", descriptor), iconv.ERROR_CONVERSION_FAILED) + assertEquals(ffi.cast("size_t", descriptor), iconv.bindings.CHARSET_CONVERSION_FAILED) iconv.bindings.iconv_close(descriptor) end) it("should return a valid handle if the conversion is supported", function() local descriptor = iconv.bindings.iconv_open("CP949", "UTF-8") - assertFalse(ffi.cast("size_t", descriptor) == iconv.ERROR_CONVERSION_FAILED) + assertFalse(ffi.cast("size_t", descriptor) == iconv.bindings.CHARSET_CONVERSION_FAILED) iconv.bindings.iconv_close(descriptor) end) end) @@ -102,7 +102,10 @@ describe("iconv", function() describe("iconv", function() it("should be able to convert Windows encodings to UTF-8", function() local descriptor = iconv.bindings.iconv_open("UTF-8", "CP949") - assert(descriptor ~= iconv.ERROR_CONVERSION_FAILED, "Failed to create conversion descriptor") + assert( + descriptor ~= iconv.bindings.CHARSET_CONVERSION_FAILED, + "Failed to create conversion descriptor" + ) local input = "\192\175\192\250\192\206\197\205\198\228\192\204\189\186" local inputSize = ffi.new("size_t[1]", #input) @@ -114,7 +117,7 @@ describe("iconv", function() local outputRef = ffi.new("char*[1]", outputBuffer) local result = iconv.bindings.iconv(descriptor, inputRef, inputSize, outputRef, outputSize) - assert(result ~= iconv.ERROR_CONVERSION_FAILED, "Conversion failed") + assert(result ~= iconv.bindings.CHARSET_CONVERSION_FAILED, "Conversion failed") local convertedSize = 256 - outputSize[0] local converted = ffi.string(outputBuffer, convertedSize)