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