summaryrefslogtreecommitdiff
path: root/symbol.c
diff options
context:
space:
mode:
Diffstat (limited to 'symbol.c')
-rw-r--r--symbol.c60
1 files changed, 34 insertions, 26 deletions
diff --git a/symbol.c b/symbol.c
index ed6006d..4240ace 100644
--- a/symbol.c
+++ b/symbol.c
@@ -1,11 +1,11 @@
#include <u.h>
#include <libc.h>
+#include <thread.h>
#include <bio.h>
#include "apl9.h"
Symtab *globalsymtab;
-DfnFrame *currentdfn;
Symtab *newsymtab(void);
void freesymtab(Symtab *);
@@ -20,7 +20,8 @@ void setsyntaxerr(Datum);
Symbol *
getsym(Rune *name, int fresh)
{
- DfnFrame *dfn = currentdfn;
+ ThreadData *td = getthreaddata();
+ DfnFrame *dfn = td->currentdfn;
Symtab *tab;
int done = 0;
do{
@@ -28,10 +29,10 @@ getsym(Rune *name, int fresh)
tab = dfn->symtab;
else
tab = globalsymtab;
-
- for(int i = 0; i < tab->nsyms; i++)
+ for(int i = 0; i < tab->nsyms; i++){
if(runestrcmp(tab->syms[i]->name, name) == 0)
return tab->syms[i];
+ }
if(dfn)
dfn = dfn->prev;
else
@@ -39,8 +40,8 @@ getsym(Rune *name, int fresh)
}while(!done && !fresh);
/* make sure to allocate in the most local scope if the symbol is not found */
- if(currentdfn)
- tab = currentdfn->symtab;
+ if(td->currentdfn)
+ tab = td->currentdfn->symtab;
tab->nsyms++;
tab->syms = realloc(tab->syms, sizeof(Symbol *) * tab->nsyms);
@@ -106,12 +107,14 @@ initsymtab(void)
DfnFrame *
getcurrentdfn(void)
{
- return currentdfn;
+ ThreadData *td = getthreaddata();
+ return td->currentdfn;
}
DfnFrame *
pushdfnframe(Rune *code, Datum *lefto, Datum *righto, Array *left, Array *right)
{
+ ThreadData *td = getthreaddata();
DfnFrame *new = malloc(sizeof(DfnFrame));
new->code = code;
new->symtab = newsymtab();
@@ -124,27 +127,29 @@ pushdfnframe(Rune *code, Datum *lefto, Datum *righto, Array *left, Array *right)
}else
new->left = nil;
new->right = right;
- new->prev = currentdfn;
- currentdfn = new;
+ new->prev = td->currentdfn;
+ td->currentdfn = new;
return new;
}
void
popdfnframe(void)
{
- if(currentdfn != nil){
- DfnFrame *prev = currentdfn->prev;
- freesymtab(currentdfn->symtab);
- free(currentdfn);
- currentdfn = prev;
+ ThreadData *td = getthreaddata();
+ if(td->currentdfn != nil){
+ DfnFrame *prev = td->currentdfn->prev;
+ freesymtab(td->currentdfn->symtab);
+ free(td->currentdfn);
+ td->currentdfn = prev;
}
}
vlong
globalIO(void)
{
- if(currentdfn)
- return currentdfn->symtab->io;
+ ThreadData *td = getthreaddata();
+ if(td->currentdfn)
+ return td->currentdfn->symtab->io;
else if(globalsymtab)
return globalsymtab->io;
else
@@ -154,8 +159,9 @@ globalIO(void)
void
globalIOset(vlong io)
{
- if(currentdfn)
- currentdfn->symtab->io = io;
+ ThreadData *td = getthreaddata();
+ if(td->currentdfn)
+ td->currentdfn->symtab->io = io;
else
globalsymtab->io = io;
}
@@ -163,8 +169,9 @@ globalIOset(vlong io)
int
globalDIV(void)
{
- if(currentdfn)
- return currentdfn->symtab->div;
+ ThreadData *td = getthreaddata();
+ if(td->currentdfn)
+ return td->currentdfn->symtab->div;
else if(globalsymtab)
return globalsymtab->div;
else
@@ -174,8 +181,9 @@ globalDIV(void)
void
globalDIVset(int div)
{
- if(currentdfn)
- currentdfn->symtab->div = div;
+ ThreadData *td = getthreaddata();
+ if(td->currentdfn)
+ td->currentdfn->symtab->div = div;
else
globalsymtab->div = div;
}
@@ -192,7 +200,7 @@ getalpha(void)
res = malloc(sizeof(Datum));
*res = *dfn->left;
if(res->tag == ArrayTag)
- incref(res->array);
+ incarrayref(res->array);
return res;
}
return res;
@@ -209,7 +217,7 @@ getomega(void)
res = mallocz(sizeof(Datum), 1);
res->tag = ArrayTag;
res->array = dfn->right;
- incref(res->array);
+ incarrayref(res->array);
}
return res;
}
@@ -225,7 +233,7 @@ getalphao(void)
res = malloc(sizeof(Datum));
*res = *dfn->lefto;
if(res->tag == ArrayTag)
- incref(res->array);
+ incarrayref(res->array);
}
return res;
}
@@ -241,7 +249,7 @@ getomegao(void)
res = malloc(sizeof(Datum));
*res = *dfn->righto;
if(res->tag == ArrayTag)
- incref(res->array);
+ incarrayref(res->array);
}
return res;
}