fixed the bug not popping an argument in the _integer_inttostr primitive.
added a new primitive _processor_return_to_and_eval to support proper exception handling
This commit is contained in:
		@ -58,7 +58,7 @@
 | 
				
			|||||||
		| newsize newstr self_ubound |
 | 
							| newsize newstr self_ubound |
 | 
				
			||||||
		newsize := self basicSize + aString basicSize.
 | 
							newsize := self basicSize + aString basicSize.
 | 
				
			||||||
		##newstr := self class basicNew: newsize.
 | 
							##newstr := self class basicNew: newsize.
 | 
				
			||||||
		newstr := String basicNew: newsize.  ## TODO: redefine , for symbol... it's a work arouind... symbols are not contacated to a symbol at this moment.
 | 
							newstr := String basicNew: newsize.  ## TODO: redefine , for symbol... it's a work arouind... symbols are not concatenated to a symbol at this moment.
 | 
				
			||||||
		self_ubound := self ubound.
 | 
							self_ubound := self ubound.
 | 
				
			||||||
		0 to: self_ubound do: [:i | newstr at: i put: (self at: i)].
 | 
							0 to: self_ubound do: [:i | newstr at: i put: (self at: i)].
 | 
				
			||||||
		0 to: (aString ubound) do: [:i | newstr at: (i + self_ubound + 1) put: (aString at: i)].
 | 
							0 to: (aString ubound) do: [:i | newstr at: (i + self_ubound + 1) put: (aString at: i)].
 | 
				
			||||||
 | 
				
			|||||||
@ -328,13 +328,15 @@ thisContext isExceptionHandlerContext dump.
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	#method ensure: aBlock
 | 
						#method ensure: aBlock
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
 | 
					 | 
				
			||||||
## TODO: ensure that the ensured block is executed after exception handler...
 | 
					## TODO: ensure that the ensured block is executed after exception handler...
 | 
				
			||||||
		| value |
 | 
							| v |
 | 
				
			||||||
		value := self on: Exception do: [:ex | aBlock value. ex pass].
 | 
							v := self on: Exception do: [:ex | 
 | 
				
			||||||
		## value := self valueAndResumeOnUnwind.
 | 
					 | 
				
			||||||
			aBlock value.
 | 
								aBlock value.
 | 
				
			||||||
		^value
 | 
								ex pass
 | 
				
			||||||
 | 
							].
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							aBlock value.
 | 
				
			||||||
 | 
							^v
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	#method ifCurtailed: aBlock
 | 
						#method ifCurtailed: aBlock
 | 
				
			||||||
