added moo_iskindof().

changed isKindOf: to utilize a new primitive _is_kind_of.
marked BlockContext and MethodContext to be #final and #limited
This commit is contained in:
hyunghwan.chung
2017-09-29 15:03:54 +00:00
parent e38a4f1f20
commit 303b49270d
9 changed files with 120 additions and 12 deletions

View File

@ -215,10 +215,15 @@ extend Apex
{
| c |
c := self superclass.
[c notNil] whileTrue: [
(* [c notNil] whileTrue: [
[ c == aClass ] ifTrue: [^true].
c := c superclass.
].
]. *)
while (c notNil)
{
if (c == aClass) { ^true }.
c := c superclass.
}.
^false
}
@ -233,6 +238,7 @@ extend Apex
method(#class) isKindOf: aClass
{
<primitive: #_is_kind_of>
^(self isMemberOf: aClass) or: [self inheritsFrom: aClass].
}
@ -243,6 +249,7 @@ extend Apex
method isKindOf: aClass
{
<primitive: #_is_kind_of>
^(self isMemberOf: aClass) or: [self class inheritsFrom: aClass].
}

View File

@ -42,7 +42,7 @@ block context...
---------------------------------- *)
}
class(#pointer) MethodContext(Context)
class(#pointer,#final,#limited) MethodContext(Context)
{
var method, receiver, home, origin.
@ -99,7 +99,7 @@ class(#pointer) MethodContext(Context)
}
}
class(#pointer) BlockContext(Context)
class(#pointer,#final,#limited) BlockContext(Context)
{
var nargs, source, home, origin.

View File

@ -94,12 +94,14 @@ TODO: timed wait...
}
*)
(* TODO: MIGRATE TO MUTEX...
method critical: aBlock
{
self wait.
^aBlock ensure: [ self signal ]
}
}*)
## ==================================================================
method heapIndex
@ -133,6 +135,26 @@ TODO: timed wait...
}
}
class Mutex(Semaphore)
{
method(#class) new
{
| s |
s := super new.
s signal.
^s.
}
method lock { ^self wait }
method unlock { ^self signal }
method critical: block
{
self wait.
^block ensure: [ self signal ]
}
}
(*
xxx := Semaphore new.

View File

@ -1,5 +1,7 @@
## TODO: use this file as a regress testing source.
## rename it to test-001.moo and use it as a test case file.
##
## TEST CASES for namespacing
##
#include 'Moo.moo'.

View File

@ -1,3 +1,6 @@
##
## TEST CASES for basic methods
##
#include 'Moo.moo'.
@ -50,8 +53,30 @@ class MyObject(TestObject)
method(#class) main
{
'START OF MAIN' dump.
'EDN OF MAIN' dump.
}
| tc limit |
tc := %(
## 0 - 4
[(Object isKindOf: Class) == true],
[(Object isKindOf: Apex) == true],
[(Class isKindOf: Class) == true],
[(Class isKindOf: Apex) == true],
[(Class isKindOf: Object) == false],
[(Apex isKindOf: Class) == true],
[(SmallInteger isKindOf: Integer) == false],
[(10 isKindOf: Integer) == true],
[(Apex isMemberOf: Class) == true],
[(Class isMemberOf: Class) == true]
).
limit := tc size.
0 priorTo: limit by: 1 do: [ :idx |
| tb |
tb := tc at: idx.
System log(System.Log.INFO, idx asString, (if (tb value) { ' PASS' } else { ' FAIL' }), S'\n').
]
}
}