forked from OctaForge/libcubescript
style
This commit is contained in:
parent
b6e567df51
commit
e92c6ad831
104
cubescript.cc
104
cubescript.cc
|
@ -138,13 +138,13 @@ const struct NullValue: TaggedValue {
|
||||||
static TaggedValue no_ret = null_value;
|
static TaggedValue no_ret = null_value;
|
||||||
|
|
||||||
CsState::CsState(): result(&no_ret) {
|
CsState::CsState(): result(&no_ret) {
|
||||||
for (int i = 0; i < MAX_ARGUMENTS; ++i) {
|
for (int i = 0; i < MaxArguments; ++i) {
|
||||||
char buf[32];
|
char buf[32];
|
||||||
snprintf(buf, sizeof(buf), "arg%d", i + 1);
|
snprintf(buf, sizeof(buf), "arg%d", i + 1);
|
||||||
new_ident((const char *)buf, IDF_ARG);
|
new_ident((const char *)buf, IDF_ARG);
|
||||||
}
|
}
|
||||||
dummy = new_ident("//dummy");
|
dummy = new_ident("//dummy");
|
||||||
add_ident(ID_VAR, "numargs", MAX_ARGUMENTS, 0, &numargs);
|
add_ident(ID_VAR, "numargs", MaxArguments, 0, &numargs);
|
||||||
add_ident(ID_VAR, "dbgalias", 0, 1000, &dbgalias);
|
add_ident(ID_VAR, "dbgalias", 0, 1000, &dbgalias);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -318,7 +318,7 @@ void CsState::set_alias(ostd::ConstCharRange name, TaggedValue &v) {
|
||||||
if (id) {
|
if (id) {
|
||||||
switch (id->type) {
|
switch (id->type) {
|
||||||
case ID_ALIAS:
|
case ID_ALIAS:
|
||||||
if (id->index < MAX_ARGUMENTS)
|
if (id->index < MaxArguments)
|
||||||
id->set_arg(*this, v);
|
id->set_arg(*this, v);
|
||||||
else
|
else
|
||||||
id->set_alias(*this, v);
|
id->set_alias(*this, v);
|
||||||
|
@ -666,12 +666,12 @@ void Ident::redo_arg(const IdentStack &st) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Ident::push_alias(IdentStack &stack) {
|
void Ident::push_alias(IdentStack &stack) {
|
||||||
if (type == ID_ALIAS && index >= MAX_ARGUMENTS)
|
if (type == ID_ALIAS && index >= MaxArguments)
|
||||||
push_arg(null_value, stack);
|
push_arg(null_value, stack);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Ident::pop_alias() {
|
void Ident::pop_alias() {
|
||||||
if (type == ID_ALIAS && index >= MAX_ARGUMENTS) pop_arg();
|
if (type == ID_ALIAS && index >= MaxArguments) pop_arg();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Ident::set_arg(CsState &cs, TaggedValue &v) {
|
void Ident::set_arg(CsState &cs, TaggedValue &v) {
|
||||||
|
@ -694,7 +694,7 @@ void Ident::set_alias(CsState &cs, TaggedValue &v) {
|
||||||
|
|
||||||
template<typename F>
|
template<typename F>
|
||||||
static void cs_do_args(CsState &cs, F body) {
|
static void cs_do_args(CsState &cs, F body) {
|
||||||
IdentStack argstack[MAX_ARGUMENTS];
|
IdentStack argstack[MaxArguments];
|
||||||
int argmask1 = cs.stack->usedargs;
|
int argmask1 = cs.stack->usedargs;
|
||||||
for (int i = 0; argmask1; argmask1 >>= 1, ++i) if(argmask1 & 1)
|
for (int i = 0; argmask1; argmask1 >>= 1, ++i) if(argmask1 & 1)
|
||||||
cs.identmap[i]->undo_arg(argstack[i]);
|
cs.identmap[i]->undo_arg(argstack[i]);
|
||||||
|
@ -839,7 +839,7 @@ CsState::get_alias(ostd::ConstCharRange name) {
|
||||||
Ident *id = idents.at(name);
|
Ident *id = idents.at(name);
|
||||||
if (!id || id->type != ID_ALIAS)
|
if (!id || id->type != ID_ALIAS)
|
||||||
return ostd::nothing;
|
return ostd::nothing;
|
||||||
if ((id->index < MAX_ARGUMENTS) && !(stack->usedargs & (1 << id->index)))
|
if ((id->index < MaxArguments) && !(stack->usedargs & (1 << id->index)))
|
||||||
return ostd::nothing;
|
return ostd::nothing;
|
||||||
return id->get_str();
|
return id->get_str();
|
||||||
}
|
}
|
||||||
|
@ -945,14 +945,14 @@ bool CsState::add_command(ostd::ConstCharRange name, ostd::ConstCharRange args,
|
||||||
case 'E':
|
case 'E':
|
||||||
case 'N':
|
case 'N':
|
||||||
case 'D':
|
case 'D':
|
||||||
if (nargs < MAX_ARGUMENTS) nargs++;
|
if (nargs < MaxArguments) nargs++;
|
||||||
break;
|
break;
|
||||||
case 'S':
|
case 'S':
|
||||||
case 's':
|
case 's':
|
||||||
case 'e':
|
case 'e':
|
||||||
case 'r':
|
case 'r':
|
||||||
case '$':
|
case '$':
|
||||||
if (nargs < MAX_ARGUMENTS) {
|
if (nargs < MaxArguments) {
|
||||||
argmask |= 1 << nargs;
|
argmask |= 1 << nargs;
|
||||||
nargs++;
|
nargs++;
|
||||||
}
|
}
|
||||||
|
@ -961,7 +961,7 @@ bool CsState::add_command(ostd::ConstCharRange name, ostd::ConstCharRange args,
|
||||||
case '2':
|
case '2':
|
||||||
case '3':
|
case '3':
|
||||||
case '4':
|
case '4':
|
||||||
if (nargs < MAX_ARGUMENTS)
|
if (nargs < MaxArguments)
|
||||||
fmt.push_front_n(fmt.front() - '0' + 1);
|
fmt.push_front_n(fmt.front() - '0' + 1);
|
||||||
break;
|
break;
|
||||||
case 'C':
|
case 'C':
|
||||||
|
@ -974,7 +974,7 @@ bool CsState::add_command(ostd::ConstCharRange name, ostd::ConstCharRange args,
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (limit && nargs > MAX_COMARGS) {
|
if (limit && nargs > MaxComargs) {
|
||||||
ostd::err.writefln("builtin %s declared with too many arguments: %d",
|
ostd::err.writefln("builtin %s declared with too many arguments: %d",
|
||||||
name, nargs);
|
name, nargs);
|
||||||
return false;
|
return false;
|
||||||
|
@ -992,7 +992,7 @@ static void cs_init_lib_base_var(CsState &cs) {
|
||||||
|
|
||||||
cs.add_command("push", "rTe", [](CsState &cs, Ident *id,
|
cs.add_command("push", "rTe", [](CsState &cs, Ident *id,
|
||||||
TaggedValue *v, ostd::Uint32 *code) {
|
TaggedValue *v, ostd::Uint32 *code) {
|
||||||
if (id->type != ID_ALIAS || id->index < MAX_ARGUMENTS) return;
|
if (id->type != ID_ALIAS || id->index < MaxArguments) return;
|
||||||
IdentStack stack;
|
IdentStack stack;
|
||||||
id->push_arg(*v, stack);
|
id->push_arg(*v, stack);
|
||||||
v->set_null();
|
v->set_null();
|
||||||
|
@ -1097,7 +1097,7 @@ haslen:
|
||||||
}
|
}
|
||||||
|
|
||||||
static char *conc(TvalRange v, bool space, const char *prefix, int prefixlen) {
|
static char *conc(TvalRange v, bool space, const char *prefix, int prefixlen) {
|
||||||
static int vlen[MAX_ARGUMENTS];
|
static int vlen[MaxArguments];
|
||||||
static char numbuf[3 * 256];
|
static char numbuf[3 * 256];
|
||||||
int len = prefixlen, numlen = 0, i = 0;
|
int len = prefixlen, numlen = 0, i = 0;
|
||||||
for (; i < int(v.size()); i++) switch (v[i].get_type()) {
|
for (; i < int(v.size()); i++) switch (v[i].get_type()) {
|
||||||
|
@ -1319,7 +1319,7 @@ struct GenState {
|
||||||
}
|
}
|
||||||
|
|
||||||
void gen_ident(Ident *id) {
|
void gen_ident(Ident *id) {
|
||||||
code.push(((id->index < MAX_ARGUMENTS) ? CODE_IDENTARG
|
code.push(((id->index < MaxArguments) ? CODE_IDENTARG
|
||||||
: CODE_IDENT) |
|
: CODE_IDENT) |
|
||||||
(id->index << 8));
|
(id->index << 8));
|
||||||
}
|
}
|
||||||
|
@ -1486,9 +1486,9 @@ static inline bool cs_get_bool(const TaggedValue &v) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static ostd::ConstCharRange unusedword(nullptr, nullptr);
|
static ostd::ConstCharRange unusedword(nullptr, nullptr);
|
||||||
static bool compilearg(GenState &gs, int wordtype, int prevargs = MAX_RESULTS, ostd::ConstCharRange &word = unusedword);
|
static bool compilearg(GenState &gs, int wordtype, int prevargs = MaxResults, ostd::ConstCharRange &word = unusedword);
|
||||||
|
|
||||||
static void compilelookup(GenState &gs, int ltype, int prevargs = MAX_RESULTS) {
|
static void compilelookup(GenState &gs, int ltype, int prevargs = MaxResults) {
|
||||||
ostd::ConstCharRange lookup;
|
ostd::ConstCharRange lookup;
|
||||||
gs.next_char();
|
gs.next_char();
|
||||||
switch (gs.current()) {
|
switch (gs.current()) {
|
||||||
|
@ -1558,21 +1558,21 @@ lookupid:
|
||||||
return;
|
return;
|
||||||
case VAL_CANY:
|
case VAL_CANY:
|
||||||
case VAL_COND:
|
case VAL_COND:
|
||||||
gs.code.push((id->index < MAX_ARGUMENTS ? CODE_LOOKUPMARG : CODE_LOOKUPM) | (id->index << 8));
|
gs.code.push((id->index < MaxArguments ? CODE_LOOKUPMARG : CODE_LOOKUPM) | (id->index << 8));
|
||||||
break;
|
break;
|
||||||
case VAL_CSTR:
|
case VAL_CSTR:
|
||||||
case VAL_CODE:
|
case VAL_CODE:
|
||||||
case VAL_IDENT:
|
case VAL_IDENT:
|
||||||
gs.code.push((id->index < MAX_ARGUMENTS ? CODE_LOOKUPMARG : CODE_LOOKUPM) | RET_STR | (id->index << 8));
|
gs.code.push((id->index < MaxArguments ? CODE_LOOKUPMARG : CODE_LOOKUPM) | RET_STR | (id->index << 8));
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
gs.code.push((id->index < MAX_ARGUMENTS ? CODE_LOOKUPARG : CODE_LOOKUP) | cs_ret_code(ltype, RET_STR) | (id->index << 8));
|
gs.code.push((id->index < MaxArguments ? CODE_LOOKUPARG : CODE_LOOKUP) | cs_ret_code(ltype, RET_STR) | (id->index << 8));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
goto done;
|
goto done;
|
||||||
case ID_COMMAND: {
|
case ID_COMMAND: {
|
||||||
int comtype = CODE_COM, numargs = 0;
|
int comtype = CODE_COM, numargs = 0;
|
||||||
if (prevargs >= MAX_RESULTS) gs.code.push(CODE_ENTER);
|
if (prevargs >= MaxResults) gs.code.push(CODE_ENTER);
|
||||||
for (const char *fmt = id->args; *fmt; fmt++) switch (*fmt) {
|
for (const char *fmt = id->args; *fmt; fmt++) switch (*fmt) {
|
||||||
case 'S':
|
case 'S':
|
||||||
gs.gen_str();
|
gs.gen_str();
|
||||||
|
@ -1633,11 +1633,11 @@ lookupid:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
gs.code.push(comtype | cs_ret_code(ltype) | (id->index << 8));
|
gs.code.push(comtype | cs_ret_code(ltype) | (id->index << 8));
|
||||||
gs.code.push((prevargs >= MAX_RESULTS ? CODE_EXIT : CODE_RESULT_ARG) | cs_ret_code(ltype));
|
gs.code.push((prevargs >= MaxResults ? CODE_EXIT : CODE_RESULT_ARG) | cs_ret_code(ltype));
|
||||||
goto done;
|
goto done;
|
||||||
compilecomv:
|
compilecomv:
|
||||||
gs.code.push(comtype | cs_ret_code(ltype) | (numargs << 8) | (id->index << 13));
|
gs.code.push(comtype | cs_ret_code(ltype) | (numargs << 8) | (id->index << 13));
|
||||||
gs.code.push((prevargs >= MAX_RESULTS ? CODE_EXIT : CODE_RESULT_ARG) | cs_ret_code(ltype));
|
gs.code.push((prevargs >= MaxResults ? CODE_EXIT : CODE_RESULT_ARG) | cs_ret_code(ltype));
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
|
@ -1777,7 +1777,7 @@ lookupid:
|
||||||
gs.code.push(CODE_SVARM | (id->index << 8));
|
gs.code.push(CODE_SVARM | (id->index << 8));
|
||||||
goto done;
|
goto done;
|
||||||
case ID_ALIAS:
|
case ID_ALIAS:
|
||||||
gs.code.push((id->index < MAX_ARGUMENTS ? CODE_LOOKUPMARG : CODE_LOOKUPM) | (id->index << 8));
|
gs.code.push((id->index < MaxArguments ? CODE_LOOKUPMARG : CODE_LOOKUPM) | (id->index << 8));
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
gs.gen_str(lookup, true);
|
gs.gen_str(lookup, true);
|
||||||
|
@ -1819,15 +1819,15 @@ static void compileblockmain(GenState &gs, int wordtype, int prevargs) {
|
||||||
int level = gs.source - (esc - 1);
|
int level = gs.source - (esc - 1);
|
||||||
if (brak > level) continue;
|
if (brak > level) continue;
|
||||||
else if (brak < level) cs_debug_code_line(gs.cs, line, "too many @s");
|
else if (brak < level) cs_debug_code_line(gs.cs, line, "too many @s");
|
||||||
if (!concs && prevargs >= MAX_RESULTS) gs.code.push(CODE_ENTER);
|
if (!concs && prevargs >= MaxResults) gs.code.push(CODE_ENTER);
|
||||||
if (concs + 2 > MAX_ARGUMENTS) {
|
if (concs + 2 > MaxArguments) {
|
||||||
gs.code.push(CODE_CONCW | RET_STR | (concs << 8));
|
gs.code.push(CODE_CONCW | RET_STR | (concs << 8));
|
||||||
concs = 1;
|
concs = 1;
|
||||||
}
|
}
|
||||||
if (compileblockstr(gs, ostd::ConstCharRange(start, esc - 1), true)) concs++;
|
if (compileblockstr(gs, ostd::ConstCharRange(start, esc - 1), true)) concs++;
|
||||||
if (compileblocksub(gs, prevargs + concs)) concs++;
|
if (compileblocksub(gs, prevargs + concs)) concs++;
|
||||||
if (concs) start = gs.source;
|
if (concs) start = gs.source;
|
||||||
else if (prevargs >= MAX_RESULTS) gs.code.pop();
|
else if (prevargs >= MaxResults) gs.code.pop();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1860,7 +1860,7 @@ done:
|
||||||
if (concs > 1) concs++;
|
if (concs > 1) concs++;
|
||||||
}
|
}
|
||||||
if (concs) {
|
if (concs) {
|
||||||
if (prevargs >= MAX_RESULTS) {
|
if (prevargs >= MaxResults) {
|
||||||
gs.code.push(CODE_CONCM | cs_ret_code(wordtype) | (concs << 8));
|
gs.code.push(CODE_CONCM | cs_ret_code(wordtype) | (concs << 8));
|
||||||
gs.code.push(CODE_EXIT | cs_ret_code(wordtype));
|
gs.code.push(CODE_EXIT | cs_ret_code(wordtype));
|
||||||
} else gs.code.push(CODE_CONCW | cs_ret_code(wordtype) | (concs << 8));
|
} else gs.code.push(CODE_CONCW | cs_ret_code(wordtype) | (concs << 8));
|
||||||
|
@ -1947,7 +1947,7 @@ static bool compilearg(GenState &gs, int wordtype, int prevargs, ostd::ConstChar
|
||||||
return true;
|
return true;
|
||||||
case '(':
|
case '(':
|
||||||
gs.next_char();
|
gs.next_char();
|
||||||
if (prevargs >= MAX_RESULTS) {
|
if (prevargs >= MaxResults) {
|
||||||
gs.code.push(CODE_ENTER);
|
gs.code.push(CODE_ENTER);
|
||||||
compilestatements(gs, wordtype > VAL_ANY ? VAL_CANY : VAL_ANY, ')');
|
compilestatements(gs, wordtype > VAL_ANY ? VAL_CANY : VAL_ANY, ')');
|
||||||
gs.code.push(CODE_EXIT | cs_ret_code(wordtype));
|
gs.code.push(CODE_EXIT | cs_ret_code(wordtype));
|
||||||
|
@ -2039,7 +2039,7 @@ static void compilestatements(GenState &gs, int rettype, int brak, int prevargs)
|
||||||
if (id) switch (id->type) {
|
if (id) switch (id->type) {
|
||||||
case ID_ALIAS:
|
case ID_ALIAS:
|
||||||
if (!(more = compilearg(gs, VAL_ANY, prevargs))) gs.gen_str();
|
if (!(more = compilearg(gs, VAL_ANY, prevargs))) gs.gen_str();
|
||||||
gs.code.push((id->index < MAX_ARGUMENTS ? CODE_ALIASARG : CODE_ALIAS) | (id->index << 8));
|
gs.code.push((id->index < MaxArguments ? CODE_ALIASARG : CODE_ALIAS) | (id->index << 8));
|
||||||
goto endstatement;
|
goto endstatement;
|
||||||
case ID_VAR:
|
case ID_VAR:
|
||||||
if (!(more = compilearg(gs, VAL_INT, prevargs))) gs.gen_int();
|
if (!(more = compilearg(gs, VAL_INT, prevargs))) gs.gen_int();
|
||||||
|
@ -2063,7 +2063,7 @@ static void compilestatements(GenState &gs, int rettype, int brak, int prevargs)
|
||||||
numargs = 0;
|
numargs = 0;
|
||||||
if (!idname.data()) {
|
if (!idname.data()) {
|
||||||
noid:
|
noid:
|
||||||
while (numargs < MAX_ARGUMENTS && (more = compilearg(gs, VAL_CANY, prevargs + numargs))) numargs++;
|
while (numargs < MaxArguments && (more = compilearg(gs, VAL_CANY, prevargs + numargs))) numargs++;
|
||||||
gs.code.push(CODE_CALLU | (numargs << 8));
|
gs.code.push(CODE_CALLU | (numargs << 8));
|
||||||
} else {
|
} else {
|
||||||
Ident *id = gs.cs.idents.at(idname);
|
Ident *id = gs.cs.idents.at(idname);
|
||||||
|
@ -2088,8 +2088,8 @@ noid:
|
||||||
gs.code.push(CODE_RESULT);
|
gs.code.push(CODE_RESULT);
|
||||||
} else switch (id->type) {
|
} else switch (id->type) {
|
||||||
case ID_ALIAS:
|
case ID_ALIAS:
|
||||||
while (numargs < MAX_ARGUMENTS && (more = compilearg(gs, VAL_ANY, prevargs + numargs))) numargs++;
|
while (numargs < MaxArguments && (more = compilearg(gs, VAL_ANY, prevargs + numargs))) numargs++;
|
||||||
gs.code.push((id->index < MAX_ARGUMENTS ? CODE_CALLARG : CODE_CALL) | (numargs << 8) | (id->index << 13));
|
gs.code.push((id->index < MaxArguments ? CODE_CALLARG : CODE_CALL) | (numargs << 8) | (id->index << 13));
|
||||||
break;
|
break;
|
||||||
case ID_COMMAND: {
|
case ID_COMMAND: {
|
||||||
int comtype = CODE_COM, fakeargs = 0;
|
int comtype = CODE_COM, fakeargs = 0;
|
||||||
|
@ -2104,7 +2104,7 @@ noid:
|
||||||
fakeargs++;
|
fakeargs++;
|
||||||
} else if (!fmt[1]) {
|
} else if (!fmt[1]) {
|
||||||
int numconc = 1;
|
int numconc = 1;
|
||||||
while (numargs + numconc < MAX_ARGUMENTS && (more = compilearg(gs, VAL_CSTR, prevargs + numargs + numconc))) numconc++;
|
while (numargs + numconc < MaxArguments && (more = compilearg(gs, VAL_CSTR, prevargs + numargs + numconc))) numconc++;
|
||||||
if (numconc > 1) gs.code.push(CODE_CONC | RET_STR | (numconc << 8));
|
if (numconc > 1) gs.code.push(CODE_CONC | RET_STR | (numconc << 8));
|
||||||
}
|
}
|
||||||
numargs++;
|
numargs++;
|
||||||
|
@ -2192,21 +2192,21 @@ noid:
|
||||||
break;
|
break;
|
||||||
case 'C':
|
case 'C':
|
||||||
comtype = CODE_COMC;
|
comtype = CODE_COMC;
|
||||||
if (more) while (numargs < MAX_ARGUMENTS && (more = compilearg(gs, VAL_CANY, prevargs + numargs))) numargs++;
|
if (more) while (numargs < MaxArguments && (more = compilearg(gs, VAL_CANY, prevargs + numargs))) numargs++;
|
||||||
goto compilecomv;
|
goto compilecomv;
|
||||||
case 'V':
|
case 'V':
|
||||||
comtype = CODE_COMV;
|
comtype = CODE_COMV;
|
||||||
if (more) while (numargs < MAX_ARGUMENTS && (more = compilearg(gs, VAL_CANY, prevargs + numargs))) numargs++;
|
if (more) while (numargs < MaxArguments && (more = compilearg(gs, VAL_CANY, prevargs + numargs))) numargs++;
|
||||||
goto compilecomv;
|
goto compilecomv;
|
||||||
case '1':
|
case '1':
|
||||||
case '2':
|
case '2':
|
||||||
case '3':
|
case '3':
|
||||||
case '4':
|
case '4':
|
||||||
if (more && numargs < MAX_ARGUMENTS) {
|
if (more && numargs < MaxArguments) {
|
||||||
int numrep = *fmt - '0' + 1;
|
int numrep = *fmt - '0' + 1;
|
||||||
fmt -= numrep;
|
fmt -= numrep;
|
||||||
rep = true;
|
rep = true;
|
||||||
} else for (; numargs > MAX_ARGUMENTS; numargs--) gs.code.push(CODE_POP);
|
} else for (; numargs > MaxArguments; numargs--) gs.code.push(CODE_POP);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
gs.code.push(comtype | cs_ret_code(rettype) | (id->index << 8));
|
gs.code.push(comtype | cs_ret_code(rettype) | (id->index << 8));
|
||||||
|
@ -2216,7 +2216,7 @@ compilecomv:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case ID_LOCAL:
|
case ID_LOCAL:
|
||||||
if (more) while (numargs < MAX_ARGUMENTS && (more = compilearg(gs, VAL_IDENT, prevargs + numargs))) numargs++;
|
if (more) while (numargs < MaxArguments && (more = compilearg(gs, VAL_IDENT, prevargs + numargs))) numargs++;
|
||||||
if (more) while ((more = compilearg(gs, VAL_POP)));
|
if (more) while ((more = compilearg(gs, VAL_POP)));
|
||||||
gs.code.push(CODE_LOCAL | (numargs << 8));
|
gs.code.push(CODE_LOCAL | (numargs << 8));
|
||||||
break;
|
break;
|
||||||
|
@ -2289,7 +2289,7 @@ compilecomv:
|
||||||
} else {
|
} else {
|
||||||
numargs++;
|
numargs++;
|
||||||
int start = gs.code.size(), end = start;
|
int start = gs.code.size(), end = start;
|
||||||
while (numargs < MAX_ARGUMENTS) {
|
while (numargs < MaxArguments) {
|
||||||
more = compilearg(gs, VAL_COND, prevargs + numargs);
|
more = compilearg(gs, VAL_COND, prevargs + numargs);
|
||||||
if (!more) break;
|
if (!more) break;
|
||||||
numargs++;
|
numargs++;
|
||||||
|
@ -2297,7 +2297,7 @@ compilecomv:
|
||||||
end = gs.code.size();
|
end = gs.code.size();
|
||||||
}
|
}
|
||||||
if (more) {
|
if (more) {
|
||||||
while (numargs < MAX_ARGUMENTS && (more = compilearg(gs, VAL_COND, prevargs + numargs))) numargs++;
|
while (numargs < MaxArguments && (more = compilearg(gs, VAL_COND, prevargs + numargs))) numargs++;
|
||||||
gs.code.push(CODE_COMV | cs_ret_code(rettype) | (numargs << 8) | (id->index << 13));
|
gs.code.push(CODE_COMV | cs_ret_code(rettype) | (numargs << 8) | (id->index << 13));
|
||||||
} else {
|
} else {
|
||||||
ostd::Uint32 op = id->type == ID_AND ? CODE_JUMP_RESULT_FALSE : CODE_JUMP_RESULT_TRUE;
|
ostd::Uint32 op = id->type == ID_AND ? CODE_JUMP_RESULT_FALSE : CODE_JUMP_RESULT_TRUE;
|
||||||
|
@ -2327,7 +2327,7 @@ compilecomv:
|
||||||
if (!(more = compilearg(gs, VAL_CSTR, prevargs))) gs.code.push(CODE_PRINT | (id->index << 8));
|
if (!(more = compilearg(gs, VAL_CSTR, prevargs))) gs.code.push(CODE_PRINT | (id->index << 8));
|
||||||
else {
|
else {
|
||||||
do ++numargs;
|
do ++numargs;
|
||||||
while (numargs < MAX_ARGUMENTS && (more = compilearg(gs, VAL_CANY, prevargs + numargs)));
|
while (numargs < MaxArguments && (more = compilearg(gs, VAL_CANY, prevargs + numargs)));
|
||||||
if (numargs > 1) gs.code.push(CODE_CONC | RET_STR | (numargs << 8));
|
if (numargs > 1) gs.code.push(CODE_CONC | RET_STR | (numargs << 8));
|
||||||
gs.code.push(CODE_SVAR1 | (id->index << 8));
|
gs.code.push(CODE_SVAR1 | (id->index << 8));
|
||||||
}
|
}
|
||||||
|
@ -2638,7 +2638,7 @@ static const ostd::Uint32 *runcode(CsState &cs, const ostd::Uint32 *code, Tagged
|
||||||
}
|
}
|
||||||
++rundepth;
|
++rundepth;
|
||||||
int numargs = 0;
|
int numargs = 0;
|
||||||
TaggedValue args[MAX_ARGUMENTS + MAX_RESULTS], *prevret = cs.result;
|
TaggedValue args[MaxArguments + MaxResults], *prevret = cs.result;
|
||||||
cs.result = &result;
|
cs.result = &result;
|
||||||
for (;;) {
|
for (;;) {
|
||||||
ostd::Uint32 op = *code++;
|
ostd::Uint32 op = *code++;
|
||||||
|
@ -2709,7 +2709,7 @@ static const ostd::Uint32 *runcode(CsState &cs, const ostd::Uint32 *code, Tagged
|
||||||
case CODE_LOCAL: {
|
case CODE_LOCAL: {
|
||||||
result.cleanup();
|
result.cleanup();
|
||||||
int numlocals = op >> 8, offset = numargs - numlocals;
|
int numlocals = op >> 8, offset = numargs - numlocals;
|
||||||
IdentStack locals[MAX_ARGUMENTS];
|
IdentStack locals[MaxArguments];
|
||||||
for (int i = 0; i < numlocals; ++i) args[offset + i].id->push_alias(locals[i]);
|
for (int i = 0; i < numlocals; ++i) args[offset + i].id->push_alias(locals[i]);
|
||||||
code = runcode(cs, code, result);
|
code = runcode(cs, code, result);
|
||||||
for (int i = offset; i < numargs; i++) args[i].id->pop_alias();
|
for (int i = offset; i < numargs; i++) args[i].id->pop_alias();
|
||||||
|
@ -2941,7 +2941,7 @@ static const ostd::Uint32 *runcode(CsState &cs, const ostd::Uint32 *code, Tagged
|
||||||
case CODE_IDENTU: {
|
case CODE_IDENTU: {
|
||||||
TaggedValue &arg = args[numargs - 1];
|
TaggedValue &arg = args[numargs - 1];
|
||||||
Ident *id = arg.get_type() == VAL_STR || arg.get_type() == VAL_MACRO || arg.get_type() == VAL_CSTR ? cs.new_ident(arg.cstr) : cs.dummy;
|
Ident *id = arg.get_type() == VAL_STR || arg.get_type() == VAL_MACRO || arg.get_type() == VAL_CSTR ? cs.new_ident(arg.cstr) : cs.dummy;
|
||||||
if (id->index < MAX_ARGUMENTS && !(cs.stack->usedargs & (1 << id->index))) {
|
if (id->index < MaxArguments && !(cs.stack->usedargs & (1 << id->index))) {
|
||||||
id->push_arg(null_value, cs.stack->argstack[id->index], false);
|
id->push_arg(null_value, cs.stack->argstack[id->index], false);
|
||||||
cs.stack->usedargs |= 1 << id->index;
|
cs.stack->usedargs |= 1 << id->index;
|
||||||
}
|
}
|
||||||
|
@ -2960,7 +2960,7 @@ static const ostd::Uint32 *runcode(CsState &cs, const ostd::Uint32 *code, Tagged
|
||||||
case ID_ALIAS: \
|
case ID_ALIAS: \
|
||||||
if(id->flags&IDF_UNKNOWN) break; \
|
if(id->flags&IDF_UNKNOWN) break; \
|
||||||
arg.cleanup(); \
|
arg.cleanup(); \
|
||||||
if(id->index < MAX_ARGUMENTS && !(cs.stack->usedargs&(1<<id->index))) { nval; continue; } \
|
if(id->index < MaxArguments && !(cs.stack->usedargs&(1<<id->index))) { nval; continue; } \
|
||||||
aval; \
|
aval; \
|
||||||
continue; \
|
continue; \
|
||||||
case ID_SVAR: arg.cleanup(); sval; continue; \
|
case ID_SVAR: arg.cleanup(); sval; continue; \
|
||||||
|
@ -2971,7 +2971,7 @@ static const ostd::Uint32 *runcode(CsState &cs, const ostd::Uint32 *code, Tagged
|
||||||
arg.cleanup(); \
|
arg.cleanup(); \
|
||||||
arg.set_null(); \
|
arg.set_null(); \
|
||||||
cs.result = &arg; \
|
cs.result = &arg; \
|
||||||
TaggedValue buf[MAX_ARGUMENTS]; \
|
TaggedValue buf[MaxArguments]; \
|
||||||
callcommand(cs, id, buf, 0, true); \
|
callcommand(cs, id, buf, 0, true); \
|
||||||
arg.force(op&CODE_RET_MASK); \
|
arg.force(op&CODE_RET_MASK); \
|
||||||
cs.result = &result; \
|
cs.result = &result; \
|
||||||
|
@ -3211,7 +3211,7 @@ static const ostd::Uint32 *runcode(CsState &cs, const ostd::Uint32 *code, Tagged
|
||||||
continue; \
|
continue; \
|
||||||
}
|
}
|
||||||
#define CALLALIAS(cs, result) { \
|
#define CALLALIAS(cs, result) { \
|
||||||
IdentStack argstack[MAX_ARGUMENTS]; \
|
IdentStack argstack[MaxArguments]; \
|
||||||
for(int i = 0; i < callargs; i++) \
|
for(int i = 0; i < callargs; i++) \
|
||||||
(cs).identmap[i]->push_arg(args[offset + i], argstack[i], false); \
|
(cs).identmap[i]->push_arg(args[offset + i], argstack[i], false); \
|
||||||
int oldargs = (cs).numargs; \
|
int oldargs = (cs).numargs; \
|
||||||
|
@ -3294,7 +3294,7 @@ noid:
|
||||||
numargs = offset - 1;
|
numargs = offset - 1;
|
||||||
continue;
|
continue;
|
||||||
case ID_LOCAL: {
|
case ID_LOCAL: {
|
||||||
IdentStack locals[MAX_ARGUMENTS];
|
IdentStack locals[MaxArguments];
|
||||||
idarg.cleanup();
|
idarg.cleanup();
|
||||||
for (ostd::Size j = 0; j < ostd::Size(callargs); ++j) cs.force_ident(args[offset + j])->push_alias(locals[j]);
|
for (ostd::Size j = 0; j < ostd::Size(callargs); ++j) cs.force_ident(args[offset + j])->push_alias(locals[j]);
|
||||||
code = runcode(cs, code, result);
|
code = runcode(cs, code, result);
|
||||||
|
@ -3314,7 +3314,7 @@ noid:
|
||||||
else cs.set_var_str_checked(id, args[offset].force_str());
|
else cs.set_var_str_checked(id, args[offset].force_str());
|
||||||
FORCERESULT;
|
FORCERESULT;
|
||||||
case ID_ALIAS:
|
case ID_ALIAS:
|
||||||
if (id->index < MAX_ARGUMENTS && !(cs.stack->usedargs & (1 << id->index))) FORCERESULT;
|
if (id->index < MaxArguments && !(cs.stack->usedargs & (1 << id->index))) FORCERESULT;
|
||||||
if (id->get_valtype() == VAL_NULL) goto noid;
|
if (id->get_valtype() == VAL_NULL) goto noid;
|
||||||
idarg.cleanup();
|
idarg.cleanup();
|
||||||
CALLALIAS(cs, result);
|
CALLALIAS(cs, result);
|
||||||
|
@ -3358,7 +3358,7 @@ void CsState::run_ret(Ident *id, TvalRange args, TaggedValue &ret) {
|
||||||
/* fallthrough */
|
/* fallthrough */
|
||||||
case ID_COMMAND:
|
case ID_COMMAND:
|
||||||
if (numargs < id->numargs) {
|
if (numargs < id->numargs) {
|
||||||
TaggedValue buf[MAX_ARGUMENTS];
|
TaggedValue buf[MaxArguments];
|
||||||
memcpy(buf, args.data(), args.size() * sizeof(TaggedValue));
|
memcpy(buf, args.data(), args.size() * sizeof(TaggedValue));
|
||||||
callcommand(*this, id, buf, numargs, false);
|
callcommand(*this, id, buf, numargs, false);
|
||||||
} else callcommand(*this, id, args.data(), numargs, false);
|
} else callcommand(*this, id, args.data(), numargs, false);
|
||||||
|
@ -3377,7 +3377,7 @@ void CsState::run_ret(Ident *id, TvalRange args, TaggedValue &ret) {
|
||||||
else set_var_str_checked(id, args[0].force_str());
|
else set_var_str_checked(id, args[0].force_str());
|
||||||
break;
|
break;
|
||||||
case ID_ALIAS:
|
case ID_ALIAS:
|
||||||
if (id->index < MAX_ARGUMENTS && !(stack->usedargs & (1 << id->index))) break;
|
if (id->index < MaxArguments && !(stack->usedargs & (1 << id->index))) break;
|
||||||
if (id->get_valtype() == VAL_NULL) break;
|
if (id->get_valtype() == VAL_NULL) break;
|
||||||
#define callargs numargs
|
#define callargs numargs
|
||||||
#define offset 0
|
#define offset 0
|
||||||
|
@ -3645,7 +3645,7 @@ void init_lib_base(CsState &cs) {
|
||||||
|
|
||||||
cs.add_command("pushif", "rTe", [](CsState &cs, Ident *id,
|
cs.add_command("pushif", "rTe", [](CsState &cs, Ident *id,
|
||||||
TaggedValue *v, ostd::Uint32 *code) {
|
TaggedValue *v, ostd::Uint32 *code) {
|
||||||
if ((id->type != ID_ALIAS) || (id->index < MAX_ARGUMENTS))
|
if ((id->type != ID_ALIAS) || (id->index < MaxArguments))
|
||||||
return;
|
return;
|
||||||
if (cs_get_bool(*v)) {
|
if (cs_get_bool(*v)) {
|
||||||
IdentStack stack;
|
IdentStack stack;
|
||||||
|
|
|
@ -16,9 +16,9 @@
|
||||||
|
|
||||||
namespace cscript {
|
namespace cscript {
|
||||||
|
|
||||||
static constexpr int MAX_ARGUMENTS = 25;
|
static constexpr int MaxArguments = 25;
|
||||||
static constexpr int MAX_RESULTS = 7;
|
static constexpr int MaxResults = 7;
|
||||||
static constexpr int MAX_COMARGS = 12;
|
static constexpr int MaxComargs = 12;
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
VAL_NULL = 0, VAL_INT, VAL_FLOAT, VAL_STR,
|
VAL_NULL = 0, VAL_INT, VAL_FLOAT, VAL_STR,
|
||||||
|
@ -357,7 +357,7 @@ struct CsState {
|
||||||
TaggedValue *result = nullptr;
|
TaggedValue *result = nullptr;
|
||||||
|
|
||||||
IdentLink noalias = {
|
IdentLink noalias = {
|
||||||
nullptr, nullptr, (1 << MAX_ARGUMENTS) - 1, nullptr
|
nullptr, nullptr, (1 << MaxArguments) - 1, nullptr
|
||||||
};
|
};
|
||||||
IdentLink *stack = &noalias;
|
IdentLink *stack = &noalias;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue