diff options
author | Benoit Giannangeli <giann008@gmail.com> | 2017-03-24 10:57:49 +0100 |
---|---|---|
committer | Benoit Giannangeli <giann008@gmail.com> | 2017-03-24 10:59:27 +0100 |
commit | a6fa99b44b6d536a1fb23f9ffd7a84786c63edab (patch) | |
tree | 6e44f116dc2e072a4a54cc5a8af9cc194d5e0d08 | |
parent | eafdbc018fbeeec088b82172ff59a413558e92e7 (diff) | |
download | fengari-a6fa99b44b6d536a1fb23f9ffd7a84786c63edab.tar.gz fengari-a6fa99b44b6d536a1fb23f9ffd7a84786c63edab.tar.bz2 fengari-a6fa99b44b6d536a1fb23f9ffd7a84786c63edab.zip |
string.char bypass to_luastring conversion
-rw-r--r-- | src/lstrlib.js | 7 | ||||
-rw-r--r-- | 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") |