touched up some primitive functions
This commit is contained in:
		| @ -90,76 +90,46 @@ extend Apex | ||||
|  | ||||
| 	## ------------------------------------------------------- | ||||
| 	## ------------------------------------------------------- | ||||
| 	##method(#dual,#primitive,#lenient) _shallowCopy. | ||||
| 	##method(#dual,#primitive) shallowCopy. | ||||
| 	 | ||||
| 	method(#dual) shallowCopy | ||||
| 	{ | ||||
| 		<primitive: #_shallow_copy> | ||||
| 		self primitiveFailed(thisContext method). | ||||
| 	} | ||||
| 	method(#dual,#primitive,#lenient) _shallowCopy. | ||||
| 	method(#dual,#primitive) shallowCopy. | ||||
|  | ||||
| 	 | ||||
| 	## ------------------------------------------------------- | ||||
| 	## ------------------------------------------------------- | ||||
| 	method(#dual,#primitive,#lenient) _basicSize. | ||||
| 	method(#dual,#primitive) basicSize. | ||||
|  | ||||
| 	method(#dual) basicAt: index | ||||
| 	{ | ||||
| 		| perr | | ||||
| 		 | ||||
| 		<primitive: #_basic_at> | ||||
|  | ||||
| ## TODO: create a common method that translate a primitive error to some standard exceptions of primitive failure. | ||||
| 		perr := thisProcess primError. | ||||
| 		if (perr == Error.Code.ERANGE) { self index: index outOfRange: (self basicSize) } | ||||
| 		elsif (perr == Error.Code.EPERM) { self messageProhibited: #basicAt } | ||||
| 		else { self primitiveFailed } | ||||
| 	} | ||||
|  | ||||
| 	method(#dual) basicAt: index put: anObject | ||||
| 	{ | ||||
| 		| perr | | ||||
| 		 | ||||
| 		<primitive: #_basic_at_put> | ||||
|  | ||||
| 		perr := thisProcess primError. | ||||
| 		if (perr == Error.Code.ERANGE) { self index: index outOfRange: (self basicSize) } | ||||
| 		elsif (perr == Error.Code.EPERM) { self messageProhibited: #basicAt:put: } | ||||
| 		else { self primitiveFailed } | ||||
| 	} | ||||
| 	method(#dual,#primitive) basicAt: index. | ||||
| 	method(#dual,#primitive) basicAt: index put: value. | ||||
|  | ||||
| 	(* ------------------------------------------------------------------ | ||||
| 	 * FINALIZATION SUPPORT | ||||
| 	 * ------------------------------------------------------------------ *) | ||||
| 	method(#dual,#primitive) addToBeFinalized. | ||||
| 	##method(#dual,#primitive) removeToBeFinalized. | ||||
| 	method(#dual,#primitive) removeToBeFinalized. | ||||
|  | ||||
| 	(* ------------------------------------------------------------------ | ||||
| 	 * HASHING | ||||
| 	 * ------------------------------------------------------------------ *) | ||||
| 	method(#dual,#primitive) hash. | ||||
|  | ||||
| 	(* | ||||
| 	method(#dual) hash | ||||
| 	{ | ||||
| 		<primitive: #_hash> | ||||
| 		<primitive: #Apex_hash> | ||||
| 		self subclassResponsibility: #hash | ||||
| 	} | ||||
| 	}*) | ||||
|  | ||||
| 	(* ------------------------------------------------------------------ | ||||
| 	 * IDENTITY TEST | ||||
| 	 * ------------------------------------------------------------------ *) | ||||
|  | ||||
| 	method(#dual) == anObject | ||||
| 	{ | ||||
| 		(* check if the receiver is identical to anObject. | ||||
| 		 * this doesn't compare the contents *) | ||||
| 		<primitive: #_identical> | ||||
| 		self primitiveFailed. | ||||
| 	} | ||||
| 	## check if the receiver is identical to anObject. | ||||
| 	## this doesn't compare the contents  | ||||
| 	method(#dual, #primitive) == anObject. | ||||
|  | ||||
| 	method(#dual) ~~ anObject | ||||
| 	{ | ||||
| 		<primitive: #_not_identical> | ||||
| 		<primitive: #'Apex_~~'> | ||||
| 		^(self == anObject) not. | ||||
| 	} | ||||
|  | ||||
| @ -168,13 +138,13 @@ extend Apex | ||||
| 	 * ------------------------------------------------------------------ *) | ||||
| 	method(#dual) = anObject | ||||
| 	{ | ||||
| 		<primitive: #_equal> | ||||
| 		<primitive: #'Apex_='> | ||||
| 		self subclassResponsibility: #= | ||||
| 	} | ||||
| 	 | ||||
| 	method(#dual) ~= anObject | ||||
| 	{ | ||||
| 		<primitive: #_not_equal> | ||||
| 		<primitive: #'Apex_~='> | ||||
| 		^(self = anObject) not. | ||||
| 	} | ||||
|  | ||||
| @ -184,7 +154,7 @@ extend Apex | ||||
| 	 * ------------------------------------------------------------------ *) | ||||
|  | ||||
| 	method(#dual,#primitive) class. | ||||
| 	  | ||||
|  | ||||
| 	method(#dual) isNil | ||||
| 	{ | ||||
| 		## ^self == nil. | ||||
| @ -243,50 +213,41 @@ extend Apex | ||||
|  | ||||
| 	method(#dual) isKindOf: aClass | ||||
| 	{ | ||||
| 		<primitive: #_is_kind_of> | ||||
| 		<primitive: #Apex_isKindOf:> | ||||
| 		^(self isMemberOf: aClass) or: [self class inheritsFrom: aClass]. | ||||
| 	} | ||||
|  | ||||
| 	## ------------------------------------------------------- | ||||
| 	## ------------------------------------------------------- | ||||
|  | ||||
| 	method(#dual) respondsTo: selector | ||||
| 	{ | ||||
| 		<primitive: #_responds_to> | ||||
| 		self primitiveFailed | ||||
| 	} | ||||
| 	method(#dual,#primitive) respondsTo: selector. | ||||
|  | ||||
| 	## ------------------------------------------------------- | ||||
| 	## ------------------------------------------------------- | ||||
|  | ||||
| 	method(#dual,#variadic) perform(selector) | ||||
| 	{ | ||||
| 		<primitive: #_perform> | ||||
| 		self primitiveFailed | ||||
| 	} | ||||
| 	method(#dual,#variadic,#primitive) perform(selector). | ||||
|  | ||||
| 	method(#dual) perform: selector | ||||
| 	{ | ||||
| 		<primitive: #_perform> | ||||
| 		<primitive: #Apex_perform> | ||||
| 		self primitiveFailed | ||||
| 	} | ||||
| 	 | ||||
|  | ||||
| 	method(#dual) perform: selector with: arg1 | ||||
| 	{ | ||||
| 		<primitive: #_perform> | ||||
| 		<primitive: #Apex_perform> | ||||
| 		self primitiveFailed | ||||
| 	} | ||||
|  | ||||
| 	method(#dual) perform: selector with: arg1 with: arg2 | ||||
| 	{ | ||||
| 		<primitive: #_perform> | ||||
| 		<primitive: #Apex_perform> | ||||
| 		self primitiveFailed | ||||
| 	} | ||||
|  | ||||
| 	method(#dual) perform: selector with: arg1 with: arg2 with: arg3 | ||||
| 	{ | ||||
| 		<primitive: #_perform> | ||||
| 		<primitive: #Apex_perform> | ||||
| 		self primitiveFailed | ||||
| 	} | ||||
|  | ||||
|  | ||||
| @ -205,14 +205,14 @@ class(#character,#final,#limited,#immutable) Symbol(String) | ||||
| 	method = anObject | ||||
| 	{ | ||||
| 		(* for a symbol, equality check is the same as the identity check *) | ||||
| 		<primitive: #_identical> | ||||
| 		<primitive: #'Apex_=='> | ||||
| 		self primitiveFailed. | ||||
| 	} | ||||
|  | ||||
| 	method ~= anObject | ||||
| 	{ | ||||
| 		(* for a symbol, equality check is the same as the identity check *) | ||||
| 		<primitive: #_not_identical> | ||||
| 		<primitive: #'Apex_~~'> | ||||
| 		^(self == anObject) not. | ||||
| 	} | ||||
| } | ||||
|  | ||||
| @ -56,22 +56,20 @@ class(#pointer,#final,#limited) MethodContext(Context) | ||||
| 		^self.ip + 1 | ||||
| 	} | ||||
|  | ||||
| 	method goto: anInteger | ||||
| 	{ | ||||
| 		<primitive: #_context_goto> | ||||
| 		self primitiveFailed. ## TODO: need to make this a hard failure? | ||||
| 	} | ||||
|  | ||||
| 	method pc: anInteger | ||||
| 	{ | ||||
| 		self.ip := anInteger. | ||||
| 	} | ||||
|  | ||||
| 	## it is similar to the pc: method but it doesn't  | ||||
| 	## push the return value to the stack. | ||||
| 	method(#primitive) goto: pc. | ||||
|  | ||||
| 	method sp | ||||
| 	{ | ||||
| 		^self.sp. | ||||
|  | ||||
| 	} | ||||
|  | ||||
| 	method sp: new_sp | ||||
| 	{ | ||||
| 		self.sp := new_sp | ||||
| @ -113,55 +111,43 @@ class(#pointer,#final,#limited) BlockContext(Context) | ||||
| 		^self.home vargAt: index | ||||
| 	} | ||||
|  | ||||
| ## TODO: how can i pass variadic arguments to newProcess | ||||
| ## method(#variadic) fork() -> how to pass them to newProcess??? | ||||
| 	method fork  | ||||
| 	{ | ||||
| 		## crate a new process in the runnable state | ||||
| 		^self newProcess resume. | ||||
| 	} | ||||
|  | ||||
| 	method newProcess | ||||
| 	{ | ||||
| 		## create a new process in the suspended state | ||||
| 		<primitive: #_block_new_process> | ||||
| 		self primitiveFailed. | ||||
| 	} | ||||
| 	## create a new process in the suspended state | ||||
| 	method(#variadic,#primitive) newProcess(). | ||||
|  | ||||
| 	method newProcessWith: anArray | ||||
| 	{ | ||||
| 		## create a new process in the suspended state passing the elements | ||||
| 		## of anArray as block arguments | ||||
| 		<primitive: #_block_new_process> | ||||
| 		self primitiveFailed. | ||||
| 	} | ||||
| 	## evaluate the block | ||||
| 	method(#variadic,#primitive) value(). | ||||
|  | ||||
| 	method value | ||||
| 	{ | ||||
| 		<primitive: #_block_value> | ||||
| 		self primitiveFailed. | ||||
| 	} | ||||
| 	method value: a  | ||||
| 	{ | ||||
| 		<primitive: #_block_value> | ||||
| 		<primitive: #BlockContext_value> | ||||
| 		self primitiveFailed. | ||||
| 	} | ||||
| 	method value: a value: b | ||||
| 	{ | ||||
| 		<primitive: #_block_value> | ||||
| 		<primitive: #BlockContext_value> | ||||
| 		self primitiveFailed. | ||||
| 	} | ||||
| 	method value: a value: b value: c | ||||
| 	{ | ||||
| 		<primitive: #_block_value> | ||||
| 		<primitive: #BlockContext_value> | ||||
| 		self primitiveFailed. | ||||
| 	} | ||||
| 	method value: a value: b value: c value: d | ||||
| 	{ | ||||
| 		<primitive: #_block_value> | ||||
| 		<primitive: #BlockContext_value> | ||||
| 		self primitiveFailed. | ||||
| 	} | ||||
| 	method value: a value: b value: c value: d value: e | ||||
| 	{ | ||||
| 		<primitive: #_block_value> | ||||
| 		<primitive: #BlockContext_value> | ||||
| 		self primitiveFailed. | ||||
| 	} | ||||
|  | ||||
|  | ||||
| @ -39,7 +39,7 @@ TODO: can i convert 'thisProcess primError' to a relevant exception? | ||||
| 	{ | ||||
| 		^(self class name) & ' - ' & self.messageText. | ||||
| 	} | ||||
|  | ||||
|       | ||||
| 	method signal | ||||
| 	{ | ||||
| 		| exctx exblk retval actpos ctx | | ||||
| @ -487,6 +487,11 @@ extend Apex | ||||
| 		if (msg isNil) { msg := ec asString }. | ||||
| 		if (method notNil) { msg := msg & ' - ' & (method owner name) & '>>' & (method name) }. | ||||
|  | ||||
| 		### TODO: convert an exception to a more specific one depending on the error code. | ||||
| 		###if (ec == Error.Code.ERANGE) { self index: index outOfRange: (self basicSize) } | ||||
| 		### elsif (ec == Error.Code.EPERM) { self messageProhibited: method name } | ||||
| 		### elsif (ec == Error.Code.ENOIMPL) { self subclassResponsibility: method name }. | ||||
|  | ||||
| 		(PrimitiveFailureException (* in: method *) withErrorCode: ec) signal: msg. | ||||
| 	} | ||||
|  | ||||
|  | ||||
		Reference in New Issue
	
	Block a user