From: <bi...@us...> - 2009-06-01 01:22:24
|
Revision: 4740 http://oorexx.svn.sourceforge.net/oorexx/?rev=4740&view=rev Author: bigrixx Date: 2009-06-01 00:34:54 +0000 (Mon, 01 Jun 2009) Log Message: ----------- [ oorexx-Bugs-2799237 ] Trapped syntax condition not cleared Modified Paths: -------------- main/trunk/interpreter/concurrency/RexxActivity.cpp main/trunk/interpreter/concurrency/RexxActivity.hpp main/trunk/interpreter/execution/RexxActivation.cpp main/trunk/interpreter/execution/RexxNativeActivation.cpp Modified: main/trunk/interpreter/concurrency/RexxActivity.cpp =================================================================== --- main/trunk/interpreter/concurrency/RexxActivity.cpp 2009-05-30 20:10:45 UTC (rev 4739) +++ main/trunk/interpreter/concurrency/RexxActivity.cpp 2009-06-01 00:34:54 UTC (rev 4740) @@ -2927,9 +2927,9 @@ /* make sure we have the stack base */ this->stackBase = currentThread.getStackBase(TOTAL_STACK_SIZE); this->generateRandomNumberSeed(); /* get a fresh random seed */ + startDepth = stackFrameDepth; /* Remember activation stack depth */ /* Push marker onto stack so we know */ this->createNewActivationStack(); /* what level we entered. */ - startDepth = stackFrameDepth; /* Remember activation stack depth */ // save the actitivation level in case there's an error unwind for an unhandled // exception; Modified: main/trunk/interpreter/concurrency/RexxActivity.hpp =================================================================== --- main/trunk/interpreter/concurrency/RexxActivity.hpp 2009-05-30 20:10:45 UTC (rev 4739) +++ main/trunk/interpreter/concurrency/RexxActivity.hpp 2009-06-01 00:34:54 UTC (rev 4740) @@ -311,6 +311,7 @@ } inline RexxDirectory *getCurrentCondition() { return conditionobj; } + inline void clearCurrentCondition() { conditionobj = OREF_NULL; } void setExitHandler(int exitNum, REXXPFN e) { getExitHandler(exitNum).setEntryPoint(e); } void setExitHandler(int exitNum, const char *e) { getExitHandler(exitNum).resolve(e); } void setExitHandler(RXSYSEXIT &e) { getExitHandler(e.sysexit_code).resolve(e.sysexit_name); } Modified: main/trunk/interpreter/execution/RexxActivation.cpp =================================================================== --- main/trunk/interpreter/execution/RexxActivation.cpp 2009-05-30 20:10:45 UTC (rev 4739) +++ main/trunk/interpreter/execution/RexxActivation.cpp 2009-06-01 00:34:54 UTC (rev 4740) @@ -2184,6 +2184,8 @@ /* and the corresponding trap info */ this->handler_queue->addLast(traphandler); this->pending_count++; /* bump pending condition count */ + // clear this from the activity if we're trapping this here + activity->clearCurrentCondition(); /* is this a signal instruction */ /* no the non-returnable PROPAGATE? */ if (handler->isType(KEYWORD_SIGNAL)) Modified: main/trunk/interpreter/execution/RexxNativeActivation.cpp =================================================================== --- main/trunk/interpreter/execution/RexxNativeActivation.cpp 2009-05-30 20:10:45 UTC (rev 4739) +++ main/trunk/interpreter/execution/RexxNativeActivation.cpp 2009-06-01 00:34:54 UTC (rev 4740) @@ -1530,6 +1530,10 @@ { // we run this under a callback trap so that the exceptions get processed. dispatcher.run(); + // make sure we clear any outstanding trapped conditions for this + // activity before we clear. If an untrapped condition occurrect, this + // will return to one of the catch positions + activity->clearCurrentCondition(); } catch (ActivityException) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |