moo/stix/kernel/Apex.st
2017-01-09 09:54:49 +00:00

451 lines
7.6 KiB
Smalltalk

class Apex(nil)
{
dcl(#class) sysdic.
## -------------------------------------------------------
## -------------------------------------------------------
method(#class) dump
{
<primitive: #_dump>
}
method dump
{
<primitive: #_dump>
}
## -------------------------------------------------------
## -------------------------------------------------------
method(#class) yourself
{
^self.
}
method yourself
{
^self.
}
## -------------------------------------------------------
## -------------------------------------------------------
method(#class) basicNew
{
<primitive: #_basic_new>
self primitiveFailed.
}
method(#class) basicNew: anInteger
{
<primitive: #_basic_new_with_size>
self primitiveFailed.
}
method(#class) ngcNew
{
<primitive: #_ngc_new>
self primitiveFailed.
}
method(#class) ngcNew: anInteger
{
<primitive: #_ngc_new_with_size>
self primitiveFailed.
}
method(#class) new
{
| x |
x := self basicNew.
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.
}
method initialize
{
"a subclass may override this method."
^self.
}
method ngcDispose
{
<primitive: #_ngc_dispose>
self primitiveFailed.
}
## -------------------------------------------------------
## -------------------------------------------------------
method 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 basicAt: index
{
<primitive: #_basic_at>
self index: index outOfRange: (self basicSize).
}
method basicAt: index put: anObject
{
<primitive: #_basic_at_put>
self index: index outOfRange: (self basicSize).
}
method(#class) basicAt: index
{
<primitive: #_basic_at>
self index: index outOfRange: (self basicSize).
}
method(#class) basicAt: index put: anObject
{
<primitive: #_basic_at_put>
self index: index outOfRange: (self basicSize).
}
(* ------------------------------------------------------------------
* HASHING
* ------------------------------------------------------------------ *)
method hash
{
<primitive: #_hash>
self subclassResponsibility: #hash
}
method(#class) hash
{
<primitive: #_hash>
self subclassResponsibility: #hash
}
(* ------------------------------------------------------------------
* IDENTITY TEST
* ------------------------------------------------------------------ *)
method == anObject
{
(* check if the receiver is identical to anObject.
* this doesn't compare the contents *)
<primitive: #_identical>
self primitiveFailed.
}
method ~~ anObject
{
<primitive: #_not_identical>
^(self == anObject) not.
}
method(#class) == anObject
{
(* check if the receiver is identical to anObject.
* this doesn't compare the contents *)
<primitive: #_identical>
self primitiveFailed.
}
method(#class) ~~ anObject
{
<primitive: #_not_identical>
^(self == anObject) not.
}
(* ------------------------------------------------------------------
* EQUALITY TEST
* ------------------------------------------------------------------ *)
method = anObject
{
<primitive: #_equal>
self subclassResponsibility: #=
}
method ~= anObject
{
<primitive: #_not_equal>
^(self = anObject) not.
}
method(#class) = anObject
{
<primitive: #_equal>
self subclassResponsibility: #=
}
method(#class) ~= anObject
{
<primitive: #_not_equal>
^(self = anObject) not.
}
(* ------------------------------------------------------------------
* COMMON QUERIES
* ------------------------------------------------------------------ *)
method isNil
{
"^self == nil."
^false
}
method notNil
{
"^(self == nil) not"
"^self ~= nil."
^true.
}
method(#class) isNil
{
"^self == nil."
^false
}
method(#class) notNil
{
"^(self == nil) not"
"^self ~= nil."
^true.
}
method isError
{
^false
}
method(#class) isError
{
^false
}
method notError
{
^true
}
method(#class) notError
{
^true
}
## -------------------------------------------------------
## -------------------------------------------------------
method(#class) inheritsFrom: aClass
{
| c |
c := self superclass.
[c notNil] whileTrue: [
[ c == aClass ] ifTrue: [^true].
c := c superclass.
].
^false
}
method(#class) isMemberOf: aClass
{
(* a class object is an instance of Class
* but Class inherits from Apex. On the other hand,
* most of ordinary classes are under Object again under Apex.
* special consideration is required here. *)
^aClass == Class
}
method(#class) isKindOf: aClass
{
^(self isMemberOf: aClass) or: [self inheritsFrom: aClass].
}
method isMemberOf: aClass
{
^self class == aClass
}
method isKindOf: aClass
{
^(self isMemberOf: aClass) or: [self class inheritsFrom: aClass].
}
(* -----------------
method(#class) respondsTo: selectorSymbol
{
TODO: find selectorSymbol in the class method dictionary...
}
method respondsTo: selectorSymbol
{
TODO: find selectorSymbol in the method dictionary...
}
------------ *)
method exceptionizeError: trueOrFalse
{
<primitive: #_exceptionize_error>
self class cannotExceptionizeError
}
(* ------------------------------------------------------------------
* COMMON ERROR/EXCEPTION HANDLERS
* ------------------------------------------------------------------ *)
method primitiveFailed
{
^self class primitiveFailed.
}
method cannotInstantiate
{
^self class cannotInstantiate
}
method doesNotUnderstand: messageSymbol
{
^self class doesNotUnderstand: messageSymbol
}
method index: index outOfRange: ubound
{
^self class index: index outOfRange: ubound.
}
method subclassResponsibility: method_name
{
^self class subclassResponsibility: method_name
}
method notImplemented: method_name
{
^self class notImplemented: method_name
}
method cannotExceptionizeError
{
^self class cannotExceptionizeError
}
method(#class) error: msgText
{
(* TODO: implement this
Error signal: msgText. *)
msgText dump.
}
method error: aString
{
self class error: aString.
}
}
class Object(Apex)
{
}
class UndefinedObject(Apex)
{
method isNil
{
^true
}
method notNil
{
^false.
}
method handleException: exception
{
('### EXCEPTION NOT HANDLED #### ' & exception class name & ' - ' & exception messageText) dump.
## TODO: debug the current process???? "
## TODO: ensure to execute ensure blocks as well....
####Processor activeProcess terminate.
}
}
pooldic ErrorCode
{
(* migrate it into Error class *)
#NONE := error(0).
#GENERIC := error(1).
#NOENT := error(2).
}
class Error(Apex)
{
(* ----------------------------
TODO: support constant declaration...
#const
{
#NONE := error(0).
#GENERIC := error(1).
}
-------------------------------- *)
method isError
{
^true
}
method notError
{
^false
}
method asInteger
{
<primitive: #_error_as_integer>
}
method asCharacter
{
<primitive: #_error_as_character>
}
method asString
{
<primitive: #_error_as_string>
}
}