Skip to content

Commit e59c26a

Browse files
committed
Compiler: removed limit of function parameters
1 parent af220ff commit e59c26a

File tree

6 files changed

+20
-21
lines changed

6 files changed

+20
-21
lines changed

Compiler/script/cc_compiledscript.cpp

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -152,9 +152,7 @@ int ccCompiledScript::remove_any_import (const char*namm, SymbolDef *oldSym) {
152152
oldSym->arrsize = sym.entries[sidx].arrsize;
153153
if (sym.entries[sidx].stype == SYM_FUNCTION) {
154154
// <= because of return type
155-
for (int i = 0; i <= sym.entries[sidx].get_num_args(); i++) {
156-
oldSym->funcparams[i] = sym.entries[sidx].funcparams[i];
157-
}
155+
oldSym->funcparams = sym.entries[sidx].funcparams;
158156
}
159157
}
160158

Compiler/script/cc_symboldef.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ struct SymbolDef {
4040
int16_t sscope; // or num arguments for function
4141
int32_t arrsize;
4242
// return value is at index 0, actual args begin with 1
43-
FuncParamInfo funcparams[MAX_FUNCTION_PARAMETERS + 1];
43+
std::vector<FuncParamInfo> funcparams;
4444
};
4545

4646
#endif // __CC_SYMBOLDEF_H

