more compiler code

This commit is contained in:
hyunghwan.chung 2015-05-25 18:13:52 +00:00
parent b7a443089a
commit ca10456d3a
4 changed files with 55 additions and 33 deletions

View File

@ -1834,28 +1834,38 @@ static stix_ssize_t find_class_level_variable (stix_t* stix, int index, const st
stix_ucs_t hs; stix_ucs_t hs;
/* TODO: find it in other types of variables */ /* TODO: find it in other types of variables */
/* THIS FUNCTION IS NOT COMPLETE */
pos = find_word_in_string(&stix->c->_class.vars[index], name); pos = find_word_in_string(&stix->c->_class.vars[index], name);
if (pos <= -1) super = stix->c->_class.super_oop;
if (pos >= 0) goto done;
while (super != stix->_nil)
{ {
super = stix->c->_class.super_oop; STIX_ASSERT (STIX_CLASSOF(stix, super) == stix->_class);
while (super != stix->_nil)
{
v = ((stix_class_t*)super)->instvars;
hs.ptr = v->slot;
hs.len = STIX_OBJ_GET_SIZE(v);
pos = find_word_in_string(&hs, name); v = ((stix_class_t*)super)->instvars;
if (pos <= -1) /* TODO: v = ((stix_class_t*)super)->classvars; */
{ hs.ptr = v->slot;
hs.len = STIX_OBJ_GET_SIZE(v);
pos = find_word_in_string(&hs, name);
} super = ((stix_class_t*)super)->superclass;
if (pos >= 0) goto done;
super = ((stix_class_t*)super)->superclass;
}
} }
return -1; return -1;
done:
if (super != stix->_nil)
{
stix_oow_t spec;
STIX_ASSERT (STIX_CLASSOF(stix, super) == stix->_class);
spec = STIX_OOP_TO_SMINT(((stix_class_t*)super)->spec);
pos += STIX_CLASS_SPEC_NAMED_INSTVAR(spec);
}
return pos;
} }
static int append_function_name (stix_t* stix, const stix_ucs_t* name) static int append_function_name (stix_t* stix, const stix_ucs_t* name)
@ -2592,24 +2602,23 @@ static int compile_stream (stix_t* stix)
} }
else if (is_token_ksym(stix, KSYM_CLASS)) else if (is_token_ksym(stix, KSYM_CLASS))
{ {
/* #class Selfclass(Superclass) { } */
GET_TOKEN (stix); GET_TOKEN (stix);
if (compile_class_definition(stix) <= -1) return -1; if (compile_class_definition(stix) <= -1) return -1;
} }
/* #if 0
else if (is_token_ksym(stix, KSYM_MAIN)) else if (is_token_ksym(stix, KSYM_MAIN))
{ {
/* #main */
/* TODO: implement this */
} }
*/ #endif
else else
{ {
/* TODO: error */ set_syntax_error(stix, STIX_SYNERR_DIRECTIVE, &stix->c->tok.loc, &stix->c->tok.name);
stix_size_t i; return -1;
printf ("%d [", stix->c->tok.type);
for (i = 0; i < stix->c->tok.name.len; i++)
printf ("%c", stix->c->tok.name.ptr[i]);
printf ("]\n");
GET_TOKEN (stix);
} }
} }
@ -2622,6 +2631,7 @@ static void gc_compiler (stix_t* stix)
{ {
if (stix->c->_class.self_oop) if (stix->c->_class.self_oop)
stix->c->_class.self_oop = stix_moveoop (stix, stix->c->_class.self_oop); stix->c->_class.self_oop = stix_moveoop (stix, stix->c->_class.self_oop);
if (stix->c->_class.super_oop) if (stix->c->_class.super_oop)
stix->c->_class.super_oop = stix_moveoop (stix, stix->c->_class.super_oop); stix->c->_class.super_oop = stix_moveoop (stix, stix->c->_class.super_oop);
} }
@ -2631,6 +2641,8 @@ static void fini_compiler (stix_t* stix)
{ {
if (stix->c) if (stix->c)
{ {
stix_size_t i;
clear_io_names (stix); clear_io_names (stix);
if (stix->c->tok.name.ptr) stix_freemem (stix, stix->c->tok.name.ptr); if (stix->c->tok.name.ptr) stix_freemem (stix, stix->c->tok.name.ptr);
@ -2638,6 +2650,11 @@ static void fini_compiler (stix_t* stix)
if (stix->c->_class.name.ptr) stix_freemem (stix, stix->c->_class.name.ptr); if (stix->c->_class.name.ptr) stix_freemem (stix, stix->c->_class.name.ptr);
if (stix->c->_class.supername.ptr) stix_freemem (stix, stix->c->_class.supername.ptr); if (stix->c->_class.supername.ptr) stix_freemem (stix, stix->c->_class.supername.ptr);
for (i = 0; i < STIX_COUNTOF(stix->c->_class.vars); i++)
{
if (stix->c->_class.vars[i].ptr) stix_freemem (stix, stix->c->_class.vars[i].ptr);
}
if (stix->c->fun.tmprs.ptr) stix_freemem (stix, stix->c->fun.tmprs.ptr); if (stix->c->fun.tmprs.ptr) stix_freemem (stix, stix->c->fun.tmprs.ptr);
if (stix->c->fun.name.ptr) stix_freemem (stix, stix->c->fun.name.ptr); if (stix->c->fun.name.ptr) stix_freemem (stix, stix->c->fun.name.ptr);
if (stix->c->fun.code.ptr) stix_freemem (stix, stix->c->fun.code.ptr); if (stix->c->fun.code.ptr) stix_freemem (stix, stix->c->fun.code.ptr);

View File

@ -201,6 +201,7 @@ static char* syntax_error_msg[] =
"identifier expected", "identifier expected",
"integer expected", "integer expected",
"primitive: expected", "primitive: expected",
"wrong directive",
"wrong class modifier", "wrong class modifier",
"undefined class", "undefined class",
"duplicate class", "duplicate class",

View File

@ -268,6 +268,7 @@ enum stix_synerrnum_t
STIX_SYNERR_IDENT, /* identifier expected */ STIX_SYNERR_IDENT, /* identifier expected */
STIX_SYNERR_INTEGER, /* integer expected */ STIX_SYNERR_INTEGER, /* integer expected */
STIX_SYNERR_PRIMITIVE, /* primitive: expected */ STIX_SYNERR_PRIMITIVE, /* primitive: expected */
STIX_SYNERR_DIRECTIVE, /* wrong directive */
STIX_SYNERR_CLASSMOD, /* wrong class modifier */ STIX_SYNERR_CLASSMOD, /* wrong class modifier */
STIX_SYNERR_CLASSUNDEF, /* undefined class */ STIX_SYNERR_CLASSUNDEF, /* undefined class */
STIX_SYNERR_CLASSDUP, /* duplicate class */ STIX_SYNERR_CLASSDUP, /* duplicate class */

View File

@ -491,18 +491,21 @@ struct stix_class_t
{ {
STIX_OBJ_HEADER; STIX_OBJ_HEADER;
stix_oop_t spec; /* SmallInteger */ stix_oop_t spec; /* SmallInteger */
stix_oop_t superclass; /* Another class */
stix_oop_t subclasses; /* Array of subclasses */
stix_oop_char_t name; /* Symbol */
stix_oop_char_t instvars; /* String */
stix_oop_char_t classvars; /* String */
stix_oop_oop_t instmthds; /* instance methods, MethodDictionary */ stix_oop_t superclass; /* Another class */
stix_oop_oop_t classmthds; /* class methods, MethodDictionary */ stix_oop_t subclasses; /* Array of subclasses */
stix_oop_char_t name; /* Symbol */
stix_oop_char_t instvars; /* String */
stix_oop_char_t classvars; /* String */
stix_oop_char_t classinstvars; /* String */
stix_oop_oop_t instfuns; /* instance methods, MethodDictionary */
stix_oop_oop_t classfuns; /* class methods, MethodDictionary */
/* indexed part afterwards */ /* indexed part afterwards */
stix_oop_t classvar[1]; /* most classes have no class variables. better to be 0 */ stix_oop_t classvar[1]; /* most classes have no class variables. better to be 0 */
}; };
typedef struct stix_class_t stix_class_t; typedef struct stix_class_t stix_class_t;
typedef struct stix_class_t* stix_oop_class_t; typedef struct stix_class_t* stix_oop_class_t;