enhanced the compiler and the interface structure to allow an interface as a name space.
enhanced formatted output of namespace, interface, class to include the hierarchy. changed the pooldic item terminator from a period to a comma
This commit is contained in:
parent
5bb0fb70b8
commit
e145c4742e
@ -6,19 +6,19 @@ class(#limited) Error(Apex)
|
||||
{
|
||||
pooldic Code
|
||||
{
|
||||
ENOERR := #\E0.
|
||||
EGENERIC := #\E1.
|
||||
ENOIMPL := #\E2.
|
||||
ESYSERR := #\E3.
|
||||
EINTERN := #\E4.
|
||||
ESYSMEM := #\E5.
|
||||
EOOMEM := #\E6.
|
||||
EINVAL := #\E7.
|
||||
ENOENT := #\E8.
|
||||
EPERM := #\E12.
|
||||
ERANGE := #\E20.
|
||||
ENOERR := #\E0,
|
||||
EGENERIC := #\E1,
|
||||
ENOIMPL := #\E2,
|
||||
ESYSERR := #\E3,
|
||||
EINTERN := #\E4,
|
||||
ESYSMEM := #\E5,
|
||||
EOOMEM := #\E6,
|
||||
EINVAL := #\E7,
|
||||
ENOENT := #\E8,
|
||||
EPERM := #\E12,
|
||||
ERANGE := #\E20,
|
||||
|
||||
ELIMIT := #\E9999.
|
||||
ELIMIT := #\E9999
|
||||
// add more items...
|
||||
}
|
||||
}
|
||||
@ -26,19 +26,19 @@ class(#limited) Error(Apex)
|
||||
/*
|
||||
pooldic Error.Code
|
||||
{
|
||||
ENOERR := #\E0.
|
||||
EGENERIC := #\E1.
|
||||
ENOIMPL := #\E2.
|
||||
ESYSERR := #\E3.
|
||||
EINTERN := #\E4.
|
||||
ESYSMEM := #\E5.
|
||||
EOOMEM := #\E6.
|
||||
EINVAL := #\E7.
|
||||
ENOENT := #\E8.
|
||||
EPERM := #\E12.
|
||||
ERANGE := #\E20.
|
||||
ENOERR := #\E0,
|
||||
EGENERIC := #\E1,
|
||||
ENOIMPL := #\E2,
|
||||
ESYSERR := #\E3,
|
||||
EINTERN := #\E4,
|
||||
ESYSMEM := #\E5,
|
||||
EOOMEM := #\E6,
|
||||
EINVAL := #\E7,
|
||||
ENOENT := #\E8,
|
||||
EPERM := #\E12,
|
||||
ERANGE := #\E20,
|
||||
|
||||
ELIMIT := #\E9999.
|
||||
ELIMIT := #\E9999
|
||||
// add more items...
|
||||
} */
|
||||
|
||||
@ -49,7 +49,7 @@ pooldic Error.Code
|
||||
>> and treat it as if it's a literal like? then even if the defined value changes,
|
||||
>> the definition here won't see the change... what is the best way to tackle this issue?
|
||||
|
||||
EGENERIC := Error.Code2.EGENERIC.
|
||||
EGENERIC := Error.Code2.EGENERIC
|
||||
}*/
|
||||
|
||||
extend Apex
|
||||
@ -332,8 +332,8 @@ extend Error
|
||||
|
||||
pooldic/const
|
||||
{
|
||||
NONE := #\e0.
|
||||
GENERIC := #\e1.
|
||||
NONE := #\e0,
|
||||
GENERIC := #\e1
|
||||
}
|
||||
-------------------------------- */
|
||||
|
||||
|
@ -47,5 +47,5 @@ class(#pointer,#limited,#uncopyable) Class(Apex) [ClassInterface]
|
||||
class(#pointer,#limited,#uncopyable) Interface(Apex)
|
||||
{
|
||||
var name.
|
||||
var instmthdic, classmthdic, nsup.
|
||||
var instmthdic, classmthdic, nsup, nsdic.
|
||||
}
|
||||
|
@ -203,10 +203,10 @@ extend Context
|
||||
pooldic MethodContext.Preamble
|
||||
{
|
||||
// this must follow MOO_METHOD_PREAMBLE_EXCEPTION in moo.h
|
||||
EXCEPTION := 13.
|
||||
EXCEPTION := 13,
|
||||
|
||||
// this must follow MOO_METHOD_PREAMBLE_ENSURE in moo.h
|
||||
ENSURE := 14.
|
||||
ENSURE := 14
|
||||
}
|
||||
|
||||
pooldic MethodContext.Index
|
||||
@ -217,10 +217,10 @@ pooldic MethodContext.Index
|
||||
// instance variables of the method context. As MethodContex has
|
||||
// instance variables, the ensure block must be at the 9th position
|
||||
// which translates to index 8
|
||||
ENSURE := 8.
|
||||
ENSURE := 8,
|
||||
|
||||
// [ ... ] on: Exception: do: [:ex | ... ]
|
||||
FIRST_ON := 8.
|
||||
FIRST_ON := 8
|
||||
}
|
||||
|
||||
extend MethodContext
|
||||
|
@ -19,15 +19,15 @@ class FFI(Object)
|
||||
/*
|
||||
pooldic Type
|
||||
{
|
||||
UINT8 := 1.
|
||||
UINT16 := 2.
|
||||
UINT32 := 3.
|
||||
UINT64 := 4.
|
||||
UINT8 := 1,
|
||||
UINT16 := 2,
|
||||
UINT32 := 3,
|
||||
UINT64 := 4
|
||||
}
|
||||
*/
|
||||
/*
|
||||
const UINT8 := 1.
|
||||
const UINT16 := 2.
|
||||
const UINT8 := 1,
|
||||
const UINT16 := 2
|
||||
*/
|
||||
|
||||
method(#class) new: aString
|
||||
|
@ -266,17 +266,17 @@ class Fcgi.ParamRecord(Fcgi.Record)
|
||||
|
||||
pooldic Fcgi.Type
|
||||
{
|
||||
BEGIN_REQUEST := 1.
|
||||
ABORT_REQUEST := 2.
|
||||
END_REQUEST := 3.
|
||||
PARAMS := 4.
|
||||
STDIN := 5.
|
||||
STDOUT := 6.
|
||||
STDERR := 7.
|
||||
DATA := 8.
|
||||
GET_VALUES := 9.
|
||||
GET_VALUES_RESULT := 10.
|
||||
UNKNOWN_TYPE := 11.
|
||||
BEGIN_REQUEST := 1,
|
||||
ABORT_REQUEST := 2,
|
||||
END_REQUEST := 3,
|
||||
PARAMS := 4,
|
||||
STDIN := 5,
|
||||
STDOUT := 6,
|
||||
STDERR := 7,
|
||||
DATA := 8,
|
||||
GET_VALUES := 9,
|
||||
GET_VALUES_RESULT := 10,
|
||||
UNKNOWN_TYPE := 11
|
||||
}
|
||||
|
||||
class FcgiConnReg(Object)
|
||||
|
@ -364,7 +364,7 @@ a free.
|
||||
|
||||
/*
|
||||
pooldic XXD {
|
||||
#abc := #(1 2 3).
|
||||
#def := ##( 1, 3, 4 ). // syntax error - literal expected where ##( is
|
||||
#abc := #(1 2 3),
|
||||
#def := ##( 1, 3, 4 ) // syntax error - literal expected where ##( is
|
||||
}
|
||||
*/
|
||||
|
@ -233,14 +233,14 @@ class Socket(Object) from 'sck'
|
||||
// TODO: generate these family and type from the C header
|
||||
pooldic Family
|
||||
{
|
||||
INET := 2.
|
||||
INET6 := 10.
|
||||
INET := 2,
|
||||
INET6 := 10
|
||||
}
|
||||
|
||||
pooldic Type
|
||||
{
|
||||
STREAM := 1.
|
||||
DGRAM := 2.
|
||||
STREAM := 1,
|
||||
DGRAM := 2
|
||||
}
|
||||
|
||||
method(#primitive) open(family, type, proto).
|
||||
|
@ -22,11 +22,11 @@ class System(Apex)
|
||||
// these items must follow defintions in moo.h
|
||||
// -----------------------------------------------------------
|
||||
|
||||
DEBUG := 1.
|
||||
INFO := 2.
|
||||
WARN := 4.
|
||||
ERROR := 8.
|
||||
FATAL := 16.
|
||||
DEBUG := 1,
|
||||
INFO := 2,
|
||||
WARN := 4,
|
||||
ERROR := 8,
|
||||
FATAL := 16
|
||||
}
|
||||
|
||||
method(#class) _initialize
|
||||
|
@ -138,20 +138,20 @@ TODO: TODO: compiler enhancement
|
||||
// ---------------------------------------------------------------------------
|
||||
pooldic X11.LLEventType
|
||||
{
|
||||
KEY_PRESS := 2.
|
||||
KEY_RELEASE := 3.
|
||||
BUTTON_PRESS := 4.
|
||||
BUTTON_RELEASE := 5.
|
||||
MOTION_NOTIFY := 6.
|
||||
ENTER_NOTIFY := 7.
|
||||
LEAVE_NOTIFY := 8.
|
||||
EXPOSE := 12.
|
||||
VISIBILITY_NOTIFY := 15.
|
||||
DESTROY_NOTIFY := 17.
|
||||
CONFIGURE_NOTIFY := 22.
|
||||
CLIENT_MESSAGE := 33.
|
||||
KEY_PRESS := 2,
|
||||
KEY_RELEASE := 3,
|
||||
BUTTON_PRESS := 4,
|
||||
BUTTON_RELEASE := 5,
|
||||
MOTION_NOTIFY := 6,
|
||||
ENTER_NOTIFY := 7,
|
||||
LEAVE_NOTIFY := 8,
|
||||
EXPOSE := 12,
|
||||
VISIBILITY_NOTIFY := 15,
|
||||
DESTROY_NOTIFY := 17,
|
||||
CONFIGURE_NOTIFY := 22,
|
||||
CLIENT_MESSAGE := 33,
|
||||
|
||||
SHELL_CLOSE := 65537.
|
||||
SHELL_CLOSE := 65537
|
||||
}
|
||||
|
||||
class X11.LLEvent(Object)
|
||||
@ -170,9 +170,9 @@ class X11.KeyEvent(X11.Event)
|
||||
|
||||
pooldic X11.MouseButton
|
||||
{
|
||||
LEFT := 1.
|
||||
MIDDLE := 2.
|
||||
RIGHT := 3.
|
||||
LEFT := 1,
|
||||
MIDDLE := 2,
|
||||
RIGHT := 3
|
||||
}
|
||||
|
||||
class X11.MouseEvent(X11.Event)
|
||||
@ -207,17 +207,17 @@ class X11.ExposeEvent(X11.Event)
|
||||
// ---------------------------------------------------------------------------
|
||||
pooldic X11.GCLineStyle
|
||||
{
|
||||
SOLID := 0.
|
||||
ON_OFF_DASH := 1.
|
||||
DOUBLE_DASH := 2.
|
||||
SOLID := 0,
|
||||
ON_OFF_DASH := 1,
|
||||
DOUBLE_DASH := 2
|
||||
}
|
||||
|
||||
pooldic X11.GCFillStyle
|
||||
{
|
||||
SOLID := 0.
|
||||
TILED := 1.
|
||||
STIPPLED := 2.
|
||||
OPAQUE_STIPPLED := 3.
|
||||
SOLID := 0,
|
||||
TILED := 1,
|
||||
STIPPLED := 2,
|
||||
OPAQUE_STIPPLED := 3
|
||||
}
|
||||
|
||||
class X11.GC(Object)
|
||||
|
@ -18,10 +18,10 @@ class MyObject.Donkey (MyObject)
|
||||
|
||||
pooldic MyObject.Code
|
||||
{
|
||||
FAST := 20.
|
||||
FASTER := 40.
|
||||
FASTER2X := self.FASTER.
|
||||
FASTER3X := #(self.FAST self.FASTER self.FASTER2X #(MyObject.Donkey selfns.Donkey self.FAST FASTER) FASTER2X).
|
||||
FAST := 20,
|
||||
FASTER := 40,
|
||||
FASTER2X := self.FASTER,
|
||||
FASTER3X := #(self.FAST self.FASTER self.FASTER2X #(MyObject.Donkey selfns.Donkey self.FAST FASTER) FASTER2X)
|
||||
}
|
||||
|
||||
class MyObject.Donkey.Party (MyObject.Donkey)
|
||||
@ -65,10 +65,10 @@ class MyObject.System.Horse (Donkey)
|
||||
|
||||
pooldic XX
|
||||
{
|
||||
Horse := MyObject.System.Horse.
|
||||
Party := MyObject.Donkey.Party.
|
||||
AAAA := 'AAAAAAAAAAAAAAAAAAAAAAAAA'.
|
||||
FFFF := 'FFFFFFFFFFFFFFFFFFFFFFFFF'.
|
||||
Horse := MyObject.System.Horse,
|
||||
Party := MyObject.Donkey.Party,
|
||||
AAAA := 'AAAAAAAAAAAAAAAAAAAAAAAAA',
|
||||
FFFF := 'FFFFFFFFFFFFFFFFFFFFFFFFF'
|
||||
}
|
||||
|
||||
class MyObject.System.System (selfns.Donkey)
|
||||
|
@ -51,7 +51,7 @@ class B.TestObject(Object)
|
||||
|
||||
pooldic ABC
|
||||
{
|
||||
KKK := 20.
|
||||
KKK := 20
|
||||
}
|
||||
|
||||
|
||||
|
@ -47,12 +47,12 @@ class B.TestObject(Object)
|
||||
|
||||
pooldic ABC
|
||||
{
|
||||
KKK := 20.
|
||||
KKK := 20
|
||||
}
|
||||
|
||||
pooldic SRX.ABC
|
||||
{
|
||||
JJJ := 1000.
|
||||
JJJ := 1000
|
||||
}
|
||||
class MyConsole(Console)
|
||||
{
|
||||
|
@ -571,6 +571,22 @@ static int fetch_word_from_string (const moo_oocs_t* haystack, moo_oow_t xindex,
|
||||
return -1;
|
||||
}
|
||||
|
||||
static int find_oop_in_oopbuf (moo_t* moo, moo_oopbuf_t* oopbuf, moo_oow_t start, moo_oow_t step, moo_oop_t item, moo_oow_t* index)
|
||||
{
|
||||
moo_oow_t i;
|
||||
|
||||
for (i = start; i < oopbuf->count; i += step)
|
||||
{
|
||||
if (oopbuf->ptr[i] == item)
|
||||
{
|
||||
if (index) *index = i;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
moo_seterrnum (moo, MOO_ENOENT);
|
||||
return -1;
|
||||
}
|
||||
|
||||
static int add_oop_to_oopbuf (moo_t* moo, moo_oopbuf_t* oopbuf, moo_oop_t item)
|
||||
{
|
||||
@ -3508,6 +3524,28 @@ oops:
|
||||
return MOO_NULL;
|
||||
}
|
||||
|
||||
static moo_oop_nsdic_t attach_nsdic_to_interface (moo_t* moo, moo_oop_interface_t c)
|
||||
{
|
||||
moo_oow_t tmp_count = 0;
|
||||
moo_oop_nsdic_t nsdic;
|
||||
|
||||
moo_pushvolat (moo, (moo_oop_t*)&c); tmp_count++;
|
||||
|
||||
nsdic = moo_makensdic(moo, moo->_namespace, NAMESPACE_SIZE);
|
||||
if (!nsdic) goto oops;
|
||||
|
||||
MOO_STORE_OOP (moo, &nsdic->nsup, (moo_oop_t)c); /* it points to the owning interface as it belongs to an interface */
|
||||
MOO_STORE_OOP (moo, (moo_oop_t*)&nsdic->name, (moo_oop_t)c->name); /* for convenience only */
|
||||
c->nsdic = nsdic;
|
||||
|
||||
moo_popvolats (moo, tmp_count);
|
||||
return nsdic;
|
||||
|
||||
oops:
|
||||
moo_popvolats (moo, tmp_count);
|
||||
return MOO_NULL;
|
||||
}
|
||||
|
||||
#define PDN_DONT_ADD_NS (1 << 0)
|
||||
#define PDN_ACCEPT_POOLDIC_AS_NS (1 << 1)
|
||||
|
||||
@ -3567,6 +3605,24 @@ static int preprocess_dotted_name (moo_t* moo, int flags, moo_oop_nsdic_t topdic
|
||||
}
|
||||
else dic = t;
|
||||
}
|
||||
else if (MOO_CLASSOF(moo, ass->value) == moo->_interface)
|
||||
{
|
||||
moo_oop_nsdic_t t;
|
||||
|
||||
t = ((moo_oop_interface_t)ass->value)->nsdic;
|
||||
if ((moo_oop_t)t == moo->_nil)
|
||||
{
|
||||
if (flags & PDN_DONT_ADD_NS) goto wrong_name;
|
||||
|
||||
/* attach a new namespace dictionary to the nsdic field
|
||||
* of the interface */
|
||||
t = attach_nsdic_to_interface(moo, (moo_oop_interface_t)ass->value);
|
||||
if (!t) return -1;
|
||||
|
||||
dic = t;
|
||||
}
|
||||
else dic = t;
|
||||
}
|
||||
else if ((flags & PDN_ACCEPT_POOLDIC_AS_NS) && MOO_CLASSOF(moo, ass->value) == moo->_pool_dictionary)
|
||||
{
|
||||
/* A pool dictionary is treated as if it's a name space.
|
||||
@ -5138,6 +5194,11 @@ static MOO_INLINE int add_to_array_literal_buffer (moo_t* moo, moo_oop_t item)
|
||||
return add_oop_to_oopbuf(moo, &moo->c->arlit, item);
|
||||
}
|
||||
|
||||
static MOO_INLINE int find_in_array_literal_buffer (moo_t* moo, moo_oow_t start, moo_oow_t step, moo_oop_t item, moo_oow_t* index)
|
||||
{
|
||||
return find_oop_in_oopbuf(moo, &moo->c->arlit, start, step, item, index);
|
||||
}
|
||||
|
||||
static int read_byte_array_literal (moo_t* moo, int rdonly, moo_oop_t* xlit)
|
||||
{
|
||||
moo_ooi_t tmp;
|
||||
@ -9771,7 +9832,15 @@ static int __compile_pooldic_definition (moo_t* moo)
|
||||
while (TOKEN_TYPE(moo) == MOO_IOTOK_IDENT)
|
||||
{
|
||||
lit = moo_makesymbol(moo, TOKEN_NAME_PTR(moo), TOKEN_NAME_LEN(moo));
|
||||
if (!lit || add_to_array_literal_buffer(moo, lit) <= -1) goto oops;
|
||||
if (!lit) goto oops;
|
||||
|
||||
if (find_in_array_literal_buffer(moo, 0, 2, lit, MOO_NULL) >= 0)
|
||||
{
|
||||
moo_setsynerr (moo, MOO_SYNERR_NAMEDUPL, TOKEN_LOC(moo), TOKEN_NAME(moo));
|
||||
goto oops;
|
||||
}
|
||||
|
||||
if (add_to_array_literal_buffer(moo, lit) <= -1) goto oops;
|
||||
|
||||
GET_TOKEN (moo);
|
||||
|
||||
@ -9796,14 +9865,23 @@ static int __compile_pooldic_definition (moo_t* moo)
|
||||
|
||||
GET_TOKEN (moo);
|
||||
|
||||
/*if (TOKEN_TYPE(moo) == MOO_IOTOK_RBRACE) goto done;
|
||||
else*/ if (TOKEN_TYPE(moo) != MOO_IOTOK_PERIOD)
|
||||
if (TOKEN_TYPE(moo) == MOO_IOTOK_RBRACE) goto done;
|
||||
|
||||
if (TOKEN_TYPE(moo) != MOO_IOTOK_COMMA)
|
||||
{
|
||||
moo_setsynerr (moo, MOO_SYNERR_PERIOD, TOKEN_LOC(moo), TOKEN_NAME(moo));
|
||||
moo_setsynerrbfmt (moo, MOO_SYNERR_COMMA, TOKEN_LOC(moo), TOKEN_NAME(moo), "comma expected");
|
||||
goto oops;
|
||||
}
|
||||
|
||||
GET_TOKEN (moo);
|
||||
|
||||
/* comment out the following check to allow the last item
|
||||
* to be followed by a comma. what is better? */
|
||||
if (TOKEN_TYPE(moo) != MOO_IOTOK_IDENT)
|
||||
{
|
||||
moo_setsynerrbfmt (moo, MOO_SYNERR_IDENT, TOKEN_LOC(moo), TOKEN_NAME(moo), "identifier expected after comma");
|
||||
goto oops;
|
||||
}
|
||||
}
|
||||
|
||||
if (TOKEN_TYPE(moo) != MOO_IOTOK_RBRACE)
|
||||
@ -9812,7 +9890,7 @@ static int __compile_pooldic_definition (moo_t* moo)
|
||||
goto oops;
|
||||
}
|
||||
|
||||
/*done:*/
|
||||
done:
|
||||
GET_TOKEN (moo);
|
||||
|
||||
tally = (moo->c->arlit.count - saved_arlit_count) / 2;
|
||||
|
143
moo/lib/fmt.c
143
moo/lib/fmt.c
@ -1559,10 +1559,151 @@ int moo_fmt_object_ (moo_fmtout_t* fmtout, moo_oop_t oop)
|
||||
}
|
||||
if (moo_bfmt_out(fmtout, ")") <= -1) return -1;
|
||||
}
|
||||
else if (c == moo->_namespace)
|
||||
{
|
||||
moo_oop_t ns;
|
||||
struct
|
||||
{
|
||||
moo_oop_nsdic_t v;
|
||||
struct node_t* next;
|
||||
}* tmp, * top = MOO_NULL;
|
||||
int ok = 1;
|
||||
|
||||
/* TODO: better memory allocation management? */
|
||||
ns = ((moo_oop_nsdic_t)oop)->nsup;
|
||||
while (/*ns != moo->_system &&*/ ns != moo->_system->nsdic) /* exclude System from the output */
|
||||
{
|
||||
if (MOO_CLASSOF(moo, ns) == moo->_class)
|
||||
{
|
||||
ns = ((moo_oop_class_t)ns)->nsup;
|
||||
}
|
||||
else if (MOO_CLASSOF(moo, ns) == moo->_interface)
|
||||
{
|
||||
ns = ((moo_oop_interface_t)ns)->nsup;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* TODO: better memory allocation management? */
|
||||
tmp = moo_callocmem(moo, MOO_SIZEOF(*tmp));
|
||||
if (!tmp) goto done_namespace;
|
||||
tmp->v = (moo_oop_nsdic_t)ns;
|
||||
tmp->next = top;
|
||||
top = tmp;
|
||||
|
||||
ns = ((moo_oop_nsdic_t)ns)->nsup;
|
||||
}
|
||||
}
|
||||
|
||||
done_namespace:
|
||||
if (ok && moo_bfmt_out(fmtout, "<<namespace:") <= -1) ok = 0;
|
||||
while (top)
|
||||
{
|
||||
tmp = top;
|
||||
top = top->next;
|
||||
if (ok && moo_bfmt_out(fmtout, "%.*js.", MOO_OBJ_GET_SIZE(tmp->v->name), MOO_OBJ_GET_CHAR_SLOT(tmp->v->name)) <= -1) ok = 0;
|
||||
moo_freemem (moo, tmp);
|
||||
}
|
||||
if (ok && moo_bfmt_out(fmtout, "%.*js", MOO_OBJ_GET_SIZE(((moo_oop_nsdic_t)oop)->name), MOO_OBJ_GET_CHAR_SLOT(((moo_oop_nsdic_t)oop)->name)) <= -1) ok = 0;
|
||||
if (ok && moo_bfmt_out(fmtout, ">>") <= -1) ok = 0;
|
||||
|
||||
if (!ok) return -1;
|
||||
}
|
||||
else if (c == moo->_class)
|
||||
{
|
||||
/* print the class name */
|
||||
if (moo_bfmt_out(fmtout, "%.*js", MOO_OBJ_GET_SIZE(((moo_oop_class_t)oop)->name), MOO_OBJ_GET_CHAR_SLOT(((moo_oop_class_t)oop)->name)) <= -1) return -1;
|
||||
moo_oop_t ns;
|
||||
struct
|
||||
{
|
||||
moo_oop_nsdic_t v;
|
||||
struct node_t* next;
|
||||
}* tmp, * top = MOO_NULL;
|
||||
int ok = 1;
|
||||
|
||||
/* TODO: collapse many duplicate code among namespace, class, interface name printing */
|
||||
ns = ((moo_oop_class_t)oop)->nsup;
|
||||
while (/*ns != moo->_system &&*/ ns != moo->_system->nsdic) /* exclude System from the output */
|
||||
{
|
||||
if (MOO_CLASSOF(moo, ns) == moo->_class)
|
||||
{
|
||||
ns = ((moo_oop_class_t)ns)->nsup;
|
||||
}
|
||||
else if (MOO_CLASSOF(moo, ns) == moo->_interface)
|
||||
{
|
||||
ns = ((moo_oop_interface_t)ns)->nsup;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* TODO: better memory allocation management? */
|
||||
tmp = moo_callocmem(moo, MOO_SIZEOF(*tmp));
|
||||
if (!tmp) goto done_class;
|
||||
tmp->v = (moo_oop_nsdic_t)ns;
|
||||
tmp->next = top;
|
||||
top = tmp;
|
||||
|
||||
ns = ((moo_oop_nsdic_t)ns)->nsup;
|
||||
}
|
||||
}
|
||||
done_class:
|
||||
if (ok && moo_bfmt_out(fmtout, "<<class:") <= -1) ok = 0;
|
||||
while (top)
|
||||
{
|
||||
tmp = top;
|
||||
top = top->next;
|
||||
if (ok && moo_bfmt_out(fmtout, "%.*js.", MOO_OBJ_GET_SIZE(tmp->v->name), MOO_OBJ_GET_CHAR_SLOT(tmp->v->name)) <= -1) ok = 0;
|
||||
moo_freemem (moo, tmp);
|
||||
}
|
||||
if (ok && moo_bfmt_out(fmtout, "%.*js", MOO_OBJ_GET_SIZE(((moo_oop_class_t)oop)->name), MOO_OBJ_GET_CHAR_SLOT(((moo_oop_class_t)oop)->name)) <= -1) return -1;
|
||||
if (ok && moo_bfmt_out(fmtout, ">>") <= -1) ok = 0;
|
||||
|
||||
if (!ok) return -1;
|
||||
}
|
||||
else if (c == moo->_interface)
|
||||
{
|
||||
moo_oop_t ns;
|
||||
struct
|
||||
{
|
||||
moo_oop_nsdic_t v;
|
||||
struct node_t* next;
|
||||
}* tmp, * top = MOO_NULL;
|
||||
int ok = 1;
|
||||
|
||||
ns = ((moo_oop_interface_t)oop)->nsup;
|
||||
while (/*ns != moo->_system &&*/ ns != moo->_system->nsdic) /* exclude System from the output */
|
||||
{
|
||||
if (MOO_CLASSOF(moo, ns) == moo->_class)
|
||||
{
|
||||
ns = ((moo_oop_class_t)ns)->nsup;
|
||||
}
|
||||
else if (MOO_CLASSOF(moo, ns) == moo->_interface)
|
||||
{
|
||||
ns = ((moo_oop_interface_t)ns)->nsup;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* TODO: better memory allocation management? */
|
||||
tmp = moo_callocmem(moo, MOO_SIZEOF(*tmp));
|
||||
if (!tmp) goto done_interface;
|
||||
tmp->v = (moo_oop_nsdic_t)ns;
|
||||
tmp->next = top;
|
||||
top = tmp;
|
||||
|
||||
ns = ((moo_oop_nsdic_t)ns)->nsup;
|
||||
}
|
||||
}
|
||||
|
||||
done_interface:
|
||||
if (ok && moo_bfmt_out(fmtout, "<<interface:") <= -1) ok = 0;
|
||||
while (top)
|
||||
{
|
||||
tmp = top;
|
||||
top = top->next;
|
||||
if (ok && moo_bfmt_out(fmtout, "%.*js.", MOO_OBJ_GET_SIZE(tmp->v->name), MOO_OBJ_GET_CHAR_SLOT(tmp->v->name)) <= -1) ok = 0;
|
||||
moo_freemem (moo, tmp);
|
||||
}
|
||||
if (ok && moo_bfmt_out(fmtout, "%.*js", MOO_OBJ_GET_SIZE(((moo_oop_interface_t)oop)->name), MOO_OBJ_GET_CHAR_SLOT(((moo_oop_interface_t)oop)->name)) <= -1) return -1;
|
||||
if (ok && moo_bfmt_out(fmtout, ">>") <= -1) ok = 0;
|
||||
|
||||
if (!ok) return -1;
|
||||
}
|
||||
else if (c == moo->_association)
|
||||
{
|
||||
|
@ -1048,7 +1048,7 @@ moo_oop_t moo_findclass (moo_t* moo, moo_oop_nsdic_t nsdic, const moo_ooch_t* na
|
||||
n.ptr = (moo_ooch_t*)name;
|
||||
n.len = moo_count_oocstr(name);
|
||||
|
||||
ass = moo_lookupdic (moo, (moo_oop_dic_t)nsdic, &n);
|
||||
ass = moo_lookupdic(moo, (moo_oop_dic_t)nsdic, &n);
|
||||
if (!ass || MOO_CLASSOF(moo,ass->value) != moo->_class)
|
||||
{
|
||||
moo_seterrnum (moo, MOO_ENOENT);
|
||||
|
@ -476,7 +476,7 @@ struct moo_dic_t
|
||||
typedef struct moo_nsdic_t moo_nsdic_t;
|
||||
typedef struct moo_nsdic_t* moo_oop_nsdic_t;
|
||||
|
||||
#define MOO_INTERFACE_NAMED_INSTVARS 4
|
||||
#define MOO_INTERFACE_NAMED_INSTVARS 5
|
||||
typedef struct moo_interface_t moo_interface_t;
|
||||
typedef struct moo_interface_t* moo_oop_interface_t;
|
||||
|
||||
@ -504,6 +504,7 @@ struct moo_interface_t
|
||||
* [1] - class methods, MethodDictionary */
|
||||
moo_oop_dic_t mthdic[2];
|
||||
moo_oop_nsdic_t nsup; /* pointer to the upper namespace */
|
||||
moo_oop_nsdic_t nsdic; /* dictionary used for namespacing - may be nil when there are no subitems underneath */
|
||||
};
|
||||
|
||||
struct moo_class_t
|
||||
|
Loading…
Reference in New Issue
Block a user