From 33d745d667c94dfd096b9ca58d1461253c6a13e4 Mon Sep 17 00:00:00 2001 From: UnlegitDqrk Date: Mon, 2 Mar 2026 15:36:05 +0100 Subject: [PATCH] Implemented issue: #47 --- .../org/luaj/vm2/libs/CjsonLib$Encoder.class | Bin 0 -> 3804 bytes .../org/luaj/vm2/libs/CjsonLib$Parser.class | Bin 0 -> 4730 bytes .../org/luaj/vm2/libs/CjsonLib$decode.class | Bin 0 -> 858 bytes .../org/luaj/vm2/libs/CjsonLib$encode.class | Bin 0 -> 812 bytes .../org/luaj/vm2/libs/CjsonLib$loader.class | Bin 0 -> 800 bytes .../java/org/luaj/vm2/libs/CjsonLib.class | Bin 0 -> 1496 bytes .../main/java/org/luaj/vm2/libs/CjsonLib.java | 414 ++++++++++++++++++ .../org/luaj/vm2/libs/jme/JmePlatform.java | 1 + .../org/luaj/vm2/libs/jse/JsePlatform.class | Bin 2104 -> 2157 bytes .../org/luaj/vm2/libs/jse/JsePlatform.java | 1 + .../test/java/org/luaj/vm2/FragmentsTest.java | 19 + 11 files changed, 435 insertions(+) create mode 100644 core/src/main/java/org/luaj/vm2/libs/CjsonLib$Encoder.class create mode 100644 core/src/main/java/org/luaj/vm2/libs/CjsonLib$Parser.class create mode 100644 core/src/main/java/org/luaj/vm2/libs/CjsonLib$decode.class create mode 100644 core/src/main/java/org/luaj/vm2/libs/CjsonLib$encode.class create mode 100644 core/src/main/java/org/luaj/vm2/libs/CjsonLib$loader.class create mode 100644 core/src/main/java/org/luaj/vm2/libs/CjsonLib.class create mode 100644 core/src/main/java/org/luaj/vm2/libs/CjsonLib.java diff --git a/core/src/main/java/org/luaj/vm2/libs/CjsonLib$Encoder.class b/core/src/main/java/org/luaj/vm2/libs/CjsonLib$Encoder.class new file mode 100644 index 0000000000000000000000000000000000000000..398816b48dbd7d37b147acdc571ca054f29a8e1c GIT binary patch literal 3804 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 literal 0 HcmV?d00001 diff --git a/core/src/main/java/org/luaj/vm2/libs/CjsonLib$encode.class b/core/src/main/java/org/luaj/vm2/libs/CjsonLib$encode.class new file mode 100644 index 0000000000000000000000000000000000000000..f0d8d7eaff31094bd9c164a20259adf5d3aacc75 GIT binary patch literal 812 zcmZ`%T~8BH5IsXHTd!LX1i>PTfOZ!emzWqeH73$PFj?TCriqWYHlOu0@{=y4` ze&U^K^*$aRW_pkYktWQ(4RnycBUBu>XQ4(|8OgEqLaB#dH;n^5+|PpWOvM70!M;P- zEW>t2Nu>RtzkQ$wQQj;}^BiFzhs)9+^p0fmrK?hbIw}GJ3pN&Uk2%PT3#HEp`;LDD z+RtQ9hM8*nQ#f50a&$&+yFJ5l*~WdW5Nc^u`~hLfaZ4C&fd^<xAY1&L&u6 z!{PKZq2-i8+!EztX4}GJ!jl`A`3C+;rE;kV)eb90nD+y%PO|g9ia*MJ$eHRuh9O~Z znkwbdg<1sBjk0*44g&*I|2y%yQITaiQAv6fC8-66(3sAUV1LkB#hp+liAq?B>+SN& z3i8;)BYtw`GnOA6_|Y literal 0 HcmV?d00001 diff --git a/core/src/main/java/org/luaj/vm2/libs/CjsonLib$loader.class b/core/src/main/java/org/luaj/vm2/libs/CjsonLib$loader.class new file mode 100644 index 0000000000000000000000000000000000000000..4eb9a29194f6010a06951b8136d8eb27bd6b619c GIT binary patch literal 800 zcmaKq&u-H|5XQf$(>OIw3W26+AkdZqPHF1GwFn7C6e3xoTFU8uwKJ;CyNV;eQXPN^u!#FdyR>A;3#+TJ56ZL~t&nES}1XP%*Fm z{~k`woC&p&Ow!L$!n1dWTFZE#M3Tsa2U{q`84md=na@~$OduTbs>_~CJnR{e$!o{alOR-A9&Dj?yRuOo4tI~`H3fH@r_H0 vrY+_IeK?F3 literal 0 HcmV?d00001 diff --git a/core/src/main/java/org/luaj/vm2/libs/CjsonLib.class b/core/src/main/java/org/luaj/vm2/libs/CjsonLib.class new file mode 100644 index 0000000000000000000000000000000000000000..67aeaf838afdd307dcb9a46340478dfdb096a99e GIT binary patch literal 1496 zcmaJ>+fEZv6kUf-ol*vb3YG#wxu`7^t9S=g6pNxmH7SzFi_W^kOEnW-lJiGF~- z_<))~B8ea1Hxc7HouXDPFMFTaXJ6J{d!PCK6%x~J9TS2 z|LVnD-m%Mme*JarwpU%LyOqGMxdO))ZPyNN3Pdv5jTmAA`b(?w+^Whr;^@+080bci zz(7kbvuY>j4?)um~dr=!71kS6}H@e zu(g4f-Ow>6FxXOxy*}}!w`B!ZC&n?MW75DBP74gR__aV1=q^4n&1a=TaecK|Fa;8S zF!ZRrEh_<;7{ysNs|@-56J_&0yP>+7HZY^Oirap@i9?xZ4V*)s=Ad?H7U<7p|1G2A zfcwp`mH{l`t)mBsptvh>!&foK)WaRlyV+Hlpz+-~Y5q!e(o)~uJ! z0-bK%ahh9{BJLJ44;O4fpvU%$^ejm?AVxwOY6mI1DG*z%IL(!gmuhvdB3Ep+U)_hx za!wH;&{dRvuqIW*zK+{R@7H6?Bl9|z1twZxw#?^AHAeU&r}R0LYr!S)QUi^Y1`;kzc2%g|bfX zL40aBUZPajK!Wlzu23r1H_#Xe%;ggLE;@^|yEy(1(cI2#;sn3vwUl;fNok3JeI%dm zA+?L4+zz8Upz=;2MwtX(G+KYagReKO?<|Gpc}S6bOM&F<>4G&476pSM4OHcaeRIKB^q!-b2?uK#P3jRfsMO z&NL82(J`>Zb;9B=t|l8yHVU6-Yja 1) { + out.append(','); + } + append(table.get(i), out, seen); + } + out.append(']'); + } else { + out.append('{'); + LuaValue key = LuaValue.NIL; + boolean first = true; + while (true) { + Varargs next = table.next(key); + key = next.arg1(); + if (key.isnil()) { + break; + } + if (!first) { + out.append(','); + } + first = false; + appendString(key.checkjstring(), out); + out.append(':'); + append(next.arg(2), out, seen); + } + out.append('}'); + } + } finally { + seen.remove(table); + } + } + + private boolean isArray(LuaTable table) { + int n = table.length(); + int count = 0; + LuaValue key = LuaValue.NIL; + while (true) { + Varargs next = table.next(key); + key = next.arg1(); + if (key.isnil()) { + break; + } + if (!key.isinttype()) { + return false; + } + int index = key.toint(); + if (index < 1 || index > n) { + return false; + } + count++; + } + return count == n; + } + + private void appendString(String value, StringBuilder out) { + out.append('"'); + for (int i = 0; i < value.length(); i++) { + char c = value.charAt(i); + switch (c) { + case '"': + case '\\': + out.append('\\').append(c); + break; + case '\b': + out.append("\\b"); + break; + case '\f': + out.append("\\f"); + break; + case '\n': + out.append("\\n"); + break; + case '\r': + out.append("\\r"); + break; + case '\t': + out.append("\\t"); + break; + default: + if (c < 0x20) { + String hex = Integer.toHexString(c); + out.append("\\u"); + for (int j = hex.length(); j < 4; j++) { + out.append('0'); + } + out.append(hex); + } else { + out.append(c); + } + } + } + out.append('"'); + } + } + + private static final class Parser { + private final String input; + private int pos; + + Parser(String input) { + this.input = input; + } + + LuaValue parseValue() { + skipWhitespace(); + if (eof()) { + error("unexpected end of json"); + } + char c = input.charAt(pos); + switch (c) { + case '{': + return parseObject(); + case '[': + return parseArray(); + case '"': + return LuaValue.valueOf(parseString()); + case 't': + expect("true"); + return LuaValue.TRUE; + case 'f': + expect("false"); + return LuaValue.FALSE; + case 'n': + expect("null"); + return nullValue(); + default: + if (c == '-' || (c >= '0' && c <= '9')) { + return parseNumber(); + } + error("invalid json value"); + return LuaValue.NIL; + } + } + + private LuaValue parseObject() { + LuaTable table = new LuaTable(); + pos++; + skipWhitespace(); + if (consume('}')) { + return table; + } + while (true) { + skipWhitespace(); + if (eof() || input.charAt(pos) != '"') { + error("expected string key"); + } + String key = parseString(); + skipWhitespace(); + if (!consume(':')) { + error("expected ':'"); + } + table.set(key, parseValue()); + skipWhitespace(); + if (consume('}')) { + return table; + } + if (!consume(',')) { + error("expected ',' or '}'"); + } + } + } + + private LuaValue parseArray() { + LuaTable table = new LuaTable(); + int index = 1; + pos++; + skipWhitespace(); + if (consume(']')) { + return table; + } + while (true) { + table.set(index++, parseValue()); + skipWhitespace(); + if (consume(']')) { + return table; + } + if (!consume(',')) { + error("expected ',' or ']'"); + } + } + } + + private LuaValue parseNumber() { + int start = pos; + if (input.charAt(pos) == '-') { + pos++; + } + readDigits(); + boolean isFloat = false; + if (!eof() && input.charAt(pos) == '.') { + isFloat = true; + pos++; + readDigits(); + } + if (!eof()) { + char c = input.charAt(pos); + if (c == 'e' || c == 'E') { + isFloat = true; + pos++; + if (!eof()) { + char sign = input.charAt(pos); + if (sign == '+' || sign == '-') { + pos++; + } + } + readDigits(); + } + } + String number = input.substring(start, pos); + try { + return isFloat ? LuaValue.valueOf(Double.parseDouble(number)) : LuaValue.valueOf(Long.parseLong(number)); + } catch (NumberFormatException e) { + error("invalid number"); + return LuaValue.NIL; + } + } + + private void readDigits() { + int start = pos; + while (!eof()) { + char c = input.charAt(pos); + if (c < '0' || c > '9') { + break; + } + pos++; + } + if (start == pos) { + error("invalid number"); + } + } + + private String parseString() { + StringBuffer out = new StringBuffer(); + pos++; + while (!eof()) { + char c = input.charAt(pos++); + if (c == '"') { + return out.toString(); + } + if (c != '\\') { + out.append(c); + continue; + } + if (eof()) { + error("unterminated escape"); + } + char esc = input.charAt(pos++); + switch (esc) { + case '"': + case '\\': + case '/': + out.append(esc); + break; + case 'b': + out.append('\b'); + break; + case 'f': + out.append('\f'); + break; + case 'n': + out.append('\n'); + break; + case 'r': + out.append('\r'); + break; + case 't': + out.append('\t'); + break; + case 'u': + if (pos + 4 > input.length()) { + error("invalid unicode escape"); + } + out.append((char) Integer.parseInt(input.substring(pos, pos + 4), 16)); + pos += 4; + break; + default: + error("invalid escape"); + } + } + error("unterminated string"); + return null; + } + + void skipWhitespace() { + while (!eof()) { + char c = input.charAt(pos); + if (c != ' ' && c != '\n' && c != '\r' && c != '\t') { + break; + } + pos++; + } + } + + boolean eof() { + return pos >= input.length(); + } + + private void expect(String token) { + if (!input.regionMatches(pos, token, 0, token.length())) { + error("expected '" + token + "'"); + } + pos += token.length(); + } + + private boolean consume(char c) { + if (!eof() && input.charAt(pos) == c) { + pos++; + return true; + } + return false; + } + } +} diff --git a/jme/src/main/java/org/luaj/vm2/libs/jme/JmePlatform.java b/jme/src/main/java/org/luaj/vm2/libs/jme/JmePlatform.java index cbe5b160..f796dd1d 100644 --- a/jme/src/main/java/org/luaj/vm2/libs/jme/JmePlatform.java +++ b/jme/src/main/java/org/luaj/vm2/libs/jme/JmePlatform.java @@ -95,6 +95,7 @@ public class JmePlatform { Globals globals = new Globals(); globals.load(new BaseLib()); globals.load(new PackageLib()); + globals.load(new CjsonLib()); globals.load(new Bit32Lib()); globals.load(new OsLib()); globals.load(new MathLib()); diff --git a/jse/src/main/java/org/luaj/vm2/libs/jse/JsePlatform.class b/jse/src/main/java/org/luaj/vm2/libs/jse/JsePlatform.class index 1ca36e41c0f687da6b56f367d57d07f0218eb3c4..97e6cd33d634f9ee6cd11f41f2a0114e6558cadc 100644 GIT binary patch delta 776 zcmYLHO;1xn6g~4k_3^+*rNJUa8cYZ+QYi8vMX*p*pcSzyVihflk0Q28i(CA_kBy6F zHZEKk65~#BQyPhE-1#e9xiOlUs0(AjJ1+zmZ|0tR?m2VkzA0JXEaTJW`waj?xKl9x zs)KX6Y=)PydTSt^Zx6-N(*~*`>)2oT;pPEmXf*=W@i1%Dydw1RSyrdji|`=-%-mIj z*@f(4KAo9y#0`RIEF^1{cq%{3H(6u(aMod(1apWawdG?uC(|r4t%anAk4mN$glwQ4 zhjnzA=tLK{rHFP!;2!=)I#AJzqdNLb^y3(VuQ27|Kcy}d+S*3-*l!+_2%3moF0@Eh0;X41We5{*i*qe;arS7JJ^Qnv-Oyn2R89S^a!>}(| zSgqz?)P|8>NHlmr0fP#S))_)x+8OPte+}#%1q?T66*LgXZgF3VMd@$IPIiSSv}e9` z1Si+fRz&%Pzl0Ed-Tu`b{QxZfOY2yAPRbYL_!2gG**jjLZ7){|;ZgrOBIGsbc>VXN zpc)`Y4d-EDk@T}jZ};++vKp~tq>l$S`T`pt5baUqPSve?SK#(2ZZ+UmmqH~RPb{nK z_10I9Qo=}&>QP;%yhWUDcAfR8MV$9H7cuD<*ZdT7R9ypU3zg7xM0MQMp;s{-w`h`oNXn3P%y0h#+~SrC delta 733 zcmYjPOHUI~7(I8MGLCeB45TF>1Y<*sj1+mbS{U(#v;v|c;)4OP6iXrH5mzFLx{*Y3 ziE-`5rLw7wMmFyF3+~+*6W7Fu-z~Q5VKW+m!i|mH+i-(!P zEmqA3nW0rd)=|yJSx^gzvX-y2TCGNu^?Zvpl+=mx2tyrjk^H`-w>X_hPZ($rbdWmi zjd@+_o8!AIXbmhBwML;G+qYEmdC9bzAR9Q2799~2tvJD7NN#Jpz#R;Mxm?Q0EO|4| z@@&MJoSU6bXQpyaV#(_@(1oaun2D1(#V8SF;C{J-b@L(la7kPYI?Z5jY}tkZ7iUbm z<2n9Xjva7u!9*V}@~?8YFTudFqT!N>0Sxj+rM~PkgY4x}26S8z>{ULdw2*DY#C44F zO{JN@n2DRX#dj2!z#S9g@OXv#C6H#Q7)#7}%bt_*vMFbHF_+G!Vmj{gpK83K3lgmx zP{5!n$&!vp@6+@zD?H$>Y$-fBsVH0dkaQ0Tvd?KSihP&wfX&M(P0hli}@n zc>6Qls3Nzkwp#NBwqLQ;u&qW4=v^6JQ`y_S?|!9#^HJ5WmiO1>k!&g-@~e3ahnn)Z z782r(JZ_8hQZaoq4pRM)=B&`NAE6YhsKR4;2HhC=SWd^0MZ`H Ypy_aROzY5@jv0$Kw@X%rO!4s9KWsIJ+yDRo diff --git a/jse/src/main/java/org/luaj/vm2/libs/jse/JsePlatform.java b/jse/src/main/java/org/luaj/vm2/libs/jse/JsePlatform.java index 93b84dca..5a2864f5 100644 --- a/jse/src/main/java/org/luaj/vm2/libs/jse/JsePlatform.java +++ b/jse/src/main/java/org/luaj/vm2/libs/jse/JsePlatform.java @@ -88,6 +88,7 @@ public class JsePlatform { Globals globals = new Globals(); globals.load(new JseBaseLib()); globals.load(new PackageLib()); + globals.load(new CjsonLib()); globals.load(new Bit32Lib()); globals.load(new TableLib()); globals.load(new JseStringLib()); diff --git a/jse/src/test/java/org/luaj/vm2/FragmentsTest.java b/jse/src/test/java/org/luaj/vm2/FragmentsTest.java index db3455cf..4da8854a 100644 --- a/jse/src/test/java/org/luaj/vm2/FragmentsTest.java +++ b/jse/src/test/java/org/luaj/vm2/FragmentsTest.java @@ -390,6 +390,25 @@ public class FragmentsTest extends TestSuite { } } + public void testCjsonRequireEncodeDecode() { + try { + Globals globals = JsePlatform.standardGlobals(); + Varargs result = globals.load( + "local cjson = require('cjson')\n" + + "local json = cjson.encode({name='lua', values={1, true, cjson.null}})\n" + + "local decoded = cjson.decode(json)\n" + + "return decoded.name, decoded.values[1], decoded.values[2], decoded.values[3] == cjson.null\n", + "cjson.lua").invoke(); + assertEquals(LuaValue.valueOf("lua"), result.arg1()); + assertEquals(LuaValue.valueOf(1), result.arg(2)); + assertEquals(LuaValue.TRUE, result.arg(3)); + assertEquals(LuaValue.TRUE, result.arg(4)); + } catch (Exception e) { + e.printStackTrace(); + fail(e.toString()); + } + } + public void testTableMove() { runFragment( LuaValue.varargsOf(new LuaValue[] {