From a0fa83dc9c170542630dbc83d1732d3e7a6313e9 Mon Sep 17 00:00:00 2001 From: daurnimator Date: Sat, 6 Jan 2018 19:32:31 +1100 Subject: Expose lua.luastring_of to construct a lua 'string' from raw byte values --- README.md | 2 +- src/defs.js | 4 ++-- src/ldump.js | 4 ++-- src/lobject.js | 2 +- src/lua.js | 1 + src/lutf8lib.js | 2 +- tests/defs.js | 14 +++++++------- 7 files changed, 15 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index 1b58b91..a40b3b9 100644 --- a/README.md +++ b/README.md @@ -45,7 +45,7 @@ Fengari implements Lua 5.3 semantics and will hopefully follow future Lua releas Lua strings are 8-bits clean and can embed `\0`. Which means that invalid UTF-8/16 strings are valid Lua strings. Lua functions like `string.dump` even use strings as a way of storing binary data. -To address that issue, Fengari uses [`Uint8Array`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Uint8Array) objects containing the raw bytes to implement lua strings. To push a JS string on the stack you can use `lua_pushliteral` which will convert it to an array of bytes before pushing it. To get a Lua string on the stack as a JS string you can use `lua_tojsstring` which will attempt to convert it to a UTF-16 JS string. The latter won't give you what you expect if the Lua string is not a valid UTF-16 sequence. You can also convert strings with `lua.to_luastring`, `lua.to_jsstring` and `lua.to_uristring`. +To address that issue, Fengari uses [`Uint8Array`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Uint8Array) objects containing the raw bytes to implement lua strings. To push a JS string on the stack you can use `lua_pushliteral` which will convert it to an array of bytes before pushing it. To get a Lua string on the stack as a JS string you can use `lua_tojsstring` which will attempt to convert it to a UTF-16 JS string. The latter won't give you what you expect if the Lua string is not a valid UTF-16 sequence. You can also convert strings with `lua.luastring_of`, `lua.to_luastring`, `lua.to_jsstring` and `lua.to_uristring`. ### Integers diff --git a/src/defs.js b/src/defs.js index bb98485..0d53c66 100644 --- a/src/defs.js +++ b/src/defs.js @@ -131,7 +131,7 @@ class lua_Debug { } -const string_of = Uint8Array.of.bind(Uint8Array); +const luastring_of = Uint8Array.of.bind(Uint8Array); const is_luastring = function(s) { return s instanceof Uint8Array; @@ -431,7 +431,7 @@ module.exports.lua_upvalueindex = lua_upvalueindex; module.exports.thread_status = thread_status; module.exports.is_luastring = is_luastring; module.exports.luastring_cmp = luastring_cmp; -module.exports.string_of = string_of; +module.exports.luastring_of = luastring_of; module.exports.to_jsstring = to_jsstring; module.exports.to_luastring = to_luastring; module.exports.to_uristring = to_uristring; diff --git a/src/ldump.js b/src/ldump.js index 7e62da3..f736e22 100644 --- a/src/ldump.js +++ b/src/ldump.js @@ -3,7 +3,7 @@ const defs = require('./defs.js'); const CT = defs.constant_types; -const LUAC_DATA = defs.string_of(25, 147, 13, 10, 26, 10); +const LUAC_DATA = defs.luastring_of(25, 147, 13, 10, 26, 10); const LUAC_INT = 0x5678; const LUAC_NUM = 370.5; const LUAC_VERSION = Number.parseInt(defs.LUA_VERSION_MAJOR) * 16 + Number.parseInt(defs.LUA_VERSION_MINOR); @@ -30,7 +30,7 @@ const DumpLiteral = function(s, D) { }; const DumpByte = function(y, D) { - DumpBlock(defs.string_of(y), 1, D); + DumpBlock(defs.luastring_of(y), 1, D); }; const DumpInt = function(x, D) { diff --git a/src/lobject.js b/src/lobject.js index 1b490f3..bd10be8 100644 --- a/src/lobject.js +++ b/src/lobject.js @@ -559,7 +559,7 @@ const luaO_pushvfstring = function(L, fmt, argp) { case char['c']: { let buff = argp[a++]; if (ljstype.lisprint(buff)) - pushstr(L, defs.string_of(buff)); + pushstr(L, defs.luastring_of(buff)); else luaO_pushfstring(L, defs.to_luastring("<\\%d>", true), buff); break; diff --git a/src/lua.js b/src/lua.js index ab1820f..a102431 100644 --- a/src/lua.js +++ b/src/lua.js @@ -78,6 +78,7 @@ module.exports.LUA_VERSUFFIX = defs.LUA_VERSUFFIX; module.exports.LUA_YIELD = defs.thread_status.LUA_YIELD; module.exports.lua_Debug = defs.lua_Debug; module.exports.lua_upvalueindex = defs.lua_upvalueindex; +module.exports.luastring_of = defs.luastring_of; module.exports.to_jsstring = defs.to_jsstring; module.exports.to_luastring = defs.to_luastring; module.exports.to_uristring = defs.to_uristring; diff --git a/src/lutf8lib.js b/src/lutf8lib.js index f581a9e..722d9f1 100644 --- a/src/lutf8lib.js +++ b/src/lutf8lib.js @@ -216,7 +216,7 @@ const funcs = { }; /* pattern to match a single UTF-8 character */ -const UTF8PATT = Uint8Array.of(91, 0, 45, 127, 194, 45, 244, 93, 91, 128, 45, 191, 93, 42); +const UTF8PATT = lua.luastring_of(91, 0, 45, 127, 194, 45, 244, 93, 91, 128, 45, 191, 93, 42); const luaopen_utf8 = function(L) { lauxlib.luaL_newlib(L, funcs); diff --git a/tests/defs.js b/tests/defs.js index 1a935d6..f24dee0 100644 --- a/tests/defs.js +++ b/tests/defs.js @@ -6,37 +6,37 @@ const unicode_tests = [ { description: "Convert normal ascii string", literal: "foo", - byte_array: defs.string_of("f".charCodeAt(0), "o".charCodeAt(0), "o".charCodeAt(0)) + byte_array: defs.luastring_of("f".charCodeAt(0), "o".charCodeAt(0), "o".charCodeAt(0)) }, { description: "Convert ascii string containing null byte", literal: "fo\0o", - byte_array: defs.string_of("f".charCodeAt(0), "o".charCodeAt(0), 0, "o".charCodeAt(0)) + byte_array: defs.luastring_of("f".charCodeAt(0), "o".charCodeAt(0), 0, "o".charCodeAt(0)) }, { description: "Convert string with BMP unicode chars", literal: "Café", - byte_array: defs.string_of(67, 97, 102, 195, 169) + byte_array: defs.luastring_of(67, 97, 102, 195, 169) }, { description: "Convert string with codepoint in PUA (U+E000 to U+F8FF)", literal: "", - byte_array: defs.string_of(239, 163, 191) + byte_array: defs.luastring_of(239, 163, 191) }, { description: "Convert string with surrogate pair", literal: "❤️🍾", - byte_array: defs.string_of(226, 157, 164, 239, 184, 143, 240, 159, 141, 190) + byte_array: defs.luastring_of(226, 157, 164, 239, 184, 143, 240, 159, 141, 190) }, { description: "Convert string with broken surrogate pair", literal: "\uD800a", - byte_array: defs.string_of(237, 160, 128, 97) + byte_array: defs.luastring_of(237, 160, 128, 97) }, { description: "Convert string with broken surrogate pair at end of string", literal: "\uD823", - byte_array: defs.string_of(237, 160, 163) + byte_array: defs.luastring_of(237, 160, 163) } ]; -- cgit v1.2.3-70-g09d2