refactored the bytecode interpretation loop with computed jump tables
added incomplete code to support a semaphore group
This commit is contained in:
@ -10,7 +10,7 @@ class Collection(Object)
|
||||
{
|
||||
^self size > 0
|
||||
}
|
||||
|
||||
|
||||
method size
|
||||
{
|
||||
(* Each subclass must override this method because
|
||||
@ -20,18 +20,18 @@ class Collection(Object)
|
||||
self do: [ :el | count := count + 1 ].
|
||||
^count
|
||||
}
|
||||
|
||||
|
||||
method do: block
|
||||
{
|
||||
^self subclassResponsibility: #do
|
||||
}
|
||||
|
||||
|
||||
method detect: block
|
||||
{
|
||||
self do: [ :el | if (block value: el) { ^el } ].
|
||||
^Error.Code.ENOENT
|
||||
}
|
||||
|
||||
|
||||
method detect: block ifNone: exception_block
|
||||
{
|
||||
self do: [ :el | if (block value: el) { ^el } ].
|
||||
@ -100,12 +100,12 @@ class(#character) String(Array)
|
||||
|
||||
^newstr
|
||||
}
|
||||
|
||||
|
||||
method asString
|
||||
{
|
||||
^self
|
||||
}
|
||||
|
||||
|
||||
(* TODO: Symbol is a #final class. Symbol new is not allowed. To create a symbol programatically, you should
|
||||
* build a string and send asSymbol to the string............
|
||||
method asSymbol
|
||||
@ -113,7 +113,6 @@ class(#character) String(Array)
|
||||
}
|
||||
*)
|
||||
|
||||
|
||||
(* The strlen method returns the number of characters before a terminating null.
|
||||
* if no terminating null character exists, it returns the same value as the size method *)
|
||||
method(#primitive,#lenient) _strlen.
|
||||
@ -252,7 +251,7 @@ class Set(Collection)
|
||||
index := hv rem: bs.
|
||||
while ((self.bucket at: index) notNil) { index := (index + 1) rem: bs }.
|
||||
}.
|
||||
|
||||
|
||||
ass := Association key: key value: value.
|
||||
self.tally := ntally.
|
||||
self.bucket at: index put: ass.
|
||||
|
@ -10,13 +10,13 @@ class Association(Magnitude)
|
||||
{
|
||||
^self new key: key value: value
|
||||
}
|
||||
|
||||
|
||||
method key: key value: value
|
||||
{
|
||||
self.key := key.
|
||||
self.value := value.
|
||||
}
|
||||
|
||||
|
||||
method value: value
|
||||
{
|
||||
self.value := value
|
||||
@ -31,12 +31,12 @@ class Association(Magnitude)
|
||||
{
|
||||
^self.value
|
||||
}
|
||||
|
||||
|
||||
method = ass
|
||||
{
|
||||
^(self.key = ass key) and: [ self.value = ass value ]
|
||||
}
|
||||
|
||||
|
||||
method hash
|
||||
{
|
||||
^(self.key hash) + (self.value hash)
|
||||
@ -230,7 +230,7 @@ class(#limited) Number(Magnitude)
|
||||
{
|
||||
^self to: end by: 1 do: block.
|
||||
}
|
||||
|
||||
|
||||
method priorTo: end by: step do: block
|
||||
{
|
||||
| i |
|
||||
@ -306,7 +306,7 @@ class(#limited) SmallInteger(Integer)
|
||||
## {
|
||||
## ^0
|
||||
## }
|
||||
|
||||
|
||||
method(#primitive) asCharacter.
|
||||
method(#primitive) asError.
|
||||
}
|
||||
|
@ -47,15 +47,16 @@ class(#pointer,#final,#limited) Process(Object)
|
||||
|
||||
class Semaphore(Object)
|
||||
{
|
||||
var count := 0,
|
||||
waiting_head := nil,
|
||||
var waiting_head := nil,
|
||||
waiting_tail := nil,
|
||||
count := 0,
|
||||
heapIndex := -1,
|
||||
fireTimeSec := 0,
|
||||
fireTimeNsec := 0,
|
||||
ioIndex := -1,
|
||||
ioHandle := nil,
|
||||
ioMask := 0.
|
||||
ioMask := 0,
|
||||
group := nil.
|
||||
|
||||
method(#class) forMutualExclusion
|
||||
{
|
||||
@ -122,10 +123,73 @@ TODO: timed wait...
|
||||
^self.fireTimeSec >= (aSemaphore fireTime)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
(*
|
||||
xxx := Semaphore new.
|
||||
xxx on: #signal do: [ ].
|
||||
|
||||
|
||||
========= CASE 1 ====================
|
||||
sg := SemaphoreGroup with (xxx, yyy, zzz).
|
||||
Processor signal: xxx onInput: aaa.
|
||||
Processor signal: yyy onInput: bbb.
|
||||
Processor signal: zzz onOutput: ccc.
|
||||
|
||||
while (true)
|
||||
{
|
||||
sem := sg wait.
|
||||
if (sem == xxx)
|
||||
{
|
||||
|
||||
}
|
||||
elsif (sem == yyy)
|
||||
{
|
||||
}
|
||||
elsif (sem == zzz)
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
============ CASE 2====================
|
||||
### ASSOCIATE CALLBACK WITH SEMAPHORE.
|
||||
|
||||
sg := SemaphoreGroup with (xxx, yyy, zzz).
|
||||
|
||||
oldaction := xxx signalAction: [ ... ]. ### similar interface like unix system call signal()???? method signalAction: block {} , method signalAction { ^self.signalAction }
|
||||
yyy signalAction: [ ... ].
|
||||
zzz signalAction: [ ... ].
|
||||
|
||||
Processor signal: xxx onInput: aaa.
|
||||
Processor signal: yyy onInput: bbb.
|
||||
Processor signal: zzz onOutput: ccc.
|
||||
|
||||
|
||||
while (true)
|
||||
{
|
||||
sem := sg wait. ### the action associated with the semaphore must get executed. => wait may be a primitive. the primitive handler may return failure... if so, the actual primitive body can execute the action easily
|
||||
}
|
||||
|
||||
|
||||
Semaphore>>method wait
|
||||
{
|
||||
<primitive: #Semaphore_wait>
|
||||
if (errorCode == NO ERROR)
|
||||
{
|
||||
self.signalAction value. ## which is better???
|
||||
self.sginalAction value: self.
|
||||
}
|
||||
}
|
||||
*)
|
||||
|
||||
|
||||
class SemaphoreGroup(Object)
|
||||
{
|
||||
var arr, size := 0.
|
||||
var waiting_head := nil,
|
||||
waiting_tail := nil,
|
||||
size := 0,
|
||||
pos := 0,
|
||||
semarr := nil.
|
||||
|
||||
(* TODO: good idea to a shortcut way to prohibit a certain method in the heirarchy chain?
|
||||
|
||||
@ -156,13 +220,13 @@ method(#class,#abstract) xxx. => method(#class) xxx { self subclassResponsibilit
|
||||
|
||||
method initialize
|
||||
{
|
||||
self.arr := Array new: 10.
|
||||
self.semarr := Array new: 10.
|
||||
}
|
||||
|
||||
method initialize: arr
|
||||
{
|
||||
self.size := arr size.
|
||||
self.arr := arr.
|
||||
self.semarr := arr.
|
||||
}
|
||||
|
||||
method(#primitive) wait.
|
||||
|
@ -104,6 +104,19 @@ extend MyObject
|
||||
{
|
||||
## TODO: support import in extend??
|
||||
|
||||
method(#class) makeBlock(a,b)
|
||||
{
|
||||
^[:x | a * x + b]
|
||||
}
|
||||
|
||||
method(#class) testMakeBlock
|
||||
{
|
||||
|a b |
|
||||
a := self makeBlock (12, 22).
|
||||
b := self makeBlock (99, 4).
|
||||
^(a value: 5) * (b value: 6). ## (12 * 5 + 22) * (99 * 6 + 4) => 49036
|
||||
}
|
||||
|
||||
method(#class) main
|
||||
{
|
||||
| tc limit |
|
||||
@ -159,7 +172,8 @@ extend MyObject
|
||||
[MyObject.System.System.System.System new kk == #KK],
|
||||
|
||||
## 35 - 39
|
||||
[MyObject.System.System.System KING == #KING]
|
||||
[MyObject.System.System.System KING == #KING],
|
||||
[self testMakeBlock == 49036]
|
||||
).
|
||||
|
||||
limit := tc size.
|
||||
|
Reference in New Issue
Block a user