Fix static variables index

This commit is contained in:
Augusto Gunsch 2020-12-31 13:39:07 -03:00
parent a0a21b6cb5
commit ffa4b8a5c8
No known key found for this signature in database
GPG Key ID: F7EEFE29825C72DC
4 changed files with 49 additions and 31 deletions

View File

@ -1,6 +1,8 @@
#include <stdlib.h> #include <stdlib.h>
#include <stdbool.h> #include <stdbool.h>
#include <string.h> #include <string.h>
#include <pthread.h>
#include "compiler.h"
#include "compiler-scopes.h" #include "compiler-scopes.h"
#include "os.h" #include "os.h"
@ -22,11 +24,13 @@ SUBROUTDEC* getsubroutdecwithoutparent(SCOPE* s, SUBROUTCALL* call);
SUBROUTDEC* getsubroutdec(SCOPE* s, const char* name); SUBROUTDEC* getsubroutdec(SCOPE* s, const char* name);
// Scope adding // 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 addvar(SCOPE* s, VAR** dest, VAR* v);
void addlocalvar(SCOPE* s, VARDEC* v); void addlocalvar(SCOPE* s, VARDEC* v, int i);
void addclassvardec(SCOPE* s, CLASSVARDEC* v); void addstaticvar(COMPILER* c, SCOPE* s, CLASSVARDEC* v);
void addparameter(SCOPE* s, PARAMETER* p); 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 // Error messages
void doubledeclaration(const char* name, DEBUGINFO* d1, DEBUGINFO* d2) { void doubledeclaration(const char* name, DEBUGINFO* d1, DEBUGINFO* d2) {
@ -195,13 +199,14 @@ SUBROUTDEC* getsubroutdec(SCOPE* s, const char* name) {
} }
// Scope adding // 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)); VAR* v = (VAR*)malloc(sizeof(VAR));
v->name = name; v->name = name;
v->type = type; v->type = type;
v->debug = debug; v->debug = debug;
v->memsegment = memsegnames[seg]; v->memsegment = memsegnames[seg];
v->primitive = primitive; v->primitive = primitive;
v->index = i;
return v; return v;
} }
@ -214,68 +219,75 @@ void addvar(SCOPE* s, VAR** dest, VAR* v) {
notdeclared(v->type, v->debug); notdeclared(v->type, v->debug);
} }
if(*dest == NULL)
v->index = 0;
else
v->index = 1+(*dest)->index;
v->next = *dest; v->next = *dest;
*dest = v; *dest = v;
} }
void addlocalvar(SCOPE* s, VARDEC* v) { void addlocalvar(SCOPE* s, VARDEC* v, int i) {
STRINGLIST* currname = v->names; STRINGLIST* currname = v->names;
while(currname != NULL) { 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; 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; STRINGLIST* currname = v->base->names;
while(currname != NULL) { 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; currname = currname->next;
} }
} }
void addfield(SCOPE* s, CLASSVARDEC* v) { void addfield(SCOPE* s, CLASSVARDEC* v, int i) {
STRINGLIST* currname = v->base->names; STRINGLIST* currname = v->base->names;
while(currname != NULL) { 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; currname = currname->next;
} }
} }
void addclassvardec(SCOPE* s, CLASSVARDEC* v) { void addclassvardec(COMPILER* c, SCOPE* s, CLASSVARDEC* v, int* i) {
if(v->type == stat) if(v->type == stat)
addstaticvar(s, v); addstaticvar(c, s, v);
else else {
addfield(s, v); addfield(s, v, *i);
*i++;
}
} }
void addparameter(SCOPE* s, PARAMETER* p) { void addparameter(SCOPE* s, PARAMETER* p, int i) {
addvar(s, &(s->parameters), mkvar(p->type, p->name, p->primitive, p->debug, arg)); addvar(s, &(s->parameters), mkvar(p->type, p->name, p->primitive, p->debug, arg, i));
} }
// Group adding // Group adding
void addclassvardecs(SCOPE* s, CLASSVARDEC* classvardecs) { void addclassvardecs(COMPILER* c, SCOPE* s, CLASSVARDEC* classvardecs) {
int i = 0;
while(classvardecs != NULL) { while(classvardecs != NULL) {
addclassvardec(s, classvardecs); addclassvardec(c, s, classvardecs, &i);
classvardecs = classvardecs->next; classvardecs = classvardecs->next;
} }
} }
void addlocalvars(SCOPE* s, VARDEC* localvars) { void addlocalvars(SCOPE* s, VARDEC* localvars) {
int i = 0;
while(localvars != NULL) { while(localvars != NULL) {
addlocalvar(s, localvars); addlocalvar(s, localvars, i);
i++;
localvars = localvars->next; localvars = localvars->next;
} }
} }
void addparameters(SCOPE* s, PARAMETER* params) { void addparameters(SCOPE* s, PARAMETER* params) {
int i = 0;
while(params != NULL) { while(params != NULL) {
addparameter(s, params); addparameter(s, params, i);
i++;
params = params->next; params = params->next;
} }
} }

