fixed an issue in isKindOf:
This commit is contained in:
parent
a240b0be7d
commit
cb2b93d01c
@ -239,7 +239,7 @@ extend Apex
|
|||||||
method(#class) isKindOf: aClass
|
method(#class) isKindOf: aClass
|
||||||
{
|
{
|
||||||
<primitive: #_is_kind_of>
|
<primitive: #_is_kind_of>
|
||||||
^(self isMemberOf: aClass) or: [self inheritsFrom: aClass].
|
^(self isMemberOf: aClass) or: [self class inheritsFrom: aClass].
|
||||||
}
|
}
|
||||||
|
|
||||||
method isMemberOf: aClass
|
method isMemberOf: aClass
|
||||||
|
@ -54,7 +54,7 @@ class MyObject(TestObject)
|
|||||||
method(#class) main
|
method(#class) main
|
||||||
{
|
{
|
||||||
| tc limit |
|
| tc limit |
|
||||||
(10 isKindOf: 20) dump.
|
|
||||||
tc := %(
|
tc := %(
|
||||||
## 0 - 4
|
## 0 - 4
|
||||||
[(Object isKindOf: Class) == true],
|
[(Object isKindOf: Class) == true],
|
||||||
@ -65,12 +65,20 @@ class MyObject(TestObject)
|
|||||||
|
|
||||||
## 5-9
|
## 5-9
|
||||||
[(Apex isKindOf: Class) == true],
|
[(Apex isKindOf: Class) == true],
|
||||||
|
[(Apex isKindOf: Apex) == true],
|
||||||
[(SmallInteger isKindOf: Integer) == false],
|
[(SmallInteger isKindOf: Integer) == false],
|
||||||
[(10 isKindOf: Integer) == true],
|
[(10 isKindOf: Integer) == true],
|
||||||
[(10 isKindOf: 20) == false],
|
[(10 isKindOf: 20) == false],
|
||||||
|
|
||||||
[(Apex isMemberOf: Class) == true],
|
## 10-14
|
||||||
[(Class isMemberOf: Class) == true]
|
[([] isKindOf: BlockContext) == true],
|
||||||
|
[([] isKindOf: MethodContext) == false],
|
||||||
|
[([] isKindOf: Context) == true],
|
||||||
|
[('string' isKindOf: String) == true],
|
||||||
|
[(#symbol isKindOf: String) == true],
|
||||||
|
|
||||||
|
[('string' isKindOf: Symbol) == false],
|
||||||
|
[(#symbol isKindOf: Symbol) == true]
|
||||||
).
|
).
|
||||||
|
|
||||||
limit := tc size.
|
limit := tc size.
|
||||||
|
@ -33,10 +33,18 @@
|
|||||||
#define PROC_STATE_TERMINATED -1
|
#define PROC_STATE_TERMINATED -1
|
||||||
|
|
||||||
|
|
||||||
|
/* receiver check failure leads to hard failure.
|
||||||
|
* RATIONAL: the primitive handler should be used by relevant classes and
|
||||||
|
* objects only. if the receiver check fails, you must review
|
||||||
|
* your class library */
|
||||||
#define MOO_PF_CHECK_RCV(moo,cond) do { \
|
#define MOO_PF_CHECK_RCV(moo,cond) do { \
|
||||||
if (!(cond)) { moo_seterrnum((moo), MOO_EMSGRCV); return MOO_PF_HARD_FAILURE; } \
|
if (!(cond)) { moo_seterrnum((moo), MOO_EMSGRCV); return MOO_PF_HARD_FAILURE; } \
|
||||||
} while(0)
|
} while(0)
|
||||||
|
|
||||||
|
/* argument check failure causes the wrapping method to return an error.
|
||||||
|
* RATIONAL: Being a typeless language, it's hard to control the kinds of
|
||||||
|
* arguments.
|
||||||
|
*/
|
||||||
#define MOO_PF_CHECK_ARGS(moo,nargs,cond) do { \
|
#define MOO_PF_CHECK_ARGS(moo,nargs,cond) do { \
|
||||||
if (!(cond)) { MOO_STACK_SETRETTOERROR ((moo), (nargs), MOO_EINVAL); return MOO_PF_SUCCESS; } \
|
if (!(cond)) { MOO_STACK_SETRETTOERROR ((moo), (nargs), MOO_EINVAL); return MOO_PF_SUCCESS; } \
|
||||||
} while(0)
|
} while(0)
|
||||||
@ -2484,7 +2492,7 @@ static moo_pfrc_t pf_semaphore_signal (moo_t* moo, moo_ooi_t nargs)
|
|||||||
moo_oop_t rcv;
|
moo_oop_t rcv;
|
||||||
|
|
||||||
rcv = MOO_STACK_GETRCV(moo, nargs);
|
rcv = MOO_STACK_GETRCV(moo, nargs);
|
||||||
MOO_PF_CHECK_RCV (moo, MOO_CLASSOF(moo,rcv) == moo->_semaphore); /* TODO: use moo_iskindof(moo,rcv,moo->_semaphore); */
|
MOO_PF_CHECK_RCV (moo, moo_iskindof(moo, rcv, moo->_semaphore));
|
||||||
|
|
||||||
/* signal_semaphore() may change the active process though the
|
/* signal_semaphore() may change the active process though the
|
||||||
* implementation as of this writing makes runnable the process waiting
|
* implementation as of this writing makes runnable the process waiting
|
||||||
@ -2502,7 +2510,7 @@ static moo_pfrc_t pf_semaphore_wait (moo_t* moo, moo_ooi_t nargs)
|
|||||||
moo_oop_t rcv;
|
moo_oop_t rcv;
|
||||||
|
|
||||||
rcv = MOO_STACK_GETRCV(moo, nargs);
|
rcv = MOO_STACK_GETRCV(moo, nargs);
|
||||||
MOO_PF_CHECK_RCV (moo, MOO_CLASSOF(moo,rcv) == moo->_semaphore);
|
MOO_PF_CHECK_RCV (moo, moo_iskindof(moo, rcv, moo->_semaphore));
|
||||||
|
|
||||||
/* i must set the return value before calling await_semaphore().
|
/* i must set the return value before calling await_semaphore().
|
||||||
* await_semaphore() may switch the active process and the stack
|
* await_semaphore() may switch the active process and the stack
|
||||||
@ -2529,7 +2537,7 @@ static moo_pfrc_t pf_semaphore_group_wait (moo_t* moo, moo_ooi_t nargs)
|
|||||||
moo_oop_t rcv, sem;
|
moo_oop_t rcv, sem;
|
||||||
|
|
||||||
rcv = MOO_STACK_GETRCV(moo, nargs);
|
rcv = MOO_STACK_GETRCV(moo, nargs);
|
||||||
MOO_PF_CHECK_RCV (moo, MOO_CLASSOF(moo,rcv) == moo->_semaphore_group);
|
MOO_PF_CHECK_RCV (moo, moo_iskindof(moo, rcv, moo->_semaphore_group));
|
||||||
|
|
||||||
/* i must set the return value before calling await_semaphore_group().
|
/* i must set the return value before calling await_semaphore_group().
|
||||||
* MOO_STACK_SETRETTORCV() manipulates the stack of the currently active
|
* MOO_STACK_SETRETTORCV() manipulates the stack of the currently active
|
||||||
|
@ -984,7 +984,7 @@ int moo_iskindof (moo_t* moo, moo_oop_t obj, moo_oop_class_t _class)
|
|||||||
if (c == moo->_class)
|
if (c == moo->_class)
|
||||||
{
|
{
|
||||||
/* object is a class */
|
/* object is a class */
|
||||||
if (_class == moo->_class) return 1;
|
if (_class == moo->_class) return 1; /* obj isKindOf: Class */
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user