diff --git a/stix/kernel/Collect.st b/stix/kernel/Collect.st index 8363dcb..8c2c9d2 100644 --- a/stix/kernel/Collect.st +++ b/stix/kernel/Collect.st @@ -55,10 +55,10 @@ { ## concatenate two strings. ## TOOD: make this a primitive for performance. - | newsize newstr self_ubound| + | newsize newstr self_ubound | newsize := self basicSize + aString basicSize. ##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. 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)]. diff --git a/stix/kernel/Context.st b/stix/kernel/Context.st index 9a073bd..9e87b16 100644 --- a/stix/kernel/Context.st +++ b/stix/kernel/Context.st @@ -328,13 +328,15 @@ thisContext isExceptionHandlerContext dump. #method ensure: aBlock { - ## TODO: ensure that the ensured block is executed after exception handler... - | value | - value := self on: Exception do: [:ex | aBlock value. ex pass]. - ## value := self valueAndResumeOnUnwind. + | v | + v := self on: Exception do: [:ex | + aBlock value. + ex pass + ]. + aBlock value. - ^value + ^v } #method ifCurtailed: aBlock @@ -424,8 +426,21 @@ thisContext isExceptionHandlerContext dump. #method handleException { self.handlerContext notNil - ifTrue: [ - Processor return: (self.handlerBlock value: self) to: (self.handlerContext sender) + ifTrue: [ +##'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: [ ('### 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 { ## Find exception handling context starting from a given context @@ -448,19 +456,21 @@ thisContext isExceptionHandlerContext dump. ctx := aContext. [ ctx notNil ] whileTrue: [ - ##(ctx handles: self) ifTrue: [ ^ ctx ]. - (ctx isExceptionHandlerContext) ifTrue: [ - | blk | - blk := ctx findExceptionHandlerBlock: (self class). - (blk notNil) ifTrue: [ - self.handlerBlock := blk. - self.handlerContext := ctx. - ^ctx - ]. +##ctx dump. + ##(ctx handles: self) ifTrue: [ ^ ctx ]. + (ctx isExceptionHandlerContext) ifTrue: [ + | blk | + blk := ctx findExceptionHandlerBlock: (self class). + (blk notNil) ifTrue: [ + self.handlerBlock := blk. + self.handlerContext := ctx. +##'-------------' dump. + ^ctx ]. - ctx := ctx sender ]. - + ctx := ctx sender + ]. +##'-------------' dump. ## no handler is found self.handlerBlock := nil. self.handlerContext := nil. diff --git a/stix/kernel/Process.st b/stix/kernel/Process.st index 9092dce..055bb13 100644 --- a/stix/kernel/Process.st +++ b/stix/kernel/Process.st @@ -401,6 +401,12 @@ self primitiveFailed. } + #method returnTo: anObject andEval: aBlock with: arg + { + + self primitiveFailed. + } + #method forceContext: aContext { diff --git a/stix/kernel/Stix.st b/stix/kernel/Stix.st index a5bb3b4..05c1a84 100644 --- a/stix/kernel/Stix.st +++ b/stix/kernel/Stix.st @@ -25,6 +25,10 @@ #class Character(Magnitude) { + ## #method basicSize + ## { + ## ^0 + ## } } #class Number(Magnitude) @@ -153,7 +157,7 @@ #method asString { - self printStringRadix: 10 + ^self printStringRadix: 10 } #method printStringRadix: aNumber @@ -213,6 +217,10 @@ #class SmallInteger(Integer) { + ## #method basicSize + ## { + ## ^0 + ## } } #class(#liword) LargeInteger(Integer) diff --git a/stix/kernel/test-010.st b/stix/kernel/test-010.st index fcce120..86744dd 100644 --- a/stix/kernel/test-010.st +++ b/stix/kernel/test-010.st @@ -67,7 +67,7 @@ } - #method(#class) main + #method(#class) main987 { |t1 t2 s1 s2 s3| @@ -110,20 +110,43 @@ s1 wait. " - - -" + } + + #method(#class) main + { | v1 | 'START OF MAIN' dump. ##[1 xxx] ifCurtailed: ['XXXXXXXX CURTAILED XXXXXXXXX' 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 dump. + ##v1 := [ ['kkk' dump.] ensure: ['XXXXXXXXX ENSURE XXXXXXXXXXXXXx' dump. 30] ] on: Exception do: [:ex | 'EXCEPTION OUTSIDE ENSURE...' 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 { |t1 t2 s1 s2 s3| diff --git a/stix/kernel/test-011.st b/stix/kernel/test-011.st index 293b9d6..67cbaa1 100644 --- a/stix/kernel/test-011.st +++ b/stix/kernel/test-011.st @@ -40,11 +40,19 @@ #method(#class) main2 { | k | + 'BEGINNING OF main2' 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. - 'END OF test-011' dump. + 'END OF main2' dump. } #method(#class) raise_exception @@ -138,33 +146,45 @@ ## exception is raised in a new process. it can't be captured ## by an exception handler of a calling process. ## exception handling must not cross the process boundary. + 'BEGINNING OF test11' dump. [ |p | - p := [Exception signal: 'Sample Exception' ] newProcess. + p := [ Exception signal: 'Exception in a new process of test11'. ] newProcess. 'JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ' dump. p resume. ] on: Exception do: [:ex | 'EXCEPTION ----------' dump. ex messageText dump ]. + 'END OF test11' dump. } #method(#class) test12 { + 'BEGINNING OF test12' dump. [ |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. 'JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ' dump. p resume. ] on: Exception do: [:ex | 'EXCEPTION ----------' dump. ex messageText dump ]. + 'END OF test12' dump. } - #method(#class) main { '>>>>> 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. ## self test3. @@ -173,7 +193,7 @@ ## self test5. self test11. ## self test12. - ##100 timesRepeat: ['>>>>> END OF MAIN' dump]. + ## 100 timesRepeat: ['>>>>> END OF MAIN' dump]. "(Exception isKindOf: Apex) dump. diff --git a/stix/lib/exec.c b/stix/lib/exec.c index 86f739f..723bccd 100644 --- a/stix/lib/exec.c +++ b/stix/lib/exec.c @@ -139,7 +139,7 @@ #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_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); #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 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) { #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 #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); #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 } @@ -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 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 stix->errnum = STIX_EPFULL; return -1; @@ -494,7 +494,7 @@ static void terminate_process (stix_t* stix, stix_oop_process_t proc) /* RUNNING/RUNNABLE ---> TERMINATED */ #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 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 */ 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 { @@ -532,7 +532,7 @@ static void terminate_process (stix_t* stix, stix_oop_process_t proc) { /* SUSPENDED ---> TERMINATED */ #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 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); #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 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 */ #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 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 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 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 */ #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 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; dic_no = STIX_CLASS_MTHDIC_CLASS; #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 } 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; dic_no = STIX_CLASS_MTHDIC_INSTANCE; #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 } @@ -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) { + /* return the number of indexable fields */ + stix_oop_t rcv, sz; STIX_ASSERT (nargs == 0); rcv = STIX_STACK_GETTOP(stix); - sz = stix_oowtoint (stix, STIX_OBJ_GET_SIZE(rcv)); - if (!sz) return -1; /* hard failure */ - STIX_STACK_SETTOP(stix, sz); + if (!STIX_OOP_IS_POINTER(rcv)) + { + sz = STIX_SMOOI_TO_OOP(0); + } + else + { + sz = stix_oowtoint (stix, STIX_OBJ_GET_SIZE(rcv)); + if (!sz) return -1; /* hard failure */ + } + STIX_STACK_SETTOP(stix, sz); return 1; } @@ -1979,6 +1988,33 @@ static int prim_processor_return_to (stix_t* stix, stix_ooi_t nargs) 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) { 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); if (!str) return (stix->errnum == STIX_EINVAL? 0: -1); + STIX_STACK_POP (stix); STIX_STACK_SETTOP (stix, str); + return 1; } @@ -2690,6 +2728,7 @@ static prim_t primitives[] = { 2, 3, prim_processor_add_timed_semaphore, "_processor_add_timed_semaphore" }, { 1, 1, prim_processor_remove_semaphore, "_processor_remove_semaphore" }, { 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_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 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", 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 */ 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 (there is semaphore awaited.... ) @@ -3497,7 +3536,7 @@ if (there is semaphore awaited.... ) case BCODE_JUMP_IF_FALSE_1: case BCODE_JUMP_IF_FALSE_2: 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; return -1; @@ -3838,7 +3877,7 @@ return -1; { 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... */ return -1; } @@ -4091,10 +4130,9 @@ return -1; 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; break; - } } @@ -4102,7 +4140,7 @@ done: vm_cleanup (stix); #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 return 0; diff --git a/stix/lib/heap.c b/stix/lib/heap.c index 31cc7e5..2741590 100644 --- a/stix/lib/heap.c +++ b/stix/lib/heap.c @@ -65,10 +65,10 @@ void* stix_allocheapmem (stix_t* stix, stix_heap_t* heap, stix_oow_t size) { 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 */ 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; return STIX_NULL; } diff --git a/stix/lib/main.c b/stix/lib/main.c index 42f40ad..3ce30d2 100644 --- a/stix/lib/main.c +++ b/stix/lib/main.c @@ -342,6 +342,9 @@ static void log_write (stix_t* stix, unsigned int mask, const stix_ooch_t* msg, msgidx = 0; +/* TODO: beautify the log message. + * do classification based on mask. */ + while (len > 0) { ucslen = len; @@ -691,8 +694,8 @@ int main (int argc, char* argv[]) cancel_tick (); g_stix = STIX_NULL; -stix_dumpsymtab(stix); -stix_dumpdic(stix, stix->sysdic, "System dictionary"); + /*stix_dumpsymtab(stix); + *stix_dumpdic(stix, stix->sysdic, "System dictionary");*/ stix_close (stix); diff --git a/stix/lib/obj.c b/stix/lib/obj.c index 069bc58..63f11b4 100644 --- a/stix/lib/obj.c +++ b/stix/lib/obj.c @@ -35,7 +35,7 @@ void* stix_allocbytes (stix_t* stix, stix_oow_t size) #endif 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); ptr = stix_allocheapmem (stix, stix->curheap, size); diff --git a/stix/lib/stix.h b/stix/lib/stix.h index fbb2bd3..2816b4b 100644 --- a/stix/lib/stix.h +++ b/stix/lib/stix.h @@ -900,7 +900,7 @@ enum stix_log_mask_t STIX_LOG_MNEMONIC = (1 << 8), /* bytecode mnemonic */ 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;