@ -425,7 +427,20 @@ thisContext isExceptionHandlerContext dump.
 | 
				
			|||||||
	{
 | 
						{
 | 
				
			||||||
		self.handlerContext notNil
 | 
							self.handlerContext notNil
 | 
				
			||||||
			ifTrue: [
 | 
								ifTrue: [
 | 
				
			||||||
				Processor return: (self.handlerBlock value: self) to: (self.handlerContext sender)
 | 
					##'RETURNING TO....' dump.
 | 
				
			||||||
 | 
					##self.handlerContext  dump.
 | 
				
			||||||
 | 
					##self.handlerContext sender dump.
 | 
				
			||||||
 | 
					##' ............' dump.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									## arrange to execute the hander block after having returned 
 | 
				
			||||||
 | 
									## to the sender of the exception handler context.
 | 
				
			||||||
 | 
									## if handler block is evaluated before returning, an
 | 
				
			||||||
 | 
									## exception raised in the handler block causes a kind of
 | 
				
			||||||
 | 
									## a recursive call to here.
 | 
				
			||||||
 | 
									##Processor return: (self.handlerBlock value: self) to: (self.handlerContext sender)
 | 
				
			||||||
 | 
									## so use a different primitive method that evaluate the block
 | 
				
			||||||
 | 
									## after having returned to the given context.
 | 
				
			||||||
 | 
									Processor returnTo: (self.handlerContext sender) andEval: (self.handlerBlock) with: self.
 | 
				
			||||||
			]
 | 
								]
 | 
				
			||||||
			ifFalse: [ 
 | 
								ifFalse: [ 
 | 
				
			||||||
				('### EXCEPTION NOT HANDLED #### ', self class name, ' - ', self messageText) dump.
 | 
									('### EXCEPTION NOT HANDLED #### ', self class name, ' - ', self messageText) dump.
 | 
				
			||||||
@ -434,13 +449,6 @@ thisContext isExceptionHandlerContext dump.
 | 
				
			|||||||
			].
 | 
								].
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
##	#method handlerContext
 | 
					 | 
				
			||||||
##	{
 | 
					 | 
				
			||||||
##		(self.handlerContext notNil) ifTrue: [ ^self.handlerContext ].
 | 
					 | 
				
			||||||
##		self findHandlerContextStartingFrom: self.signalContext.
 | 
					 | 
				
			||||||
##		^self.handlerContext.
 | 
					 | 
				
			||||||
##	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	#method findHandlerContextStartingFrom: aContext
 | 
						#method findHandlerContextStartingFrom: aContext
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		## Find exception handling context starting from a given context
 | 
							## Find exception handling context starting from a given context
 | 
				
			||||||
@ -448,6 +456,7 @@ thisContext isExceptionHandlerContext dump.
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
		ctx := aContext.
 | 
							ctx := aContext.
 | 
				
			||||||
		[ ctx notNil ] whileTrue: [
 | 
							[ ctx notNil ] whileTrue: [
 | 
				
			||||||
 | 
					##ctx dump.
 | 
				
			||||||
			##(ctx handles: self) ifTrue: [ ^ ctx ].
 | 
								##(ctx handles: self) ifTrue: [ ^ ctx ].
 | 
				
			||||||
			(ctx isExceptionHandlerContext) ifTrue: [
 | 
								(ctx isExceptionHandlerContext) ifTrue: [
 | 
				
			||||||
				| blk |
 | 
									| blk |
 | 
				
			||||||
@ -455,12 +464,13 @@ thisContext isExceptionHandlerContext dump.
 | 
				
			|||||||
				(blk notNil) ifTrue: [ 
 | 
									(blk notNil) ifTrue: [ 
 | 
				
			||||||
					self.handlerBlock := blk. 
 | 
										self.handlerBlock := blk. 
 | 
				
			||||||
					self.handlerContext := ctx. 
 | 
										self.handlerContext := ctx. 
 | 
				
			||||||
 | 
					##'-------------' dump.
 | 
				
			||||||
					^ctx 
 | 
										^ctx 
 | 
				
			||||||
				].
 | 
									].
 | 
				
			||||||
			].
 | 
								].
 | 
				
			||||||
			ctx := ctx sender
 | 
								ctx := ctx sender
 | 
				
			||||||
		].
 | 
							].
 | 
				
			||||||
 | 
					##'-------------' dump.
 | 
				
			||||||
		## no handler is found
 | 
							## no handler is found
 | 
				
			||||||
		self.handlerBlock := nil.
 | 
							self.handlerBlock := nil.
 | 
				
			||||||
		self.handlerContext := nil.
 | 
							self.handlerContext := nil.
 | 
				
			||||||
 | 
				
			|||||||
@ -401,6 +401,12 @@
 | 
				
			|||||||
		self primitiveFailed.
 | 
							self primitiveFailed.
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#method returnTo: anObject andEval: aBlock with: arg
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							<primitive: #_processor_return_to_and_eval>
 | 
				
			||||||
 | 
							self primitiveFailed.
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	#method forceContext: aContext
 | 
						#method forceContext: aContext
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		<primitive: #_processor_force_context>
 | 
							<primitive: #_processor_force_context>
 | 
				
			||||||
 | 
				
			|||||||
@ -25,6 +25,10 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#class Character(Magnitude)
 | 
					#class Character(Magnitude)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						## #method basicSize
 | 
				
			||||||
 | 
						## {
 | 
				
			||||||
 | 
						## 	^0
 | 
				
			||||||
 | 
						## }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#class Number(Magnitude)
 | 
					#class Number(Magnitude)
 | 
				
			||||||
@ -153,7 +157,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	#method asString
 | 
						#method asString
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		self printStringRadix: 10
 | 
							^self printStringRadix: 10
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	#method printStringRadix: aNumber
 | 
						#method printStringRadix: aNumber
 | 
				
			||||||
@ -213,6 +217,10 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#class SmallInteger(Integer)
 | 
					#class SmallInteger(Integer)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						## #method basicSize
 | 
				
			||||||
 | 
						## {
 | 
				
			||||||
 | 
						## 	^0
 | 
				
			||||||
 | 
						## }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#class(#liword) LargeInteger(Integer)
 | 
					#class(#liword) LargeInteger(Integer)
 | 
				
			||||||
 | 
				
			|||||||
@ -67,7 +67,7 @@
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	#method(#class) main
 | 
						#method(#class) main987
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		|t1 t2 s1 s2 s3|
 | 
							|t1 t2 s1 s2 s3|
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -110,18 +110,41 @@
 | 
				
			|||||||
		s1 wait.
 | 
							s1 wait.
 | 
				
			||||||
"
 | 
					"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
 | 
						#method(#class) main
 | 
				
			||||||
"
 | 
						{
 | 
				
			||||||
		| v1 |
 | 
							| v1 |
 | 
				
			||||||
		'START OF MAIN' dump.
 | 
							'START OF MAIN' dump.
 | 
				
			||||||
		##[1 xxx] ifCurtailed: ['XXXXXXXX CURTAILED XXXXXXXXX' dump].
 | 
							##[1 xxx] ifCurtailed: ['XXXXXXXX CURTAILED XXXXXXXXX' dump].
 | 
				
			||||||
		##['ENSURE TEST' dump] ensure: ['XXXXXXXXX ENSURE XXXXXXXXXXXXXx' dump].
 | 
							##['ENSURE TEST' dump] ensure: ['XXXXXXXXX ENSURE XXXXXXXXXXXXXx' dump].
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		v1 := [ ['kkk' dump.] ensure: ['XXXXXXXXX ENSURE XXXXXXXXXXXXXx' dump. 30] ] on: Exception do: [:ex | 'EXCEPTION OUTSIDE ENSURE...' dump.  ].
 | 
							##v1 := [ ['kkk' dump.] ensure: ['XXXXXXXXX ENSURE XXXXXXXXXXXXXx' dump. 30] ] on: Exception do: [:ex | 'EXCEPTION OUTSIDE ENSURE...' dump.  ].
 | 
				
			||||||
		v1 dump.
 | 
							##v1 dump.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		'END OF MAIN' dump."
 | 
					
 | 
				
			||||||
 | 
							##[ Exception signal: 'simulated error' ] on: Exception do: [:ex | 'CAUGHT...' dump. Exception signal: 'jjjjjjj' ].
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							"[
 | 
				
			||||||
 | 
									[ Exception signal: 'simulated error' ] ensure: ['ensure 1' dump ].
 | 
				
			||||||
 | 
							] on: Exception do: [:ex | ('EXCETION - ' , ex messageText) dump. Exception signal: 'qqq'. ]."
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							"[1 xxx] ifCurtailed: ['XXXXXXXX CURTAILED XXXXXXXXX' dump. Exception signal: 'jjjj']."
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							v1 := [
 | 
				
			||||||
 | 
								| k |
 | 
				
			||||||
 | 
								k := 99.
 | 
				
			||||||
 | 
								[
 | 
				
			||||||
 | 
									[ Exception signal: 'simulated error' ] ensure: [('ensure 1 ', (k asString)) dump ].
 | 
				
			||||||
 | 
								] ensure: ['ensure 2' dump ].
 | 
				
			||||||
 | 
							] on: Exception do: [:ex | 
 | 
				
			||||||
 | 
								('EXCETION - ' , ex messageText) dump.
 | 
				
			||||||
 | 
								## Exception signal: 'qqq'.
 | 
				
			||||||
 | 
							].
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							'--------------------------------' dump.
 | 
				
			||||||
 | 
							v1 dump.
 | 
				
			||||||
 | 
							'END OF MAIN' dump.
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	#method(#class) main22222
 | 
						#method(#class) main22222
 | 
				
			||||||
 | 
				
			|||||||
@ -40,11 +40,19 @@
 | 
				
			|||||||
	#method(#class) main2
 | 
						#method(#class) main2
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		| k |
 | 
							| k |
 | 
				
			||||||
 | 
							'BEGINNING OF main2' dump.
 | 
				
			||||||
		k := ['this is test-011' dump. Exception signal: 'main2 screwed...'. 8888 dump. ] 
 | 
							k := ['this is test-011' dump. Exception signal: 'main2 screwed...'. 8888 dump. ] 
 | 
				
			||||||
			on: Exception do: [ :ex | 'Exception occurred' dump.  ex messageText dump. 'Getting back to....' dump. "ex return: 9999." ex pass. 'AFTER RETURN' dump. ].
 | 
								on: Exception do: [ :ex | 
 | 
				
			||||||
 | 
									'Exception occurred' dump.  
 | 
				
			||||||
 | 
									ex messageText dump.
 | 
				
			||||||
 | 
									'Getting back to....' dump.
 | 
				
			||||||
 | 
									"ex return: 9999."
 | 
				
			||||||
 | 
									ex pass.
 | 
				
			||||||
 | 
									'AFTER RETURN' dump. 
 | 
				
			||||||
 | 
								].
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		k dump.
 | 
							k dump.
 | 
				
			||||||
		'END OF test-011' dump.
 | 
							'END OF main2' dump.
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	#method(#class) raise_exception
 | 
						#method(#class) raise_exception
 | 
				
			||||||
@ -138,33 +146,45 @@
 | 
				
			|||||||
		## exception is raised in a new process. it can't be captured
 | 
							## exception is raised in a new process. it can't be captured
 | 
				
			||||||
		## by an exception handler of a calling process.
 | 
							## by an exception handler of a calling process.
 | 
				
			||||||
		## exception handling must not cross the process boundary.
 | 
							## exception handling must not cross the process boundary.
 | 
				
			||||||
 | 
							'BEGINNING OF test11' dump.
 | 
				
			||||||
		[ 
 | 
							[ 
 | 
				
			||||||
			|p | 
 | 
								|p | 
 | 
				
			||||||
			p := [Exception signal: 'Sample Exception' ] newProcess.
 | 
								p := [ Exception signal: 'Exception in a new process of test11'.  ] newProcess.
 | 
				
			||||||
			'JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ' dump.
 | 
								'JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ' dump.
 | 
				
			||||||
			p resume.
 | 
								p resume.
 | 
				
			||||||
		] on: Exception do: [:ex | 'EXCEPTION ----------' dump. ex messageText dump ].
 | 
							] on: Exception do: [:ex | 'EXCEPTION ----------' dump. ex messageText dump ].
 | 
				
			||||||
 | 
							'END OF test11' dump.
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	#method(#class) test12
 | 
						#method(#class) test12
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
 | 
							'BEGINNING OF test12' dump.
 | 
				
			||||||
		[ 
 | 
							[ 
 | 
				
			||||||
			|p | 
 | 
								|p | 
 | 
				
			||||||
			p := [ 
 | 
								p := [ 
 | 
				
			||||||
				[ Exception signal: 'Sample Exception' ] on: Exception do: [:ex | 'EXCEPTION CAUGHT...' dump. ex messageText dump. ]
 | 
									[ Exception signal: 'Exception in a new process of test12' ] 
 | 
				
			||||||
 | 
										on: Exception do: [:ex | 
 | 
				
			||||||
 | 
											('EXCEPTION CAUGHT...in test12 ==> ', (ex messageText)) dump.
 | 
				
			||||||
 | 
										]
 | 
				
			||||||
			] newProcess.
 | 
								] newProcess.
 | 
				
			||||||
			'JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ' dump.
 | 
								'JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ' dump.
 | 
				
			||||||
			p resume.
 | 
								p resume.
 | 
				
			||||||
		] on: Exception do: [:ex | 'EXCEPTION ----------' dump. ex messageText dump ].
 | 
							] on: Exception do: [:ex | 'EXCEPTION ----------' dump. ex messageText dump ].
 | 
				
			||||||
 | 
							'END OF test12' dump.
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	
 | 
					 | 
				
			||||||
	#method(#class) main
 | 
						#method(#class) main
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		'>>>>> BEGINNING OF MAIN' dump.
 | 
							'>>>>> BEGINNING OF MAIN' dump.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	##	[ self main2 ] on: Exception do: [ :ex | 'EXCEPTION CAUGHT IN MAIN....' dump. ex messageText dump. "ex pass." ex resume. ].
 | 
							[ self main2 ] on: Exception do: [ :ex | 
 | 
				
			||||||
 | 
								'EXCEPTION CAUGHT IN MAIN....' dump. 
 | 
				
			||||||
 | 
								ex messageText dump. 
 | 
				
			||||||
 | 
								"ex pass." 
 | 
				
			||||||
 | 
								'Returning back to where the exception has signalled in main2...' dump.
 | 
				
			||||||
 | 
								ex resume. 
 | 
				
			||||||
 | 
							].
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		'##############################' dump.
 | 
							'##############################' dump.
 | 
				
			||||||
	##	self test3.
 | 
						##	self test3.
 | 
				
			||||||
 | 
				
			|||||||
@ -139,7 +139,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if defined(STIX_DEBUG_VM_EXEC)
 | 
					#if defined(STIX_DEBUG_VM_EXEC)
 | 
				
			||||||
#	define LOG_MASK_INST (STIX_LOG_VM | STIX_LOG_MNEMONIC)
 | 
					#	define LOG_MASK_INST (STIX_LOG_IC | STIX_LOG_MNEMONIC)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#	define LOG_INST_0(stix,fmt) STIX_LOG0(stix, LOG_MASK_INST, "\t" fmt "\n")
 | 
					#	define LOG_INST_0(stix,fmt) STIX_LOG0(stix, LOG_MASK_INST, "\t" fmt "\n")
 | 
				
			||||||
#	define LOG_INST_1(stix,fmt,a1) STIX_LOG1(stix, LOG_MASK_INST, "\t" fmt "\n",a1)
 | 
					#	define LOG_INST_1(stix,fmt,a1) STIX_LOG1(stix, LOG_MASK_INST, "\t" fmt "\n",a1)
 | 
				
			||||||
@ -301,7 +301,7 @@ static stix_oop_process_t make_process (stix_t* stix, stix_oop_context_t c)
 | 
				
			|||||||
	STIX_ASSERT ((stix_oop_t)c->sender == stix->_nil);
 | 
						STIX_ASSERT ((stix_oop_t)c->sender == stix->_nil);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if defined(STIX_DEBUG_VM_PROCESSOR)
 | 
					#if defined(STIX_DEBUG_VM_PROCESSOR)
 | 
				
			||||||
	STIX_LOG2 (stix, STIX_LOG_VM | STIX_LOG_DEBUG, "Processor - made process %O of size %zd\n", proc, STIX_OBJ_GET_SIZE(proc));
 | 
						STIX_LOG2 (stix, STIX_LOG_IC | STIX_LOG_DEBUG, "Processor - made process %O of size %zd\n", proc, STIX_OBJ_GET_SIZE(proc));
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
	return proc;
 | 
						return proc;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -309,7 +309,7 @@ static stix_oop_process_t make_process (stix_t* stix, stix_oop_context_t c)
 | 
				
			|||||||
static STIX_INLINE void sleep_active_process (stix_t* stix, int state)
 | 
					static STIX_INLINE void sleep_active_process (stix_t* stix, int state)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
#if defined(STIX_DEBUG_VM_PROCESSOR)
 | 
					#if defined(STIX_DEBUG_VM_PROCESSOR)
 | 
				
			||||||
	STIX_LOG3 (stix, STIX_LOG_VM | STIX_LOG_DEBUG, "Processor - put process %O context %O ip=%zd to sleep\n", stix->processor->active, stix->active_context, stix->ip);
 | 
						STIX_LOG3 (stix, STIX_LOG_IC | STIX_LOG_DEBUG, "Processor - put process %O context %O ip=%zd to sleep\n", stix->processor->active, stix->active_context, stix->ip);
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if defined(STIX_USE_PROCSTK)
 | 
					#if defined(STIX_USE_PROCSTK)
 | 
				
			||||||
@ -341,7 +341,7 @@ static STIX_INLINE void wake_new_process (stix_t* stix, stix_oop_process_t proc)
 | 
				
			|||||||
	SWITCH_ACTIVE_CONTEXT (stix, proc->current_context);
 | 
						SWITCH_ACTIVE_CONTEXT (stix, proc->current_context);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if defined(STIX_DEBUG_VM_PROCESSOR)
 | 
					#if defined(STIX_DEBUG_VM_PROCESSOR)
 | 
				
			||||||
	STIX_LOG3 (stix, STIX_LOG_VM | STIX_LOG_DEBUG, "Processor - woke up process %O context %O ip=%zd\n", stix->processor->active, stix->active_context, stix->ip);
 | 
						STIX_LOG3 (stix, STIX_LOG_IC | STIX_LOG_DEBUG, "Processor - woke up process %O context %O ip=%zd\n", stix->processor->active, stix->active_context, stix->ip);
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -395,7 +395,7 @@ static STIX_INLINE int chain_into_processor (stix_t* stix, stix_oop_process_t pr
 | 
				
			|||||||
	if (tally >= STIX_SMOOI_MAX)
 | 
						if (tally >= STIX_SMOOI_MAX)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
#if defined(STIX_DEBUG_VM_PROCESSOR)
 | 
					#if defined(STIX_DEBUG_VM_PROCESSOR)
 | 
				
			||||||
		STIX_LOG0 (stix, STIX_LOG_VM | STIX_LOG_FATAL, "Processor - too many process\n");
 | 
							STIX_LOG0 (stix, STIX_LOG_IC | STIX_LOG_FATAL, "Processor - too many process\n");
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
		stix->errnum = STIX_EPFULL;
 | 
							stix->errnum = STIX_EPFULL;
 | 
				
			||||||
		return -1;
 | 
							return -1;
 | 
				
			||||||
@ -494,7 +494,7 @@ static void terminate_process (stix_t* stix, stix_oop_process_t proc)
 | 
				
			|||||||
		/* RUNNING/RUNNABLE ---> TERMINATED */
 | 
							/* RUNNING/RUNNABLE ---> TERMINATED */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	#if defined(STIX_DEBUG_VM_PROCESSOR)
 | 
						#if defined(STIX_DEBUG_VM_PROCESSOR)
 | 
				
			||||||
		STIX_LOG1 (stix, STIX_LOG_VM | STIX_LOG_DEBUG, "Processor - process %O RUNNING/RUNNABLE->TERMINATED\n", proc);
 | 
							STIX_LOG1 (stix, STIX_LOG_IC | STIX_LOG_DEBUG, "Processor - process %O RUNNING/RUNNABLE->TERMINATED\n", proc);
 | 
				
			||||||
	#endif
 | 
						#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (proc == stix->processor->active)
 | 
							if (proc == stix->processor->active)
 | 
				
			||||||
@ -515,7 +515,7 @@ static void terminate_process (stix_t* stix, stix_oop_process_t proc)
 | 
				
			|||||||
			{
 | 
								{
 | 
				
			||||||
				/* no runnable process after termination */
 | 
									/* no runnable process after termination */
 | 
				
			||||||
				STIX_ASSERT (stix->processor->active == stix->nil_process);
 | 
									STIX_ASSERT (stix->processor->active == stix->nil_process);
 | 
				
			||||||
				STIX_LOG0 (stix, STIX_LOG_VM | STIX_LOG_DEBUG, "No runnable process after process termination\n");
 | 
									STIX_LOG0 (stix, STIX_LOG_IC | STIX_LOG_DEBUG, "No runnable process after process termination\n");
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			else
 | 
								else
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
@ -532,7 +532,7 @@ static void terminate_process (stix_t* stix, stix_oop_process_t proc)
 | 
				
			|||||||
	{
 | 
						{
 | 
				
			||||||
		/* SUSPENDED ---> TERMINATED */
 | 
							/* SUSPENDED ---> TERMINATED */
 | 
				
			||||||
	#if defined(STIX_DEBUG_VM_PROCESSOR)
 | 
						#if defined(STIX_DEBUG_VM_PROCESSOR)
 | 
				
			||||||
		STIX_LOG1 (stix, STIX_LOG_VM | STIX_LOG_DEBUG, "Processor - process %O SUSPENDED->TERMINATED\n", proc);
 | 
							STIX_LOG1 (stix, STIX_LOG_IC | STIX_LOG_DEBUG, "Processor - process %O SUSPENDED->TERMINATED\n", proc);
 | 
				
			||||||
	#endif
 | 
						#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		proc->state = STIX_SMOOI_TO_OOP(PROC_STATE_TERMINATED);
 | 
							proc->state = STIX_SMOOI_TO_OOP(PROC_STATE_TERMINATED);
 | 
				
			||||||
@ -559,7 +559,7 @@ static void resume_process (stix_t* stix, stix_oop_process_t proc)
 | 
				
			|||||||
		STIX_ASSERT ((stix_oop_t)proc->next == stix->_nil);
 | 
							STIX_ASSERT ((stix_oop_t)proc->next == stix->_nil);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	#if defined(STIX_DEBUG_VM_PROCESSOR)
 | 
						#if defined(STIX_DEBUG_VM_PROCESSOR)
 | 
				
			||||||
		STIX_LOG1 (stix, STIX_LOG_VM | STIX_LOG_DEBUG, "Processor - process %O SUSPENDED->RUNNING\n", proc);
 | 
							STIX_LOG1 (stix, STIX_LOG_IC | STIX_LOG_DEBUG, "Processor - process %O SUSPENDED->RUNNING\n", proc);
 | 
				
			||||||
	#endif
 | 
						#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		chain_into_processor (stix, proc); /* TODO: error check */
 | 
							chain_into_processor (stix, proc); /* TODO: error check */
 | 
				
			||||||
@ -589,7 +589,7 @@ static void suspend_process (stix_t* stix, stix_oop_process_t proc)
 | 
				
			|||||||
		/* RUNNING/RUNNABLE ---> SUSPENDED */
 | 
							/* RUNNING/RUNNABLE ---> SUSPENDED */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	#if defined(STIX_DEBUG_VM_PROCESSOR)
 | 
						#if defined(STIX_DEBUG_VM_PROCESSOR)
 | 
				
			||||||
		STIX_LOG1 (stix, STIX_LOG_VM | STIX_LOG_DEBUG, "Processor - process %O RUNNING/RUNNABLE->SUSPENDED\n", proc);
 | 
							STIX_LOG1 (stix, STIX_LOG_IC | STIX_LOG_DEBUG, "Processor - process %O RUNNING/RUNNABLE->SUSPENDED\n", proc);
 | 
				
			||||||
	#endif
 | 
						#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (proc == stix->processor->active)
 | 
							if (proc == stix->processor->active)
 | 
				
			||||||
@ -645,7 +645,7 @@ static void yield_process (stix_t* stix, stix_oop_process_t proc)
 | 
				
			|||||||
		if (nrp != proc) 
 | 
							if (nrp != proc) 
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
		#if defined(STIX_DEBUG_VM_PROCESSOR)
 | 
							#if defined(STIX_DEBUG_VM_PROCESSOR)
 | 
				
			||||||
			STIX_LOG1 (stix, STIX_LOG_VM | STIX_LOG_DEBUG, "Processor - process %O RUNNING->RUNNABLE\n", proc);
 | 
								STIX_LOG1 (stix, STIX_LOG_IC | STIX_LOG_DEBUG, "Processor - process %O RUNNING->RUNNABLE\n", proc);
 | 
				
			||||||
		#endif
 | 
							#endif
 | 
				
			||||||
			switch_to_process (stix, nrp, PROC_STATE_RUNNABLE);
 | 
								switch_to_process (stix, nrp, PROC_STATE_RUNNABLE);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
@ -1043,7 +1043,7 @@ static stix_oop_method_t find_method (stix_t* stix, stix_oop_t receiver, const s
 | 
				
			|||||||
/* TODO: implement method lookup cache */
 | 
					/* TODO: implement method lookup cache */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if defined(STIX_DEBUG_VM_METHOD_LOOKUP)
 | 
					#if defined(STIX_DEBUG_VM_METHOD_LOOKUP)
 | 
				
			||||||
	STIX_LOG3 (stix, STIX_LOG_VM | STIX_LOG_DEBUG, "Method lookup - Finding method %.*S for %O in ", message->len, message->ptr, receiver);
 | 
						STIX_LOG3 (stix, STIX_LOG_IC | STIX_LOG_DEBUG, "Method lookup - Finding method %.*S for %O in ", message->len, message->ptr, receiver);
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	cls = (stix_oop_class_t)STIX_CLASSOF(stix, receiver);
 | 
						cls = (stix_oop_class_t)STIX_CLASSOF(stix, receiver);
 | 
				
			||||||
@ -1053,7 +1053,7 @@ static stix_oop_method_t find_method (stix_t* stix, stix_oop_t receiver, const s
 | 
				
			|||||||
		c = receiver; 
 | 
							c = receiver; 
 | 
				
			||||||
		dic_no = STIX_CLASS_MTHDIC_CLASS;
 | 
							dic_no = STIX_CLASS_MTHDIC_CLASS;
 | 
				
			||||||
#if defined(STIX_DEBUG_VM_METHOD_LOOKUP)
 | 
					#if defined(STIX_DEBUG_VM_METHOD_LOOKUP)
 | 
				
			||||||
	STIX_LOG1 (stix, STIX_LOG_VM | STIX_LOG_DEBUG, "Method lookup - class method dictionary of %O\n", c);
 | 
						STIX_LOG1 (stix, STIX_LOG_IC | STIX_LOG_DEBUG, "Method lookup - class method dictionary of %O\n", c);
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	else
 | 
						else
 | 
				
			||||||
@ -1061,7 +1061,7 @@ static stix_oop_method_t find_method (stix_t* stix, stix_oop_t receiver, const s
 | 
				
			|||||||
		c = (stix_oop_t)cls;
 | 
							c = (stix_oop_t)cls;
 | 
				
			||||||
		dic_no = STIX_CLASS_MTHDIC_INSTANCE;
 | 
							dic_no = STIX_CLASS_MTHDIC_INSTANCE;
 | 
				
			||||||
#if defined(STIX_DEBUG_VM_METHOD_LOOKUP)
 | 
					#if defined(STIX_DEBUG_VM_METHOD_LOOKUP)
 | 
				
			||||||
	STIX_LOG1 (stix, STIX_LOG_VM | STIX_LOG_DEBUG, "Method lookup - instance method dictionary of %O\n", c);
 | 
						STIX_LOG1 (stix, STIX_LOG_IC | STIX_LOG_DEBUG, "Method lookup - instance method dictionary of %O\n", c);
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -1379,16 +1379,25 @@ static int prim_shallow_copy (stix_t* stix, stix_ooi_t nargs)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
static int prim_basic_size (stix_t* stix, stix_ooi_t nargs)
 | 
					static int prim_basic_size (stix_t* stix, stix_ooi_t nargs)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						/* return the number of indexable fields */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	stix_oop_t rcv, sz;
 | 
						stix_oop_t rcv, sz;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	STIX_ASSERT (nargs == 0);
 | 
						STIX_ASSERT (nargs == 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	rcv = STIX_STACK_GETTOP(stix);
 | 
						rcv = STIX_STACK_GETTOP(stix);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (!STIX_OOP_IS_POINTER(rcv))
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							sz = STIX_SMOOI_TO_OOP(0);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
		sz = stix_oowtoint (stix, STIX_OBJ_GET_SIZE(rcv));
 | 
							sz = stix_oowtoint (stix, STIX_OBJ_GET_SIZE(rcv));
 | 
				
			||||||
		if (!sz) return -1; /* hard failure */
 | 
							if (!sz) return -1; /* hard failure */
 | 
				
			||||||
	STIX_STACK_SETTOP(stix, sz);
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						STIX_STACK_SETTOP(stix, sz);
 | 
				
			||||||
	return 1;
 | 
						return 1;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -1979,6 +1988,33 @@ static int prim_processor_return_to (stix_t* stix, stix_ooi_t nargs)
 | 
				
			|||||||
	return 1;
 | 
						return 1;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static int prim_processor_return_to_and_eval (stix_t* stix, stix_ooi_t nargs)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						stix_oop_t rcv, ctx, blk, blkarg;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						STIX_ASSERT (nargs == 3);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						rcv = STIX_STACK_GET(stix, stix->sp - 3);
 | 
				
			||||||
 | 
						ctx = STIX_STACK_GET(stix, stix->sp - 2);
 | 
				
			||||||
 | 
						blk = STIX_STACK_GET(stix, stix->sp - 1);
 | 
				
			||||||
 | 
						blkarg = STIX_STACK_GET(stix, stix->sp);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (rcv != (stix_oop_t)stix->processor) return 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (STIX_CLASSOF(stix, ctx) != stix->_block_context &&
 | 
				
			||||||
 | 
						    STIX_CLASSOF(stix, ctx) != stix->_method_context) return 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (STIX_CLASSOF(stix, blk) != stix->_block_context) return 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						STIX_STACK_POPS (stix, nargs + 1); /* pop arguments and receiver */
 | 
				
			||||||
 | 
						STIX_STACK_PUSH (stix, stix->_nil); /* TODO: change the return value.. */
 | 
				
			||||||
 | 
						SWITCH_ACTIVE_CONTEXT (stix, (stix_oop_context_t)ctx);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						STIX_STACK_PUSH (stix, blk);
 | 
				
			||||||
 | 
						STIX_STACK_PUSH (stix, blkarg);
 | 
				
			||||||
 | 
						return prim_block_value (stix, 1);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int prim_processor_force_context (stix_t* stix, stix_ooi_t nargs)
 | 
					static int prim_processor_force_context (stix_t* stix, stix_ooi_t nargs)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	stix_oop_t rcv, ctx;
 | 
						stix_oop_t rcv, ctx;
 | 
				
			||||||
@ -2358,7 +2394,9 @@ static int prim_integer_inttostr (stix_t* stix, stix_ooi_t nargs)
 | 
				
			|||||||
	str = stix_inttostr (stix, rcv, radix);
 | 
						str = stix_inttostr (stix, rcv, radix);
 | 
				
			||||||
	if (!str) return (stix->errnum == STIX_EINVAL? 0: -1);
 | 
						if (!str) return (stix->errnum == STIX_EINVAL? 0: -1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						STIX_STACK_POP (stix);
 | 
				
			||||||
	STIX_STACK_SETTOP (stix, str);
 | 
						STIX_STACK_SETTOP (stix, str);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return 1;
 | 
						return 1;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -2690,6 +2728,7 @@ static prim_t primitives[] =
 | 
				
			|||||||
	{   2,  3,  prim_processor_add_timed_semaphore,    "_processor_add_timed_semaphore" },
 | 
						{   2,  3,  prim_processor_add_timed_semaphore,    "_processor_add_timed_semaphore" },
 | 
				
			||||||
	{   1,  1,  prim_processor_remove_semaphore,       "_processor_remove_semaphore" },
 | 
						{   1,  1,  prim_processor_remove_semaphore,       "_processor_remove_semaphore" },
 | 
				
			||||||
	{   2,  2,  prim_processor_return_to,              "_processor_return_to" },
 | 
						{   2,  2,  prim_processor_return_to,              "_processor_return_to" },
 | 
				
			||||||
 | 
						{   3,  3,  prim_processor_return_to_and_eval,     "_processor_return_to_and_eval" },
 | 
				
			||||||
	{   1,  1,  prim_processor_force_context,          "_processor_force_context" },
 | 
						{   1,  1,  prim_processor_force_context,          "_processor_force_context" },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	{   1,  1,  prim_integer_add,                      "_integer_add"         },
 | 
						{   1,  1,  prim_integer_add,                      "_integer_add"         },
 | 
				
			||||||
@ -2915,7 +2954,7 @@ static int send_message (stix_t* stix, stix_oop_char_t selector, int to_super, s
 | 
				
			|||||||
		{
 | 
							{
 | 
				
			||||||
			/* this must not happen as long as doesNotUnderstand: is implemented under Apex.
 | 
								/* this must not happen as long as doesNotUnderstand: is implemented under Apex.
 | 
				
			||||||
			 * this check should indicate a very serious internal problem */
 | 
								 * this check should indicate a very serious internal problem */
 | 
				
			||||||
			STIX_LOG4 (stix, STIX_LOG_VM | STIX_LOG_FATAL, 
 | 
								STIX_LOG4 (stix, STIX_LOG_IC | STIX_LOG_FATAL, 
 | 
				
			||||||
				"Fatal error - receiver [%O] of class [%O] doesNotUnderstand: [%.*S]\n", 
 | 
									"Fatal error - receiver [%O] of class [%O] doesNotUnderstand: [%.*S]\n", 
 | 
				
			||||||
				receiver, STIX_CLASSOF(stix, receiver), mthname.len, mthname.ptr);
 | 
									receiver, STIX_CLASSOF(stix, receiver), mthname.len, mthname.ptr);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -3167,7 +3206,7 @@ int stix_execute (stix_t* stix)
 | 
				
			|||||||
		{
 | 
							{
 | 
				
			||||||
			/* no more waiting semaphore and no more process */
 | 
								/* no more waiting semaphore and no more process */
 | 
				
			||||||
			STIX_ASSERT (stix->processor->tally = STIX_SMOOI_TO_OOP(0));
 | 
								STIX_ASSERT (stix->processor->tally = STIX_SMOOI_TO_OOP(0));
 | 
				
			||||||
			STIX_LOG0 (stix, STIX_LOG_VM | STIX_LOG_DEBUG, "No more runnable process\n");
 | 
								STIX_LOG0 (stix, STIX_LOG_IC | STIX_LOG_DEBUG, "No more runnable process\n");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if 0
 | 
					#if 0
 | 
				
			||||||
if (there is semaphore awaited.... )
 | 
					if (there is semaphore awaited.... )
 | 
				
			||||||
@ -3497,7 +3536,7 @@ if (there is semaphore awaited.... )
 | 
				
			|||||||
			case BCODE_JUMP_IF_FALSE_1:
 | 
								case BCODE_JUMP_IF_FALSE_1:
 | 
				
			||||||
			case BCODE_JUMP_IF_FALSE_2:
 | 
								case BCODE_JUMP_IF_FALSE_2:
 | 
				
			||||||
			case BCODE_JUMP_IF_FALSE_3:
 | 
								case BCODE_JUMP_IF_FALSE_3:
 | 
				
			||||||
STIX_LOG0 (stix, STIX_LOG_VM | STIX_LOG_FATAL, "<<<<<<<<<<<<<< JUMP NOT IMPLEMENTED YET >>>>>>>>>>>>\n");
 | 
					STIX_LOG0 (stix, STIX_LOG_IC | STIX_LOG_FATAL, "<<<<<<<<<<<<<< JUMP NOT IMPLEMENTED YET >>>>>>>>>>>>\n");
 | 
				
			||||||
stix->errnum = STIX_ENOIMPL;
 | 
					stix->errnum = STIX_ENOIMPL;
 | 
				
			||||||
return -1;
 | 
					return -1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -3838,7 +3877,7 @@ return -1;
 | 
				
			|||||||
				{
 | 
									{
 | 
				
			||||||
					if (stix->active_context->origin->ip == STIX_SMOOI_TO_OOP(STIX_SMOOI_MIN))
 | 
										if (stix->active_context->origin->ip == STIX_SMOOI_TO_OOP(STIX_SMOOI_MIN))
 | 
				
			||||||
					{
 | 
										{
 | 
				
			||||||
						STIX_LOG0 (stix, STIX_LOG_VM | STIX_LOG_ERROR, "Error - cannot return from dead context\n");
 | 
											STIX_LOG0 (stix, STIX_LOG_IC | STIX_LOG_ERROR, "Error - cannot return from dead context\n");
 | 
				
			||||||
						stix->errnum = STIX_EINTERN; /* TODO: make this error catchable at the stix level... */
 | 
											stix->errnum = STIX_EINTERN; /* TODO: make this error catchable at the stix level... */
 | 
				
			||||||
						return -1;
 | 
											return -1;
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
@ -4091,10 +4130,9 @@ return -1;
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			default:
 | 
								default:
 | 
				
			||||||
				STIX_LOG1 (stix, STIX_LOG_VM | STIX_LOG_FATAL, "Fatal error - unknown byte code 0x%zx\n", bcode);
 | 
									STIX_LOG1 (stix, STIX_LOG_IC | STIX_LOG_FATAL, "Fatal error - unknown byte code 0x%zx\n", bcode);
 | 
				
			||||||
				stix->errnum = STIX_EINTERN;
 | 
									stix->errnum = STIX_EINTERN;
 | 
				
			||||||
				break;
 | 
									break;
 | 
				
			||||||
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -4102,7 +4140,7 @@ done:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	vm_cleanup (stix);
 | 
						vm_cleanup (stix);
 | 
				
			||||||
#if defined(STIX_PROFILE_VM)
 | 
					#if defined(STIX_PROFILE_VM)
 | 
				
			||||||
	STIX_LOG1 (stix, STIX_LOG_VM | STIX_LOG_INFO, "TOTAL_INST_COUTNER = %zu\n", inst_counter);
 | 
						STIX_LOG1 (stix, STIX_LOG_IC | STIX_LOG_INFO, "TOTAL_INST_COUTNER = %zu\n", inst_counter);
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -65,10 +65,10 @@ void* stix_allocheapmem (stix_t* stix, stix_heap_t* heap, stix_oow_t size)
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
	stix_uint8_t* ptr;
 | 
						stix_uint8_t* ptr;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*printf ("heap ptr %p  %p %lld %lld\n", heap->ptr, heap->limit, (long long int)size, (long long int)(heap->limit - heap->ptr));*/
 | 
					 | 
				
			||||||
	/* check the heap size limit */
 | 
						/* check the heap size limit */
 | 
				
			||||||
	if (heap->ptr >= heap->limit || heap->limit - heap->ptr < size)
 | 
						if (heap->ptr >= heap->limit || heap->limit - heap->ptr < size)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
 | 
							STIX_LOG4 (stix, STIX_LOG_ERROR, "Cannot allocate %zd bytes from heap - ptr %p limit %p size %zd\n", size, heap->ptr, heap->limit, (stix_oow_t)(heap->limit - heap->ptr));
 | 
				
			||||||
		stix->errnum = STIX_EOOMEM;
 | 
							stix->errnum = STIX_EOOMEM;
 | 
				
			||||||
		return STIX_NULL;
 | 
							return STIX_NULL;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
				
			|||||||
@ -342,6 +342,9 @@ static void log_write (stix_t* stix, unsigned int mask, const stix_ooch_t* msg,
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	msgidx = 0;
 | 
						msgidx = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* TODO: beautify the log message.
 | 
				
			||||||
 | 
					 *       do classification based on mask. */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	while (len > 0)
 | 
						while (len > 0)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		ucslen = len;
 | 
							ucslen = len;
 | 
				
			||||||
@ -691,8 +694,8 @@ int main (int argc, char* argv[])
 | 
				
			|||||||
	cancel_tick ();
 | 
						cancel_tick ();
 | 
				
			||||||
	g_stix = STIX_NULL;
 | 
						g_stix = STIX_NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
stix_dumpsymtab(stix);
 | 
						/*stix_dumpsymtab(stix);
 | 
				
			||||||
stix_dumpdic(stix, stix->sysdic, "System dictionary");
 | 
						 *stix_dumpdic(stix, stix->sysdic, "System dictionary");*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	stix_close (stix);
 | 
						stix_close (stix);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -35,7 +35,7 @@ void* stix_allocbytes (stix_t* stix, stix_oow_t size)
 | 
				
			|||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ptr = stix_allocheapmem (stix, stix->curheap, size);
 | 
						ptr = stix_allocheapmem (stix, stix->curheap, size);
 | 
				
			||||||
	if (!ptr && !(stix->option.trait & STIX_NOGC))
 | 
						if (!ptr && stix->errnum == STIX_EOOMEM && !(stix->option.trait & STIX_NOGC))
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		stix_gc (stix);
 | 
							stix_gc (stix);
 | 
				
			||||||
		ptr = stix_allocheapmem (stix, stix->curheap, size);
 | 
							ptr = stix_allocheapmem (stix, stix->curheap, size);
 | 
				
			||||||
 | 
				
			|||||||
@ -900,7 +900,7 @@ enum stix_log_mask_t
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	STIX_LOG_MNEMONIC = (1 << 8), /* bytecode mnemonic */
 | 
						STIX_LOG_MNEMONIC = (1 << 8), /* bytecode mnemonic */
 | 
				
			||||||
	STIX_LOG_GC       = (1 << 9),
 | 
						STIX_LOG_GC       = (1 << 9),
 | 
				
			||||||
	STIX_LOG_VM       = (1 << 10)
 | 
						STIX_LOG_IC       = (1 << 10) /* instruction cycle, fetch-decode-execute */
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
typedef enum stix_log_mask_t stix_log_mask_t;
 | 
					typedef enum stix_log_mask_t stix_log_mask_t;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user