touched up primitive failure handling in exec.c

This commit is contained in:
hyunghwan.chung
2017-05-08 16:00:55 +00:00
parent 95f3df6424
commit a1782753a9
8 changed files with 124 additions and 132 deletions

View File

@ -36,7 +36,6 @@ extend Apex
{
## -------------------------------------------------------
## -------------------------------------------------------
method(#dual) dump
{
<primitive: #_dump>
@ -44,29 +43,22 @@ extend Apex
## -------------------------------------------------------
## -------------------------------------------------------
method(#dual) yourself
{
^self.
}
method(#dual) yourself { ^self }
## -------------------------------------------------------
## INSTANTIATION & INITIALIZATION
## -------------------------------------------------------
method(#class,#lenient) _basicNew
{
<primitive: #_basic_new>
}
method(#class,#lenient) _basicNew: size
{
<primitive: #_basic_new>
}
method(#class,#primitive,#lenient) _basicNew.
method(#class,#primitive,#lenient) _basicNew: size.
method(#class,#primitive) basicNew.
method(#class,#primitive) basicNew: size.
(*
method(#class) basicNew
{
| perr |
<primitive: #_basic_new>
<primitive: #Apex__basicNew>
self primitiveFailed.
## perr := thisProcess primError.
@ -77,93 +69,51 @@ extend Apex
method(#class) basicNew: size
{
| perr |
## <primitive: #_basicNew>
<primitive: #_basic_new>
<primitive: #Apex__basicNew:>
self primitiveFailed.
## perr := thisProcess primError.
## if (perr == xxxx) { self cannotInstantiate }
## else { self primitiveFailed }.
}
method(#class) ngcNew
{
<primitive: #_ngc_new>
self primitiveFailed.
}
method(#class) ngcNew: anInteger
{
<primitive: #_ngc_new>
self primitiveFailed.
}
}*)
method(#class) new
{
| x |
x := self basicNew.
x initialize. "TODO: assess if it's good to call 'initialize' from new."
x initialize. ## TODO: assess if it's good to call 'initialize' from new
^x.
}
method(#class) new: anInteger
{
| x |
## TODO: check if the class is a fixed class.
## if so, raise an exception.
x := self basicNew: anInteger.
x initialize. "TODO: assess if it's good to call 'initialize' from new."
x initialize. ## TODO: assess if it's good to call 'initialize' from new.
^x.
}
method initialize
{
"a subclass may override this method."
(* a subclass may override this method *)
^self.
}
method ngcDispose
{
<primitive: #_ngc_dispose>
self primitiveFailed.
}
## -------------------------------------------------------
## -------------------------------------------------------
method shallowCopy
##method(#primitive,#lenient) _shallowCopy.
method(#dual) shallowCopy
{
<primitive: #_shallow_copy>
self primitiveFailed.
}
## -------------------------------------------------------
## -------------------------------------------------------
method class
{
<primitive: #_class>
}
method(#class) class
{
<primitive: #_class>
^Class
}
## -------------------------------------------------------
## -------------------------------------------------------
method basicSize
{
<primitive: #_basic_size>
self primitiveFailed.
}
method(#class) basicSize
{
<primitive: #_basic_size>
self primitiveFailed.
}
method(#dual,#primitive,#lenient) _basicSize.
method(#dual,#primitive) basicSize.
method(#dual) basicAt: index
{
@ -237,6 +187,8 @@ extend Apex
* COMMON QUERIES
* ------------------------------------------------------------------ *)
method(#dual,#primitive) class.
method(#dual) isNil
{
"^self == nil."

View File

@ -35,9 +35,9 @@ class(#pointer) Class(Apex)
method specNumInstVars
{
## shift right by 7 bits.
## see moo-prv.h for details.
^self.spec bitShift: -7
## shift right by 8 bits.
## see MOO_CLASS_SPEC_NAMED_INSTVARS in moo-prv.h for details.
^self.spec bitShift: -8
}
(*method inheritsFrom: aSuperclass

View File

@ -413,8 +413,23 @@ class ProhibitedMessageException(Exception)
extend Apex
{
method(#dual) primitiveFailed
method(#dual,#variadic) primitiveFailed()
{
| a b |
thisContext vargCount dump.
a := 1.
b := thisContext vargCount.
'PRIMITIVE FAILED............................................' dump.
self dump.
while (a < b)
{
(thisContext vargAt: a) dump.
a := a + 1.
}.
('PRIMITIVE FAILED....' & (thisContext vargAt: 0)) dump.
PrimitiveFailureException signal: 'PRIMITIVE FAILED'.
}

View File

@ -30,6 +30,7 @@ class MyObject(Object)
'data too large'
'message receiver error'
'message sending error'
'wrong number of arguments'
'range error'
'byte-code full'
'dictionary full'