View File

@ -1,6 +1,7 @@
#ifndef COMPILER_SCOPES_H #ifndef COMPILER_SCOPES_H
#define COMPILER_SCOPES_H #define COMPILER_SCOPES_H
#include "parser-tree.h" #include "parser-tree.h"
#include "compiler.h"
/* compiler-scopes /* compiler-scopes
* Tools for dealing with scopes. * Tools for dealing with scopes.
@ -34,8 +35,10 @@ typedef struct scope {
struct scope* previous; struct scope* previous;
} SCOPE; } SCOPE;
struct compiler;
// Group adding // Group adding
void addclassvardecs(SCOPE* s, CLASSVARDEC* classvardecs); void addclassvardecs(struct compiler* c, SCOPE* s, CLASSVARDEC* classvardecs);
void addlocalvars(SCOPE* s, VARDEC* localvars); void addlocalvars(SCOPE* s, VARDEC* localvars);
void addparameters(SCOPE* s, PARAMETER* params); void addparameters(SCOPE* s, PARAMETER* params);

View File

@ -1,6 +1,5 @@
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <pthread.h>
#include "compiler.h" #include "compiler.h"
LINEBLOCK* compilestatements(COMPILER* c, SCOPE* s, STATEMENT* sts); 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) { LINEBLOCK* compileclass(COMPILER* c, CLASS* class) {
SCOPE* topscope = mkscope(c->globalscope); SCOPE* topscope = mkscope(c->globalscope);
if(class->vardecs != NULL) if(class->vardecs != NULL)
addclassvardecs(topscope, class->vardecs); addclassvardecs(c, topscope, class->vardecs);
if(class->subroutdecs != NULL) if(class->subroutdecs != NULL)
topscope->subroutines = class->subroutdecs; topscope->subroutines = class->subroutdecs;
@ -469,12 +468,14 @@ COMPILER* mkcompiler(CLASS* classes) {
c->classes = classes; c->classes = classes;
pthread_mutex_init(&(c->ifmutex), NULL); pthread_mutex_init(&(c->ifmutex), NULL);
pthread_mutex_init(&(c->whilemutex), NULL); pthread_mutex_init(&(c->whilemutex), NULL);
pthread_mutex_init(&(c->staticmutex), NULL);
return c; return c;
} }
void freecompiler(COMPILER* c) { void freecompiler(COMPILER* c) {
pthread_mutex_destroy(&(c->ifmutex)); pthread_mutex_destroy(&(c->ifmutex));
pthread_mutex_destroy(&(c->whilemutex)); pthread_mutex_destroy(&(c->whilemutex));
pthread_mutex_destroy(&(c->staticmutex));
// to be continued // to be continued
free(c); free(c);
} }

View File

@ -1,12 +1,14 @@
#ifndef COMPILER_H #ifndef COMPILER_H
#define COMPILER_H #define COMPILER_H
#include "compiler-scopes.h" #include <pthread.h>
#include "parser-tree.h" #include "parser-tree.h"
#include "vm-lines.h" #include "vm-lines.h"
#include "compiler-scopes.h"
typedef struct { typedef struct compiler {
pthread_mutex_t ifmutex; pthread_mutex_t ifmutex;
pthread_mutex_t whilemutex; pthread_mutex_t whilemutex;
pthread_mutex_t staticmutex;
CLASS* classes; CLASS* classes;
SCOPE* globalscope; SCOPE* globalscope;
} COMPILER; } COMPILER;