drop prevargs in codegen
since we now have a single, contiguous, unlimited VM stack, this does not make any sense anymore (it was a limitation of the static array)master
parent
c62dd07adb
commit
3f513180f1
178
src/cs_gen.cc
178
src/cs_gen.cc
|
@ -107,7 +107,7 @@ static inline int ret_code(int type, int def = 0) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static void compilestatements(
|
static void compilestatements(
|
||||||
codegen_state &gs, int rettype, int brak = '\0', int prevargs = 0
|
codegen_state &gs, int rettype, int brak = '\0'
|
||||||
);
|
);
|
||||||
static inline std::pair<std::string_view, size_t> compileblock(
|
static inline std::pair<std::string_view, size_t> compileblock(
|
||||||
codegen_state &gs, std::string_view p, size_t line,
|
codegen_state &gs, std::string_view p, size_t line,
|
||||||
|
@ -213,22 +213,21 @@ static inline void compileunescapestr(codegen_state &gs) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool compilearg(
|
static bool compilearg(
|
||||||
codegen_state &gs, int wordtype, int prevargs = MAX_RESULTS,
|
codegen_state &gs, int wordtype, charbuf *word = nullptr
|
||||||
charbuf *word = nullptr
|
|
||||||
);
|
);
|
||||||
|
|
||||||
static void compilelookup(codegen_state &gs, int ltype, int prevargs = MAX_RESULTS) {
|
static void compilelookup(codegen_state &gs, int ltype) {
|
||||||
charbuf lookup{gs.ts.istate};
|
charbuf lookup{gs.ts.istate};
|
||||||
gs.next_char();
|
gs.next_char();
|
||||||
switch (gs.current()) {
|
switch (gs.current()) {
|
||||||
case '(':
|
case '(':
|
||||||
case '[':
|
case '[':
|
||||||
if (!compilearg(gs, VAL_STRING, prevargs)) {
|
if (!compilearg(gs, VAL_STRING)) {
|
||||||
goto invalid;
|
goto invalid;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case '$':
|
case '$':
|
||||||
compilelookup(gs, VAL_STRING, prevargs);
|
compilelookup(gs, VAL_STRING);
|
||||||
break;
|
break;
|
||||||
case '\"':
|
case '\"':
|
||||||
lookup = gs.get_str_dup();
|
lookup = gs.get_str_dup();
|
||||||
|
@ -317,9 +316,6 @@ lookupid:
|
||||||
goto done;
|
goto done;
|
||||||
case ident_type::COMMAND: {
|
case ident_type::COMMAND: {
|
||||||
int comtype = BC_INST_COM, numargs = 0;
|
int comtype = BC_INST_COM, numargs = 0;
|
||||||
if (prevargs >= MAX_RESULTS) {
|
|
||||||
gs.code.push_back(BC_INST_ENTER);
|
|
||||||
}
|
|
||||||
auto fmt = static_cast<command_impl *>(id)->get_args();
|
auto fmt = static_cast<command_impl *>(id)->get_args();
|
||||||
for (char c: fmt) {
|
for (char c: fmt) {
|
||||||
switch (c) {
|
switch (c) {
|
||||||
|
@ -381,10 +377,7 @@ lookupid:
|
||||||
comtype | ret_code(ltype) | (id->get_index() << 8)
|
comtype | ret_code(ltype) | (id->get_index() << 8)
|
||||||
);
|
);
|
||||||
gs.code.push_back(
|
gs.code.push_back(
|
||||||
(prevargs >= MAX_RESULTS
|
BC_INST_RESULT_ARG | ret_code(ltype)
|
||||||
? BC_INST_EXIT
|
|
||||||
: BC_INST_RESULT_ARG
|
|
||||||
) | ret_code(ltype)
|
|
||||||
);
|
);
|
||||||
goto done;
|
goto done;
|
||||||
compilecomv:
|
compilecomv:
|
||||||
|
@ -393,10 +386,7 @@ lookupid:
|
||||||
(id->get_index() << 13)
|
(id->get_index() << 13)
|
||||||
);
|
);
|
||||||
gs.code.push_back(
|
gs.code.push_back(
|
||||||
(prevargs >= MAX_RESULTS
|
BC_INST_RESULT_ARG | ret_code(ltype)
|
||||||
? BC_INST_EXIT
|
|
||||||
: BC_INST_RESULT_ARG
|
|
||||||
) | ret_code(ltype)
|
|
||||||
);
|
);
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
|
@ -508,16 +498,16 @@ done:
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool compileblocksub(codegen_state &gs, int prevargs) {
|
static bool compileblocksub(codegen_state &gs) {
|
||||||
charbuf lookup{gs.ts.istate};
|
charbuf lookup{gs.ts.istate};
|
||||||
switch (gs.current()) {
|
switch (gs.current()) {
|
||||||
case '(':
|
case '(':
|
||||||
if (!compilearg(gs, VAL_ANY, prevargs)) {
|
if (!compilearg(gs, VAL_ANY)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case '[':
|
case '[':
|
||||||
if (!compilearg(gs, VAL_STRING, prevargs)) {
|
if (!compilearg(gs, VAL_STRING)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
gs.code.push_back(BC_INST_LOOKUP_MU);
|
gs.code.push_back(BC_INST_LOOKUP_MU);
|
||||||
|
@ -565,7 +555,7 @@ done:
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void compileblockmain(codegen_state &gs, int wordtype, int prevargs) {
|
static void compileblockmain(codegen_state &gs, int wordtype) {
|
||||||
char const *start = gs.source;
|
char const *start = gs.source;
|
||||||
size_t curline = gs.current_line;
|
size_t curline = gs.current_line;
|
||||||
int concs = 0;
|
int concs = 0;
|
||||||
|
@ -604,9 +594,6 @@ static void compileblockmain(codegen_state &gs, int wordtype, int prevargs) {
|
||||||
throw error{gs.ts, "too many @s"};
|
throw error{gs.ts, "too many @s"};
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (!concs && prevargs >= MAX_RESULTS) {
|
|
||||||
gs.code.push_back(BC_INST_ENTER);
|
|
||||||
}
|
|
||||||
if (concs + 2 > MAX_ARGUMENTS) {
|
if (concs + 2 > MAX_ARGUMENTS) {
|
||||||
gs.code.push_back(BC_INST_CONC_W | BC_RET_STRING | (concs << 8));
|
gs.code.push_back(BC_INST_CONC_W | BC_RET_STRING | (concs << 8));
|
||||||
concs = 1;
|
concs = 1;
|
||||||
|
@ -614,14 +601,12 @@ static void compileblockmain(codegen_state &gs, int wordtype, int prevargs) {
|
||||||
if (compileblockstr(gs, start, esc)) {
|
if (compileblockstr(gs, start, esc)) {
|
||||||
concs++;
|
concs++;
|
||||||
}
|
}
|
||||||
if (compileblocksub(gs, prevargs + concs)) {
|
if (compileblocksub(gs)) {
|
||||||
concs++;
|
concs++;
|
||||||
}
|
}
|
||||||
if (concs) {
|
if (concs) {
|
||||||
start = gs.source;
|
start = gs.source;
|
||||||
curline = gs.current_line;
|
curline = gs.current_line;
|
||||||
} else if (prevargs >= MAX_RESULTS) {
|
|
||||||
gs.code.pop_back();
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -658,12 +643,7 @@ static void compileblockmain(codegen_state &gs, int wordtype, int prevargs) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (concs) {
|
if (concs) {
|
||||||
if (prevargs >= MAX_RESULTS) {
|
gs.code.push_back(BC_INST_CONC_W | ret_code(wordtype) | (concs << 8));
|
||||||
gs.code.push_back(BC_INST_CONC_M | ret_code(wordtype) | (concs << 8));
|
|
||||||
gs.code.push_back(BC_INST_EXIT | ret_code(wordtype));
|
|
||||||
} else {
|
|
||||||
gs.code.push_back(BC_INST_CONC_W | ret_code(wordtype) | (concs << 8));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
switch (wordtype) {
|
switch (wordtype) {
|
||||||
case VAL_POP:
|
case VAL_POP:
|
||||||
|
@ -713,7 +693,7 @@ static void compileblockmain(codegen_state &gs, int wordtype, int prevargs) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool compilearg(
|
static bool compilearg(
|
||||||
codegen_state &gs, int wordtype, int prevargs, charbuf *word
|
codegen_state &gs, int wordtype, charbuf *word
|
||||||
) {
|
) {
|
||||||
gs.skip_comments();
|
gs.skip_comments();
|
||||||
switch (gs.current()) {
|
switch (gs.current()) {
|
||||||
|
@ -758,23 +738,17 @@ static bool compilearg(
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
case '$':
|
case '$':
|
||||||
compilelookup(gs, wordtype, prevargs);
|
compilelookup(gs, wordtype);
|
||||||
return true;
|
return true;
|
||||||
case '(':
|
case '(': {
|
||||||
gs.next_char();
|
gs.next_char();
|
||||||
if (prevargs >= MAX_RESULTS) {
|
std::size_t start = gs.code.size();
|
||||||
gs.code.push_back(BC_INST_ENTER);
|
compilestatements(gs, VAL_ANY, ')');
|
||||||
compilestatements(gs, VAL_ANY, ')');
|
if (gs.code.size() > start) {
|
||||||
gs.code.push_back(BC_INST_EXIT | ret_code(wordtype));
|
gs.code.push_back(BC_INST_RESULT_ARG | ret_code(wordtype));
|
||||||
} else {
|
} else {
|
||||||
size_t start = gs.code.size();
|
gs.gen_value(wordtype);
|
||||||
compilestatements(gs, VAL_ANY, ')', prevargs);
|
return true;
|
||||||
if (gs.code.size() > start) {
|
|
||||||
gs.code.push_back(BC_INST_RESULT_ARG | ret_code(wordtype));
|
|
||||||
} else {
|
|
||||||
gs.gen_value(wordtype);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
switch (wordtype) {
|
switch (wordtype) {
|
||||||
case VAL_POP:
|
case VAL_POP:
|
||||||
|
@ -791,9 +765,10 @@ static bool compilearg(
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
|
}
|
||||||
case '[':
|
case '[':
|
||||||
gs.next_char();
|
gs.next_char();
|
||||||
compileblockmain(gs, wordtype, prevargs);
|
compileblockmain(gs, wordtype);
|
||||||
return true;
|
return true;
|
||||||
default:
|
default:
|
||||||
switch (wordtype) {
|
switch (wordtype) {
|
||||||
|
@ -840,7 +815,7 @@ static bool compilearg(
|
||||||
}
|
}
|
||||||
|
|
||||||
static void compile_cmd(
|
static void compile_cmd(
|
||||||
codegen_state &gs, command_impl *id, bool &more, int rettype, int prevargs
|
codegen_state &gs, command_impl *id, bool &more, int rettype
|
||||||
) {
|
) {
|
||||||
int comtype = BC_INST_COM, numargs = 0, fakeargs = 0;
|
int comtype = BC_INST_COM, numargs = 0, fakeargs = 0;
|
||||||
bool rep = false;
|
bool rep = false;
|
||||||
|
@ -849,7 +824,7 @@ static void compile_cmd(
|
||||||
switch (*it) {
|
switch (*it) {
|
||||||
case 's': /* string */
|
case 's': /* string */
|
||||||
if (more) {
|
if (more) {
|
||||||
more = compilearg(gs, VAL_STRING, prevargs + numargs);
|
more = compilearg(gs, VAL_STRING);
|
||||||
}
|
}
|
||||||
if (!more) {
|
if (!more) {
|
||||||
if (rep) {
|
if (rep) {
|
||||||
|
@ -860,9 +835,7 @@ static void compile_cmd(
|
||||||
} else if ((it + 1) == fmt.end()) {
|
} else if ((it + 1) == fmt.end()) {
|
||||||
int numconc = 1;
|
int numconc = 1;
|
||||||
while ((numargs + numconc) < MAX_ARGUMENTS) {
|
while ((numargs + numconc) < MAX_ARGUMENTS) {
|
||||||
more = compilearg(
|
more = compilearg(gs, VAL_STRING);
|
||||||
gs, VAL_STRING, prevargs + numargs + numconc
|
|
||||||
);
|
|
||||||
if (!more) {
|
if (!more) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -876,7 +849,7 @@ static void compile_cmd(
|
||||||
break;
|
break;
|
||||||
case 'i': /* integer */
|
case 'i': /* integer */
|
||||||
if (more) {
|
if (more) {
|
||||||
more = compilearg(gs, VAL_INT, prevargs + numargs);
|
more = compilearg(gs, VAL_INT);
|
||||||
}
|
}
|
||||||
if (!more) {
|
if (!more) {
|
||||||
if (rep) {
|
if (rep) {
|
||||||
|
@ -889,7 +862,7 @@ static void compile_cmd(
|
||||||
break;
|
break;
|
||||||
case 'b': /* integer, INT_MIN default */
|
case 'b': /* integer, INT_MIN default */
|
||||||
if (more) {
|
if (more) {
|
||||||
more = compilearg(gs, VAL_INT, prevargs + numargs);
|
more = compilearg(gs, VAL_INT);
|
||||||
}
|
}
|
||||||
if (!more) {
|
if (!more) {
|
||||||
if (rep) {
|
if (rep) {
|
||||||
|
@ -902,7 +875,7 @@ static void compile_cmd(
|
||||||
break;
|
break;
|
||||||
case 'f': /* float */
|
case 'f': /* float */
|
||||||
if (more) {
|
if (more) {
|
||||||
more = compilearg(gs, VAL_FLOAT, prevargs + numargs);
|
more = compilearg(gs, VAL_FLOAT);
|
||||||
}
|
}
|
||||||
if (!more) {
|
if (!more) {
|
||||||
if (rep) {
|
if (rep) {
|
||||||
|
@ -915,7 +888,7 @@ static void compile_cmd(
|
||||||
break;
|
break;
|
||||||
case 'F': /* float, prev-argument default */
|
case 'F': /* float, prev-argument default */
|
||||||
if (more) {
|
if (more) {
|
||||||
more = compilearg(gs, VAL_FLOAT, prevargs + numargs);
|
more = compilearg(gs, VAL_FLOAT);
|
||||||
}
|
}
|
||||||
if (!more) {
|
if (!more) {
|
||||||
if (rep) {
|
if (rep) {
|
||||||
|
@ -928,10 +901,7 @@ static void compile_cmd(
|
||||||
break;
|
break;
|
||||||
case 't': /* any arg */
|
case 't': /* any arg */
|
||||||
if (more) {
|
if (more) {
|
||||||
more = compilearg(
|
more = compilearg(gs, VAL_ANY);
|
||||||
gs, VAL_ANY,
|
|
||||||
prevargs + numargs
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
if (!more) {
|
if (!more) {
|
||||||
if (rep) {
|
if (rep) {
|
||||||
|
@ -944,7 +914,7 @@ static void compile_cmd(
|
||||||
break;
|
break;
|
||||||
case 'E': /* condition */
|
case 'E': /* condition */
|
||||||
if (more) {
|
if (more) {
|
||||||
more = compilearg(gs, VAL_COND, prevargs + numargs);
|
more = compilearg(gs, VAL_COND);
|
||||||
}
|
}
|
||||||
if (!more) {
|
if (!more) {
|
||||||
if (rep) {
|
if (rep) {
|
||||||
|
@ -957,7 +927,7 @@ static void compile_cmd(
|
||||||
break;
|
break;
|
||||||
case 'e': /* code */
|
case 'e': /* code */
|
||||||
if (more) {
|
if (more) {
|
||||||
more = compilearg(gs, VAL_CODE, prevargs + numargs);
|
more = compilearg(gs, VAL_CODE);
|
||||||
}
|
}
|
||||||
if (!more) {
|
if (!more) {
|
||||||
if (rep) {
|
if (rep) {
|
||||||
|
@ -970,7 +940,7 @@ static void compile_cmd(
|
||||||
break;
|
break;
|
||||||
case 'r': /* ident */
|
case 'r': /* ident */
|
||||||
if (more) {
|
if (more) {
|
||||||
more = compilearg(gs, VAL_IDENT, prevargs + numargs);
|
more = compilearg(gs, VAL_IDENT);
|
||||||
}
|
}
|
||||||
if (!more) {
|
if (!more) {
|
||||||
if (rep) {
|
if (rep) {
|
||||||
|
@ -993,7 +963,7 @@ static void compile_cmd(
|
||||||
comtype = BC_INST_COM_C;
|
comtype = BC_INST_COM_C;
|
||||||
if (more) {
|
if (more) {
|
||||||
while (numargs < MAX_ARGUMENTS) {
|
while (numargs < MAX_ARGUMENTS) {
|
||||||
more = compilearg(gs, VAL_ANY, prevargs + numargs);
|
more = compilearg(gs, VAL_ANY);
|
||||||
if (!more) {
|
if (!more) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -1005,7 +975,7 @@ static void compile_cmd(
|
||||||
comtype = BC_INST_COM_V;
|
comtype = BC_INST_COM_V;
|
||||||
if (more) {
|
if (more) {
|
||||||
while (numargs < MAX_ARGUMENTS) {
|
while (numargs < MAX_ARGUMENTS) {
|
||||||
more = compilearg(gs, VAL_ANY, prevargs + numargs);
|
more = compilearg(gs, VAL_ANY);
|
||||||
if (!more) {
|
if (!more) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -1038,10 +1008,10 @@ compilecomv:
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void compile_alias(codegen_state &gs, alias *id, bool &more, int prevargs) {
|
static void compile_alias(codegen_state &gs, alias *id, bool &more) {
|
||||||
int numargs = 0;
|
int numargs = 0;
|
||||||
while (numargs < MAX_ARGUMENTS) {
|
while (numargs < MAX_ARGUMENTS) {
|
||||||
more = compilearg(gs, VAL_ANY, prevargs + numargs);
|
more = compilearg(gs, VAL_ANY);
|
||||||
if (!more) {
|
if (!more) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -1052,11 +1022,11 @@ static void compile_alias(codegen_state &gs, alias *id, bool &more, int prevargs
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void compile_local(codegen_state &gs, bool &more, int prevargs) {
|
static void compile_local(codegen_state &gs, bool &more) {
|
||||||
int numargs = 0;
|
int numargs = 0;
|
||||||
if (more) {
|
if (more) {
|
||||||
while (numargs < MAX_ARGUMENTS) {
|
while (numargs < MAX_ARGUMENTS) {
|
||||||
more = compilearg(gs, VAL_IDENT, prevargs + numargs);
|
more = compilearg(gs, VAL_IDENT);
|
||||||
if (!more) {
|
if (!more) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -1070,31 +1040,31 @@ static void compile_local(codegen_state &gs, bool &more, int prevargs) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static void compile_do(
|
static void compile_do(
|
||||||
codegen_state &gs, bool &more, int prevargs, int rettype, int opcode
|
codegen_state &gs, bool &more, int rettype, int opcode
|
||||||
) {
|
) {
|
||||||
if (more) {
|
if (more) {
|
||||||
more = compilearg(gs, VAL_CODE, prevargs);
|
more = compilearg(gs, VAL_CODE);
|
||||||
}
|
}
|
||||||
gs.code.push_back((more ? opcode : BC_INST_NULL) | ret_code(rettype));
|
gs.code.push_back((more ? opcode : BC_INST_NULL) | ret_code(rettype));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void compile_if(
|
static void compile_if(
|
||||||
codegen_state &gs, ident *id, bool &more, int prevargs, int rettype
|
codegen_state &gs, ident *id, bool &more, int rettype
|
||||||
) {
|
) {
|
||||||
if (more) {
|
if (more) {
|
||||||
more = compilearg(gs, VAL_ANY, prevargs);
|
more = compilearg(gs, VAL_ANY);
|
||||||
}
|
}
|
||||||
if (!more) {
|
if (!more) {
|
||||||
gs.code.push_back(BC_INST_NULL | ret_code(rettype));
|
gs.code.push_back(BC_INST_NULL | ret_code(rettype));
|
||||||
} else {
|
} else {
|
||||||
int start1 = gs.code.size();
|
int start1 = gs.code.size();
|
||||||
more = compilearg(gs, VAL_CODE, prevargs + 1);
|
more = compilearg(gs, VAL_CODE);
|
||||||
if (!more) {
|
if (!more) {
|
||||||
gs.code.push_back(BC_INST_POP);
|
gs.code.push_back(BC_INST_POP);
|
||||||
gs.code.push_back(BC_INST_NULL | ret_code(rettype));
|
gs.code.push_back(BC_INST_NULL | ret_code(rettype));
|
||||||
} else {
|
} else {
|
||||||
int start2 = gs.code.size();
|
int start2 = gs.code.size();
|
||||||
more = compilearg(gs, VAL_CODE, prevargs + 2);
|
more = compilearg(gs, VAL_CODE);
|
||||||
uint32_t inst1 = gs.code[start1];
|
uint32_t inst1 = gs.code[start1];
|
||||||
uint32_t op1 = inst1 & ~BC_INST_RET_MASK;
|
uint32_t op1 = inst1 & ~BC_INST_RET_MASK;
|
||||||
uint32_t len1 = start2 - (start1 + 1);
|
uint32_t len1 = start2 - (start1 + 1);
|
||||||
|
@ -1143,11 +1113,11 @@ static void compile_if(
|
||||||
}
|
}
|
||||||
|
|
||||||
static void compile_and_or(
|
static void compile_and_or(
|
||||||
codegen_state &gs, ident *id, bool &more, int prevargs, int rettype
|
codegen_state &gs, ident *id, bool &more, int rettype
|
||||||
) {
|
) {
|
||||||
int numargs = 0;
|
int numargs = 0;
|
||||||
if (more) {
|
if (more) {
|
||||||
more = compilearg(gs, VAL_COND, prevargs);
|
more = compilearg(gs, VAL_COND);
|
||||||
}
|
}
|
||||||
if (!more) {
|
if (!more) {
|
||||||
gs.code.push_back(
|
gs.code.push_back(
|
||||||
|
@ -1158,7 +1128,7 @@ static void compile_and_or(
|
||||||
numargs++;
|
numargs++;
|
||||||
int start = gs.code.size(), end = start;
|
int start = gs.code.size(), end = start;
|
||||||
while (numargs < MAX_ARGUMENTS) {
|
while (numargs < MAX_ARGUMENTS) {
|
||||||
more = compilearg(gs, VAL_COND, prevargs + numargs);
|
more = compilearg(gs, VAL_COND);
|
||||||
if (!more) {
|
if (!more) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -1172,7 +1142,7 @@ static void compile_and_or(
|
||||||
}
|
}
|
||||||
if (more) {
|
if (more) {
|
||||||
while (numargs < MAX_ARGUMENTS) {
|
while (numargs < MAX_ARGUMENTS) {
|
||||||
more = compilearg(gs, VAL_COND, prevargs + numargs);
|
more = compilearg(gs, VAL_COND);
|
||||||
if (!more) {
|
if (!more) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -1201,13 +1171,13 @@ static void compile_and_or(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void compilestatements(codegen_state &gs, int rettype, int brak, int prevargs) {
|
static void compilestatements(codegen_state &gs, int rettype, int brak) {
|
||||||
charbuf idname{gs.ts.istate};
|
charbuf idname{gs.ts.istate};
|
||||||
for (;;) {
|
for (;;) {
|
||||||
gs.skip_comments();
|
gs.skip_comments();
|
||||||
idname.clear();
|
idname.clear();
|
||||||
size_t curline = gs.current_line;
|
size_t curline = gs.current_line;
|
||||||
bool more = compilearg(gs, VAL_WORD, prevargs, &idname);
|
bool more = compilearg(gs, VAL_WORD, &idname);
|
||||||
if (!more) {
|
if (!more) {
|
||||||
goto endstatement;
|
goto endstatement;
|
||||||
}
|
}
|
||||||
|
@ -1234,7 +1204,7 @@ static void compilestatements(codegen_state &gs, int rettype, int brak, int prev
|
||||||
if (id) {
|
if (id) {
|
||||||
switch (id->get_type()) {
|
switch (id->get_type()) {
|
||||||
case ident_type::ALIAS:
|
case ident_type::ALIAS:
|
||||||
more = compilearg(gs, VAL_ANY, prevargs);
|
more = compilearg(gs, VAL_ANY);
|
||||||
if (!more) {
|
if (!more) {
|
||||||
gs.gen_str();
|
gs.gen_str();
|
||||||
}
|
}
|
||||||
|
@ -1243,7 +1213,7 @@ static void compilestatements(codegen_state &gs, int rettype, int brak, int prev
|
||||||
);
|
);
|
||||||
goto endstatement;
|
goto endstatement;
|
||||||
case ident_type::IVAR:
|
case ident_type::IVAR:
|
||||||
more = compilearg(gs, VAL_INT, prevargs);
|
more = compilearg(gs, VAL_INT);
|
||||||
if (!more) {
|
if (!more) {
|
||||||
gs.gen_int();
|
gs.gen_int();
|
||||||
}
|
}
|
||||||
|
@ -1252,7 +1222,7 @@ static void compilestatements(codegen_state &gs, int rettype, int brak, int prev
|
||||||
);
|
);
|
||||||
goto endstatement;
|
goto endstatement;
|
||||||
case ident_type::FVAR:
|
case ident_type::FVAR:
|
||||||
more = compilearg(gs, VAL_FLOAT, prevargs);
|
more = compilearg(gs, VAL_FLOAT);
|
||||||
if (!more) {
|
if (!more) {
|
||||||
gs.gen_float();
|
gs.gen_float();
|
||||||
}
|
}
|
||||||
|
@ -1261,7 +1231,7 @@ static void compilestatements(codegen_state &gs, int rettype, int brak, int prev
|
||||||
);
|
);
|
||||||
goto endstatement;
|
goto endstatement;
|
||||||
case ident_type::SVAR:
|
case ident_type::SVAR:
|
||||||
more = compilearg(gs, VAL_STRING, prevargs);
|
more = compilearg(gs, VAL_STRING);
|
||||||
if (!more) {
|
if (!more) {
|
||||||
gs.gen_str();
|
gs.gen_str();
|
||||||
}
|
}
|
||||||
|
@ -1287,7 +1257,7 @@ static void compilestatements(codegen_state &gs, int rettype, int brak, int prev
|
||||||
noid:
|
noid:
|
||||||
int numargs = 0;
|
int numargs = 0;
|
||||||
while (numargs < MAX_ARGUMENTS) {
|
while (numargs < MAX_ARGUMENTS) {
|
||||||
more = compilearg(gs, VAL_ANY, prevargs + numargs);
|
more = compilearg(gs, VAL_ANY);
|
||||||
if (!more) {
|
if (!more) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -1322,26 +1292,26 @@ noid:
|
||||||
switch (id->get_raw_type()) {
|
switch (id->get_raw_type()) {
|
||||||
case ID_ALIAS:
|
case ID_ALIAS:
|
||||||
compile_alias(
|
compile_alias(
|
||||||
gs, static_cast<alias *>(id), more, prevargs
|
gs, static_cast<alias *>(id), more
|
||||||
);
|
);
|
||||||
break;
|
break;
|
||||||
case ID_COMMAND:
|
case ID_COMMAND:
|
||||||
compile_cmd(
|
compile_cmd(
|
||||||
gs, static_cast<command_impl *>(id), more,
|
gs, static_cast<command_impl *>(id), more,
|
||||||
rettype, prevargs
|
rettype
|
||||||
);
|
);
|
||||||
break;
|
break;
|
||||||
case ID_LOCAL:
|
case ID_LOCAL:
|
||||||
compile_local(gs, more, prevargs);
|
compile_local(gs, more);
|
||||||
break;
|
break;
|
||||||
case ID_DO:
|
case ID_DO:
|
||||||
compile_do(gs, more, prevargs, rettype, BC_INST_DO);
|
compile_do(gs, more, rettype, BC_INST_DO);
|
||||||
break;
|
break;
|
||||||
case ID_DOARGS:
|
case ID_DOARGS:
|
||||||
compile_do(gs, more, prevargs, rettype, BC_INST_DO_ARGS);
|
compile_do(gs, more, rettype, BC_INST_DO_ARGS);
|
||||||
break;
|
break;
|
||||||
case ID_IF:
|
case ID_IF:
|
||||||
compile_if(gs, id, more, prevargs, rettype);
|
compile_if(gs, id, more, rettype);
|
||||||
break;
|
break;
|
||||||
case ID_BREAK:
|
case ID_BREAK:
|
||||||
gs.code.push_back(BC_INST_BREAK | BC_INST_FLAG_FALSE);
|
gs.code.push_back(BC_INST_BREAK | BC_INST_FLAG_FALSE);
|
||||||
|
@ -1351,7 +1321,7 @@ noid:
|
||||||
break;
|
break;
|
||||||
case ID_RESULT:
|
case ID_RESULT:
|
||||||
if (more) {
|
if (more) {
|
||||||
more = compilearg(gs, VAL_ANY, prevargs);
|
more = compilearg(gs, VAL_ANY);
|
||||||
}
|
}
|
||||||
gs.code.push_back(
|
gs.code.push_back(
|
||||||
(more ? BC_INST_RESULT : BC_INST_NULL) |
|
(more ? BC_INST_RESULT : BC_INST_NULL) |
|
||||||
|
@ -1360,7 +1330,7 @@ noid:
|
||||||
break;
|
break;
|
||||||
case ID_NOT:
|
case ID_NOT:
|
||||||
if (more) {
|
if (more) {
|
||||||
more = compilearg(gs, VAL_ANY, prevargs);
|
more = compilearg(gs, VAL_ANY);
|
||||||
}
|
}
|
||||||
gs.code.push_back(
|
gs.code.push_back(
|
||||||
(more ? BC_INST_NOT : BC_INST_TRUE) | ret_code(rettype)
|
(more ? BC_INST_NOT : BC_INST_TRUE) | ret_code(rettype)
|
||||||
|
@ -1368,17 +1338,17 @@ noid:
|
||||||
break;
|
break;
|
||||||
case ID_AND:
|
case ID_AND:
|
||||||
case ID_OR:
|
case ID_OR:
|
||||||
compile_and_or(gs, id, more, prevargs, rettype);
|
compile_and_or(gs, id, more, rettype);
|
||||||
break;
|
break;
|
||||||
case ID_IVAR:
|
case ID_IVAR:
|
||||||
if (!(more = compilearg(gs, VAL_INT, prevargs))) {
|
if (!(more = compilearg(gs, VAL_INT))) {
|
||||||
gs.code.push_back(BC_INST_PRINT | (id->get_index() << 8));
|
gs.code.push_back(BC_INST_PRINT | (id->get_index() << 8));
|
||||||
} else if (!(id->get_flags() & IDENT_FLAG_HEX) || !(
|
} else if (!(id->get_flags() & IDENT_FLAG_HEX) || !(
|
||||||
more = compilearg(gs, VAL_INT, prevargs + 1)
|
more = compilearg(gs, VAL_INT)
|
||||||
)) {
|
)) {
|
||||||
gs.code.push_back(BC_INST_IVAR1 | (id->get_index() << 8));
|
gs.code.push_back(BC_INST_IVAR1 | (id->get_index() << 8));
|
||||||
} else if (!(
|
} else if (!(
|
||||||
more = compilearg(gs, VAL_INT, prevargs + 2)
|
more = compilearg(gs, VAL_INT)
|
||||||
)) {
|
)) {
|
||||||
gs.code.push_back(BC_INST_IVAR2 | (id->get_index() << 8));
|
gs.code.push_back(BC_INST_IVAR2 | (id->get_index() << 8));
|
||||||
} else {
|
} else {
|
||||||
|
@ -1386,23 +1356,21 @@ noid:
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case ID_FVAR:
|
case ID_FVAR:
|
||||||
if (!(more = compilearg(gs, VAL_FLOAT, prevargs))) {
|
if (!(more = compilearg(gs, VAL_FLOAT))) {
|
||||||
gs.code.push_back(BC_INST_PRINT | (id->get_index() << 8));
|
gs.code.push_back(BC_INST_PRINT | (id->get_index() << 8));
|
||||||
} else {
|
} else {
|
||||||
gs.code.push_back(BC_INST_FVAR1 | (id->get_index() << 8));
|
gs.code.push_back(BC_INST_FVAR1 | (id->get_index() << 8));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case ID_SVAR:
|
case ID_SVAR:
|
||||||
if (!(more = compilearg(gs, VAL_STRING, prevargs))) {
|
if (!(more = compilearg(gs, VAL_STRING))) {
|
||||||
gs.code.push_back(BC_INST_PRINT | (id->get_index() << 8));
|
gs.code.push_back(BC_INST_PRINT | (id->get_index() << 8));
|
||||||
} else {
|
} else {
|
||||||
int numargs = 0;
|
int numargs = 0;
|
||||||
do {
|
do {
|
||||||
++numargs;
|
++numargs;
|
||||||
} while (numargs < MAX_ARGUMENTS && (
|
} while (numargs < MAX_ARGUMENTS && (
|
||||||
more = compilearg(
|
more = compilearg(gs, VAL_ANY)
|
||||||
gs, VAL_ANY, prevargs + numargs
|
|
||||||
)
|
|
||||||
));
|
));
|
||||||
if (numargs > 1) {
|
if (numargs > 1) {
|
||||||
gs.code.push_back(
|
gs.code.push_back(
|
||||||
|
|
Loading…
Reference in New Issue