supporting fixed type size specification for a nonpointer variable object like class(#byte(30))). work still in progress

This commit is contained in:
hyunghwan.chung 2018-01-05 17:46:10 +00:00
parent 68f67cf595
commit f4875ba51d
7 changed files with 154 additions and 90 deletions

View File

@ -13,23 +13,23 @@ class(#byte) IPAddress(Object)
###class(#byte(4)) IP4Address(IPAddress) -> new basicNew always create 4 bytes. size to new: or basicNew: is ignored. ###class(#byte(4)) IP4Address(IPAddress) -> new basicNew always create 4 bytes. size to new: or basicNew: is ignored.
###class(#byte(16)) IP6Address(IPAddress) ###class(#byte(16)) IP6Address(IPAddress)
class(#byte) IP4Address(IPAddress) class(#byte(4)) IP4Address(IPAddress)
{ {
method(#class) new (*method(#class) new
{ {
^self basicNew: 4. ^self basicNew: 4.
} }*)
method(#class) fromString: str method(#class) fromString: str
{ {
^self new fromString: str. ^self new fromString: str.
} }
method __fromString: str offset: offset method __fromString: str offset: string_offset offset: address_offset
{ {
| dots digits pos size c acc | | dots digits pos size c acc |
pos := 0. pos := string_offset.
size := str size. size := str size.
acc := 0. acc := 0.
@ -41,7 +41,7 @@ class(#byte) IP4Address(IPAddress)
if (pos >= size) if (pos >= size)
{ {
if (dots < 3 or: [digits == 0]) { ^Error.Code.EINVAL }. if (dots < 3 or: [digits == 0]) { ^Error.Code.EINVAL }.
self basicAt: (dots + offset) put: acc. self basicAt: (dots + address_offset) put: acc.
break. break.
}. }.
@ -57,7 +57,7 @@ class(#byte) IP4Address(IPAddress)
elsif (c = $.) elsif (c = $.)
{ {
if (dots >= 3 or: [digits == 0]) { ^Error.Code.EINVAL }. if (dots >= 3 or: [digits == 0]) { ^Error.Code.EINVAL }.
self basicAt: (dots + offset) put: acc. self basicAt: (dots + address_offset) put: acc.
dots := dots + 1. dots := dots + 1.
acc := 0. acc := 0.
digits := 0. digits := 0.
@ -79,19 +79,19 @@ class(#byte) IP4Address(IPAddress)
method fromString: str method fromString: str
{ {
if ((self __fromString: str offset: 0) isError) if ((self __fromString: str offset: 0 offset: 0) isError)
{ {
Exception signal: ('invalid IPv4 address ' & str). Exception signal: ('invalid IPv4 address ' & str).
} }
} }
} }
class(#byte) IP6Address(IP4Address) class(#byte(16)) IP6Address(IP4Address)
{ {
method(#class) new (*method(#class) new
{ {
^self basicNew: 16. ^self basicNew: 16.
} }*)
##method(#class) fromString: str ##method(#class) fromString: str
##{ ##{
@ -164,7 +164,8 @@ class(#byte) IP6Address(IP4Address)
if (ch == $. and: [tgpos + 4 <= mysize]) if (ch == $. and: [tgpos + 4 <= mysize])
{ {
if ((super __fromString: (str copyFrom: curseg) offset: tgpos) isError) { ^Error.Code.EINVAL }. ##if ((super __fromString: (str copyFrom: curseg) offset:0 offset: tgpos) isError) { ^Error.Code.EINVAL }.
if ((super __fromString: str offset: curseg offset: tgpos) isError) { ^Error.Code.EINVAL }.
tgpos := tgpos + 4. tgpos := tgpos + 4.
saw_xdigit := false. saw_xdigit := false.
break. break.
@ -185,9 +186,6 @@ class(#byte) IP6Address(IP4Address)
if (colonpos >= 0) if (colonpos >= 0)
{ {
## double colon position ## double colon position
tgpos dump.
colonpos dump.
'--------' dump.
self basicShiftFrom: colonpos to: (colonpos + (mysize - tgpos)) count: (tgpos - colonpos). self basicShiftFrom: colonpos to: (colonpos + (mysize - tgpos)) count: (tgpos - colonpos).
##tgpos := tgpos + (mysize - tgpos). ##tgpos := tgpos + (mysize - tgpos).
} }
@ -381,10 +379,10 @@ s := IP4Address fromString: '192.168.123.232'.
s dump. s dump.
s basicSize dump. s basicSize dump.
##s := IP6Address fromString: 'fe80::c225:e9ff:fe47:99.2.3.4'. s := IP6Address fromString: 'fe80::c225:e9ff:fe47:99.2.3.4'.
##s := IP6Address fromString: '::99.12.34.54'. ##s := IP6Address fromString: '::99.12.34.54'.
s := IP6Address fromString: '::FFFF:0:0'. ##s := IP6Address fromString: '::FFFF:0:0'.
s := IP6Address fromString: 'fe80::'. ##s := IP6Address fromString: 'fe80::'.
s dump. s dump.
s basicSize dump. s basicSize dump.

View File

@ -79,6 +79,7 @@ class MyObject(Object)
'wrong class name' 'wrong class name'
'non-pointer class not allowed to inherit a superclass with trailer size set' 'non-pointer class not allowed to inherit a superclass with trailer size set'
'not allowed to inherit a #final class' 'not allowed to inherit a #final class'
'invalid class type size'
'variable declaration not allowed' 'variable declaration not allowed'
'modifier expected' 'modifier expected'
'wrong modifier' 'wrong modifier'

View File

@ -6928,7 +6928,18 @@ static int make_defined_class (moo_t* moo)
flags = 0; flags = 0;
if (moo->c->cls.flags & CLASS_INDEXED) flags |= MOO_CLASS_SPEC_FLAG_INDEXED; if (moo->c->cls.flags & CLASS_INDEXED) flags |= MOO_CLASS_SPEC_FLAG_INDEXED;
if (moo->c->cls.flags & CLASS_IMMUTABLE) flags |= MOO_CLASS_SPEC_FLAG_IMMUTABLE; if (moo->c->cls.flags & CLASS_IMMUTABLE) flags |= MOO_CLASS_SPEC_FLAG_IMMUTABLE;
if (moo->c->cls.type_size > 0)
{
MOO_ASSERT (moo, moo->c->cls.var[VAR_INSTANCE].total_count == 0);
MOO_ASSERT (moo, moo->c->cls.indexed_type != MOO_OBJ_TYPE_OOP);
spec = MOO_CLASS_SPEC_MAKE (moo->c->cls.type_size, flags, moo->c->cls.indexed_type);
}
else
{
MOO_ASSERT (moo, moo->c->cls.type_size == 0);
spec = MOO_CLASS_SPEC_MAKE (moo->c->cls.var[VAR_INSTANCE].total_count, flags, moo->c->cls.indexed_type); spec = MOO_CLASS_SPEC_MAKE (moo->c->cls.var[VAR_INSTANCE].total_count, flags, moo->c->cls.indexed_type);
}
flags = 0; flags = 0;
if (moo->c->cls.flags & CLASS_FINAL) flags |= MOO_CLASS_SELFSPEC_FLAG_FINAL; if (moo->c->cls.flags & CLASS_FINAL) flags |= MOO_CLASS_SELFSPEC_FLAG_FINAL;
@ -7130,29 +7141,44 @@ static int __compile_class_definition (moo_t* moo, int extend)
{ {
do do
{ {
int permit_type_size = 0;
if (is_token_symbol(moo, VOCA_BYTE_S)) if (is_token_symbol(moo, VOCA_BYTE_S))
{ {
/* class(#byte) */ /* class(#byte) */
if (_set_class_indexed_type (moo, MOO_OBJ_TYPE_BYTE) <= -1) return -1; if (_set_class_indexed_type (moo, MOO_OBJ_TYPE_BYTE) <= -1) return -1;
GET_TOKEN (moo); GET_TOKEN (moo);
permit_type_size = 1;
} }
else if (is_token_symbol(moo, VOCA_CHARACTER_S)) else if (is_token_symbol(moo, VOCA_CHARACTER_S))
{ {
/* class(#character) */ /* class(#character) */
if (_set_class_indexed_type (moo, MOO_OBJ_TYPE_CHAR) <= -1) return -1; if (_set_class_indexed_type (moo, MOO_OBJ_TYPE_CHAR) <= -1) return -1;
GET_TOKEN (moo); GET_TOKEN (moo);
permit_type_size = 1;
} }
else if (is_token_symbol(moo, VOCA_HALFWORD_S)) else if (is_token_symbol(moo, VOCA_HALFWORD_S))
{ {
/* class(#halfword) */ /* class(#halfword) */
if (_set_class_indexed_type (moo, MOO_OBJ_TYPE_HALFWORD) <= -1) return -1; if (_set_class_indexed_type (moo, MOO_OBJ_TYPE_HALFWORD) <= -1) return -1;
GET_TOKEN (moo); GET_TOKEN (moo);
permit_type_size = 1;
} }
else if (is_token_symbol(moo, VOCA_WORD_S)) else if (is_token_symbol(moo, VOCA_WORD_S))
{ {
/* class(#word) */ /* class(#word) */
if (_set_class_indexed_type (moo, MOO_OBJ_TYPE_WORD) <= -1) return -1; if (_set_class_indexed_type (moo, MOO_OBJ_TYPE_WORD) <= -1) return -1;
GET_TOKEN (moo); GET_TOKEN (moo);
permit_type_size = 1;
}
else if (is_token_symbol(moo, VOCA_LIWORD_S))
{
/* class(#liword) -
* the liword type maps to one of word or halfword.
* see the definiton of MOO_OBJ_TYPE_LIWORD in moo.h */
if (_set_class_indexed_type (moo, MOO_OBJ_TYPE_LIWORD) <= -1) return -1;
GET_TOKEN (moo);
permit_type_size = 1;
} }
else if (is_token_symbol(moo, VOCA_POINTER_S)) else if (is_token_symbol(moo, VOCA_POINTER_S))
{ {
@ -7160,12 +7186,6 @@ static int __compile_class_definition (moo_t* moo, int extend)
if (_set_class_indexed_type (moo, MOO_OBJ_TYPE_OOP) <= -1) return -1; if (_set_class_indexed_type (moo, MOO_OBJ_TYPE_OOP) <= -1) return -1;
GET_TOKEN (moo); GET_TOKEN (moo);
} }
else if (is_token_symbol(moo, VOCA_LIWORD_S))
{
/* class(#liword) */
if (_set_class_indexed_type (moo, MOO_OBJ_TYPE_LIWORD) <= -1) return -1;
GET_TOKEN (moo);
}
else if (is_token_symbol(moo, VOCA_FINAL_S)) else if (is_token_symbol(moo, VOCA_FINAL_S))
{ {
if (moo->c->cls.flags & CLASS_FINAL) if (moo->c->cls.flags & CLASS_FINAL)
@ -7207,6 +7227,47 @@ static int __compile_class_definition (moo_t* moo, int extend)
/* invalid modifier */ /* invalid modifier */
set_syntax_error (moo, MOO_SYNERR_MODIFIERINVAL, TOKEN_LOC(moo), TOKEN_NAME(moo)); set_syntax_error (moo, MOO_SYNERR_MODIFIERINVAL, TOKEN_LOC(moo), TOKEN_NAME(moo));
return -1; return -1;
}size 16 specified for fixed-sized(4) class IP6Addre
if (permit_type_size)
{
/* class(#byte(20))
* class(#word(3))
* ... */
if (TOKEN_TYPE(moo) == MOO_IOTOK_LPAREN)
{
moo_ooi_t tmp;
GET_TOKEN (moo);
if (TOKEN_TYPE(moo) != MOO_IOTOK_NUMLIT && TOKEN_TYPE(moo) != MOO_IOTOK_RADNUMLIT)
{
set_syntax_error (moo, MOO_SYNERR_LITERAL, TOKEN_LOC(moo), TOKEN_NAME(moo));
return -1;
}
if (string_to_smooi(moo, TOKEN_NAME(moo), TOKEN_TYPE(moo) == MOO_IOTOK_RADNUMLIT, &tmp) <= -1 ||
tmp < 0 || tmp > MOO_MAX_NAMED_INSTVARS)
{
/* the class type size has nothing to do with the name instance variables
* in the semantics. but it is stored into the named-instvar bits in the
* spec field of a class. so i check it against MOO_MAX_NAMED_INSTVARS. */
set_syntax_error (moo, MOO_SYNERR_CLASSTSIZEINVAL, TOKEN_LOC(moo), TOKEN_NAME(moo));
return -1;
}
GET_TOKEN (moo);
if (TOKEN_TYPE(moo) != MOO_IOTOK_RPAREN)
{
set_syntax_error (moo, MOO_SYNERR_RPAREN, TOKEN_LOC(moo), TOKEN_NAME(moo));
return -1;
}
GET_TOKEN (moo);
moo->c->cls.type_size = tmp;
}
} }
if (TOKEN_TYPE(moo) != MOO_IOTOK_COMMA) break; /* hopefully ) */ if (TOKEN_TYPE(moo) != MOO_IOTOK_COMMA) break; /* hopefully ) */
@ -7363,7 +7424,6 @@ static int __compile_class_definition (moo_t* moo, int extend)
if (get_variable_info (moo, &moo->c->cls.superfqn, &moo->c->cls.superfqn_loc, superfqn_is_dotted, &var) <= -1) return -1; if (get_variable_info (moo, &moo->c->cls.superfqn, &moo->c->cls.superfqn_loc, superfqn_is_dotted, &var) <= -1) return -1;
if (var.type != VAR_GLOBAL) goto unknown_superclass; if (var.type != VAR_GLOBAL) goto unknown_superclass;
if (MOO_CLASSOF(moo, var.u.gbl->value) == moo->_class && MOO_OBJ_GET_FLAGS_KERNEL(var.u.gbl->value) != 1) if (MOO_CLASSOF(moo, var.u.gbl->value) == moo->_class && MOO_OBJ_GET_FLAGS_KERNEL(var.u.gbl->value) != 1)
{ {
@ -7622,6 +7682,7 @@ static int compile_class_definition (moo_t* moo, int extend)
/* reset the structure to hold information about a class to be compiled */ /* reset the structure to hold information about a class to be compiled */
moo->c->cls.flags = 0; moo->c->cls.flags = 0;
moo->c->cls.indexed_type = MOO_OBJ_TYPE_OOP; moo->c->cls.indexed_type = MOO_OBJ_TYPE_OOP;
moo->c->cls.type_size = 0;
moo->c->cls.name.len = 0; moo->c->cls.name.len = 0;
moo->c->cls.fqn.len = 0; moo->c->cls.fqn.len = 0;

View File

@ -106,45 +106,46 @@ static moo_ooch_t synerrstr_29[] = {'c','o','n','t','r','a','d','i','c','t','o',
static moo_ooch_t synerrstr_30[] = {'w','r','o','n','g',' ','c','l','a','s','s',' ','n','a','m','e','\0'}; static moo_ooch_t synerrstr_30[] = {'w','r','o','n','g',' ','c','l','a','s','s',' ','n','a','m','e','\0'};
static moo_ooch_t synerrstr_31[] = {'n','o','n','-','p','o','i','n','t','e','r',' ','c','l','a','s','s',' ','n','o','t',' ','a','l','l','o','w','e','d',' ','t','o',' ','i','n','h','e','r','i','t',' ','a',' ','s','u','p','e','r','c','l','a','s','s',' ','w','i','t','h',' ','t','r','a','i','l','e','r',' ','s','i','z','e',' ','s','e','t','\0'}; static moo_ooch_t synerrstr_31[] = {'n','o','n','-','p','o','i','n','t','e','r',' ','c','l','a','s','s',' ','n','o','t',' ','a','l','l','o','w','e','d',' ','t','o',' ','i','n','h','e','r','i','t',' ','a',' ','s','u','p','e','r','c','l','a','s','s',' ','w','i','t','h',' ','t','r','a','i','l','e','r',' ','s','i','z','e',' ','s','e','t','\0'};
static moo_ooch_t synerrstr_32[] = {'n','o','t',' ','a','l','l','o','w','e','d',' ','t','o',' ','i','n','h','e','r','i','t',' ','a',' ','#','f','i','n','a','l',' ','c','l','a','s','s','\0'}; static moo_ooch_t synerrstr_32[] = {'n','o','t',' ','a','l','l','o','w','e','d',' ','t','o',' ','i','n','h','e','r','i','t',' ','a',' ','#','f','i','n','a','l',' ','c','l','a','s','s','\0'};
static moo_ooch_t synerrstr_33[] = {'v','a','r','i','a','b','l','e',' ','d','e','c','l','a','r','a','t','i','o','n',' ','n','o','t',' ','a','l','l','o','w','e','d','\0'}; static moo_ooch_t synerrstr_33[] = {'i','n','v','a','l','i','d',' ','c','l','a','s','s',' ','t','y','p','e',' ','s','i','z','e','\0'};
static moo_ooch_t synerrstr_34[] = {'m','o','d','i','f','i','e','r',' ','e','x','p','e','c','t','e','d','\0'}; static moo_ooch_t synerrstr_34[] = {'v','a','r','i','a','b','l','e',' ','d','e','c','l','a','r','a','t','i','o','n',' ','n','o','t',' ','a','l','l','o','w','e','d','\0'};
static moo_ooch_t synerrstr_35[] = {'w','r','o','n','g',' ','m','o','d','i','f','i','e','r','\0'}; static moo_ooch_t synerrstr_35[] = {'m','o','d','i','f','i','e','r',' ','e','x','p','e','c','t','e','d','\0'};
static moo_ooch_t synerrstr_36[] = {'d','i','s','a','l','l','o','w','e','d',' ','m','o','d','i','f','i','e','r','\0'}; static moo_ooch_t synerrstr_36[] = {'w','r','o','n','g',' ','m','o','d','i','f','i','e','r','\0'};
static moo_ooch_t synerrstr_37[] = {'d','u','p','l','i','c','a','t','e',' ','m','o','d','i','f','i','e','r','\0'}; static moo_ooch_t synerrstr_37[] = {'d','i','s','a','l','l','o','w','e','d',' ','m','o','d','i','f','i','e','r','\0'};
static moo_ooch_t synerrstr_38[] = {'m','e','t','h','o','d',' ','n','a','m','e',' ','e','x','p','e','c','t','e','d','\0'}; static moo_ooch_t synerrstr_38[] = {'d','u','p','l','i','c','a','t','e',' ','m','o','d','i','f','i','e','r','\0'};
static moo_ooch_t synerrstr_39[] = {'d','u','p','l','i','c','a','t','e',' ','m','e','t','h','o','d',' ','n','a','m','e','\0'}; static moo_ooch_t synerrstr_39[] = {'m','e','t','h','o','d',' ','n','a','m','e',' ','e','x','p','e','c','t','e','d','\0'};
static moo_ooch_t synerrstr_40[] = {'i','n','v','a','l','i','d',' ','v','a','r','i','a','d','i','c',' ','m','e','t','h','o','d',' ','d','e','f','i','n','i','t','i','o','n','\0'}; static moo_ooch_t synerrstr_40[] = {'d','u','p','l','i','c','a','t','e',' ','m','e','t','h','o','d',' ','n','a','m','e','\0'};
static moo_ooch_t synerrstr_41[] = {'v','a','r','i','a','b','l','e',' ','n','a','m','e',' ','e','x','p','e','c','t','e','d','\0'}; static moo_ooch_t synerrstr_41[] = {'i','n','v','a','l','i','d',' ','v','a','r','i','a','d','i','c',' ','m','e','t','h','o','d',' ','d','e','f','i','n','i','t','i','o','n','\0'};
static moo_ooch_t synerrstr_42[] = {'d','u','p','l','i','c','a','t','e',' ','a','r','g','u','m','e','n','t',' ','n','a','m','e','\0'}; static moo_ooch_t synerrstr_42[] = {'v','a','r','i','a','b','l','e',' ','n','a','m','e',' ','e','x','p','e','c','t','e','d','\0'};
static moo_ooch_t synerrstr_43[] = {'d','u','p','l','i','c','a','t','e',' ','t','e','m','p','o','r','a','r','y',' ','v','a','r','i','a','b','l','e',' ','n','a','m','e','\0'}; static moo_ooch_t synerrstr_43[] = {'d','u','p','l','i','c','a','t','e',' ','a','r','g','u','m','e','n','t',' ','n','a','m','e','\0'};
static moo_ooch_t synerrstr_44[] = {'d','u','p','l','i','c','a','t','e',' ','v','a','r','i','a','b','l','e',' ','n','a','m','e','\0'}; static moo_ooch_t synerrstr_44[] = {'d','u','p','l','i','c','a','t','e',' ','t','e','m','p','o','r','a','r','y',' ','v','a','r','i','a','b','l','e',' ','n','a','m','e','\0'};
static moo_ooch_t synerrstr_45[] = {'d','u','p','l','i','c','a','t','e',' ','b','l','o','c','k',' ','a','r','g','u','m','e','n','t',' ','n','a','m','e','\0'}; static moo_ooch_t synerrstr_45[] = {'d','u','p','l','i','c','a','t','e',' ','v','a','r','i','a','b','l','e',' ','n','a','m','e','\0'};
static moo_ooch_t synerrstr_46[] = {'u','n','d','e','c','l','a','r','e','d',' ','v','a','r','i','a','b','l','e','\0'}; static moo_ooch_t synerrstr_46[] = {'d','u','p','l','i','c','a','t','e',' ','b','l','o','c','k',' ','a','r','g','u','m','e','n','t',' ','n','a','m','e','\0'};
static moo_ooch_t synerrstr_47[] = {'u','n','u','s','a','b','l','e',' ','v','a','r','i','a','b','l','e',' ','i','n',' ','c','o','m','p','i','l','e','d',' ','c','o','d','e','\0'}; static moo_ooch_t synerrstr_47[] = {'u','n','d','e','c','l','a','r','e','d',' ','v','a','r','i','a','b','l','e','\0'};
static moo_ooch_t synerrstr_48[] = {'i','n','a','c','c','e','s','s','i','b','l','e',' ','v','a','r','i','a','b','l','e','\0'}; static moo_ooch_t synerrstr_48[] = {'u','n','u','s','a','b','l','e',' ','v','a','r','i','a','b','l','e',' ','i','n',' ','c','o','m','p','i','l','e','d',' ','c','o','d','e','\0'};
static moo_ooch_t synerrstr_49[] = {'a','m','b','i','g','u','o','u','s',' ','v','a','r','i','a','b','l','e','\0'}; static moo_ooch_t synerrstr_49[] = {'i','n','a','c','c','e','s','s','i','b','l','e',' ','v','a','r','i','a','b','l','e','\0'};
static moo_ooch_t synerrstr_50[] = {'i','n','a','c','c','e','s','s','i','b','l','e',' ','s','e','l','f','\0'}; static moo_ooch_t synerrstr_50[] = {'a','m','b','i','g','u','o','u','s',' ','v','a','r','i','a','b','l','e','\0'};
static moo_ooch_t synerrstr_51[] = {'w','r','o','n','g',' ','e','x','p','r','e','s','s','i','o','n',' ','p','r','i','m','a','r','y','\0'}; static moo_ooch_t synerrstr_51[] = {'i','n','a','c','c','e','s','s','i','b','l','e',' ','s','e','l','f','\0'};
static moo_ooch_t synerrstr_52[] = {'t','o','o',' ','m','a','n','y',' ','t','e','m','p','o','r','a','r','i','e','s','\0'}; static moo_ooch_t synerrstr_52[] = {'w','r','o','n','g',' ','e','x','p','r','e','s','s','i','o','n',' ','p','r','i','m','a','r','y','\0'};
static moo_ooch_t synerrstr_53[] = {'t','o','o',' ','m','a','n','y',' ','a','r','g','u','m','e','n','t','s','\0'}; static moo_ooch_t synerrstr_53[] = {'t','o','o',' ','m','a','n','y',' ','t','e','m','p','o','r','a','r','i','e','s','\0'};
static moo_ooch_t synerrstr_54[] = {'t','o','o',' ','m','a','n','y',' ','b','l','o','c','k',' ','t','e','m','p','o','r','a','r','i','e','s','\0'}; static moo_ooch_t synerrstr_54[] = {'t','o','o',' ','m','a','n','y',' ','a','r','g','u','m','e','n','t','s','\0'};
static moo_ooch_t synerrstr_55[] = {'t','o','o',' ','m','a','n','y',' ','b','l','o','c','k',' ','a','r','g','u','m','e','n','t','s','\0'}; static moo_ooch_t synerrstr_55[] = {'t','o','o',' ','m','a','n','y',' ','b','l','o','c','k',' ','t','e','m','p','o','r','a','r','i','e','s','\0'};
static moo_ooch_t synerrstr_56[] = {'t','o','o',' ','l','a','r','g','e',' ','b','l','o','c','k','\0'}; static moo_ooch_t synerrstr_56[] = {'t','o','o',' ','m','a','n','y',' ','b','l','o','c','k',' ','a','r','g','u','m','e','n','t','s','\0'};
static moo_ooch_t synerrstr_57[] = {'t','o','o',' ','l','a','r','g','e',' ','a','r','r','a','y',' ','e','x','p','r','e','s','s','i','o','n','\0'}; static moo_ooch_t synerrstr_57[] = {'t','o','o',' ','l','a','r','g','e',' ','b','l','o','c','k','\0'};
static moo_ooch_t synerrstr_58[] = {'w','r','o','n','g',' ','p','r','i','m','i','t','i','v','e',' ','f','u','n','c','t','i','o','n',' ','n','u','m','b','e','r','\0'}; static moo_ooch_t synerrstr_58[] = {'t','o','o',' ','l','a','r','g','e',' ','a','r','r','a','y',' ','e','x','p','r','e','s','s','i','o','n','\0'};
static moo_ooch_t synerrstr_59[] = {'w','r','o','n','g',' ','p','r','i','m','i','t','i','v','e',' ','f','u','n','c','t','i','o','n',' ','i','d','e','n','t','i','f','i','e','r','\0'}; static moo_ooch_t synerrstr_59[] = {'w','r','o','n','g',' ','p','r','i','m','i','t','i','v','e',' ','f','u','n','c','t','i','o','n',' ','n','u','m','b','e','r','\0'};
static moo_ooch_t synerrstr_60[] = {'w','r','o','n','g',' ','p','r','i','m','i','t','i','v','e',' ','f','u','n','c','t','i','o','n',' ','a','r','g','u','m','e','n','t',' ','d','e','f','i','n','i','t','i','o','n','\0'}; static moo_ooch_t synerrstr_60[] = {'w','r','o','n','g',' ','p','r','i','m','i','t','i','v','e',' ','f','u','n','c','t','i','o','n',' ','i','d','e','n','t','i','f','i','e','r','\0'};
static moo_ooch_t synerrstr_61[] = {'w','r','o','n','g',' ','m','o','d','u','l','e',' ','n','a','m','e','\0'}; static moo_ooch_t synerrstr_61[] = {'w','r','o','n','g',' ','p','r','i','m','i','t','i','v','e',' ','f','u','n','c','t','i','o','n',' ','a','r','g','u','m','e','n','t',' ','d','e','f','i','n','i','t','i','o','n','\0'};
static moo_ooch_t synerrstr_62[] = {'f','a','i','l','e','d',' ','t','o',' ','i','m','p','o','r','t',' ','m','o','d','u','l','e','\0'}; static moo_ooch_t synerrstr_62[] = {'w','r','o','n','g',' ','m','o','d','u','l','e',' ','n','a','m','e','\0'};
static moo_ooch_t synerrstr_63[] = {'#','i','n','c','l','u','d','e',' ','e','r','r','o','r','\0'}; static moo_ooch_t synerrstr_63[] = {'f','a','i','l','e','d',' ','t','o',' ','i','m','p','o','r','t',' ','m','o','d','u','l','e','\0'};
static moo_ooch_t synerrstr_64[] = {'w','r','o','n','g',' ','p','r','a','g','m','a',' ','n','a','m','e','\0'}; static moo_ooch_t synerrstr_64[] = {'#','i','n','c','l','u','d','e',' ','e','r','r','o','r','\0'};
static moo_ooch_t synerrstr_65[] = {'w','r','o','n','g',' ','n','a','m','e','s','p','a','c','e',' ','n','a','m','e','\0'}; static moo_ooch_t synerrstr_65[] = {'w','r','o','n','g',' ','p','r','a','g','m','a',' ','n','a','m','e','\0'};
static moo_ooch_t synerrstr_66[] = {'w','r','o','n','g',' ','p','o','o','l',' ','d','i','c','t','i','o','n','a','r','y',' ','n','a','m','e','\0'}; static moo_ooch_t synerrstr_66[] = {'w','r','o','n','g',' ','n','a','m','e','s','p','a','c','e',' ','n','a','m','e','\0'};
static moo_ooch_t synerrstr_67[] = {'d','u','p','l','i','c','a','t','e',' ','p','o','o','l',' ','d','i','c','t','i','o','n','a','r','y',' ','n','a','m','e','\0'}; static moo_ooch_t synerrstr_67[] = {'w','r','o','n','g',' ','p','o','o','l',' ','d','i','c','t','i','o','n','a','r','y',' ','n','a','m','e','\0'};
static moo_ooch_t synerrstr_68[] = {'l','i','t','e','r','a','l',' ','e','x','p','e','c','t','e','d','\0'}; static moo_ooch_t synerrstr_68[] = {'d','u','p','l','i','c','a','t','e',' ','p','o','o','l',' ','d','i','c','t','i','o','n','a','r','y',' ','n','a','m','e','\0'};
static moo_ooch_t synerrstr_69[] = {'b','r','e','a','k',' ','o','r',' ','c','o','n','t','i','n','u','e',' ','n','o','t',' ','w','i','t','h','i','n',' ','a',' ','l','o','o','p','\0'}; static moo_ooch_t synerrstr_69[] = {'l','i','t','e','r','a','l',' ','e','x','p','e','c','t','e','d','\0'};
static moo_ooch_t synerrstr_70[] = {'b','r','e','a','k',' ','o','r',' ','c','o','n','t','i','n','u','e',' ','w','i','t','h','i','n',' ','a',' ','b','l','o','c','k','\0'}; static moo_ooch_t synerrstr_70[] = {'b','r','e','a','k',' ','o','r',' ','c','o','n','t','i','n','u','e',' ','n','o','t',' ','w','i','t','h','i','n',' ','a',' ','l','o','o','p','\0'};
static moo_ooch_t synerrstr_71[] = {'w','h','i','l','e',' ','e','x','p','e','c','t','e','d','\0'}; static moo_ooch_t synerrstr_71[] = {'b','r','e','a','k',' ','o','r',' ','c','o','n','t','i','n','u','e',' ','w','i','t','h','i','n',' ','a',' ','b','l','o','c','k','\0'};
static moo_ooch_t synerrstr_72[] = {'w','h','i','l','e',' ','e','x','p','e','c','t','e','d','\0'};
static moo_ooch_t* synerrstr[] = static moo_ooch_t* synerrstr[] =
{ {
synerrstr_0, synerrstr_1, synerrstr_2, synerrstr_3, synerrstr_4, synerrstr_5, synerrstr_6, synerrstr_7, synerrstr_0, synerrstr_1, synerrstr_2, synerrstr_3, synerrstr_4, synerrstr_5, synerrstr_6, synerrstr_7,
@ -155,7 +156,8 @@ static moo_ooch_t* synerrstr[] =
synerrstr_40, synerrstr_41, synerrstr_42, synerrstr_43, synerrstr_44, synerrstr_45, synerrstr_46, synerrstr_47, synerrstr_40, synerrstr_41, synerrstr_42, synerrstr_43, synerrstr_44, synerrstr_45, synerrstr_46, synerrstr_47,
synerrstr_48, synerrstr_49, synerrstr_50, synerrstr_51, synerrstr_52, synerrstr_53, synerrstr_54, synerrstr_55, synerrstr_48, synerrstr_49, synerrstr_50, synerrstr_51, synerrstr_52, synerrstr_53, synerrstr_54, synerrstr_55,
synerrstr_56, synerrstr_57, synerrstr_58, synerrstr_59, synerrstr_60, synerrstr_61, synerrstr_62, synerrstr_63, synerrstr_56, synerrstr_57, synerrstr_58, synerrstr_59, synerrstr_60, synerrstr_61, synerrstr_62, synerrstr_63,
synerrstr_64, synerrstr_65, synerrstr_66, synerrstr_67, synerrstr_68, synerrstr_69, synerrstr_70, synerrstr_71 synerrstr_64, synerrstr_65, synerrstr_66, synerrstr_67, synerrstr_68, synerrstr_69, synerrstr_70, synerrstr_71,
synerrstr_72
}; };
#endif #endif
/* END: GENERATED WITH generr.moo */ /* END: GENERATED WITH generr.moo */

View File

@ -134,8 +134,8 @@
* For example, on a platform where sizeof(moo_oow_t) is 4, * For example, on a platform where sizeof(moo_oow_t) is 4,
* the layout of the spec field of a class as an OOP value looks like this: * the layout of the spec field of a class as an OOP value looks like this:
* *
* 31 10 9 8 7 6 5 4 3 2 1 0 * 31 11 10 9 8 7 6 5 4 3 2 1 0
* |number of named instance variables|indexed-type|indexability|oop-tag| * |number of named instance variables|indexed-type|flags|oop-tag|
* *
* the number of named instance variables is stored in high 23 bits. * the number of named instance variables is stored in high 23 bits.
* the indexed type takes up bit 3 to bit 8 (assuming MOO_OBJ_TYPE_BITS is 6. * the indexed type takes up bit 3 to bit 8 (assuming MOO_OBJ_TYPE_BITS is 6.
@ -143,7 +143,7 @@
* and the indexability is stored in bit 2. * and the indexability is stored in bit 2.
* *
* The maximum number of named(fixed) instance variables for a class is: * The maximum number of named(fixed) instance variables for a class is:
* 2 ^ ((BITS-IN-OOW - MOO_OOP_TAG_BITS_LO) - MOO_OBJ_TYPE_BITS - 1) - 1 * 2 ^ ((BITS-IN-OOW - MOO_OOP_TAG_BITS_LO) - MOO_OBJ_TYPE_BITS - 1 - 2) - 1
* *
* MOO_OOP_TAG_BITS_LO are decremented from the number of bits in OOW because * MOO_OOP_TAG_BITS_LO are decremented from the number of bits in OOW because
* the spec field is always encoded as a small integer. * the spec field is always encoded as a small integer.
@ -187,11 +187,9 @@
#define MOO_CLASS_SPEC_IS_IMMUTABLE(spec) (MOO_CLASS_SPEC_FLAGS(spec) & MOO_CLASS_SPEC_FLAG_IMMUTABLE) #define MOO_CLASS_SPEC_IS_IMMUTABLE(spec) (MOO_CLASS_SPEC_FLAGS(spec) & MOO_CLASS_SPEC_FLAG_IMMUTABLE)
/* What is the maximum number of named instance variables? /* What is the maximum number of named instance variables?
* This limit is set so because the number must be encoded into the spec field * This limit is set this way because the number must be encoded into
* of the class with limited number of bits assigned to the number of * the spec field of the class with limited number of bits assigned to
* named instance variables. the trailing -1 in the calculation of number of * the number of named instance variables.
* bits is to consider the sign bit of a small-integer which is a typical
* type of the spec field in the class object.
*/ */
#define MOO_MAX_NAMED_INSTVARS \ #define MOO_MAX_NAMED_INSTVARS \
MOO_BITS_MAX(moo_oow_t, MOO_SMOOI_ABS_BITS - (MOO_OBJ_FLAGS_TYPE_BITS + 2)) MOO_BITS_MAX(moo_oow_t, MOO_SMOOI_ABS_BITS - (MOO_OBJ_FLAGS_TYPE_BITS + 2))
@ -515,6 +513,7 @@ struct moo_compiler_t
{ {
int flags; int flags;
int indexed_type; int indexed_type;
moo_oow_t type_size; /* fixed type size */
moo_oop_class_t self_oop; moo_oop_class_t self_oop;
moo_oop_t super_oop; /* this may be nil. so the type is moo_oop_t */ moo_oop_t super_oop; /* this may be nil. so the type is moo_oop_t */

View File

@ -1545,6 +1545,7 @@ enum moo_synerrnum_t
MOO_SYNERR_CLASSNAMEINVAL, /* wrong class name */ MOO_SYNERR_CLASSNAMEINVAL, /* wrong class name */
MOO_SYNERR_CLASSTRSIZE, /* non-pointer class now allowed to inherit a superclass with trailer size set */ MOO_SYNERR_CLASSTRSIZE, /* non-pointer class now allowed to inherit a superclass with trailer size set */
MOO_SYNERR_CLASSFINAL, /* now allowed to inherit a #final class */ MOO_SYNERR_CLASSFINAL, /* now allowed to inherit a #final class */
MOO_SYNERR_CLASSTSIZEINVAL, /* invalid class type size */
MOO_SYNERR_VARDCLBANNED, /* variable declaration not allowed */ MOO_SYNERR_VARDCLBANNED, /* variable declaration not allowed */
MOO_SYNERR_MODIFIER, /* modifier expected */ MOO_SYNERR_MODIFIER, /* modifier expected */
MOO_SYNERR_MODIFIERINVAL, /* wrong modifier */ MOO_SYNERR_MODIFIERINVAL, /* wrong modifier */

View File

@ -195,12 +195,12 @@ static MOO_INLINE int decode_spec (moo_t* moo, moo_oop_class_t _class, moo_oow_t
{ {
if (named_instvar > MOO_MAX_NAMED_INSTVARS) if (named_instvar > MOO_MAX_NAMED_INSTVARS)
{ {
MOO_DEBUG3 (moo, "Too many named instance variables for a variable-pointer class %O - %zu/%zu\n", _class, named_instvar, (moo_oow_t)MOO_MAX_NAMED_INSTVARS); moo_seterrbfmt (moo, MOO_EINVAL, "too many named instance variables for a variable-pointer class %O - %zu/%zu", _class, named_instvar, (moo_oow_t)MOO_MAX_NAMED_INSTVARS);
return -1; return -1;
} }
if (vlen > MOO_MAX_INDEXED_INSTVARS(named_instvar)) if (vlen > MOO_MAX_INDEXED_INSTVARS(named_instvar))
{ {
MOO_DEBUG3 (moo, "Too many unnamed instance variables for a variable-pointer class %O - %zu/%zu\n", _class, vlen, (moo_oow_t)MOO_MAX_INDEXED_INSTVARS(named_instvar)); moo_seterrbfmt (moo, MOO_EINVAL, "too many unnamed instance variables for a variable-pointer class %O - %zu/%zu", _class, vlen, (moo_oow_t)MOO_MAX_INDEXED_INSTVARS(named_instvar));
return -1; return -1;
} }
@ -209,14 +209,24 @@ static MOO_INLINE int decode_spec (moo_t* moo, moo_oop_class_t _class, moo_oow_t
else else
{ {
/* a non-pointer indexed class can't have named instance variables */ /* a non-pointer indexed class can't have named instance variables */
#if 0
if (named_instvar > 0) if (named_instvar > 0)
{ {
MOO_DEBUG1 (moo, "Named instance variables in a variable-nonpointer class %O\n", _class); moo_seterrbfmt (moo, MOO_EINVAL, "named instance variables in a variable-nonpointer class %O", _class);
return -1; return -1;
} }
#else
if (named_instvar > 0 && vlen > 0)
{
/* disallow the user-defined length if the fixed type size is specified
* and it's greater than 0, the user-defined length is not allowed */
moo_seterrbfmt (moo, MOO_EINVAL, "size %zu specified for fixed-sized(%zu) class %O", vlen, named_instvar, _class);
return -1;
}
#endif
if (vlen > MOO_OBJ_SIZE_MAX) if (vlen > MOO_OBJ_SIZE_MAX)
{ {
MOO_DEBUG3 (moo, "Too many unnamed instance variables for a variable-nonpointer class %O - %zu/%zu\n", _class, vlen, (moo_oow_t)MOO_OBJ_SIZE_MAX); moo_seterrbfmt (moo, MOO_EINVAL, "too many unnamed instance variables for a variable-nonpointer class %O - %zu/%zu", _class, vlen, (moo_oow_t)MOO_OBJ_SIZE_MAX);
return -1; return -1;
} }
} }
@ -229,14 +239,14 @@ static MOO_INLINE int decode_spec (moo_t* moo, moo_oop_class_t _class, moo_oow_t
if (vlen > 0) if (vlen > 0)
{ {
MOO_DEBUG2 (moo, "Unnamed instance variables for a fixed class %O - %zu\n", _class, vlen); moo_seterrbfmt (moo, MOO_EINVAL, "unnamed instance variables for a fixed class %O - %zu", _class, vlen);
return -1; return -1;
} }
/*vlen = 0;*/ /* vlen is not used */ /*vlen = 0;*/ /* vlen is not used */
if (named_instvar > MOO_MAX_NAMED_INSTVARS) if (named_instvar > MOO_MAX_NAMED_INSTVARS)
{ {
MOO_DEBUG3 (moo, "Too many named instance variables for a fixed class %O - %zu/%zu\n", _class, named_instvar, (moo_oow_t)MOO_MAX_NAMED_INSTVARS); moo_seterrbfmt (moo, MOO_EINVAL, "too many named instance variables for a fixed class %O - %zu/%zu", _class, named_instvar, (moo_oow_t)MOO_MAX_NAMED_INSTVARS);
return -1; return -1;
} }
MOO_ASSERT (moo, named_instvar <= MOO_OBJ_SIZE_MAX); MOO_ASSERT (moo, named_instvar <= MOO_OBJ_SIZE_MAX);
@ -256,11 +266,7 @@ moo_oop_t moo_instantiate (moo_t* moo, moo_oop_class_t _class, const void* vptr,
MOO_ASSERT (moo, moo->_nil != MOO_NULL); MOO_ASSERT (moo, moo->_nil != MOO_NULL);
if (decode_spec (moo, _class, vlen, &type, &alloclen) <= -1) if (decode_spec(moo, _class, vlen, &type, &alloclen) <= -1) return MOO_NULL;
{
moo_seterrnum (moo, MOO_EINVAL);
return MOO_NULL;
}
moo_pushtmp (moo, (moo_oop_t*)&_class); tmp_count++; moo_pushtmp (moo, (moo_oop_t*)&_class); tmp_count++;
@ -348,11 +354,7 @@ moo_oop_t moo_instantiatewithtrailer (moo_t* moo, moo_oop_class_t _class, moo_oo
MOO_ASSERT (moo, moo->_nil != MOO_NULL); MOO_ASSERT (moo, moo->_nil != MOO_NULL);
if (decode_spec (moo, _class, vlen, &type, &alloclen) <= -1) if (decode_spec(moo, _class, vlen, &type, &alloclen) <= -1) return MOO_NULL;
{
moo_seterrnum (moo, MOO_EINVAL);
return MOO_NULL;
}
moo_pushtmp (moo, (moo_oop_t*)&_class); tmp_count++; moo_pushtmp (moo, (moo_oop_t*)&_class); tmp_count++;