Fix scope bugs
This commit is contained in:
parent
cbf7879794
commit
c3df97b04b
|
@ -274,53 +274,65 @@ OBJ* getbynamelist(SCOPE* s, STRINGLIST* names, char** retname) {
|
|||
// Scope adding
|
||||
void addclassvardec(SCOPE* s, CLASSVARDEC* v) {
|
||||
ensurenoduplicates(s, v->base->names, v->base->debug);
|
||||
v->next = s->classvardecs;
|
||||
s->classvardecs = v;
|
||||
CLASSVARDEC* new = copy(v, sizeof(CLASSVARDEC));
|
||||
new->next = s->classvardecs;
|
||||
s->classvardecs = new;
|
||||
}
|
||||
|
||||
void addvardec(SCOPE* s, VARDEC* v) {
|
||||
ensurenoduplicates(s, v->names, v->debug);
|
||||
v->next = s->vardecs;
|
||||
s->vardecs = v;
|
||||
VARDEC* new = copy(v, sizeof(VARDEC));
|
||||
new->next = s->vardecs;
|
||||
s->vardecs = new;
|
||||
}
|
||||
|
||||
void addsubdec(SCOPE* s, SUBDEC* sd) {
|
||||
ensurenoduplicate(s, sd->name, sd->debug);
|
||||
sd->next = s->subroutines;
|
||||
s->subroutines = sd;
|
||||
SUBDEC* new = copy(sd, sizeof(SUBDEC));
|
||||
new->next = s->subroutines;
|
||||
s->subroutines = new;
|
||||
}
|
||||
|
||||
void addclass(SCOPE* s, CLASS* c) {
|
||||
ensurenoduplicate(s, c->name, c->debug);
|
||||
c->next = s->classes;
|
||||
s->classes = c;
|
||||
CLASS* new = copy(c, sizeof(CLASS));
|
||||
new->next = s->classes;
|
||||
s->classes = new;
|
||||
}
|
||||
|
||||
// Group adding
|
||||
void addclassvardecs(SCOPE* s, CLASSVARDEC* vs) {
|
||||
CLASSVARDEC* next;
|
||||
while(vs != NULL) {
|
||||
next = vs->next;
|
||||
addclassvardec(s, vs);
|
||||
vs = vs->next;
|
||||
vs = next;
|
||||
}
|
||||
}
|
||||
|
||||
void addvardecs(SCOPE* s, VARDEC* vs) {
|
||||
VARDEC* next;
|
||||
while(vs != NULL) {
|
||||
next = vs->next;
|
||||
addvardec(s, vs);
|
||||
vs = vs->next;
|
||||
vs = next;
|
||||
}
|
||||
}
|
||||
|
||||
void addsubdecs(SCOPE* s, SUBDEC* ss) {
|
||||
SUBDEC* next;
|
||||
while(ss != NULL) {
|
||||
next = ss->next;
|
||||
addsubdec(s, ss);
|
||||
ss = ss->next;
|
||||
ss = next;
|
||||
}
|
||||
}
|
||||
|
||||
void addclasses(SCOPE* s, CLASS* c) {
|
||||
CLASS* next;
|
||||
while(c != NULL) {
|
||||
next = c->next;
|
||||
addclass(s, c);
|
||||
c = c->next;
|
||||
c = next;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -127,7 +127,7 @@ LINEBLOCK* compilecallln(CLASS* c, SUBROUTCALL* call) {
|
|||
|
||||
// temporary ignore list for OS functions
|
||||
char* ignoresubdecs[] = {
|
||||
"printInt", "void"
|
||||
"printInt", "void", "peek", "int"
|
||||
};
|
||||
int ignorecount = sizeof(ignoresubdecs) / sizeof(char*);
|
||||
|
||||
|
|
4
parser.c
4
parser.c
|
@ -106,6 +106,7 @@ TERM* parsetermnullified(PARSER* p) {
|
|||
t->type = unaryopterm;
|
||||
next(p);
|
||||
t->expression = parseterm(p);
|
||||
t->expression->next = NULL;
|
||||
} else if(!strcmp(p->current->token, "(")) {
|
||||
next(p);
|
||||
t->type = innerexpression;
|
||||
|
@ -148,7 +149,7 @@ TERM* parseexpressionnullified(PARSER* p) {
|
|||
while(isop(p->current)) {
|
||||
current->op = p->current->token[0];
|
||||
next(p);
|
||||
nextt = parsetermnullified(p);
|
||||
nextt = parseterm(p);
|
||||
current->next = nextt;
|
||||
current = nextt;
|
||||
}
|
||||
|
@ -466,6 +467,7 @@ PARAMETER* parseparameters(PARSER* p) {
|
|||
PARAMETER* head = parseparameter(p);
|
||||
PARAMETER* current = head;
|
||||
while(!strcmp(p->current->token, ",")) {
|
||||
next(p);
|
||||
current->next = parseparameter(p);
|
||||
current = current->next;
|
||||
}
|
||||
|
|
6
util.c
6
util.c
|
@ -13,6 +13,12 @@ char* ezheapstr(char* str) {
|
|||
return heapstr(str, strlen(str));
|
||||
}
|
||||
|
||||
void* copy(void* v, int sz) {
|
||||
void* copy = malloc(sz);
|
||||
memcpy(copy, v, sz);
|
||||
return copy;
|
||||
}
|
||||
|
||||
int countplaces(int n) {
|
||||
int places = 1;
|
||||
int divisor = 1;
|
||||
|
|
Loading…
Reference in New Issue