added a new modifier #variadic to make variadic method definition more obvious.
allowed the #primitive modifier in a method definition not associated with an external module. fixed a bug in handling soft failure from numbered primitive functions
This commit is contained in:
@ -328,13 +328,13 @@ class Apex(nil)
|
||||
## -------------------------------------------------------
|
||||
## -------------------------------------------------------
|
||||
|
||||
method(#class) perform()
|
||||
method(#class,#variadic) perform()
|
||||
{
|
||||
<primitive: #_perform>
|
||||
self primitiveFailed
|
||||
}
|
||||
|
||||
method perform()
|
||||
method(#variadic) perform()
|
||||
{
|
||||
<primitive: #_perform>
|
||||
self primitiveFailed
|
||||
@ -540,85 +540,3 @@ extend Error
|
||||
}
|
||||
}
|
||||
|
||||
class System(Apex)
|
||||
{
|
||||
}
|
||||
|
||||
pooldic System.Log
|
||||
{
|
||||
## -----------------------------------------------------------
|
||||
## defines log levels
|
||||
## these items must follow defintions in moo.h
|
||||
## -----------------------------------------------------------
|
||||
|
||||
DEBUG := 1.
|
||||
INFO := 2.
|
||||
WARN := 4.
|
||||
ERROR := 8.
|
||||
FATAL := 16.
|
||||
}
|
||||
|
||||
extend System
|
||||
{
|
||||
## the following methods may not look suitable to be placed
|
||||
## inside a system dictionary. but they are here for quick and dirty
|
||||
## output production from the moo code.
|
||||
## System logNl: 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'.
|
||||
##
|
||||
method(#class) atLevel: level log: message
|
||||
{
|
||||
<primitive: #_log>
|
||||
## do nothing upon logging failure
|
||||
}
|
||||
|
||||
method(#class) atLevel: level log: message and: message2
|
||||
{
|
||||
<primitive: #_log>
|
||||
## do nothing upon logging failure
|
||||
}
|
||||
|
||||
method(#class) atLevel: level log: message and: message2 and: message3
|
||||
{
|
||||
<primitive: #_log>
|
||||
## do nothing upon logging failure
|
||||
}
|
||||
|
||||
method(#class) atLevel: level logNl: message
|
||||
{
|
||||
## the #_log primitive accepts an array.
|
||||
## so the following lines should work also.
|
||||
## | x |
|
||||
## x := Array new: 2.
|
||||
## x at: 0 put: message.
|
||||
## x at: 1 put: S'\n'.
|
||||
## ^self atLevel: level log: x.
|
||||
|
||||
^self atLevel: level log: message and: S'\n'.
|
||||
}
|
||||
|
||||
method(#class) atLevel: level logNl: message and: message2
|
||||
{
|
||||
^self atLevel: level log: message and: message2 and: S'\n'.
|
||||
}
|
||||
|
||||
method(#class) log: message
|
||||
{
|
||||
^self atLevel: System.Log.INFO log: message.
|
||||
}
|
||||
|
||||
method(#class) log: message and: message2
|
||||
{
|
||||
^self atLevel: System.Log.INFO log: message and: message2.
|
||||
}
|
||||
|
||||
method(#class) logNl: message
|
||||
{
|
||||
^self atLevel: System.Log.INFO logNl: message.
|
||||
}
|
||||
|
||||
method(#class) logNl: message and: message2
|
||||
{
|
||||
^self atLevel: System.Log.INFO logNl: message and: message2.
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -47,4 +47,9 @@ class(#pointer) Class(Apex)
|
||||
].
|
||||
^false
|
||||
}*)
|
||||
|
||||
method nsdic
|
||||
{
|
||||
^self.nsdic
|
||||
}
|
||||
}
|
||||
|
@ -268,7 +268,11 @@ class MyObject(Object)
|
||||
|
||||
method(#class) main
|
||||
{
|
||||
|a i |
|
||||
|a i|
|
||||
|
||||
System _getUint8(1,2).
|
||||
'JJJJJJJJJJ' dump.
|
||||
|
||||
|
||||
a := 100.
|
||||
## PROBLEM: the following double loop will exhaust the stack
|
||||
@ -318,16 +322,20 @@ class MyObject(Object)
|
||||
}
|
||||
}*)
|
||||
|
||||
System logNl: 'Sleeping start now....'.
|
||||
|
||||
|
||||
|
||||
(* basicAt: 12 to access the nsdic field. use a proper method once it's defined in Class *)
|
||||
(System basicAt: 12) keysAndValuesDo: [:k :v |
|
||||
(System nsdic) keysAndValuesDo: [:k :v |
|
||||
k dump.
|
||||
v dump.
|
||||
'------------' dump.
|
||||
].
|
||||
|
||||
Processor sleepFor: 3. ## DEBUG VM... VM WAITING FOR 10 SECS instead of 3.
|
||||
|
||||
(System at: #Processor) dump.
|
||||
System logNl: 'Sleeping start now....'.
|
||||
Processor sleepFor: 2.
|
||||
}
|
||||
|
||||
(*
|
||||
|
@ -2,6 +2,7 @@
|
||||
#include 'Context.moo'.
|
||||
#include 'Except.moo'.
|
||||
#include 'Class.moo'.
|
||||
#include 'System.moo'.
|
||||
#include 'Boolean.moo'.
|
||||
#include 'Magnitu.moo'.
|
||||
#include 'Collect.moo'.
|
||||
|
@ -42,7 +42,7 @@ class Stdio(Object) from 'stdio'
|
||||
}
|
||||
*)
|
||||
|
||||
method format (fmt)
|
||||
method(#variadic) format (fmt)
|
||||
{
|
||||
| a b c |
|
||||
'THIS IS FORMAT' dump.
|
||||
|
150
moo/kernel/System.moo
Normal file
150
moo/kernel/System.moo
Normal file
@ -0,0 +1,150 @@
|
||||
## TODO: consider if System can replace Apex itself.
|
||||
## System, being the top class, seems to give very natural way of
|
||||
## offering global system-level functions and interfaces.
|
||||
##
|
||||
## class System(nil) { ... }
|
||||
## class Object(System) { .... }
|
||||
## System at: #
|
||||
## System logNl: 'xxxxx'.
|
||||
## System getUint8(ptr,offset)
|
||||
|
||||
class System(Apex)
|
||||
{
|
||||
}
|
||||
|
||||
pooldic System.Log
|
||||
{
|
||||
## -----------------------------------------------------------
|
||||
## defines log levels
|
||||
## these items must follow defintions in moo.h
|
||||
## -----------------------------------------------------------
|
||||
|
||||
DEBUG := 1.
|
||||
INFO := 2.
|
||||
WARN := 4.
|
||||
ERROR := 8.
|
||||
FATAL := 16.
|
||||
}
|
||||
|
||||
extend System
|
||||
{
|
||||
## the following methods may not look suitable to be placed
|
||||
## inside a system dictionary. but they are here for quick and dirty
|
||||
## output production from the moo code.
|
||||
## System logNl: 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'.
|
||||
##
|
||||
method(#class) atLevel: level log: message
|
||||
{
|
||||
<primitive: #_log>
|
||||
## do nothing upon logging failure
|
||||
}
|
||||
|
||||
method(#class) atLevel: level log: message and: message2
|
||||
{
|
||||
<primitive: #_log>
|
||||
## do nothing upon logging failure
|
||||
}
|
||||
|
||||
method(#class) atLevel: level log: message and: message2 and: message3
|
||||
{
|
||||
<primitive: #_log>
|
||||
## do nothing upon logging failure
|
||||
}
|
||||
|
||||
method(#class) atLevel: level logNl: message
|
||||
{
|
||||
## the #_log primitive accepts an array.
|
||||
## so the following lines should work also.
|
||||
## | x |
|
||||
## x := Array new: 2.
|
||||
## x at: 0 put: message.
|
||||
## x at: 1 put: S'\n'.
|
||||
## ^self atLevel: level log: x.
|
||||
|
||||
^self atLevel: level log: message and: S'\n'.
|
||||
}
|
||||
|
||||
method(#class) atLevel: level logNl: message and: message2
|
||||
{
|
||||
^self atLevel: level log: message and: message2 and: S'\n'.
|
||||
}
|
||||
|
||||
method(#class) log: message
|
||||
{
|
||||
^self atLevel: System.Log.INFO log: message.
|
||||
}
|
||||
|
||||
method(#class) log: message and: message2
|
||||
{
|
||||
^self atLevel: System.Log.INFO log: message and: message2.
|
||||
}
|
||||
|
||||
method(#class) logNl: message
|
||||
{
|
||||
^self atLevel: System.Log.INFO logNl: message.
|
||||
}
|
||||
|
||||
method(#class) logNl: message and: message2
|
||||
{
|
||||
^self atLevel: System.Log.INFO logNl: message and: message2.
|
||||
}
|
||||
|
||||
(* nsdic access *)
|
||||
method(#class) at: key
|
||||
{
|
||||
^self nsdic at: key
|
||||
}
|
||||
|
||||
method(#class) at: key put: value
|
||||
{
|
||||
^self nsdic at: key put: value
|
||||
}
|
||||
|
||||
(* raw memory access *)
|
||||
method(#class,#primitive) _getInt8 (rawptr, offset). ## <primitive: #System__getInt8>
|
||||
method(#class,#primitive) _getInt16 (rawptr, offset).
|
||||
method(#class,#primitive) _getInt32 (rawptr, offset).
|
||||
method(#class,#primitive) _getInt64 (rawptr, offset).
|
||||
method(#class,#primitive) _getUint8 (rawptr, offset). ## <primitive: #System__getUint8>
|
||||
method(#class,#primitive) _getUint16 (rawptr, offset).
|
||||
method(#class,#primitive) _getUint32 (rawptr, offset).
|
||||
method(#class,#primitive) _getUint64 (rawptr, offset).
|
||||
|
||||
(*
|
||||
method(#class,#primitive) _putInt8 (rawptr, offset, value).
|
||||
method(#class,#primitive) _putInt16 (rawptr, offset, value).
|
||||
method(#class,#primitive) _putInt32 (rawptr, offset, value).
|
||||
method(#class,#primitive) _putInt64 (rawptr, offset, value).
|
||||
method(#class,#primitive) _putUint8 (rawptr, offset, value).
|
||||
method(#class,#primitive) _putUint16 (rawptr, offset, value).
|
||||
method(#class,#primitive) _putUint32 (rawptr, offset, value).
|
||||
method(#class,#primitive) _putUint64 (rawptr, offset, value),
|
||||
*)
|
||||
|
||||
(*
|
||||
method(#class) getUint8: rawptr at: offset
|
||||
{
|
||||
<primitive: #_get_uint8>
|
||||
}
|
||||
|
||||
method(#class) getUint16: rawptr at: offset
|
||||
{
|
||||
<primitive: #_get_uint16>
|
||||
}
|
||||
|
||||
method(#class) getUint32: rawptr at: offset
|
||||
{
|
||||
<primitive: #_get_uint32>
|
||||
}
|
||||
|
||||
method(#class) getUint64: rawptr at: offset
|
||||
{
|
||||
<primitive: #_get_uint64>
|
||||
}
|
||||
|
||||
method(#class) putUint8: value rawptr: rawptr at: offset
|
||||
{
|
||||
<primitive: #_get_uint8>
|
||||
}*)
|
||||
}
|
||||
|
@ -81,6 +81,7 @@ class MyObject(Object)
|
||||
'duplicate modifier'
|
||||
'wrong method name'
|
||||
'duplicate method name'
|
||||
'invalid variadic method definition'
|
||||
'duplicate argument name'
|
||||
'duplicate temporary variable name'
|
||||
'duplicate variable name'
|
||||
|
Reference in New Issue
Block a user