mirror of
https://github.com/sfall-team/sslc.git
synced 2026-07-27 16:52:49 -07:00
Fill extern procedure variable list when it's defined (closes #3)
- This satisfies expectation in procedure() that forward-declared procedures already have variable list initialized, thus preventing crash
This commit is contained in:
@@ -682,6 +682,17 @@ static Procedure *addProcedure(ProcedureList *procs, char **namelist, char *name
|
||||
return procs->procedures + i;
|
||||
}
|
||||
|
||||
static void copyVariables(VariableList *to, char **toNames, VariableList *from, char *fromNames) {
|
||||
int i, varI;
|
||||
|
||||
for (i = 0; i < from->numVariables; ++i) {
|
||||
varI = addVariable(to, toNames, from->variables[i].type,
|
||||
getName(from->variables[i].name, fromNames));
|
||||
to->variables[i].value = from->variables[i].value;
|
||||
to->variables[i].initialized = from->variables[i].initialized;
|
||||
}
|
||||
}
|
||||
|
||||
static int externProcedure(ProcedureList *pl, char **namelist, int type) {
|
||||
Procedure *p;
|
||||
int numArgs = 0;
|
||||
@@ -739,8 +750,11 @@ static int externProcedure(ProcedureList *pl, char **namelist, int type) {
|
||||
if (type | P_EXPORT)
|
||||
p->uses = 1;
|
||||
|
||||
char* tmpNames = 0;
|
||||
copyVariables(&p->variables, &tmpNames, &args, argNames);
|
||||
freeVariableList(&args);
|
||||
if (argNames) free(argNames);
|
||||
if (tmpNames) free(tmpNames);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -860,17 +874,6 @@ static int export(Program *p, char **names) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void copyVariables(VariableList *to, char **toNames, VariableList *from, char *fromNames) {
|
||||
int i, varI;
|
||||
|
||||
for (i = 0; i < from->numVariables; ++i) {
|
||||
varI = addVariable(to, toNames, from->variables[i].type,
|
||||
getName(from->variables[i].name, fromNames));
|
||||
to->variables[i].value = from->variables[i].value;
|
||||
to->variables[i].initialized = from->variables[i].initialized;
|
||||
}
|
||||
}
|
||||
|
||||
/* Parse the syntax for declaring global and local variables of the procedures */
|
||||
static int variable(VariableList *v, char **names, int type, ArrayVarList* arrays, int allowMulti) {
|
||||
if (expectToken(T_VARIABLE) == -1) return 1;
|
||||
|
||||
Reference in New Issue
Block a user