added more code to stix_genpfmethod(). still incomplete
This commit is contained in:
parent
7b5fc708f7
commit
b4a513cf40
@ -21,18 +21,18 @@
|
||||
|
||||
#method(#class) open: name for: mode
|
||||
{
|
||||
^(super new: 1) open: name for: mode
|
||||
^(self new) open: name for: mode
|
||||
}
|
||||
|
||||
#method open: name for: mode
|
||||
{
|
||||
<primitive: #stdio_open>
|
||||
}
|
||||
## #method open: name for: mode
|
||||
## {
|
||||
## <primitive: #stdio_open>
|
||||
## }
|
||||
|
||||
#method close
|
||||
{
|
||||
<primitive: #stdio_close>
|
||||
}
|
||||
## #method close
|
||||
## {
|
||||
## <primitive: #stdio_close>
|
||||
## }
|
||||
}
|
||||
|
||||
#extend Stdio
|
||||
|
116
stix/lib/comp.c
116
stix/lib/comp.c
@ -45,12 +45,6 @@ enum class_mod_t
|
||||
CLASS_INDEXED = (1 << 0)
|
||||
};
|
||||
|
||||
enum mth_type_t
|
||||
{
|
||||
MTH_INSTANCE,
|
||||
MTH_CLASS
|
||||
};
|
||||
|
||||
enum var_type_t
|
||||
{
|
||||
/* NEVER Change the order and the value of 3 items below.
|
||||
@ -1985,20 +1979,20 @@ static STIX_INLINE int add_class_level_variable (stix_t* stix, var_type_t index,
|
||||
|
||||
static STIX_INLINE int add_pool_dictionary (stix_t* stix, const stix_oocs_t* name, stix_oop_set_t pooldic_oop)
|
||||
{
|
||||
if (stix->c->cls.pooldic_count >= stix->c->cls.pooldic_oop_capa)
|
||||
if (stix->c->cls.pooldic_count >= stix->c->cls.pooldic_imp_oops_capa)
|
||||
{
|
||||
stix_oow_t new_capa;
|
||||
stix_oop_set_t* tmp;
|
||||
|
||||
new_capa = STIX_ALIGN(stix->c->cls.pooldic_oop_capa + 1, POOLDIC_OOP_BUFFER_ALIGN);
|
||||
tmp = stix_reallocmem (stix, stix->c->cls.pooldic_oops, new_capa * STIX_SIZEOF(stix_oop_set_t));
|
||||
new_capa = STIX_ALIGN(stix->c->cls.pooldic_imp_oops_capa + 1, POOLDIC_OOP_BUFFER_ALIGN);
|
||||
tmp = stix_reallocmem (stix, stix->c->cls.pooldic_imp_oops, new_capa * STIX_SIZEOF(stix_oop_set_t));
|
||||
if (!tmp) return -1;
|
||||
|
||||
stix->c->cls.pooldic_oop_capa = new_capa;
|
||||
stix->c->cls.pooldic_oops = tmp;
|
||||
stix->c->cls.pooldic_imp_oops_capa = new_capa;
|
||||
stix->c->cls.pooldic_imp_oops = tmp;
|
||||
}
|
||||
|
||||
stix->c->cls.pooldic_oops[stix->c->cls.pooldic_count] = pooldic_oop;
|
||||
stix->c->cls.pooldic_imp_oops[stix->c->cls.pooldic_count] = pooldic_oop;
|
||||
stix->c->cls.pooldic_count++;
|
||||
/* TODO: check if pooldic_count overflows */
|
||||
|
||||
@ -2195,7 +2189,11 @@ static int add_method_name_fragment (stix_t* stix, const stix_oocs_t* name)
|
||||
static int method_exists (stix_t* stix, const stix_oocs_t* name)
|
||||
{
|
||||
/* check if the current class contains a method of the given name */
|
||||
#ifdef MTHDIC
|
||||
return stix_lookupdic (stix, stix->c->cls.mthdic_oop[stix->c->mth.type], name) != STIX_NULL;
|
||||
#else
|
||||
return stix_lookupdic (stix, stix->c->cls.self_oop->mthdic[stix->c->mth.type], name) != STIX_NULL;
|
||||
#endif
|
||||
}
|
||||
|
||||
static int add_temporary_variable (stix_t* stix, const stix_oocs_t* name)
|
||||
@ -2365,7 +2363,7 @@ static int resolve_pooldic (stix_t* stix, int dotted, const stix_oocs_t* name)
|
||||
/* check if the same dictionary pool has been declared for import */
|
||||
for (i = 0; i < stix->c->cls.pooldic_count; i++)
|
||||
{
|
||||
if ((stix_oop_set_t)ass->value == stix->c->cls.pooldic_oops[i])
|
||||
if ((stix_oop_set_t)ass->value == stix->c->cls.pooldic_imp_oops[i])
|
||||
{
|
||||
set_syntax_error (stix, STIX_SYNERR_POOLDICDUP, TOKEN_LOC(stix), name);
|
||||
return -1;
|
||||
@ -2391,7 +2389,7 @@ static int import_pool_dictionary (stix_t* stix, stix_oop_set_t ns_oop, const st
|
||||
/* check if the same dictionary pool has been declared for import */
|
||||
for (i = 0; i < stix->c->cls.pooldic_count; i++)
|
||||
{
|
||||
if ((stix_oop_set_t)ass->value == stix->c->cls.pooldic_oops[i])
|
||||
if ((stix_oop_set_t)ass->value == stix->c->cls.pooldic_imp_oops[i])
|
||||
{
|
||||
set_syntax_error (stix, STIX_SYNERR_POOLDICDUP, tok_loc, tok_name);
|
||||
return -1;
|
||||
@ -2897,7 +2895,7 @@ static int get_variable_info (stix_t* stix, const stix_oocs_t* name, const stix_
|
||||
switch (var->type)
|
||||
{
|
||||
case VAR_INSTANCE:
|
||||
if (stix->c->mth.type == MTH_CLASS)
|
||||
if (stix->c->mth.type == STIX_METHOD_CLASS)
|
||||
{
|
||||
/* a class method cannot access an instance variable */
|
||||
set_syntax_error (stix, STIX_SYNERR_VARINACC, name_loc, name);
|
||||
@ -2918,7 +2916,7 @@ static int get_variable_info (stix_t* stix, const stix_oocs_t* name, const stix_
|
||||
|
||||
case VAR_CLASSINST:
|
||||
/* class instance variable can be accessed by only class methods */
|
||||
if (stix->c->mth.type == MTH_INSTANCE)
|
||||
if (stix->c->mth.type == STIX_METHOD_INSTANCE)
|
||||
{
|
||||
/* an instance method cannot access a class-instance variable */
|
||||
set_syntax_error (stix, STIX_SYNERR_VARINACC, name_loc, name);
|
||||
@ -2958,7 +2956,7 @@ static int get_variable_info (stix_t* stix, const stix_oocs_t* name, const stix_
|
||||
/* attempt to find the variable in pool dictionaries */
|
||||
for (i = 0; i < stix->c->cls.pooldic_count; i++)
|
||||
{
|
||||
ass = stix_lookupdic (stix, stix->c->cls.pooldic_oops[i], name);
|
||||
ass = stix_lookupdic (stix, stix->c->cls.pooldic_imp_oops[i], name);
|
||||
if (ass)
|
||||
{
|
||||
if (ass2)
|
||||
@ -4344,7 +4342,7 @@ static int add_compiled_method (stix_t* stix)
|
||||
else if (stix->c->mth.pftype == 2)
|
||||
{
|
||||
preamble_code = STIX_METHOD_PREAMBLE_NAMED_PRIMITIVE;
|
||||
preamble_index = stix->c->mth.pfnum;
|
||||
preamble_index = stix->c->mth.pfnum; /* index to literal frame */
|
||||
}
|
||||
else if (stix->c->mth.pftype == 3)
|
||||
{
|
||||
@ -4385,7 +4383,11 @@ need to write code to collect string.
|
||||
|
||||
stix_poptmps (stix, tmp_count); tmp_count = 0;
|
||||
|
||||
#ifdef MTHDIC
|
||||
if (!stix_putatdic(stix, stix->c->cls.mthdic_oop[stix->c->mth.type], (stix_oop_t)name, (stix_oop_t)mth)) goto oops;
|
||||
#else
|
||||
if (!stix_putatdic(stix, stix->c->cls.self_oop->mthdic[stix->c->mth.type], (stix_oop_t)name, (stix_oop_t)mth)) goto oops;
|
||||
#endif
|
||||
|
||||
return 0;
|
||||
|
||||
@ -4397,7 +4399,7 @@ oops:
|
||||
static int compile_method_definition (stix_t* stix)
|
||||
{
|
||||
/* clear data required to compile a method */
|
||||
stix->c->mth.type = MTH_INSTANCE;
|
||||
stix->c->mth.type = STIX_METHOD_INSTANCE;
|
||||
stix->c->mth.text.len = 0;
|
||||
stix->c->mth.assignees.len = 0;
|
||||
stix->c->mth.binsels.len = 0;
|
||||
@ -4423,7 +4425,7 @@ static int compile_method_definition (stix_t* stix)
|
||||
if (is_token_symbol(stix, VOCA_CLASS))
|
||||
{
|
||||
/* #method(#class) */
|
||||
stix->c->mth.type = MTH_CLASS;
|
||||
stix->c->mth.type = STIX_METHOD_CLASS;
|
||||
GET_TOKEN (stix);
|
||||
}
|
||||
|
||||
@ -4544,12 +4546,20 @@ static int make_defined_class (stix_t* stix)
|
||||
/* TOOD: good dictionary size */
|
||||
tmp = (stix_oop_t)stix_makedic (stix, stix->_method_dictionary, INSTANCE_METHOD_DICTIONARY_SIZE);
|
||||
if (!tmp) return -1;
|
||||
stix->c->cls.mthdic_oop[MTH_INSTANCE] = (stix_oop_set_t)tmp;
|
||||
#ifdef MTHDIC
|
||||
stix->c->cls.mthdic_oop[STIX_METHOD_INSTANCE] = (stix_oop_set_t)tmp;
|
||||
#else
|
||||
stix->c->cls.self_oop->mthdic[STIX_METHOD_INSTANCE] = (stix_oop_set_t)tmp;
|
||||
#endif
|
||||
|
||||
/* TOOD: good dictionary size */
|
||||
tmp = (stix_oop_t)stix_makedic (stix, stix->_method_dictionary, CLASS_METHOD_DICTIONARY_SIZE);
|
||||
if (!tmp) return -1;
|
||||
stix->c->cls.mthdic_oop[MTH_CLASS] = (stix_oop_set_t)tmp;
|
||||
#ifdef MTHDIC
|
||||
stix->c->cls.mthdic_oop[STIX_METHOD_CLASS] = (stix_oop_set_t)tmp;
|
||||
#else
|
||||
stix->c->cls.self_oop->mthdic[STIX_METHOD_CLASS] = (stix_oop_set_t)tmp;
|
||||
#endif
|
||||
|
||||
/* TODO: initialize more fields??? whatelse. */
|
||||
|
||||
@ -4814,7 +4824,9 @@ static int __compile_class_definition (stix_t* stix, int extend)
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (TOKEN_NAME_LEN(stix) < 1 || TOKEN_NAME_LEN(stix) > STIX_MOD_NAME_LEN_MAX)
|
||||
if (TOKEN_NAME_LEN(stix) < 1 ||
|
||||
TOKEN_NAME_LEN(stix) > STIX_MOD_NAME_LEN_MAX ||
|
||||
stix_findoochar(TOKEN_NAME_PTR(stix), TOKEN_NAME_LEN(stix), '_'))
|
||||
{
|
||||
set_syntax_error (stix, STIX_SYNERR_MODNAME, TOKEN_LOC(stix), TOKEN_NAME(stix));
|
||||
return -1;
|
||||
@ -4860,9 +4872,12 @@ static int __compile_class_definition (stix_t* stix, int extend)
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
#ifdef MTHDIC
|
||||
/* use the method dictionary of an existing class object */
|
||||
stix->c->cls.mthdic_oop[MTH_INSTANCE] = stix->c->cls.self_oop->mthdic[STIX_CLASS_MTHDIC_INSTANCE];
|
||||
stix->c->cls.mthdic_oop[MTH_CLASS] = stix->c->cls.self_oop->mthdic[STIX_CLASS_MTHDIC_CLASS];
|
||||
stix->c->cls.mthdic_oop[STIX_METHOD_INSTANCE] = stix->c->cls.self_oop->mthdic[STIX_METHOD_INSTANCE];
|
||||
stix->c->cls.mthdic_oop[STIX_METHOD_CLASS] = stix->c->cls.self_oop->mthdic[STIX_METHOD_CLASS];
|
||||
#endif
|
||||
|
||||
/* load the pooldic definition from the existing class object */
|
||||
pds = stix->c->cls.self_oop->pooldics;
|
||||
@ -4870,7 +4885,6 @@ static int __compile_class_definition (stix_t* stix, int extend)
|
||||
{
|
||||
stix_ooch_t* ptr, * end;
|
||||
|
||||
|
||||
STIX_ASSERT (STIX_CLASSOF(stix, pds) == stix->_string);
|
||||
|
||||
ptr = pds->slot;
|
||||
@ -4947,12 +4961,15 @@ static int __compile_class_definition (stix_t* stix, int extend)
|
||||
return -1;
|
||||
}
|
||||
|
||||
#ifdef MTHDIC
|
||||
if (!extend)
|
||||
{
|
||||
/* link the method dictionaries created to the actual class object */
|
||||
/* TODO: anything else to set? */
|
||||
stix->c->cls.self_oop->mthdic[STIX_CLASS_MTHDIC_INSTANCE] = stix->c->cls.mthdic_oop[MTH_INSTANCE];
|
||||
stix->c->cls.self_oop->mthdic[STIX_CLASS_MTHDIC_CLASS] = stix->c->cls.mthdic_oop[MTH_CLASS];
|
||||
stix->c->cls.self_oop->mthdic[STIX_CLASS_MTHDIC_INSTANCE] = stix->c->cls.mthdic_oop[STIX_METHOD_INSTANCE];
|
||||
stix->c->cls.self_oop->mthdic[STIX_CLASS_MTHDIC_CLASS] = stix->c->cls.mthdic_oop[STIX_METHOD_CLASS];
|
||||
}
|
||||
#endif
|
||||
|
||||
GET_TOKEN (stix);
|
||||
return 0;
|
||||
@ -4984,8 +5001,10 @@ static int compile_class_definition (stix_t* stix, int extend)
|
||||
|
||||
stix->c->cls.self_oop = STIX_NULL;
|
||||
stix->c->cls.super_oop = STIX_NULL;
|
||||
stix->c->cls.mthdic_oop[MTH_INSTANCE] = STIX_NULL;
|
||||
stix->c->cls.mthdic_oop[MTH_CLASS] = STIX_NULL;
|
||||
#ifdef MTHDIC
|
||||
stix->c->cls.mthdic_oop[STIX_METHOD_INSTANCE] = STIX_NULL;
|
||||
stix->c->cls.mthdic_oop[STIX_METHOD_CLASS] = STIX_NULL;
|
||||
#endif
|
||||
stix->c->cls.ns_oop = STIX_NULL;
|
||||
stix->c->cls.superns_oop = STIX_NULL;
|
||||
stix->c->mth.literal_count = 0;
|
||||
@ -4998,8 +5017,10 @@ static int compile_class_definition (stix_t* stix, int extend)
|
||||
/* reset these oops plus literal pointers not to confuse gc_compiler() */
|
||||
stix->c->cls.self_oop = STIX_NULL;
|
||||
stix->c->cls.super_oop = STIX_NULL;
|
||||
stix->c->cls.mthdic_oop[MTH_INSTANCE] = STIX_NULL;
|
||||
stix->c->cls.mthdic_oop[MTH_CLASS] = STIX_NULL;
|
||||
#ifdef MTHDIC
|
||||
stix->c->cls.mthdic_oop[STIX_METHOD_INSTANCE] = STIX_NULL;
|
||||
stix->c->cls.mthdic_oop[STIX_METHOD_CLASS] = STIX_NULL;
|
||||
#endif
|
||||
stix->c->cls.ns_oop = STIX_NULL;
|
||||
stix->c->cls.superns_oop = STIX_NULL;
|
||||
stix->c->mth.literal_count = 0;
|
||||
@ -5152,19 +5173,21 @@ static int __compile_pooldic_definition (stix_t* stix)
|
||||
/*TODO: tally and arlit_count range check */
|
||||
/*if (!STIX_IN_SMOOI_RANGE(tally)) ERROR??*/
|
||||
|
||||
stix->c->cls.mthdic_oop[0] = stix_makedic (stix, stix->_pool_dictionary, STIX_ALIGN(tally + 10, POOL_DICTIONARY_SIZE_ALIGN));
|
||||
if (!stix->c->cls.mthdic_oop[0]) return -1;
|
||||
/* i use mthdic_oop[0] when compling #pooldic. it's not a real method dictionary.
|
||||
* i just use it not to declare another field into the compiler */
|
||||
stix->c->cls.pooldic_oop = stix_makedic (stix, stix->_pool_dictionary, STIX_ALIGN(tally + 10, POOL_DICTIONARY_SIZE_ALIGN));
|
||||
if (!stix->c->cls.pooldic_oop) return -1;
|
||||
|
||||
for (i = 0; i < stix->c->mth.arlit_count; i += 2)
|
||||
{
|
||||
/* TODO: handle duplicate keys? */
|
||||
if (!stix_putatdic(stix, stix->c->cls.mthdic_oop[0], stix->c->mth.arlit[i], stix->c->mth.arlit[i + 1])) return -1;
|
||||
if (!stix_putatdic(stix, stix->c->cls.pooldic_oop, stix->c->mth.arlit[i], stix->c->mth.arlit[i + 1])) return -1;
|
||||
}
|
||||
|
||||
/* eveything seems ok. register the pool dictionary to the main
|
||||
* system dictionary or to the name space it belongs to */
|
||||
lit = stix_makesymbol (stix, stix->c->cls.name.ptr, stix->c->cls.name.len);
|
||||
if (!lit || !stix_putatdic (stix, stix->c->cls.ns_oop, lit, (stix_oop_t)stix->c->cls.mthdic_oop[0])) return -1;
|
||||
if (!lit || !stix_putatdic (stix, stix->c->cls.ns_oop, lit, (stix_oop_t)stix->c->cls.pooldic_oop)) return -1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -5176,7 +5199,7 @@ static int compile_pooldic_definition (stix_t* stix)
|
||||
* i'll be reusing some fields reserved for compling a class */
|
||||
stix->c->cls.name.len = 0;
|
||||
STIX_MEMSET (&stix->c->cls.fqn_loc, 0, STIX_SIZEOF(stix->c->cls.fqn_loc));
|
||||
stix->c->cls.mthdic_oop[0] = STIX_NULL;
|
||||
stix->c->cls.pooldic_oop = STIX_NULL;
|
||||
stix->c->cls.ns_oop = STIX_NULL;
|
||||
stix->c->mth.balit_count = 0;
|
||||
stix->c->mth.arlit_count = 0;
|
||||
@ -5184,7 +5207,7 @@ static int compile_pooldic_definition (stix_t* stix)
|
||||
n = __compile_pooldic_definition (stix);
|
||||
|
||||
/* reset these oops plus literal pointers not to confuse gc_compiler() */
|
||||
stix->c->cls.mthdic_oop[0] = STIX_NULL;
|
||||
stix->c->cls.pooldic_oop = STIX_NULL;
|
||||
stix->c->cls.ns_oop = STIX_NULL;
|
||||
stix->c->mth.balit_count = 0;
|
||||
stix->c->mth.arlit_count = 0;
|
||||
@ -5258,11 +5281,16 @@ static void gc_compiler (stix_t* stix)
|
||||
if (stix->c->cls.super_oop)
|
||||
stix->c->cls.super_oop = stix_moveoop (stix, stix->c->cls.super_oop);
|
||||
|
||||
if (stix->c->cls.mthdic_oop[MTH_INSTANCE])
|
||||
stix->c->cls.mthdic_oop[MTH_INSTANCE] = (stix_oop_set_t)stix_moveoop (stix, (stix_oop_t)stix->c->cls.mthdic_oop[MTH_INSTANCE]);
|
||||
#ifdef MTHDIC
|
||||
if (stix->c->cls.mthdic_oop[STIX_METHOD_INSTANCE])
|
||||
stix->c->cls.mthdic_oop[STIX_METHOD_INSTANCE] = (stix_oop_set_t)stix_moveoop (stix, (stix_oop_t)stix->c->cls.mthdic_oop[STIX_METHOD_INSTANCE]);
|
||||
|
||||
if (stix->c->cls.mthdic_oop[MTH_CLASS])
|
||||
stix->c->cls.mthdic_oop[MTH_CLASS] = (stix_oop_set_t)stix_moveoop (stix, (stix_oop_t)stix->c->cls.mthdic_oop[MTH_CLASS]);
|
||||
if (stix->c->cls.mthdic_oop[STIX_METHOD_CLASS])
|
||||
stix->c->cls.mthdic_oop[STIX_METHOD_CLASS] = (stix_oop_set_t)stix_moveoop (stix, (stix_oop_t)stix->c->cls.mthdic_oop[STIX_METHOD_CLASS]);
|
||||
#endif
|
||||
|
||||
if (stix->c->cls.pooldic_oop)
|
||||
stix->c->cls.pooldic_oop = (stix_oop_set_t)stix_moveoop (stix, (stix_oop_t)stix->c->cls.pooldic_oop);
|
||||
|
||||
if (stix->c->cls.ns_oop)
|
||||
stix->c->cls.ns_oop = (stix_oop_set_t)stix_moveoop (stix, (stix_oop_t)stix->c->cls.ns_oop);
|
||||
@ -5272,7 +5300,7 @@ static void gc_compiler (stix_t* stix)
|
||||
|
||||
for (i = 0; i < stix->c->cls.pooldic_count; i++)
|
||||
{
|
||||
stix->c->cls.pooldic_oops[i] = (stix_oop_set_t)stix_moveoop (stix, (stix_oop_t)stix->c->cls.pooldic_oops[i]);
|
||||
stix->c->cls.pooldic_imp_oops[i] = (stix_oop_set_t)stix_moveoop (stix, (stix_oop_t)stix->c->cls.pooldic_imp_oops[i]);
|
||||
}
|
||||
|
||||
for (i = 0; i < stix->c->mth.literal_count; i++)
|
||||
@ -5306,7 +5334,7 @@ static void fini_compiler (stix_t* stix)
|
||||
}
|
||||
|
||||
if (stix->c->cls.pooldic.ptr) stix_freemem (stix, stix->c->cls.pooldic.ptr);
|
||||
if (stix->c->cls.pooldic_oops) stix_freemem (stix, stix->c->cls.pooldic_oops);
|
||||
if (stix->c->cls.pooldic_imp_oops) stix_freemem (stix, stix->c->cls.pooldic_imp_oops);
|
||||
|
||||
if (stix->c->mth.text.ptr) stix_freemem (stix, stix->c->mth.text.ptr);
|
||||
if (stix->c->mth.assignees.ptr) stix_freemem (stix, stix->c->mth.assignees.ptr);
|
||||
|
@ -992,13 +992,13 @@ static stix_oop_method_t find_method (stix_t* stix, stix_oop_t receiver, const s
|
||||
{
|
||||
/* receiver is a class object (an instance of Class) */
|
||||
c = receiver;
|
||||
dic_no = STIX_CLASS_MTHDIC_CLASS;
|
||||
dic_no = STIX_METHOD_CLASS;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* receiver is not a class object. so take its class */
|
||||
c = (stix_oop_t)cls;
|
||||
dic_no = STIX_CLASS_MTHDIC_INSTANCE;
|
||||
dic_no = STIX_METHOD_INSTANCE;
|
||||
}
|
||||
|
||||
STIX_ASSERT (c != stix->_nil);
|
||||
@ -1039,7 +1039,7 @@ not_found:
|
||||
{
|
||||
/* the object is an instance of Class. find the method
|
||||
* in an instance method dictionary of Class also */
|
||||
mthdic = ((stix_oop_class_t)cls)->mthdic[STIX_CLASS_MTHDIC_INSTANCE];
|
||||
mthdic = ((stix_oop_class_t)cls)->mthdic[STIX_METHOD_INSTANCE];
|
||||
STIX_ASSERT ((stix_oop_t)mthdic != stix->_nil);
|
||||
STIX_ASSERT (STIX_CLASSOF(stix, mthdic) == stix->_method_dictionary);
|
||||
|
||||
@ -2893,7 +2893,7 @@ static int start_method (stix_t* stix, stix_oop_method_t method, stix_oow_t narg
|
||||
STIX_ASSERT (STIX_OBJ_GET_FLAGS_EXTRA(name));
|
||||
STIX_ASSERT (STIX_CLASSOF(stix,name) == stix->_symbol);
|
||||
|
||||
handler = stix_querymodforpfimpl (stix, ((stix_oop_char_t)name)->slot, STIX_OBJ_GET_SIZE(name));
|
||||
handler = stix_querymod (stix, ((stix_oop_char_t)name)->slot, STIX_OBJ_GET_SIZE(name));
|
||||
}
|
||||
|
||||
if (handler)
|
||||
@ -2915,15 +2915,19 @@ static int start_method (stix_t* stix, stix_oop_method_t method, stix_oow_t narg
|
||||
return -1; /* hard primitive failure */
|
||||
}
|
||||
if (n >= 1) break; /* primitive ok*/
|
||||
}
|
||||
|
||||
/* soft primitive failure or handler not found.
|
||||
* if handler is not found, 0 must be printed in the debug message. */
|
||||
/* soft primitive failure */
|
||||
STIX_DEBUG1 (stix, "Soft failure indicated by primitive function %p\n", handler);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* no handler found */
|
||||
STIX_DEBUG0 (stix, "Soft failure for non-existent primitive function\n");
|
||||
}
|
||||
|
||||
#if defined(STIX_USE_OBJECT_TRAILER)
|
||||
STIX_ASSERT (STIX_OBJ_GET_FLAGS_TRAILER(method));
|
||||
if (method->slot[STIX_OBJ_GET_SIZE(method)] == 0) /* this trailer size field not a small integer */
|
||||
if (STIX_METHOD_GET_CODE_SIZE(method) == 0) /* this trailer size field not a small integer */
|
||||
#else
|
||||
if (method->code == stix->_nil)
|
||||
#endif
|
||||
|
@ -411,7 +411,7 @@ static void log_write (stix_t* stix, stix_oow_t mask, const stix_ooch_t* msg, st
|
||||
struct tm tm, *tmp;
|
||||
time_t now;
|
||||
|
||||
/*if (mask & STIX_LOG_GC) return;*/ /* don't show gc logs */
|
||||
if (mask & STIX_LOG_GC) return; /* don't show gc logs */
|
||||
|
||||
/* TODO: beautify the log message.
|
||||
* do classification based on mask. */
|
||||
|
@ -45,7 +45,7 @@
|
||||
#define STIX_USE_MAKE_BLOCK
|
||||
|
||||
/* this is for gc debugging */
|
||||
/*#define STIX_DEBUG_GC*/
|
||||
#define STIX_DEBUG_GC
|
||||
#define STIX_DEBUG_COMPILER
|
||||
/*#define STIX_DEBUG_VM_PROCESSOR*/
|
||||
/*#define STIX_DEBUG_VM_EXEC*/
|
||||
@ -479,8 +479,10 @@ struct stix_compiler_t
|
||||
|
||||
stix_oop_class_t self_oop;
|
||||
stix_oop_t super_oop; /* this may be nil. so the type is stix_oop_t */
|
||||
stix_oop_set_t mthdic_oop[2];
|
||||
|
||||
#ifdef MTHDIC
|
||||
stix_oop_set_t mthdic_oop[2]; /* used when compiling a method definition */
|
||||
#endif
|
||||
stix_oop_set_t pooldic_oop; /* used when compiling a pooldic definition */
|
||||
stix_oop_set_t ns_oop;
|
||||
stix_oocs_t fqn;
|
||||
stix_oocs_t name;
|
||||
@ -503,18 +505,20 @@ struct stix_compiler_t
|
||||
* var_count[2] - number of class instance variables */
|
||||
stix_oow_t var_count[3];
|
||||
|
||||
/* buffer to hold pooldic import declaration */
|
||||
stix_oocs_t pooldic;
|
||||
stix_oow_t pooldic_capa;
|
||||
stix_oow_t pooldic_count;
|
||||
|
||||
stix_oop_set_t* pooldic_oops;
|
||||
stix_oow_t pooldic_oop_capa;
|
||||
/* used to hold imported pool dictionarie objects */
|
||||
stix_oop_set_t* pooldic_imp_oops;
|
||||
stix_oow_t pooldic_imp_oops_capa;
|
||||
} cls;
|
||||
|
||||
/* information about a function being comipled */
|
||||
/* information about a method being comipled */
|
||||
struct
|
||||
{
|
||||
int type;
|
||||
stix_method_type_t type;
|
||||
|
||||
/* method source text */
|
||||
stix_oocs_t text;
|
||||
@ -590,16 +594,8 @@ struct stix_oochbuf_t
|
||||
stix_oow_t capa;
|
||||
};
|
||||
|
||||
struct stix_decoder_t
|
||||
{
|
||||
stix_oochbuf_t fltout;
|
||||
stix_bchbuf_t fltfmt;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
#if defined(STIX_USE_OBJECT_TRAILER)
|
||||
/* let it point to the trailer of the method */
|
||||
# define SET_ACTIVE_METHOD_CODE(stix) ((stix)->active_code = (stix_oob_t*)&(stix)->active_method->slot[STIX_OBJ_GET_SIZE((stix)->active_method) + 1 - STIX_METHOD_NAMED_INSTVARS])
|
||||
@ -1268,10 +1264,10 @@ int stix_importmod (
|
||||
);
|
||||
|
||||
/*
|
||||
* The stix_querymodforpfimpl() function finds a primitive function in modules
|
||||
* The stix_querymod() function finds a primitive function in modules
|
||||
* with a full primitive identifier.
|
||||
*/
|
||||
stix_pfimpl_t stix_querymodforpfimpl (
|
||||
stix_pfimpl_t stix_querymod (
|
||||
stix_t* stix,
|
||||
const stix_ooch_t* pfid,
|
||||
stix_oow_t pfidlen
|
||||
|
@ -505,7 +505,7 @@ stix_mod_data_t* stix_openmod (stix_t* stix, const stix_ooch_t* name, stix_oow_t
|
||||
|
||||
/* attempt to find an external module */
|
||||
STIX_MEMSET (&md, 0, STIX_SIZEOF(md));
|
||||
stix_copyoochars (md.name, name, namelen);
|
||||
stix_copyoochars ((stix_ooch_t*)md.mod.name, name, namelen);
|
||||
if (stix->vmprim.dl_open && stix->vmprim.dl_getsym && stix->vmprim.dl_close)
|
||||
{
|
||||
md.handle = stix->vmprim.dl_open (stix, &buf[MOD_PREFIX_LEN]);
|
||||
@ -551,7 +551,7 @@ stix_mod_data_t* stix_openmod (stix_t* stix, const stix_ooch_t* name, stix_oow_t
|
||||
|
||||
mdp->pair = pair;
|
||||
|
||||
STIX_DEBUG2 (stix, "Opened a module [%S] - %p\n", mdp->name, mdp->handle);
|
||||
STIX_DEBUG2 (stix, "Opened a module [%S] - %p\n", mdp->mod.name, mdp->handle);
|
||||
|
||||
/* the module loader must ensure to set a proper query handler */
|
||||
STIX_ASSERT (mdp->mod.query != STIX_NULL);
|
||||
@ -566,14 +566,14 @@ void stix_closemod (stix_t* stix, stix_mod_data_t* mdp)
|
||||
if (mdp->handle)
|
||||
{
|
||||
stix->vmprim.dl_close (stix, mdp->handle);
|
||||
STIX_DEBUG2 (stix, "Closed a module [%S] - %p\n", mdp->name, mdp->handle);
|
||||
STIX_DEBUG2 (stix, "Closed a module [%S] - %p\n", mdp->mod.name, mdp->handle);
|
||||
mdp->handle = STIX_NULL;
|
||||
}
|
||||
|
||||
if (mdp->pair)
|
||||
{
|
||||
/*mdp->pair = STIX_NULL;*/ /* this reset isn't needed as the area will get freed by stix_rbt_delete()) */
|
||||
stix_rbt_delete (&stix->modtab, mdp->name, stix_countoocstr(mdp->name));
|
||||
stix_rbt_delete (&stix->modtab, mdp->mod.name, stix_countoocstr(mdp->mod.name));
|
||||
}
|
||||
}
|
||||
|
||||
@ -583,6 +583,11 @@ int stix_importmod (stix_t* stix, stix_oop_t _class, const stix_ooch_t* name, st
|
||||
stix_mod_data_t* mdp;
|
||||
int r = 0;
|
||||
|
||||
/* stix_openmod(), stix_closemod(), etc calls a user-defined callback.
|
||||
* i need to protect _class in case the user-defined callback allocates
|
||||
* a OOP memory chunk and GC occurs */
|
||||
stix_pushtmp (stix, &_class);
|
||||
|
||||
pair = stix_rbt_search (&stix->modtab, name, len);
|
||||
if (pair)
|
||||
{
|
||||
@ -601,7 +606,7 @@ int stix_importmod (stix_t* stix, stix_oop_t _class, const stix_ooch_t* name, st
|
||||
|
||||
if (!mdp->mod.import)
|
||||
{
|
||||
STIX_DEBUG1 (stix, "Cannot import module [%S] - importing not supported by the module\n", mdp->name);
|
||||
STIX_DEBUG1 (stix, "Cannot import module [%S] - importing not supported by the module\n", mdp->mod.name);
|
||||
stix->errnum = STIX_ENOIMPL;
|
||||
r = -1;
|
||||
goto done;
|
||||
@ -609,7 +614,7 @@ int stix_importmod (stix_t* stix, stix_oop_t _class, const stix_ooch_t* name, st
|
||||
|
||||
if (mdp->mod.import (stix, &mdp->mod, _class) <= -1)
|
||||
{
|
||||
STIX_DEBUG1 (stix, "Cannot import module [%S] - module's import() returned failure\n", mdp->name);
|
||||
STIX_DEBUG1 (stix, "Cannot import module [%S] - module's import() returned failure\n", mdp->mod.name);
|
||||
r = -1;
|
||||
goto done;
|
||||
}
|
||||
@ -621,10 +626,11 @@ done:
|
||||
stix_closemod (stix, mdp);
|
||||
}
|
||||
|
||||
stix_poptmp (stix);
|
||||
return r;
|
||||
}
|
||||
|
||||
stix_pfimpl_t stix_querymodforpfimpl (stix_t* stix, const stix_ooch_t* pfid, stix_oow_t pfidlen)
|
||||
stix_pfimpl_t stix_querymod (stix_t* stix, const stix_ooch_t* pfid, stix_oow_t pfidlen)
|
||||
{
|
||||
/* primitive function identifier
|
||||
* _funcname
|
||||
@ -666,41 +672,66 @@ stix_pfimpl_t stix_querymodforpfimpl (stix_t* stix, const stix_ooch_t* pfid, sti
|
||||
if ((handler = mdp->mod.query (stix, &mdp->mod, sep + 1)) == STIX_NULL)
|
||||
{
|
||||
/* the primitive function is not found. keep the module open */
|
||||
STIX_DEBUG2 (stix, "Cannot find a primitive function [%S] in a module [%S]\n", sep + 1, mdp->name);
|
||||
STIX_DEBUG2 (stix, "Cannot find a primitive function [%S] in a module [%S]\n", sep + 1, mdp->mod.name);
|
||||
stix->errnum = STIX_ENOENT; /* TODO: proper error code and handling */
|
||||
return STIX_NULL;
|
||||
}
|
||||
|
||||
STIX_DEBUG3 (stix, "Found a primitive function [%S] in a module [%S] - %p\n", sep + 1, mdp->name, handler);
|
||||
STIX_DEBUG3 (stix, "Found a primitive function [%S] in a module [%S] - %p\n", sep + 1, mdp->mod.name, handler);
|
||||
return handler;
|
||||
}
|
||||
|
||||
/* -------------------------------------------------------------------------- */
|
||||
|
||||
/* add a new primitive method */
|
||||
int stix_addmethod (stix_t* stix, stix_oop_t _class, const stix_ooch_t* name, stix_pfimpl_t func)
|
||||
int stix_genpfmethod (stix_t* stix, stix_mod_t* mod, stix_oop_t _class, stix_method_type_t type, const stix_ooch_t* mthname, const stix_ooch_t* pfname)
|
||||
{
|
||||
/* NOTE: this function is a subset of add_compiled_method() in comp.c */
|
||||
|
||||
stix_oop_char_t nsym;
|
||||
stix_oop_char_t mnsym, pfidsym;
|
||||
stix_oop_method_t mth;
|
||||
stix_oop_class_t cls;
|
||||
stix_oow_t tmp_count = 0, i;
|
||||
stix_ooi_t arg_count = 0;
|
||||
stix_oocs_t cs;
|
||||
|
||||
STIX_ASSERT (STIX_CLASSOF(stix, _class) == stix->_class);
|
||||
|
||||
cls = (stix_oop_class_t)_class;
|
||||
stix_pushtmp (stix, (stix_oop_t*)&cls); tmp_count++;
|
||||
STIX_ASSERT (STIX_CLASSOF(stix, (stix_oop_t)cls->mthdic[type]) == stix->_method_dictionary);
|
||||
|
||||
/* TODO: check if name is a valid method name */
|
||||
for (i = 0; name[i]; i++)
|
||||
for (i = 0; mthname[i]; i++)
|
||||
{
|
||||
if (name[i] == ':') arg_count++;
|
||||
if (mthname[i] == ':') arg_count++;
|
||||
}
|
||||
/* TODO: check if name is a valid method name - more checks... */
|
||||
/* TOOD: if the method name is a binary selector, it can still have an argument.. so the check below is invalid... */
|
||||
if (arg_count > 0 && mthname[i - 1] != ':')
|
||||
{
|
||||
STIX_DEBUG2 (stix, "Cannot generate primitive function method [%S] in [%O] - invalid name\n", mthname, cls->name);
|
||||
stix->errnum = STIX_EINVAL;
|
||||
goto oops;
|
||||
}
|
||||
nsym = (stix_oop_char_t)stix_makesymbol (stix, name, i);
|
||||
if (!nsym) return -1;
|
||||
|
||||
stix_pushtmp (stix, (stix_oop_t*)&name); tmp_count++;
|
||||
cs.ptr = (stix_ooch_t*)mthname;
|
||||
cs.len = i;
|
||||
if (stix_lookupdic (stix, cls->mthdic[type], &cs) != STIX_NULL)
|
||||
{
|
||||
STIX_DEBUG2 (stix, "Cannot generate primitive function method [%S] in [%O] - duplicate\n", mthname, cls->name);
|
||||
stix->errnum = STIX_EEXIST;
|
||||
goto oops;
|
||||
}
|
||||
|
||||
mnsym = (stix_oop_char_t)stix_makesymbol (stix, mthname, i);
|
||||
if (!mnsym) goto oops;
|
||||
stix_pushtmp (stix, (stix_oop_t*)&mnsym); tmp_count++;
|
||||
|
||||
/* TODO:... */
|
||||
/* pfid => mod->name + '_' + pfname */
|
||||
pfidsym = (stix_oop_char_t)stix_makesymbol (stix, pfname, stix_countoocstr(pfname));
|
||||
if (!pfidsym) goto oops;
|
||||
stix_pushtmp (stix, (stix_oop_t*)&pfidsym); tmp_count++;
|
||||
|
||||
#if defined(STIX_USE_OBJECT_TRAILER)
|
||||
mth = (stix_oop_method_t)stix_instantiatewithtrailer (stix, stix->_method, 1, STIX_NULL, 0);
|
||||
@ -709,23 +740,23 @@ int stix_addmethod (stix_t* stix, stix_oop_t _class, const stix_ooch_t* name, st
|
||||
#endif
|
||||
if (!mth) goto oops;
|
||||
|
||||
/* store the symbol name to the literal frame */
|
||||
mth->slot[0] = (stix_oop_t)nsym;
|
||||
/* store the primitive function name symbol to the literal frame */
|
||||
mth->slot[0] = (stix_oop_t)pfidsym;
|
||||
|
||||
/* add the primitive as a name primitive with index of -1.
|
||||
* set the preamble_data to the pointer to the primitive function. */
|
||||
/* premable should contain the index to the literal frame - 0 */
|
||||
mth->owner = cls;
|
||||
mth->name = nsym;
|
||||
mth->preamble = STIX_SMOOI_TO_OOP(STIX_METHOD_MAKE_PREAMBLE(STIX_METHOD_PREAMBLE_NAMED_PRIMITIVE, -1));
|
||||
mth->preamble_data[0] = STIX_SMOOI_TO_OOP((stix_oow_t)func >> (STIX_OOW_BITS / 2));
|
||||
mth->preamble_data[1] = STIX_SMOOI_TO_OOP((stix_oow_t)func & STIX_LBMASK(stix_oow_t, STIX_OOW_BITS / 2));
|
||||
mth->name = mnsym;
|
||||
mth->preamble = STIX_SMOOI_TO_OOP(STIX_METHOD_MAKE_PREAMBLE(STIX_METHOD_PREAMBLE_NAMED_PRIMITIVE, 0));
|
||||
mth->preamble_data[0] = STIX_SMOOI_TO_OOP(0);
|
||||
mth->preamble_data[1] = STIX_SMOOI_TO_OOP(0);
|
||||
mth->tmpr_count = STIX_SMOOI_TO_OOP(arg_count);
|
||||
mth->tmpr_nargs = STIX_SMOOI_TO_OOP(arg_count);
|
||||
stix_poptmps (stix, tmp_count); tmp_count = 0;
|
||||
|
||||
/* TODO: class method? */
|
||||
/* instance method */
|
||||
if (!stix_putatdic (stix, cls->mthdic[STIX_CLASS_MTHDIC_INSTANCE], (stix_oop_t)nsym, (stix_oop_t)mth)) goto oops;
|
||||
/* TODO: emit BCODE_RETURN_NIL ? */
|
||||
|
||||
if (!stix_putatdic (stix, cls->mthdic[type], (stix_oop_t)mnsym, (stix_oop_t)mth)) goto oops;
|
||||
|
||||
return 0;
|
||||
|
||||
oops:
|
||||
|
@ -52,6 +52,7 @@ enum stix_errnum_t
|
||||
STIX_ESYSMEM, /**< insufficient system memory */
|
||||
STIX_EOOMEM, /**< insufficient object memory */
|
||||
STIX_EINVAL, /**< invalid parameter or data */
|
||||
STIX_EEXIST, /**< existing/duplicate data */
|
||||
STIX_ETOOBIG, /**< data too large */
|
||||
STIX_EMSGSND, /**< message sending error. even doesNotUnderstand: is not found */
|
||||
STIX_ERANGE, /**< range error. overflow and underflow */
|
||||
@ -159,6 +160,17 @@ typedef struct stix_obj_word_t* stix_oop_word_t;
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
enum stix_method_type_t
|
||||
{
|
||||
STIX_METHOD_INSTANCE,
|
||||
STIX_METHOD_CLASS,
|
||||
|
||||
/* --------------------------- */
|
||||
STIX_METHOD_TYPE_COUNT
|
||||
};
|
||||
typedef enum stix_method_type_t stix_method_type_t;
|
||||
|
||||
/*
|
||||
* OOP encoding
|
||||
* An object pointer(OOP) is an ordinary pointer value to an object.
|
||||
@ -424,13 +436,11 @@ struct stix_class_t
|
||||
|
||||
/* [0] - instance methods, MethodDictionary
|
||||
* [1] - class methods, MethodDictionary */
|
||||
stix_oop_set_t mthdic[2];
|
||||
stix_oop_set_t mthdic[STIX_METHOD_TYPE_COUNT];
|
||||
|
||||
/* indexed part afterwards */
|
||||
stix_oop_t slot[1]; /* class instance variables and class variables. */
|
||||
};
|
||||
#define STIX_CLASS_MTHDIC_INSTANCE 0
|
||||
#define STIX_CLASS_MTHDIC_CLASS 1
|
||||
|
||||
#define STIX_ASSOCIATION_NAMED_INSTVARS 2
|
||||
typedef struct stix_association_t stix_association_t;
|
||||
@ -757,6 +767,7 @@ typedef void (*stix_mod_unload_t) (
|
||||
|
||||
struct stix_mod_t
|
||||
{
|
||||
const stix_ooch_t name[STIX_MOD_NAME_LEN_MAX + 1];
|
||||
stix_mod_import_t import;
|
||||
stix_mod_query_t query;
|
||||
stix_mod_unload_t unload;
|
||||
@ -765,7 +776,6 @@ struct stix_mod_t
|
||||
|
||||
struct stix_mod_data_t
|
||||
{
|
||||
stix_ooch_t name[STIX_MOD_NAME_LEN_MAX + 1];
|
||||
void* handle;
|
||||
stix_rbt_pair_t* pair; /* internal backreference to stix->modtab */
|
||||
stix_mod_t mod;
|
||||
@ -1081,10 +1091,6 @@ STIX_EXPORT void stix_gc (
|
||||
stix_t* stix
|
||||
);
|
||||
|
||||
STIX_EXPORT stix_oow_t stix_getpayloadbytes (
|
||||
stix_t* stix,
|
||||
stix_oop_t oop
|
||||
);
|
||||
|
||||
/**
|
||||
* The stix_instantiate() function creates a new object of the class
|
||||
@ -1176,6 +1182,22 @@ STIX_EXPORT void stix_freemem (
|
||||
);
|
||||
|
||||
|
||||
/* =========================================================================
|
||||
* PRIMITIVE METHOD MANIPULATION
|
||||
* ========================================================================= */
|
||||
STIX_EXPORT int stix_genpfmethod (
|
||||
stix_t* stix,
|
||||
stix_mod_t* mod,
|
||||
stix_oop_t _class,
|
||||
stix_method_type_t type,
|
||||
const stix_ooch_t* mthname,
|
||||
const stix_ooch_t* name
|
||||
);
|
||||
|
||||
/* =========================================================================
|
||||
* STRING ENCODING CONVERSION
|
||||
* ========================================================================= */
|
||||
|
||||
#if defined(STIX_OOCH_IS_UCH)
|
||||
# define stix_oocstobcs(stix,oocs,oocslen,bcs,bcslen) stix_ucstobcs(stix,oocs,oocslen,bcs,bcslen)
|
||||
# define stix_bcstooocs(stix,bcs,bcslen,oocs,oocslen) stix_bcstoucs(stix,bcs,bcslen,oocs,oocslen)
|
||||
@ -1201,6 +1223,11 @@ STIX_EXPORT int stix_ucstobcs (
|
||||
stix_oow_t* bcslen
|
||||
);
|
||||
|
||||
|
||||
/* =========================================================================
|
||||
* STIX VM LOGGING
|
||||
* ========================================================================= */
|
||||
|
||||
STIX_EXPORT stix_ooi_t stix_logbfmt (
|
||||
stix_t* stix,
|
||||
stix_oow_t mask,
|
||||
|
@ -302,37 +302,5 @@ int stix_mod_console (stix_t* stix, stix_mod_t* mod)
|
||||
mod->query = query;
|
||||
mod->unload = unload;
|
||||
mod->ctx = STIX_NULL;
|
||||
|
||||
#if 0
|
||||
|
||||
#include 'Stix.st'.
|
||||
#import 'Console'.
|
||||
|
||||
c = stix_findclass (stix, "Console");
|
||||
if (!c) c = stix_makeclass (stix, "Console", "x y"); <- provides an API to create a simple class
|
||||
|
||||
stix_addmethod (stix, c, "open", pf_open);
|
||||
stix_addmethod (stix, c, "close:", pf_close);
|
||||
stix_addmethod (stix, c, "setCursorTo:", pf_setcursor);
|
||||
stix_addmethod (stix, c, "clear", pf_clear );
|
||||
stix_addmethod (stix, c, "write", pf_write );
|
||||
|
||||
|
||||
|
||||
|
||||
/* GRAMMER ENHANCEMENT */
|
||||
fun abc (a, b, c) <----- this style, register C style method
|
||||
{
|
||||
}
|
||||
|
||||
fun abc: a with: b c: c <----- smalltalk style
|
||||
{
|
||||
}
|
||||
|
||||
abc->def (a, b, c) <------- use -> as an c style method indicator
|
||||
abc abc: a with: b c: c
|
||||
|
||||
#endif
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -128,10 +128,18 @@ static fnctab_t fnctab[] =
|
||||
{ "puts", pf_puts }
|
||||
};
|
||||
|
||||
|
||||
static stix_ooch_t voca_open_for[] = { 'o','p','e','n',':','f','o','r',':','\0' };
|
||||
static stix_ooch_t voca_open[] = { 'o','p','e','n','\0' };
|
||||
static stix_ooch_t voca_close[] = { 'c','l','o','s','e','\0' };
|
||||
/* ------------------------------------------------------------------------ */
|
||||
|
||||
static int import (stix_t* stix, stix_mod_t* mod, stix_oop_t _class)
|
||||
{
|
||||
stix_pushtmp (stix, &_class);
|
||||
stix_genpfmethod (stix, mod, _class, STIX_METHOD_INSTANCE, voca_open_for, voca_open);
|
||||
stix_genpfmethod (stix, mod, _class, STIX_METHOD_CLASS, voca_close, voca_close);
|
||||
stix_poptmp (stix);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -186,18 +194,6 @@ int stix_mod_stdio (stix_t* stix, stix_mod_t* mod)
|
||||
#include 'Stix.st'.
|
||||
#import 'Console'.
|
||||
|
||||
c = stix_findclass (stix, "Console");
|
||||
if (!c) c = stix_makeclass (stix, "Console", "x y"); <- provides an API to create a simple class
|
||||
|
||||
stix_addmethod (stix, c, "open", pf_open);
|
||||
stix_addmethod (stix, c, "close:", pf_close);
|
||||
stix_addmethod (stix, c, "setCursorTo:", pf_setcursor);
|
||||
stix_addmethod (stix, c, "clear", pf_clear );
|
||||
stix_addmethod (stix, c, "write", pf_write );
|
||||
|
||||
|
||||
|
||||
|
||||
/* GRAMMER ENHANCEMENT */
|
||||
fun abc (a, b, c) <----- this style, register C style method
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user