From 9bceadd0991f305e580cae77b809879b0d55a966 Mon Sep 17 00:00:00 2001 From: Dibyendu Majumdar Date: Thu, 18 Feb 2021 19:43:45 +0000 Subject: [PATCH 1/5] issue #211 since the up-value carries the type of the local variable, we can safely infer that the result of a get on array is a primitive type --- tests/language/ravi_tests1.ravi | 19 +++++++++++++++++++ tests/language/ravi_tests2.ravi | 17 ++++++++--------- 2 files changed, 27 insertions(+), 9 deletions(-) diff --git a/tests/language/ravi_tests1.ravi b/tests/language/ravi_tests1.ravi index 0512729..1f5c8c9 100644 --- a/tests/language/ravi_tests1.ravi +++ b/tests/language/ravi_tests1.ravi @@ -1819,6 +1819,25 @@ end check(x, 'TOIARRAY', 'IARRAY_GET', 'LEN', 'ADD', 'RETURN', 'RETURN') print 'Test 86 OK' +-- An upvalue that is an array will yield a primitive value +-- issue #211 +do + local x: integer[] = {4} + local y: number[] = {4.2} + local function f() + return x[1] + 1, y[1] + 2.2 + end + check(f, 'GETTABUP', 'ADDII', 'GETTABUP', 'ADDFF', 'RETURN', 'RETURN') + local a,b = f() + assert(a == 5) + assert(b == 6.4) + compile(f) + a,b = f() + assert(a == 5) + assert(b == 6.4) +end +print 'Test 87 OK' + for k,v in pairs(opcodes_coverage) do diff --git a/tests/language/ravi_tests2.ravi b/tests/language/ravi_tests2.ravi index 17c4572..da59cdf 100644 --- a/tests/language/ravi_tests2.ravi +++ b/tests/language/ravi_tests2.ravi @@ -19,12 +19,11 @@ end print 'Ok' -- issue ---do --- local function f(x:integer[]) --- return function () --- return x[1][1] + 1 --- end --- end --- local x = f(table.intarray(3)) --- x() ---end +do + local x: integer[] = {4} + local y: number[] = {4.2} + local function f() + return x[1] + 1, y[1] + 2.2 + end + ravi.dumplua(f) +end From a2ec53624d58b8d952a40868bd83fe4690c7d305 Mon Sep 17 00:00:00 2001 From: Dibyendu Majumdar Date: Thu, 18 Feb 2021 19:44:02 +0000 Subject: [PATCH 2/5] issue #211 since the up-value carries the type of the local variable, we can safely infer that the result of a get on array is a primitive type --- tests/language/ravi_tests2.ravi | 9 --------- 1 file changed, 9 deletions(-) diff --git a/tests/language/ravi_tests2.ravi b/tests/language/ravi_tests2.ravi index da59cdf..a67ad37 100644 --- a/tests/language/ravi_tests2.ravi +++ b/tests/language/ravi_tests2.ravi @@ -18,12 +18,3 @@ do end print 'Ok' --- issue -do - local x: integer[] = {4} - local y: number[] = {4.2} - local function f() - return x[1] + 1, y[1] + 2.2 - end - ravi.dumplua(f) -end From 58cdc8d7dc6dcf46bce422e3a9f48e260b08d635 Mon Sep 17 00:00:00 2001 From: XmiliaH Date: Fri, 19 Feb 2021 13:40:55 +0100 Subject: [PATCH 3/5] RAVI_TSTRINGs can be nil --- src/lcode.c | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/src/lcode.c b/src/lcode.c index 2f88f9e..0077128 100644 --- a/src/lcode.c +++ b/src/lcode.c @@ -1278,7 +1278,7 @@ static void codeunexpval (FuncState *fs, OpCode op, expdesc *e, int line) { break; case OP_LEN: e->u.info = luaK_codeABC(fs, OP_LEN, 0, r, 0); - if (e->ravi_type == RAVI_TARRAYINT || e->ravi_type == RAVI_TARRAYFLT || e->ravi_type == RAVI_TSTRING) { + if (e->ravi_type == RAVI_TARRAYINT || e->ravi_type == RAVI_TARRAYFLT) { e->ravi_type = RAVI_TNUMINT; } else if (e->ravi_type == RAVI_TTABLE) { @@ -1391,8 +1391,8 @@ static void codebinexpval (FuncState *fs, OpCode op, RAVI_GEN_INT_OP(SHR); case OP_CONCAT: e1->u.info = luaK_codeABC(fs, op, 0, rk1, rk2); - if ((e1->ravi_type == RAVI_TSTRING || e1->ravi_type == RAVI_TNUMINT || e1->ravi_type == RAVI_TNUMFLT) || - (e2->ravi_type == RAVI_TSTRING || e2->ravi_type == RAVI_TNUMINT || e2->ravi_type == RAVI_TNUMFLT)) { + if ((e1->ravi_type == RAVI_TNUMINT || e1->ravi_type == RAVI_TNUMFLT) || + (e2->ravi_type == RAVI_TNUMINT || e2->ravi_type == RAVI_TNUMFLT)) { e1->ravi_type = RAVI_TSTRING; } else { @@ -1697,13 +1697,7 @@ void luaK_posfix (FuncState *fs, BinOpr op, SETARG_B(getinstruction(fs, e2), e1->u.info); DEBUG_CODEGEN(raviY_printf(fs, "[%d]* %o ; set A to %d\n", e2->u.info, getinstruction(fs,e2), e1->u.info)); e1->k = VRELOCABLE; e1->u.info = e2->u.info; - if (e2->ravi_type == RAVI_TSTRING && - (e1->ravi_type == RAVI_TSTRING || e1->ravi_type == RAVI_TNUMINT || e1->ravi_type == RAVI_TNUMFLT)) { - e1->ravi_type = RAVI_TSTRING; - } - else { - e1->ravi_type = RAVI_TANY; - } + e1->ravi_type = RAVI_TANY; } else { luaK_exp2nextreg(fs, e2); /* operand must be on the 'stack' */ From c0122cd81613d1d4b698146a02a34006d0ec97fd Mon Sep 17 00:00:00 2001 From: XmiliaH Date: Fri, 19 Feb 2021 13:42:54 +0100 Subject: [PATCH 4/5] FIx tests --- tests/language/ravi_tests1.ravi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/language/ravi_tests1.ravi b/tests/language/ravi_tests1.ravi index 22f1e0e..3c9fc8b 100644 --- a/tests/language/ravi_tests1.ravi +++ b/tests/language/ravi_tests1.ravi @@ -1523,7 +1523,7 @@ print 'Test 58 OK' function x(s1: string, s2: string) return @string( s1 .. s2 ) end -check(x, 'TOSTRING', 'TOSTRING', 'MOVE', 'MOVE', 'CONCAT', 'RETURN', 'RETURN') +check(x, 'TOSTRING', 'TOSTRING', 'MOVE', 'MOVE', 'CONCAT', 'TOSTRING', 'RETURN', 'RETURN') assert(x('a', 'b') == 'ab') compile(x) assert(x('a', 'b') == 'ab') From 62ab59134387beed5d4a19fb4fde330df75eeaf4 Mon Sep 17 00:00:00 2001 From: XmiliaH Date: Fri, 19 Feb 2021 16:45:03 +0100 Subject: [PATCH 5/5] Fix concat --- src/lcode.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lcode.c b/src/lcode.c index 0077128..7cd379b 100644 --- a/src/lcode.c +++ b/src/lcode.c @@ -1391,7 +1391,7 @@ static void codebinexpval (FuncState *fs, OpCode op, RAVI_GEN_INT_OP(SHR); case OP_CONCAT: e1->u.info = luaK_codeABC(fs, op, 0, rk1, rk2); - if ((e1->ravi_type == RAVI_TNUMINT || e1->ravi_type == RAVI_TNUMFLT) || + if ((e1->ravi_type == RAVI_TNUMINT || e1->ravi_type == RAVI_TNUMFLT) && (e2->ravi_type == RAVI_TNUMINT || e2->ravi_type == RAVI_TNUMFLT)) { e1->ravi_type = RAVI_TSTRING; }