From a6fa99b44b6d536a1fb23f9ffd7a84786c63edab Mon Sep 17 00:00:00 2001 From: Benoit Giannangeli Date: Fri, 24 Mar 2017 10:57:49 +0100 Subject: string.char bypass to_luastring conversion --- src/lstrlib.js | 7 ++++--- tests/single.lua | 22 ++++++++++++++++++++++ 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/src/lstrlib.js b/src/lstrlib.js index 1b62db1..4bd8664 100644 --- a/src/lstrlib.js +++ b/src/lstrlib.js @@ -53,13 +53,14 @@ const str_len = function(L) { const str_char = function(L) { let n = lapi.lua_gettop(L); /* number of arguments */ - let p = ""; + let p = []; for (let i = 1; i <= n; i++) { let c = lauxlib.luaL_checkinteger(L, i); lauxlib.luaL_argcheck(L, c >= 0 && c <= 255, "value out of range"); // Strings are 8-bit clean - p += String.fromCharCode(c); + p.push(c); } - lapi.lua_pushstring(L, p); + lapi.lua_pushstring(L, ""); + L.stack[L.top - 1].value = p; // Since value are already capped, avoid conversion return 1; }; diff --git a/tests/single.lua b/tests/single.lua index 616e2a4..c52a6fb 100644 --- a/tests/single.lua +++ b/tests/single.lua @@ -71,3 +71,25 @@ assert(string.len("1234567890") == 10) assert(#"" == 0) assert(#"\0\0\0" == 3) assert(#"1234567890" == 10) + +-- testing string.byte/string.char +assert(string.byte("a") == 97) +assert(string.byte("\xe4") > 127) +assert(string.byte(string.char(255)) == 255) +assert(string.byte(string.char(0)) == 0) +assert(string.byte("\0") == 0) +assert(string.byte("\0\0alo\0x", -1) == string.byte('x')) +assert(string.byte("ba", 2) == 97) +assert(string.byte("\n\n", 2, -1) == 10) +assert(string.byte("\n\n", 2, 2) == 10) +assert(string.byte("") == nil) +assert(string.byte("hi", -3) == nil) +assert(string.byte("hi", 3) == nil) +assert(string.byte("hi", 9, 10) == nil) +assert(string.byte("hi", 2, 1) == nil) +assert(string.char() == "") +assert(string.char(0, 255, 0) == "\0\255\0") +assert(string.char(0, string.byte("\xe4"), 0) == "\0\xe4\0") +assert(string.char(string.byte("\xe4l\0óu", 1, -1)) == "\xe4l\0óu") +assert(string.char(string.byte("\xe4l\0óu", 1, 0)) == "") +assert(string.char(string.byte("\xe4l\0óu", -10, 100)) == "\xe4l\0óu") -- cgit v1.2.3-54-g00ecf