From f4875ba51d5a95adbcfabd6d15ca439a70ecb59f Mon Sep 17 00:00:00 2001 From: "hyunghwan.chung" Date: Fri, 5 Jan 2018 17:46:10 +0000 Subject: [PATCH] supporting fixed type size specification for a nonpointer variable object like class(#byte(30))). work still in progress --- moo/kernel/Socket.moo | 34 +++++++++--------- moo/kernel/generr.moo | 1 + moo/lib/comp.c | 77 +++++++++++++++++++++++++++++++++++----- moo/lib/err.c | 82 ++++++++++++++++++++++--------------------- moo/lib/moo-prv.h | 15 ++++---- moo/lib/moo.h | 1 + moo/lib/obj.c | 34 +++++++++--------- 7 files changed, 154 insertions(+), 90 deletions(-) diff --git a/moo/kernel/Socket.moo b/moo/kernel/Socket.moo index 239c6d7..f04dc8c 100644 --- a/moo/kernel/Socket.moo +++ b/moo/kernel/Socket.moo @@ -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(16)) IP6Address(IPAddress) -class(#byte) IP4Address(IPAddress) +class(#byte(4)) IP4Address(IPAddress) { - method(#class) new + (*method(#class) new { ^self basicNew: 4. - } + }*) method(#class) 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 | - pos := 0. + pos := string_offset. size := str size. acc := 0. @@ -41,7 +41,7 @@ class(#byte) IP4Address(IPAddress) if (pos >= size) { if (dots < 3 or: [digits == 0]) { ^Error.Code.EINVAL }. - self basicAt: (dots + offset) put: acc. + self basicAt: (dots + address_offset) put: acc. break. }. @@ -57,7 +57,7 @@ class(#byte) IP4Address(IPAddress) elsif (c = $.) { 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. acc := 0. digits := 0. @@ -79,19 +79,19 @@ class(#byte) IP4Address(IPAddress) 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). } } } -class(#byte) IP6Address(IP4Address) +class(#byte(16)) IP6Address(IP4Address) { - method(#class) new + (*method(#class) new { ^self basicNew: 16. - } + }*) ##method(#class) fromString: str ##{ @@ -164,7 +164,8 @@ class(#byte) IP6Address(IP4Address) 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. saw_xdigit := false. break. @@ -185,9 +186,6 @@ class(#byte) IP6Address(IP4Address) if (colonpos >= 0) { ## double colon position -tgpos dump. -colonpos dump. -'--------' dump. self basicShiftFrom: colonpos to: (colonpos + (mysize - tgpos)) count: (tgpos - colonpos). ##tgpos := tgpos + (mysize - tgpos). } @@ -381,10 +379,10 @@ s := IP4Address fromString: '192.168.123.232'. s 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: '::FFFF:0:0'. -s := IP6Address fromString: 'fe80::'. +##s := IP6Address fromString: '::FFFF:0:0'. +##s := IP6Address fromString: 'fe80::'. s dump. s basicSize dump. diff --git a/moo/kernel/generr.moo b/moo/kernel/generr.moo index 3cf1fb0..e68286b 100644 --- a/moo/kernel/generr.moo +++ b/moo/kernel/generr.moo @@ -79,6 +79,7 @@ class MyObject(Object) 'wrong class name' 'non-pointer class not allowed to inherit a superclass with trailer size set' 'not allowed to inherit a #final class' + 'invalid class type size' 'variable declaration not allowed' 'modifier expected' 'wrong modifier' diff --git a/moo/lib/comp.c b/moo/lib/comp.c index ff4e53b..52a514a 100644 --- a/moo/lib/comp.c +++ b/moo/lib/comp.c @@ -6928,7 +6928,18 @@ static int make_defined_class (moo_t* moo) flags = 0; 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; - spec = MOO_CLASS_SPEC_MAKE (moo->c->cls.var[VAR_INSTANCE].total_count, flags, moo->c->cls.indexed_type); + + 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); + } flags = 0; 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 { + int permit_type_size = 0; + if (is_token_symbol(moo, VOCA_BYTE_S)) { /* class(#byte) */ if (_set_class_indexed_type (moo, MOO_OBJ_TYPE_BYTE) <= -1) return -1; GET_TOKEN (moo); + permit_type_size = 1; } else if (is_token_symbol(moo, VOCA_CHARACTER_S)) { /* class(#character) */ if (_set_class_indexed_type (moo, MOO_OBJ_TYPE_CHAR) <= -1) return -1; GET_TOKEN (moo); + permit_type_size = 1; } else if (is_token_symbol(moo, VOCA_HALFWORD_S)) { /* class(#halfword) */ if (_set_class_indexed_type (moo, MOO_OBJ_TYPE_HALFWORD) <= -1) return -1; GET_TOKEN (moo); + permit_type_size = 1; } else if (is_token_symbol(moo, VOCA_WORD_S)) { /* class(#word) */ if (_set_class_indexed_type (moo, MOO_OBJ_TYPE_WORD) <= -1) return -1; 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)) { @@ -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; 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)) { if (moo->c->cls.flags & CLASS_FINAL) @@ -7207,6 +7227,47 @@ static int __compile_class_definition (moo_t* moo, int extend) /* invalid modifier */ set_syntax_error (moo, MOO_SYNERR_MODIFIERINVAL, TOKEN_LOC(moo), TOKEN_NAME(moo)); 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 ) */ @@ -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 (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) { @@ -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 */ moo->c->cls.flags = 0; moo->c->cls.indexed_type = MOO_OBJ_TYPE_OOP; + moo->c->cls.type_size = 0; moo->c->cls.name.len = 0; moo->c->cls.fqn.len = 0; diff --git a/moo/lib/err.c b/moo/lib/err.c index 1f8ab50..19d6da0 100644 --- a/moo/lib/err.c +++ b/moo/lib/err.c @@ -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_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_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_34[] = {'m','o','d','i','f','i','e','r',' ','e','x','p','e','c','t','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_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_37[] = {'d','u','p','l','i','c','a','t','e',' ','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_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_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_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_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_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_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_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_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_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_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_49[] = {'a','m','b','i','g','u','o','u','s',' ','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_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_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_53[] = {'t','o','o',' ','m','a','n','y',' ','a','r','g','u','m','e','n','t','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_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_56[] = {'t','o','o',' ','l','a','r','g','e',' ','b','l','o','c','k','\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_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_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_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_61[] = {'w','r','o','n','g',' ','m','o','d','u','l','e',' ','n','a','m','e','\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_63[] = {'#','i','n','c','l','u','d','e',' ','e','r','r','o','r','\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_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_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_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_68[] = {'l','i','t','e','r','a','l',' ','e','x','p','e','c','t','e','d','\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_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_71[] = {'w','h','i','l','e',' ','e','x','p','e','c','t','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[] = {'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[] = {'m','o','d','i','f','i','e','r',' ','e','x','p','e','c','t','e','d','\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','i','s','a','l','l','o','w','e','d',' ','m','o','d','i','f','i','e','r','\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[] = {'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[] = {'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[] = {'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[] = {'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',' ','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',' ','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',' ','v','a','r','i','a','b','l','e',' ','n','a','m','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','d','e','c','l','a','r','e','d',' ','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[] = {'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[] = {'a','m','b','i','g','u','o','u','s',' ','v','a','r','i','a','b','l','e','\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[] = {'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',' ','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',' ','t','e','m','p','o','r','a','r','i','e','s','\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',' ','b','l','o','c','k','\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',' ','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',' ','i','d','e','n','t','i','f','i','e','r','\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[] = {'w','r','o','n','g',' ','m','o','d','u','l','e',' ','n','a','m','e','\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[] = {'#','i','n','c','l','u','d','e',' ','e','r','r','o','r','\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',' ','n','a','m','e','s','p','a','c','e',' ','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[] = {'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[] = {'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',' ','n','o','t',' ','w','i','t','h','i','n',' ','a',' ','l','o','o','p','\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[] = { 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_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_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 /* END: GENERATED WITH generr.moo */ diff --git a/moo/lib/moo-prv.h b/moo/lib/moo-prv.h index 94845ec..66b6300 100644 --- a/moo/lib/moo-prv.h +++ b/moo/lib/moo-prv.h @@ -134,8 +134,8 @@ * 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: * - * 31 10 9 8 7 6 5 4 3 2 1 0 - * |number of named instance variables|indexed-type|indexability|oop-tag| + * 31 11 10 9 8 7 6 5 4 3 2 1 0 + * |number of named instance variables|indexed-type|flags|oop-tag| * * 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. @@ -143,7 +143,7 @@ * and the indexability is stored in bit 2. * * 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 * 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) /* What is the maximum number of named instance variables? - * This limit is set so because the number must be encoded into the spec field - * of the class with limited number of bits assigned to the number of - * named instance variables. the trailing -1 in the calculation of number of - * bits is to consider the sign bit of a small-integer which is a typical - * type of the spec field in the class object. + * This limit is set this way because the number must be encoded into + * the spec field of the class with limited number of bits assigned to + * the number of named instance variables. */ #define MOO_MAX_NAMED_INSTVARS \ 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 indexed_type; + moo_oow_t type_size; /* fixed type size */ moo_oop_class_t self_oop; moo_oop_t super_oop; /* this may be nil. so the type is moo_oop_t */ diff --git a/moo/lib/moo.h b/moo/lib/moo.h index 1f75f33..031c809 100644 --- a/moo/lib/moo.h +++ b/moo/lib/moo.h @@ -1545,6 +1545,7 @@ enum moo_synerrnum_t MOO_SYNERR_CLASSNAMEINVAL, /* wrong class name */ 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_CLASSTSIZEINVAL, /* invalid class type size */ MOO_SYNERR_VARDCLBANNED, /* variable declaration not allowed */ MOO_SYNERR_MODIFIER, /* modifier expected */ MOO_SYNERR_MODIFIERINVAL, /* wrong modifier */ diff --git a/moo/lib/obj.c b/moo/lib/obj.c index e8e59fe..ae164b8 100644 --- a/moo/lib/obj.c +++ b/moo/lib/obj.c @@ -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) { - 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; } 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; } @@ -209,14 +209,24 @@ static MOO_INLINE int decode_spec (moo_t* moo, moo_oop_class_t _class, moo_oow_t else { /* a non-pointer indexed class can't have named instance variables */ +#if 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; } +#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) { - 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; } } @@ -229,14 +239,14 @@ static MOO_INLINE int decode_spec (moo_t* moo, moo_oop_class_t _class, moo_oow_t 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; } /*vlen = 0;*/ /* vlen is not used */ 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; } 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); - if (decode_spec (moo, _class, vlen, &type, &alloclen) <= -1) - { - moo_seterrnum (moo, MOO_EINVAL); - return MOO_NULL; - } + if (decode_spec(moo, _class, vlen, &type, &alloclen) <= -1) return MOO_NULL; 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); - if (decode_spec (moo, _class, vlen, &type, &alloclen) <= -1) - { - moo_seterrnum (moo, MOO_EINVAL); - return MOO_NULL; - } + if (decode_spec(moo, _class, vlen, &type, &alloclen) <= -1) return MOO_NULL; moo_pushtmp (moo, (moo_oop_t*)&_class); tmp_count++;