mirror of https://github.com/rusefi/lua.git
`(exp)' adjusts exp to 1 result
This commit is contained in:
parent
186111dc01
commit
89c301d180
22
lcode.c
22
lcode.c
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
** $Id: lcode.c,v 1.73 2001/06/08 19:00:57 roberto Exp roberto $
|
** $Id: lcode.c,v 1.74 2001/06/11 14:56:42 roberto Exp roberto $
|
||||||
** Code generator for Lua
|
** Code generator for Lua
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
|
@ -271,7 +271,7 @@ void luaK_setcallreturns (FuncState *fs, expdesc *e, int nresults) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void dischargevars (FuncState *fs, expdesc *e) {
|
void luaK_dischargevars (FuncState *fs, expdesc *e) {
|
||||||
switch (e->k) {
|
switch (e->k) {
|
||||||
case VLOCAL: {
|
case VLOCAL: {
|
||||||
e->k = VNONRELOC;
|
e->k = VNONRELOC;
|
||||||
|
@ -325,7 +325,7 @@ static void dischargejumps (FuncState *fs, expdesc *e, int reg) {
|
||||||
|
|
||||||
|
|
||||||
static void discharge2reg (FuncState *fs, expdesc *e, int reg) {
|
static void discharge2reg (FuncState *fs, expdesc *e, int reg) {
|
||||||
dischargevars(fs, e);
|
luaK_dischargevars(fs, e);
|
||||||
switch (e->k) {
|
switch (e->k) {
|
||||||
case VNIL: {
|
case VNIL: {
|
||||||
luaK_nil(fs, reg, 1);
|
luaK_nil(fs, reg, 1);
|
||||||
|
@ -392,7 +392,7 @@ static void luaK_exp2reg (FuncState *fs, expdesc *e, int reg) {
|
||||||
|
|
||||||
void luaK_exp2nextreg (FuncState *fs, expdesc *e) {
|
void luaK_exp2nextreg (FuncState *fs, expdesc *e) {
|
||||||
int reg;
|
int reg;
|
||||||
dischargevars(fs, e);
|
luaK_dischargevars(fs, e);
|
||||||
freeexp(fs, e);
|
freeexp(fs, e);
|
||||||
reg = fs->freereg;
|
reg = fs->freereg;
|
||||||
luaK_reserveregs(fs, 1);
|
luaK_reserveregs(fs, 1);
|
||||||
|
@ -401,7 +401,7 @@ void luaK_exp2nextreg (FuncState *fs, expdesc *e) {
|
||||||
|
|
||||||
|
|
||||||
int luaK_exp2anyreg (FuncState *fs, expdesc *e) {
|
int luaK_exp2anyreg (FuncState *fs, expdesc *e) {
|
||||||
dischargevars(fs, e);
|
luaK_dischargevars(fs, e);
|
||||||
if (e->k == VNONRELOC) {
|
if (e->k == VNONRELOC) {
|
||||||
if (!hasjumps(e)) return e->u.i.info; /* exp is already in a register */
|
if (!hasjumps(e)) return e->u.i.info; /* exp is already in a register */
|
||||||
if (e->u.i.info >= fs->nactloc) { /* reg. is not a local? */
|
if (e->u.i.info >= fs->nactloc) { /* reg. is not a local? */
|
||||||
|
@ -418,7 +418,7 @@ void luaK_exp2val (FuncState *fs, expdesc *e) {
|
||||||
if (hasjumps(e))
|
if (hasjumps(e))
|
||||||
luaK_exp2anyreg(fs, e);
|
luaK_exp2anyreg(fs, e);
|
||||||
else
|
else
|
||||||
dischargevars(fs, e);
|
luaK_dischargevars(fs, e);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -510,7 +510,7 @@ static int jumponcond (FuncState *fs, expdesc *e, OpCode op) {
|
||||||
|
|
||||||
void luaK_goiftrue (FuncState *fs, expdesc *e) {
|
void luaK_goiftrue (FuncState *fs, expdesc *e) {
|
||||||
int pc; /* pc of last jump */
|
int pc; /* pc of last jump */
|
||||||
dischargevars(fs, e);
|
luaK_dischargevars(fs, e);
|
||||||
switch (e->k) {
|
switch (e->k) {
|
||||||
case VK: case VNUMBER: {
|
case VK: case VNUMBER: {
|
||||||
pc = NO_JUMP; /* always true; do nothing */
|
pc = NO_JUMP; /* always true; do nothing */
|
||||||
|
@ -544,7 +544,7 @@ void luaK_goiftrue (FuncState *fs, expdesc *e) {
|
||||||
|
|
||||||
static void luaK_goiffalse (FuncState *fs, expdesc *e) {
|
static void luaK_goiffalse (FuncState *fs, expdesc *e) {
|
||||||
int pc; /* pc of last jump */
|
int pc; /* pc of last jump */
|
||||||
dischargevars(fs, e);
|
luaK_dischargevars(fs, e);
|
||||||
switch (e->k) {
|
switch (e->k) {
|
||||||
case VNIL: {
|
case VNIL: {
|
||||||
pc = NO_JUMP; /* always false; do nothing */
|
pc = NO_JUMP; /* always false; do nothing */
|
||||||
|
@ -573,7 +573,7 @@ static void luaK_goiffalse (FuncState *fs, expdesc *e) {
|
||||||
|
|
||||||
|
|
||||||
static void codenot (FuncState *fs, expdesc *e) {
|
static void codenot (FuncState *fs, expdesc *e) {
|
||||||
dischargevars(fs, e);
|
luaK_dischargevars(fs, e);
|
||||||
switch (e->k) {
|
switch (e->k) {
|
||||||
case VNIL: {
|
case VNIL: {
|
||||||
e->u.n = 1;
|
e->u.n = 1;
|
||||||
|
@ -680,14 +680,14 @@ void luaK_posfix (FuncState *fs, BinOpr op, expdesc *e1, expdesc *e2) {
|
||||||
switch (op) {
|
switch (op) {
|
||||||
case OPR_AND: {
|
case OPR_AND: {
|
||||||
lua_assert(e1->t == NO_JUMP); /* list must be closed */
|
lua_assert(e1->t == NO_JUMP); /* list must be closed */
|
||||||
dischargevars(fs, e2);
|
luaK_dischargevars(fs, e2);
|
||||||
luaK_concat(fs, &e1->f, e2->f);
|
luaK_concat(fs, &e1->f, e2->f);
|
||||||
e1->k = e2->k; e1->u = e2->u; e1->t = e2->t;
|
e1->k = e2->k; e1->u = e2->u; e1->t = e2->t;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case OPR_OR: {
|
case OPR_OR: {
|
||||||
lua_assert(e1->f == NO_JUMP); /* list must be closed */
|
lua_assert(e1->f == NO_JUMP); /* list must be closed */
|
||||||
dischargevars(fs, e2);
|
luaK_dischargevars(fs, e2);
|
||||||
luaK_concat(fs, &e1->t, e2->t);
|
luaK_concat(fs, &e1->t, e2->t);
|
||||||
e1->k = e2->k; e1->u = e2->u; e1->f = e2->f;
|
e1->k = e2->k; e1->u = e2->u; e1->f = e2->f;
|
||||||
break;
|
break;
|
||||||
|
|
3
lcode.h
3
lcode.h
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
** $Id: lcode.h,v 1.21 2001/02/23 17:17:25 roberto Exp roberto $
|
** $Id: lcode.h,v 1.22 2001/06/05 18:17:01 roberto Exp roberto $
|
||||||
** Code generator for Lua
|
** Code generator for Lua
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
|
@ -44,6 +44,7 @@ int luaK_codeABC (FuncState *fs, OpCode o, int A, int B, int C);
|
||||||
void luaK_nil (FuncState *fs, int from, int n);
|
void luaK_nil (FuncState *fs, int from, int n);
|
||||||
void luaK_reserveregs (FuncState *fs, int n);
|
void luaK_reserveregs (FuncState *fs, int n);
|
||||||
int luaK_stringk (FuncState *fs, TString *s);
|
int luaK_stringk (FuncState *fs, TString *s);
|
||||||
|
void luaK_dischargevars (FuncState *fs, expdesc *e);
|
||||||
int luaK_exp2anyreg (FuncState *fs, expdesc *e);
|
int luaK_exp2anyreg (FuncState *fs, expdesc *e);
|
||||||
void luaK_exp2nextreg (FuncState *fs, expdesc *e);
|
void luaK_exp2nextreg (FuncState *fs, expdesc *e);
|
||||||
void luaK_exp2val (FuncState *fs, expdesc *e);
|
void luaK_exp2val (FuncState *fs, expdesc *e);
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
** $Id: lparser.c,v 1.147 2001/06/08 19:00:57 roberto Exp roberto $
|
** $Id: lparser.c,v 1.148 2001/06/11 14:56:42 roberto Exp roberto $
|
||||||
** LL(1) Parser and code generator for Lua
|
** LL(1) Parser and code generator for Lua
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
|
@ -636,6 +636,7 @@ static void primaryexp (LexState *ls, expdesc *v) {
|
||||||
next(ls);
|
next(ls);
|
||||||
expr(ls, v);
|
expr(ls, v);
|
||||||
check(ls, l_c(')'));
|
check(ls, l_c(')'));
|
||||||
|
luaK_dischargevars(ls->fs, v);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
case TK_NAME: {
|
case TK_NAME: {
|
||||||
|
|
Loading…
Reference in New Issue