From ffa4b8a5c825e31e6e5bb516a63fec5347bb0918 Mon Sep 17 00:00:00 2001 From: Augusto Gunsch Date: Thu, 31 Dec 2020 13:39:07 -0300 Subject: [PATCH] Fix static variables index --- compiler/compiler-scopes.c | 64 ++++++++++++++++++++++---------------- compiler/compiler-scopes.h | 5 ++- compiler/compiler.c | 5 +-- compiler/compiler.h | 6 ++-- 4 files changed, 49 insertions(+), 31 deletions(-) diff --git a/compiler/compiler-scopes.c b/compiler/compiler-scopes.c index 0866af6..3ddc2ed 100644 --- a/compiler/compiler-scopes.c +++ b/compiler/compiler-scopes.c @@ -1,6 +1,8 @@ #include #include #include +#include +#include "compiler.h" #include "compiler-scopes.h" #include "os.h" @@ -22,11 +24,13 @@ SUBROUTDEC* getsubroutdecwithoutparent(SCOPE* s, SUBROUTCALL* call); SUBROUTDEC* getsubroutdec(SCOPE* s, const char* name); // Scope adding -VAR* mkvar(char* type, char* name, bool primitive, DEBUGINFO* debug, MEMSEGMENT seg); +VAR* mkvar(char* type, char* name, bool primitive, DEBUGINFO* debug, MEMSEGMENT seg, int i); void addvar(SCOPE* s, VAR** dest, VAR* v); -void addlocalvar(SCOPE* s, VARDEC* v); -void addclassvardec(SCOPE* s, CLASSVARDEC* v); -void addparameter(SCOPE* s, PARAMETER* p); +void addlocalvar(SCOPE* s, VARDEC* v, int i); +void addstaticvar(COMPILER* c, SCOPE* s, CLASSVARDEC* v); +void addfield(SCOPE* s, CLASSVARDEC* v, int i); +void addclassvardec(COMPILER* c, SCOPE* s, CLASSVARDEC* v, int* i); +void addparameter(SCOPE* s, PARAMETER* p, int i); // Error messages void doubledeclaration(const char* name, DEBUGINFO* d1, DEBUGINFO* d2) { @@ -195,13 +199,14 @@ SUBROUTDEC* getsubroutdec(SCOPE* s, const char* name) { } // Scope adding -VAR* mkvar(char* type, char* name, bool primitive, DEBUGINFO* debug, MEMSEGMENT seg) { +VAR* mkvar(char* type, char* name, bool primitive, DEBUGINFO* debug, MEMSEGMENT seg, int i) { VAR* v = (VAR*)malloc(sizeof(VAR)); v->name = name; v->type = type; v->debug = debug; v->memsegment = memsegnames[seg]; v->primitive = primitive; + v->index = i; return v; } @@ -214,68 +219,75 @@ void addvar(SCOPE* s, VAR** dest, VAR* v) { notdeclared(v->type, v->debug); } - if(*dest == NULL) - v->index = 0; - else - v->index = 1+(*dest)->index; - v->next = *dest; *dest = v; } -void addlocalvar(SCOPE* s, VARDEC* v) { +void addlocalvar(SCOPE* s, VARDEC* v, int i) { STRINGLIST* currname = v->names; while(currname != NULL) { - addvar(s, &(s->localvars), mkvar(v->type, currname->content, v->primitive, v->debug, local)); + addvar(s, &(s->localvars), mkvar(v->type, currname->content, v->primitive, v->debug, local, i)); currname = currname->next; } } -void addstaticvar(SCOPE* s, CLASSVARDEC* v) { +void addstaticvar(COMPILER* c, SCOPE* s, CLASSVARDEC* v) { + pthread_mutex_lock(&(c->staticmutex)); + static int count = 0; + int i = count; + count++; + pthread_mutex_unlock(&(c->staticmutex)); STRINGLIST* currname = v->base->names; while(currname != NULL) { - addvar(s, &(s->staticvars), mkvar(v->base->type, currname->content, v->base->primitive, v->base->debug, staticseg)); + addvar(s, &(s->staticvars), mkvar(v->base->type, currname->content, v->base->primitive, v->base->debug, staticseg, i)); currname = currname->next; } } -void addfield(SCOPE* s, CLASSVARDEC* v) { +void addfield(SCOPE* s, CLASSVARDEC* v, int i) { STRINGLIST* currname = v->base->names; while(currname != NULL) { - addvar(s, &(s->fields), mkvar(v->base->type, currname->content, v->base->primitive, v->base->debug, fieldseg)); + addvar(s, &(s->fields), mkvar(v->base->type, currname->content, v->base->primitive, v->base->debug, fieldseg, i)); currname = currname->next; } } -void addclassvardec(SCOPE* s, CLASSVARDEC* v) { +void addclassvardec(COMPILER* c, SCOPE* s, CLASSVARDEC* v, int* i) { if(v->type == stat) - addstaticvar(s, v); - else - addfield(s, v); + addstaticvar(c, s, v); + else { + addfield(s, v, *i); + *i++; + } } -void addparameter(SCOPE* s, PARAMETER* p) { - addvar(s, &(s->parameters), mkvar(p->type, p->name, p->primitive, p->debug, arg)); +void addparameter(SCOPE* s, PARAMETER* p, int i) { + addvar(s, &(s->parameters), mkvar(p->type, p->name, p->primitive, p->debug, arg, i)); } // Group adding -void addclassvardecs(SCOPE* s, CLASSVARDEC* classvardecs) { +void addclassvardecs(COMPILER* c, SCOPE* s, CLASSVARDEC* classvardecs) { + int i = 0; while(classvardecs != NULL) { - addclassvardec(s, classvardecs); + addclassvardec(c, s, classvardecs, &i); classvardecs = classvardecs->next; } } void addlocalvars(SCOPE* s, VARDEC* localvars) { + int i = 0; while(localvars != NULL) { - addlocalvar(s, localvars); + addlocalvar(s, localvars, i); + i++; localvars = localvars->next; } } void addparameters(SCOPE* s, PARAMETER* params) { + int i = 0; while(params != NULL) { - addparameter(s, params); + addparameter(s, params, i); + i++; params = params->next; } } diff --git a/compiler/compiler-scopes.h b/compiler/compiler-scopes.h index fbf7703..2f2a449 100644 --- a/compiler/compiler-scopes.h +++ b/compiler/compiler-scopes.h @@ -1,6 +1,7 @@ #ifndef COMPILER_SCOPES_H #define COMPILER_SCOPES_H #include "parser-tree.h" +#include "compiler.h" /* compiler-scopes * Tools for dealing with scopes. @@ -34,8 +35,10 @@ typedef struct scope { struct scope* previous; } SCOPE; +struct compiler; + // Group adding -void addclassvardecs(SCOPE* s, CLASSVARDEC* classvardecs); +void addclassvardecs(struct compiler* c, SCOPE* s, CLASSVARDEC* classvardecs); void addlocalvars(SCOPE* s, VARDEC* localvars); void addparameters(SCOPE* s, PARAMETER* params); diff --git a/compiler/compiler.c b/compiler/compiler.c index d9ae45a..11794db 100644 --- a/compiler/compiler.c +++ b/compiler/compiler.c @@ -1,6 +1,5 @@ #include #include -#include #include "compiler.h" LINEBLOCK* compilestatements(COMPILER* c, SCOPE* s, STATEMENT* sts); @@ -449,7 +448,7 @@ LINEBLOCK* compilesubroutdec(COMPILER* c, SCOPE* s, CLASS* cl, SUBROUTDEC* sd) { LINEBLOCK* compileclass(COMPILER* c, CLASS* class) { SCOPE* topscope = mkscope(c->globalscope); if(class->vardecs != NULL) - addclassvardecs(topscope, class->vardecs); + addclassvardecs(c, topscope, class->vardecs); if(class->subroutdecs != NULL) topscope->subroutines = class->subroutdecs; @@ -469,12 +468,14 @@ COMPILER* mkcompiler(CLASS* classes) { c->classes = classes; pthread_mutex_init(&(c->ifmutex), NULL); pthread_mutex_init(&(c->whilemutex), NULL); + pthread_mutex_init(&(c->staticmutex), NULL); return c; } void freecompiler(COMPILER* c) { pthread_mutex_destroy(&(c->ifmutex)); pthread_mutex_destroy(&(c->whilemutex)); + pthread_mutex_destroy(&(c->staticmutex)); // to be continued free(c); } diff --git a/compiler/compiler.h b/compiler/compiler.h index 1271f0f..1d57959 100644 --- a/compiler/compiler.h +++ b/compiler/compiler.h @@ -1,12 +1,14 @@ #ifndef COMPILER_H #define COMPILER_H -#include "compiler-scopes.h" +#include #include "parser-tree.h" #include "vm-lines.h" +#include "compiler-scopes.h" -typedef struct { +typedef struct compiler { pthread_mutex_t ifmutex; pthread_mutex_t whilemutex; + pthread_mutex_t staticmutex; CLASS* classes; SCOPE* globalscope; } COMPILER;