added yet more compiler code
This commit is contained in:
parent
bb3b6c4270
commit
3bfb434a8d
@ -1970,6 +1970,12 @@ static int append_method_name (stix_t* stix, const stix_ucs_t* name)
|
|||||||
return copy_string_to (stix, name, &stix->c->mth.name, &stix->c->mth.name_capa, 1, '\0');
|
return copy_string_to (stix, name, &stix->c->mth.name, &stix->c->mth.name_capa, 1, '\0');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static stix_ssize_t find_method_name (stix_t* stix, stix_oop_class_t self, const stix_ucs_t* name)
|
||||||
|
{
|
||||||
|
/* TODO: .................... */
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int append_temporary (stix_t* stix, const stix_ucs_t* name)
|
static int append_temporary (stix_t* stix, const stix_ucs_t* name)
|
||||||
{
|
{
|
||||||
/* temporary variable names are added to the string with leading
|
/* temporary variable names are added to the string with leading
|
||||||
@ -2027,38 +2033,6 @@ printf ("duplicate variable name type %d pos %lu\n", var.type, var.pos);
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (stix->c->cls.self_oop)
|
|
||||||
{
|
|
||||||
stix_oow_t spec, limit;
|
|
||||||
|
|
||||||
/* it is an internally defined kernel class object */
|
|
||||||
switch (dcl_type)
|
|
||||||
{
|
|
||||||
case VAR_INSTANCE:
|
|
||||||
spec = STIX_OOP_TO_SMINT(stix->c->cls.self_oop->spec);
|
|
||||||
limit = STIX_CLASS_SPEC_NAMED_INSTVAR(spec);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case VAR_CLASS:
|
|
||||||
spec = STIX_OOP_TO_SMINT(stix->c->cls.self_oop->selfspec);
|
|
||||||
limit = STIX_CLASS_SELFSPEC_CLASSVAR(spec);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case VAR_CLASSINST:
|
|
||||||
spec = STIX_OOP_TO_SMINT(stix->c->cls.self_oop->selfspec);
|
|
||||||
limit = STIX_CLASS_SELFSPEC_CLASSINSTVAR(spec);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (stix->c->cls.var_count[dcl_type] >= limit)
|
|
||||||
{
|
|
||||||
/* THIS IS NOT QUITE RIGHT... Do differetn calculation.... */
|
|
||||||
printf ("TOO MANY XXXXXXXXXXXXXXXXXXXXXXXXX duplicate variable name type %d pos %lu\n", var.type, var.pos);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (append_class_level_variable(stix, dcl_type, &stix->c->tok.name) <= -1) return -1;
|
if (append_class_level_variable(stix, dcl_type, &stix->c->tok.name) <= -1) return -1;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -2108,9 +2082,8 @@ static int compile_binary_method_name (stix_t* stix)
|
|||||||
|
|
||||||
STIX_ASSERT (stix->c->mth.tmpr_nargs == 0);
|
STIX_ASSERT (stix->c->mth.tmpr_nargs == 0);
|
||||||
|
|
||||||
/* no duplication check is performed against instance variable names or
|
/* no duplication check is performed against class-level variable names.
|
||||||
* class variable names. a duplcate name will shade a previsouly defined
|
* a duplcate name will shade a previsouly defined variable. */
|
||||||
* variable. */
|
|
||||||
if (append_temporary(stix, &stix->c->tok.name) <= -1) return -1;
|
if (append_temporary(stix, &stix->c->tok.name) <= -1) return -1;
|
||||||
stix->c->mth.tmpr_nargs++;
|
stix->c->mth.tmpr_nargs++;
|
||||||
|
|
||||||
@ -2162,9 +2135,11 @@ static int compile_method_name (stix_t* stix)
|
|||||||
* unary-selector := identifier
|
* unary-selector := identifier
|
||||||
*/
|
*/
|
||||||
int n;
|
int n;
|
||||||
|
stix_ioloc_t mth_loc;
|
||||||
|
|
||||||
STIX_ASSERT (stix->c->mth.tmpr_count == 0);
|
STIX_ASSERT (stix->c->mth.tmpr_count == 0);
|
||||||
|
|
||||||
|
mth_loc = stix->c->tok.loc;
|
||||||
switch (stix->c->tok.type)
|
switch (stix->c->tok.type)
|
||||||
{
|
{
|
||||||
case STIX_IOTOK_IDENT:
|
case STIX_IOTOK_IDENT:
|
||||||
@ -2187,7 +2162,11 @@ static int compile_method_name (stix_t* stix)
|
|||||||
|
|
||||||
if (n >= 0)
|
if (n >= 0)
|
||||||
{
|
{
|
||||||
/* TODO: check if the current function name collected conflicts with a previously defined function name */
|
if (find_method_name(stix, stix->c->cls.self_oop, &stix->c->mth.name) >= 0)
|
||||||
|
{
|
||||||
|
set_syntax_error (stix, STIX_SYNERR_MTHNAMEDUP, &mth_loc, &stix->c->mth.name);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* the total number of temporaries is equal to the number of
|
/* the total number of temporaries is equal to the number of
|
||||||
@ -2469,13 +2448,13 @@ static int make_defined_class (stix_t* stix)
|
|||||||
int just_made = 0;
|
int just_made = 0;
|
||||||
|
|
||||||
|
|
||||||
spec = STIX_CLASS_SPEC_MAKE (stix->c->cls.var_count[0],
|
spec = STIX_CLASS_SPEC_MAKE (stix->c->cls.var_count[VAR_INSTANCE],
|
||||||
((stix->c->cls.flags & CLASS_INDEXED)? 1: 0),
|
((stix->c->cls.flags & CLASS_INDEXED)? 1: 0),
|
||||||
stix->c->cls.indexed_type);
|
stix->c->cls.indexed_type);
|
||||||
self_spec = STIX_CLASS_SELFSPEC_MAKE(stix->c->cls.var_count[1], stix->c->cls.var_count[2]);
|
self_spec = STIX_CLASS_SELFSPEC_MAKE(stix->c->cls.var_count[VAR_CLASS], stix->c->cls.var_count[VAR_CLASSINST]);
|
||||||
|
|
||||||
print_ucs (&stix->c->cls.name);
|
print_ucs (&stix->c->cls.name);
|
||||||
printf (" instvars %d classvars %d classinstvars %d\n", (int)stix->c->cls.var_count[0], (int)stix->c->cls.var_count[1], (int)stix->c->cls.var_count[2]);
|
printf (" instvars %d classvars %d classinstvars %d\n", (int)stix->c->cls.var_count[VAR_INSTANCE], (int)stix->c->cls.var_count[VAR_CLASS], (int)stix->c->cls.var_count[VAR_CLASSINST]);
|
||||||
|
|
||||||
if (stix->c->cls.self_oop)
|
if (stix->c->cls.self_oop)
|
||||||
{
|
{
|
||||||
@ -2485,7 +2464,7 @@ printf (" instvars %d classvars %d classinstvars %d\n", (int)stix->c->cls.var_co
|
|||||||
if (spec != STIX_OOP_TO_SMINT(stix->c->cls.self_oop->spec) ||
|
if (spec != STIX_OOP_TO_SMINT(stix->c->cls.self_oop->spec) ||
|
||||||
self_spec != STIX_OOP_TO_SMINT(stix->c->cls.self_oop->selfspec))
|
self_spec != STIX_OOP_TO_SMINT(stix->c->cls.self_oop->selfspec))
|
||||||
{
|
{
|
||||||
/* it conflicts with internal defintion */
|
/* it conflicts with internal definition */
|
||||||
printf (" DDDDDDDDDD CONFLICTING CLASS DEFINITION DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD %lu %lu %lu %lu\n",
|
printf (" DDDDDDDDDD CONFLICTING CLASS DEFINITION DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD %lu %lu %lu %lu\n",
|
||||||
(unsigned long)spec, (unsigned long)self_spec,
|
(unsigned long)spec, (unsigned long)self_spec,
|
||||||
(unsigned long)STIX_OOP_TO_SMINT(stix->c->cls.self_oop->spec), (unsigned long)STIX_OOP_TO_SMINT(stix->c->cls.self_oop->selfspec)
|
(unsigned long)STIX_OOP_TO_SMINT(stix->c->cls.self_oop->spec), (unsigned long)STIX_OOP_TO_SMINT(stix->c->cls.self_oop->selfspec)
|
||||||
@ -2499,7 +2478,7 @@ printf (" DDDDDDDDDD CONFLICTING CLASS DEFINITION DDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
|
|||||||
/* the class variables and class instance variables are placed
|
/* the class variables and class instance variables are placed
|
||||||
* inside the class object after the fixed part. */
|
* inside the class object after the fixed part. */
|
||||||
tmp = stix_instantiate (stix, stix->_class, STIX_NULL,
|
tmp = stix_instantiate (stix, stix->_class, STIX_NULL,
|
||||||
stix->c->cls.var_count[1] + stix->c->cls.var_count[2]);
|
stix->c->cls.var_count[VAR_CLASSINST] + stix->c->cls.var_count[VAR_CLASS]);
|
||||||
if (!tmp) return -1;
|
if (!tmp) return -1;
|
||||||
|
|
||||||
just_made = 1;
|
just_made = 1;
|
||||||
@ -2757,8 +2736,8 @@ printf ("\n");
|
|||||||
c = (stix_oop_class_t)stix->c->cls.super_oop;
|
c = (stix_oop_class_t)stix->c->cls.super_oop;
|
||||||
spec = STIX_OOP_TO_SMINT(c->spec);
|
spec = STIX_OOP_TO_SMINT(c->spec);
|
||||||
self_spec = STIX_OOP_TO_SMINT(c->selfspec);
|
self_spec = STIX_OOP_TO_SMINT(c->selfspec);
|
||||||
stix->c->cls.var_count[0] = STIX_CLASS_SPEC_NAMED_INSTVAR(spec);
|
stix->c->cls.var_count[VAR_INSTANCE] = STIX_CLASS_SPEC_NAMED_INSTVAR(spec);
|
||||||
stix->c->cls.var_count[2] = STIX_CLASS_SELFSPEC_CLASSINSTVAR(self_spec);
|
stix->c->cls.var_count[VAR_CLASSINST] = STIX_CLASS_SELFSPEC_CLASSINSTVAR(self_spec);
|
||||||
}
|
}
|
||||||
|
|
||||||
GET_TOKEN (stix);
|
GET_TOKEN (stix);
|
||||||
|
@ -235,7 +235,8 @@ static char* syntax_error_msg[] =
|
|||||||
"undefined class",
|
"undefined class",
|
||||||
"duplicate class",
|
"duplicate class",
|
||||||
"#dcl not allowed",
|
"#dcl not allowed",
|
||||||
"wrong function name",
|
"wrong method name",
|
||||||
|
"duplicate method name",
|
||||||
"duplicate argument name",
|
"duplicate argument name",
|
||||||
"duplicate temporary variable name",
|
"duplicate temporary variable name",
|
||||||
"duplicate variable name"
|
"duplicate variable name"
|
||||||
|
@ -280,7 +280,8 @@ enum stix_synerrnum_t
|
|||||||
STIX_SYNERR_CLASSUNDEF, /* undefined class */
|
STIX_SYNERR_CLASSUNDEF, /* undefined class */
|
||||||
STIX_SYNERR_CLASSDUP, /* duplicate class */
|
STIX_SYNERR_CLASSDUP, /* duplicate class */
|
||||||
STIX_SYNERR_DCLBANNED, /* #dcl not allowed */
|
STIX_SYNERR_DCLBANNED, /* #dcl not allowed */
|
||||||
STIX_SYNERR_MTHNAME, /* wrong function name */
|
STIX_SYNERR_MTHNAME, /* wrong method name */
|
||||||
|
STIX_SYNERR_MTHNAMEDUP, /* duplicate method name */
|
||||||
STIX_SYNERR_ARGNAMEDUP, /* duplicate argument name */
|
STIX_SYNERR_ARGNAMEDUP, /* duplicate argument name */
|
||||||
STIX_SYNERR_TMPRNAMEDUP, /* duplicate temporary variable name */
|
STIX_SYNERR_TMPRNAMEDUP, /* duplicate temporary variable name */
|
||||||
STIX_SYNERR_VARNAMEDUP /* duplicate variable name */
|
STIX_SYNERR_VARNAMEDUP /* duplicate variable name */
|
||||||
|
Loading…
Reference in New Issue
Block a user