Compiler/script/cc_symboltable.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -240,7 +240,6 @@ int symbolTable::add_ex(const char*nta,int typo,char sizee) {
240240
entry.sscope = 0;
241241
entry.arrsize = 0;
242242
entry.extends = 0;
243-
entry.funcparams = std::vector<FuncParamInfo>(MAX_FUNCTION_PARAMETERS + 1);
244243
entries.push_back(entry);
245244

246245
symbolTree.addEntry(nta, p_value);

Compiler/script/cc_symboltable.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ struct SymbolTableEntry
3434
int16_t sscope; // or num arguments for function
3535
int32_t arrsize;
3636
int16_t extends; // inherits another class (classes) / owning class (member vars)
37-
// functions only, save types of return value and all parameters
37+
// functions only, save types of return value and all parameters;
3838
// return value is at index 0, actual args begin with 1
3939
std::vector<FuncParamInfo> funcparams;
4040

Compiler/script/cs_parser.cpp

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -663,6 +663,10 @@ int float_to_int_raw(float toconv) {
663663
}
664664

665665
int check_for_default_value(ccInternalList &targ, int funcsym, int numparams) {
666+
const int arg_idx = numparams % 100;
667+
assert(static_cast<uint32_t>(funcsym) < sym.entries.size());
668+
assert(static_cast<uint32_t>(arg_idx) < sym.entries[funcsym].funcparams.size());
669+
666670
if (sym.get_type(targ.peeknext()) == SYM_ASSIGN) {
667671
const char *vartype = sym.get_name(targ.script[targ.pos - 2]);
668672
// parameter has default value
@@ -711,9 +715,8 @@ int check_for_default_value(ccInternalList &targ, int funcsym, int numparams) {
711715
}
712716
}
713717

714-
sym.entries[funcsym].funcparams[numparams % 100].DefaultValue = defaultValue;
715-
sym.entries[funcsym].funcparams[numparams % 100].HasDefaultValue = true;
716-
718+
sym.entries[funcsym].funcparams[arg_idx].DefaultValue = defaultValue;
719+
sym.entries[funcsym].funcparams[arg_idx].HasDefaultValue = true;
717720
}
718721

719722
return 0;
@@ -862,6 +865,7 @@ int process_function_declaration(ccInternalList &targ, ccCompiledScript*scrip,
862865

863866
sym.entries[funcsym].stype = SYM_FUNCTION;
864867
sym.entries[funcsym].ssize = varsize; // save return type size
868+
sym.entries[funcsym].funcparams.resize(1);
865869
sym.entries[funcsym].funcparams[0].Type = vtwas; // return type
866870

867871
if (is_const)
@@ -932,30 +936,28 @@ int process_function_declaration(ccInternalList &targ, ccCompiledScript*scrip,
932936
}
933937
else if (next_type == SYM_VARTYPE) {
934938
// function parameter
935-
if ((numparams % 100) >= MAX_FUNCTION_PARAMETERS) {
936-
cc_error("too many parameters defined for function");
937-
return -1;
938-
}
939939
if (cursym == sym.normalVoidSym) {
940940
cc_error("'void' invalid type for function parameter");
941941
return -1;
942942
}
943943
int isPointerParam = 0;
944944
// save the parameter type (numparams starts from 1)
945-
sym.entries[funcsym].funcparams[numparams % 100].Type = cursym;
946-
sym.entries[funcsym].funcparams[numparams % 100].DefaultValue = 0;
947-
sym.entries[funcsym].funcparams[numparams % 100].HasDefaultValue = false;
945+
const int arg_idx = numparams % 100;
946+
sym.entries[funcsym].funcparams.resize(arg_idx + 1);
947+
sym.entries[funcsym].funcparams[arg_idx].Type = cursym;
948+
sym.entries[funcsym].funcparams[arg_idx].DefaultValue = 0;
949+
sym.entries[funcsym].funcparams[arg_idx].HasDefaultValue = false;
948950

949951
if (next_is_const)
950-
sym.entries[funcsym].funcparams[numparams % 100].Type |= STYPE_CONST;
952+
sym.entries[funcsym].funcparams[arg_idx].Type |= STYPE_CONST;
951953

952954
functype[strlen(functype)+1] = 0;
953955
functype[strlen(functype)] = (char)cursym; // save variable type
954956
if (check_not_eof(targ))
955957
return -1;
956958
if (strcmp(sym.get_name(targ.peeknext()), "*") == 0) {
957959
// pointer
958-
sym.entries[funcsym].funcparams[numparams % 100].Type |= STYPE_POINTER;
960+
sym.entries[funcsym].funcparams[arg_idx].Type |= STYPE_POINTER;
959961
isPointerParam = 1;
960962
targ.getnext();
961963
if ((sym.entries[cursym].flags & SFLG_MANAGED) == 0) {
@@ -970,7 +972,7 @@ int process_function_declaration(ccInternalList &targ, ccCompiledScript*scrip,
970972
}
971973

972974
if (sym.entries[cursym].flags & SFLG_AUTOPTR) {
973-
sym.entries[funcsym].funcparams[numparams % 100].Type |= STYPE_POINTER;
975+
sym.entries[funcsym].funcparams[arg_idx].Type |= STYPE_POINTER;
974976
isPointerParam = 1;
975977
}
976978

@@ -1034,7 +1036,7 @@ int process_function_declaration(ccInternalList &targ, ccCompiledScript*scrip,
10341036
}
10351037
else if (dynArrayStatus > 0)
10361038
{
1037-
sym.entries[funcsym].funcparams[(numparams - 1) % 100].Type |= STYPE_DYNARRAY;
1039+
sym.entries[funcsym].funcparams[arg_idx].Type |= STYPE_DYNARRAY;
10381040
if (createdLocalVar)
10391041
{
10401042
sym.entries[cursym].flags |= SFLG_DYNAMICARRAY | SFLG_ARRAY;
@@ -2780,6 +2782,7 @@ int parse_sub_expr(int32_t *symlist, int listlen, ccCompiledScript*scrip) {
27802782

27812783
if (num_supplied_args < func_args) {
27822784
// not enough arguments -- see if we can supply default values
2785+
assert(static_cast<uint32_t>(func_args) < sym.entries[funcsym].funcparams.size());
27832786
for (int ii = func_args; ii > num_supplied_args; ii--) {
27842787

27852788
if (!sym.entries[funcsym].funcparams[ii].HasDefaultValue) {

Compiler/script/cs_parser_common.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@
3030
#define NEST_DOSINGLE 9 // Single Do statement
3131
#define NEST_FOR 10 // For statement
3232
#define NEST_SWITCH 11 // Case block for a switch statement
33-
#define MAX_FUNCTION_PARAMETERS 15
3433
#define SYM_GLOBALVAR 1
3534
#define SYM_LOCALVAR 2
3635
#define SYM_OPERATOR 3

0 commit comments

Comments
 (0)