From: <bi...@us...> - 2011-05-25 19:24:32
|
Revision: 6968 http://oorexx.svn.sourceforge.net/oorexx/?rev=6968&view=rev Author: bigrixx Date: 2011-05-25 19:24:25 +0000 (Wed, 25 May 2011) Log Message: ----------- [ oorexx-Feature Requests-3297856 ] Add traceback and program information to all conditions Modified Paths: -------------- main/trunk/interpreter/concurrency/CommandHandler.cpp main/trunk/interpreter/concurrency/CommandHandler.hpp main/trunk/interpreter/concurrency/RexxActivity.cpp main/trunk/interpreter/concurrency/RexxActivity.hpp main/trunk/interpreter/execution/RexxActivation.cpp main/trunk/interpreter/execution/SecurityManager.cpp main/trunk/interpreter/execution/SecurityManager.hpp Modified: main/trunk/interpreter/concurrency/CommandHandler.cpp =================================================================== --- main/trunk/interpreter/concurrency/CommandHandler.cpp 2011-05-13 20:31:43 UTC (rev 6967) +++ main/trunk/interpreter/concurrency/CommandHandler.cpp 2011-05-25 19:24:25 UTC (rev 6968) @@ -99,7 +99,7 @@ { if (type == REGISTERED_NAME) { - CommandHandlerDispatcher dispatcher(entryPoint, command); + CommandHandlerDispatcher dispatcher(activity, entryPoint, command); // run this and give back the return code activity->run(dispatcher); @@ -114,8 +114,9 @@ } } -CommandHandlerDispatcher::CommandHandlerDispatcher(REXXPFN e, RexxString *command) +CommandHandlerDispatcher::CommandHandlerDispatcher(RexxActivity *a, REXXPFN e, RexxString *command) { + activity = a; // needed for raising conditions entryPoint = e; // the call point // clear the state flags flags = 0; @@ -178,13 +179,13 @@ { /* send failure condition back */ // raise the condition when things are done - condition = (RexxObject *)RexxActivity::createConditionObject(OREF_FAILURENAME, (RexxObject *)result, command, OREF_NULL, OREF_NULL); + condition = (RexxObject *)activity->createConditionObject(OREF_FAILURENAME, (RexxObject *)result, command, OREF_NULL, OREF_NULL); } /* If error flag set */ else if (flags & (unsigned short)RXSUBCOM_ERROR) { // raise the condition when things are done - condition = (RexxObject *)RexxActivity::createConditionObject(OREF_ERRORNAME, (RexxObject *)result, command, OREF_NULL, OREF_NULL); + condition = (RexxObject *)activity->createConditionObject(OREF_ERRORNAME, (RexxObject *)result, command, OREF_NULL, OREF_NULL); } } Modified: main/trunk/interpreter/concurrency/CommandHandler.hpp =================================================================== --- main/trunk/interpreter/concurrency/CommandHandler.hpp 2011-05-13 20:31:43 UTC (rev 6967) +++ main/trunk/interpreter/concurrency/CommandHandler.hpp 2011-05-25 19:24:25 UTC (rev 6968) @@ -82,12 +82,13 @@ class CommandHandlerDispatcher : public CallbackDispatcher { public: - CommandHandlerDispatcher(REXXPFN e, RexxString *c); + CommandHandlerDispatcher(RexxActivity * a, REXXPFN e, RexxString *c); virtual ~CommandHandlerDispatcher() { ; } virtual void run(); void complete(RexxString *command, ProtectedObject &result, ProtectedObject &condition); + RexxActivity *activity; // the activity we're dispatching on REXXPFN entryPoint; // resolved exit entry point CONSTRXSTRING rxstrcmd; // invoked command RXSTRING retstr; // passed back result Modified: main/trunk/interpreter/concurrency/RexxActivity.cpp =================================================================== --- main/trunk/interpreter/concurrency/RexxActivity.cpp 2011-05-13 20:31:43 UTC (rev 6967) +++ main/trunk/interpreter/concurrency/RexxActivity.cpp 2011-05-25 19:24:25 UTC (rev 6968) @@ -487,6 +487,9 @@ { conditionObj->put(result, OREF_RESULT); } + + // add in all location-specific information + generateProgramInformation(conditionObj); return conditionObj; } @@ -872,6 +875,25 @@ exobj->put(result, OREF_RESULT); } + // add in all location-specific information + generateProgramInformation(exobj); + + // the condition name is always SYNTAX + exobj->put(OREF_SYNTAX, OREF_CONDITION); + /* fill in the propagation status */ + exobj->put(TheFalseObject, OREF_PROPAGATED); + + return exobj; +} + + +/** + * Add program location-specific information to a condition object. + * + * @param exobj The exception object being constructed. + */ +void RexxActivity::generateProgramInformation(RexxDirectory *exobj) +{ // create lists for both the stack frames and the traceback lines RexxList *stackFrames = new_list(); /* add to the exception object */ @@ -926,13 +948,6 @@ // if not available, then this is explicitly a NULLSTRINg. exobj->put(OREF_NULLSTRING, OREF_PROGRAM); } - - // the condition name is always SYNTAX - exobj->put(OREF_SYNTAX, OREF_CONDITION); - /* fill in the propagation status */ - exobj->put(TheFalseObject, OREF_PROPAGATED); - - return exobj; } @@ -2408,7 +2423,7 @@ SecurityManager *manager = activation->getEffectiveSecurityManager(); if (manager != OREF_NULL) { - if (manager->checkCommand(address, command, result, condition)) + if (manager->checkCommand(this, address, command, result, condition)) { return false; } @@ -2439,14 +2454,14 @@ if (exit_parm.rxcmd_flags.rxfcfail)/* need to raise failure condition? */ { // raise the condition when things are done - condition = RexxActivity::createConditionObject(OREF_FAILURENAME, (RexxObject *)result, command, OREF_NULL, OREF_NULL); + condition = createConditionObject(OREF_FAILURENAME, (RexxObject *)result, command, OREF_NULL, OREF_NULL); } /* Did we find the function?? */ else if (exit_parm.rxcmd_flags.rxfcerr) { // raise the condition when things are done - condition = RexxActivity::createConditionObject(OREF_ERRORNAME, (RexxObject *)result, command, OREF_NULL, OREF_NULL); + condition = createConditionObject(OREF_ERRORNAME, (RexxObject *)result, command, OREF_NULL, OREF_NULL); } /* Get input string and return it */ result = new_string(exit_parm.rxcmd_retc); Modified: main/trunk/interpreter/concurrency/RexxActivity.hpp =================================================================== --- main/trunk/interpreter/concurrency/RexxActivity.hpp 2011-05-13 20:31:43 UTC (rev 6967) +++ main/trunk/interpreter/concurrency/RexxActivity.hpp 2011-05-25 19:24:25 UTC (rev 6968) @@ -144,9 +144,10 @@ wholenumber_t errorNumber(RexxDirectory *conditionObject); bool raiseCondition(RexxString *, RexxObject *, RexxString *, RexxObject *, RexxObject *); bool raiseCondition(RexxDirectory *); - static RexxDirectory *createConditionObject(RexxString *, RexxObject *, RexxString *, RexxObject *, RexxObject *); + RexxDirectory *createConditionObject(RexxString *, RexxObject *, RexxString *, RexxObject *, RexxObject *); void raiseException(wholenumber_t, RexxString *, RexxArray *, RexxObject *); RexxDirectory *createExceptionObject(wholenumber_t, RexxString *, RexxArray *, RexxObject *); + void generateProgramInformation(RexxDirectory *exObj); void reportAnException(wholenumber_t, const char *); void reportAnException(wholenumber_t, const char *, const char *); void reportAnException(wholenumber_t, RexxObject *, const char *); Modified: main/trunk/interpreter/execution/RexxActivation.cpp =================================================================== --- main/trunk/interpreter/execution/RexxActivation.cpp 2011-05-13 20:31:43 UTC (rev 6967) +++ main/trunk/interpreter/execution/RexxActivation.cpp 2011-05-25 19:24:25 UTC (rev 6968) @@ -3817,7 +3817,7 @@ // No handler for this environment commandResult = new_integer(RXSUBCOM_NOTREG); // just use the not registered return code // raise the condition when things are done - condition = RexxActivity::createConditionObject(OREF_FAILURENAME, (RexxObject *)commandResult, commandString, OREF_NULL, OREF_NULL); + condition = activity->createConditionObject(OREF_FAILURENAME, (RexxObject *)commandResult, commandString, OREF_NULL, OREF_NULL); } } Modified: main/trunk/interpreter/execution/SecurityManager.cpp =================================================================== --- main/trunk/interpreter/execution/SecurityManager.cpp 2011-05-13 20:31:43 UTC (rev 6967) +++ main/trunk/interpreter/execution/SecurityManager.cpp 2011-05-25 19:24:25 UTC (rev 6968) @@ -222,15 +222,15 @@ /** * Check for permission to call an external command * - * @param functionName - * The name of the target function. - * @param count The return count. - * @param arguments The method arguments. + * @param activity The activity we're running on + * @param address + * @param command * @param result The returned result. + * @param condition * * @return true if the security manager handled this call, false otherwise. */ -bool SecurityManager::checkCommand(RexxString *address, RexxString *command, ProtectedObject &result, ProtectedObject &condition) +bool SecurityManager::checkCommand(RexxActivity *activity, RexxString *address, RexxString *command, ProtectedObject &result, ProtectedObject &condition) { // no method here if (manager == OREF_NULL) @@ -256,13 +256,13 @@ if (securityArgs->fastAt(OREF_FAILURENAME) != OREF_NULL) { // raise the condition when things are done - condition = RexxActivity::createConditionObject(OREF_FAILURENAME, (RexxObject *)result, command, OREF_NULL, OREF_NULL); + condition = activity->createConditionObject(OREF_FAILURENAME, (RexxObject *)result, command, OREF_NULL, OREF_NULL); } /* how about an error condition? */ else if (securityArgs->fastAt(OREF_ERRORNAME) != OREF_NULL) { // raise the condition when things are done - condition = RexxActivity::createConditionObject(OREF_ERRORNAME, (RexxObject *)result, command, OREF_NULL, OREF_NULL); + condition = activity->createConditionObject(OREF_ERRORNAME, (RexxObject *)result, command, OREF_NULL, OREF_NULL); } return true; } Modified: main/trunk/interpreter/execution/SecurityManager.hpp =================================================================== --- main/trunk/interpreter/execution/SecurityManager.hpp 2011-05-13 20:31:43 UTC (rev 6967) +++ main/trunk/interpreter/execution/SecurityManager.hpp 2011-05-25 19:24:25 UTC (rev 6968) @@ -66,7 +66,7 @@ RexxObject *checkEnvironmentAccess(RexxString *index); bool checkProtectedMethod(RexxObject *target, RexxString *messageName, size_t count, RexxObject **arguments, ProtectedObject &result); bool checkFunctionCall(RexxString *functionName, size_t count, RexxObject **arguments, ProtectedObject &result); - bool checkCommand(RexxString *address, RexxString *command, ProtectedObject &result, ProtectedObject &condition); + bool checkCommand(RexxActivity *, RexxString *address, RexxString *command, ProtectedObject &result, ProtectedObject &condition); RexxObject *checkStreamAccess(RexxString *name); RexxString *checkRequiresAccess(RexxString *name, RexxObject *&securityManager); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bi...@us...> - 2012-02-19 21:06:46
|
Revision: 7555 http://oorexx.svn.sourceforge.net/oorexx/?rev=7555&view=rev Author: bigrixx Date: 2012-02-19 21:06:40 +0000 (Sun, 19 Feb 2012) Log Message: ----------- Fix performance problem on calls to routines Modified Paths: -------------- main/trunk/interpreter/execution/RexxActivation.cpp main/trunk/interpreter/platform/unix/MiscSystem.cpp main/trunk/interpreter/platform/unix/SysInterpreterInstance.cpp main/trunk/interpreter/platform/unix/SysInterpreterInstance.hpp main/trunk/interpreter/platform/unix/SystemInterpreter.hpp main/trunk/interpreter/platform/windows/MiscSystem.cpp main/trunk/interpreter/platform/windows/SysInterpreterInstance.cpp main/trunk/interpreter/platform/windows/SysInterpreterInstance.hpp main/trunk/interpreter/platform/windows/SystemInterpreter.hpp main/trunk/interpreter/runtime/InterpreterInstance.hpp Modified: main/trunk/interpreter/execution/RexxActivation.cpp =================================================================== --- main/trunk/interpreter/execution/RexxActivation.cpp 2012-02-19 19:10:58 UTC (rev 7554) +++ main/trunk/interpreter/execution/RexxActivation.cpp 2012-02-19 21:06:40 UTC (rev 7555) @@ -426,7 +426,7 @@ { /* run initialization exit */ activity->callInitializationExit(this); - SystemInterpreter::setupProgram(this); /* do any system specific setup */ + activity->getInstance()->setupProgram(this); /* do any system specific setup */ } else { Modified: main/trunk/interpreter/platform/unix/MiscSystem.cpp =================================================================== --- main/trunk/interpreter/platform/unix/MiscSystem.cpp 2012-02-19 19:10:58 UTC (rev 7554) +++ main/trunk/interpreter/platform/unix/MiscSystem.cpp 2012-02-19 21:06:40 UTC (rev 7555) @@ -141,23 +141,6 @@ } } -void SystemInterpreter::setupProgram(RexxActivation *activation) -/******************************************************************************/ -/* Function: Do system specific program setup */ -/******************************************************************************/ -{ - /* scan current environment, */ - const char *rxTraceBuf = getenv("RXTRACE"); - if (rxTraceBuf != NULL) - { - if (!Utilities::strCaselessCompare(rxTraceBuf, "ON")) /* request to turn on? */ - { - /* turn on tracing */ - activation->enableExternalTrace(); - } - } -} - RexxString * SystemInterpreter::getSourceString(RexxString * callType, RexxString * programName ) /******************************************************************************/ /* Function: Produce a system specific source string */ Modified: main/trunk/interpreter/platform/unix/SysInterpreterInstance.cpp =================================================================== --- main/trunk/interpreter/platform/unix/SysInterpreterInstance.cpp 2012-02-19 19:10:58 UTC (rev 7554) +++ main/trunk/interpreter/platform/unix/SysInterpreterInstance.cpp 2012-02-19 21:06:40 UTC (rev 7555) @@ -42,6 +42,7 @@ #include "InterpreterInstance.hpp" #include "SystemInterpreter.hpp" +#include "RexxActivation.hpp" /** @@ -55,6 +56,17 @@ { instance = i; + externalTraceEnabled = false; // off by default + /* scan current environment, */ + const char *rxTraceBuf = getenv("RXTRACE"); + if (rxTraceBuf != NULL) + { + if (!Utilities::strCaselessCompare(rxTraceBuf, "ON")) /* request to turn on? */ + { + externalTraceEnabled = true; // turn on tracing of top-level activations for this instance + } + } + // add our default search extension as both upper and lower case addSearchExtension(".REX"); addSearchExtension(".rex"); Modified: main/trunk/interpreter/platform/unix/SysInterpreterInstance.hpp =================================================================== --- main/trunk/interpreter/platform/unix/SysInterpreterInstance.hpp 2012-02-19 19:10:58 UTC (rev 7554) +++ main/trunk/interpreter/platform/unix/SysInterpreterInstance.hpp 2012-02-19 21:06:40 UTC (rev 7555) @@ -44,6 +44,7 @@ #define Included_SysInterpreterInstance_hpp class InterpreterInstance; +class RexxActivation; class SysInterpreterInstance { @@ -55,11 +56,13 @@ void terminate(); RexxString *resolveProgramName(RexxString *_name, RexxString *_parentDir, RexxString *_parentExtension); void registerCommandHandlers(InterpreterInstance *i); + void setupProgram(RexxActivation *activation); protected: void addSearchExtension(const char *name); InterpreterInstance *instance; // backlink to our instance container + bool externalTraceEnabled; // are we started with external trace on }; Modified: main/trunk/interpreter/platform/unix/SystemInterpreter.hpp =================================================================== --- main/trunk/interpreter/platform/unix/SystemInterpreter.hpp 2012-02-19 19:10:58 UTC (rev 7554) +++ main/trunk/interpreter/platform/unix/SystemInterpreter.hpp 2012-02-19 21:06:40 UTC (rev 7555) @@ -100,7 +100,6 @@ static RexxString *getDefaultAddressName(); static bool invokeExternalFunction(RexxActivation *, RexxActivity *, RexxString *, RexxObject **, size_t, RexxString *, ProtectedObject &); static void validateAddressName(RexxString *name ); - static void setupProgram(RexxActivation *activation); static void loadImage(char **imageBuffer, size_t *imageSize); static RexxBuffer *readProgram(const char *file_name); Modified: main/trunk/interpreter/platform/windows/MiscSystem.cpp =================================================================== --- main/trunk/interpreter/platform/windows/MiscSystem.cpp 2012-02-19 19:10:58 UTC (rev 7554) +++ main/trunk/interpreter/platform/windows/MiscSystem.cpp 2012-02-19 21:06:40 UTC (rev 7555) @@ -121,25 +121,6 @@ } -void SystemInterpreter::setupProgram(RexxActivation *activation) -/******************************************************************************/ -/* Function: Do system specific program setup */ -/******************************************************************************/ -{ - TCHAR rxTraceBuf[8]; - - /* scan current environment, */ - if (GetEnvironmentVariable("RXTRACE", rxTraceBuf, 8)) - { - if (!Utilities::strCaselessCompare(rxTraceBuf, "ON")) /* request to turn on? */ - { - /* turn on tracing */ - activation->enableExternalTrace(); - } - } -} - - RexxString *SystemInterpreter::getSourceString( RexxString * callType, /* type of call token */ RexxString * programName ) /* program name token */ Modified: main/trunk/interpreter/platform/windows/SysInterpreterInstance.cpp =================================================================== --- main/trunk/interpreter/platform/windows/SysInterpreterInstance.cpp 2012-02-19 19:10:58 UTC (rev 7554) +++ main/trunk/interpreter/platform/windows/SysInterpreterInstance.cpp 2012-02-19 21:06:40 UTC (rev 7555) @@ -44,6 +44,7 @@ #include "InterpreterInstance.hpp" #include "ListClass.hpp" #include "SystemInterpreter.hpp" +#include "RexxActivation.hpp" #include <stdio.h> #include <fcntl.h> @@ -96,6 +97,18 @@ */ void SysInterpreterInstance::initialize(InterpreterInstance *i, RexxOption *options) { + externalTraceEnabled = false; // off by default + TCHAR rxTraceBuf[8]; + + /* scan current environment, */ + if (GetEnvironmentVariable("RXTRACE", rxTraceBuf, 8)) + { + if (!Utilities::strCaselessCompare(rxTraceBuf, "ON")) /* request to turn on? */ + { + externalTraceEnabled = true; // turn on tracing of top-level activations for this instance + } + } + /* Because of using the stand-alone runtime library or when using different compilers, the std-streams of the calling program and the REXX.DLL might be located at different addresses and therefore _file might be -1. If so, std-streams are reassigned to the @@ -145,7 +158,19 @@ } } +void SysInterpreterInstance::setupProgram(RexxActivation *activation) +/******************************************************************************/ +/* Function: Do system specific program setup */ +/******************************************************************************/ +{ + // trace this activation if turned on externally when the instance was started + if (externalTraceEnabled) + { + activation->enableExternalTrace(); + } +} + SysSearchPath::SysSearchPath(const char *parentDir, const char *extensionPath) { char temp[4]; // this is just a temp buffer to check component sizes Modified: main/trunk/interpreter/platform/windows/SysInterpreterInstance.hpp =================================================================== --- main/trunk/interpreter/platform/windows/SysInterpreterInstance.hpp 2012-02-19 19:10:58 UTC (rev 7554) +++ main/trunk/interpreter/platform/windows/SysInterpreterInstance.hpp 2012-02-19 21:06:40 UTC (rev 7555) @@ -44,6 +44,7 @@ #define Included_SysInterpreterInstance_hpp class InterpreterInstance; +class RexxActivation; class SysInterpreterInstance { @@ -55,11 +56,13 @@ void terminate(); RexxString *resolveProgramName(RexxString *_name, RexxString *_parentDir, RexxString *_parentExtension); void registerCommandHandlers(InterpreterInstance *i); + void setupProgram(RexxActivation *activation); protected: void addSearchExtension(const char *name); InterpreterInstance *instance; // backlink to our instance container + bool externalTraceEnabled; // are we started with external trace on }; Modified: main/trunk/interpreter/platform/windows/SystemInterpreter.hpp =================================================================== --- main/trunk/interpreter/platform/windows/SystemInterpreter.hpp 2012-02-19 19:10:58 UTC (rev 7554) +++ main/trunk/interpreter/platform/windows/SystemInterpreter.hpp 2012-02-19 21:06:40 UTC (rev 7555) @@ -93,7 +93,6 @@ static RexxString *getDefaultAddressName(); static bool invokeExternalFunction(RexxActivation *, RexxActivity *, RexxString *, RexxObject **, size_t, RexxString *, ProtectedObject &); static void validateAddressName(RexxString *name ); - static void setupProgram(RexxActivation *activation); static void loadImage(char **imageBuffer, size_t *imageSize); static RexxBuffer *readProgram(const char *file_name); static bool processSignal(DWORD dwCtrlType); Modified: main/trunk/interpreter/runtime/InterpreterInstance.hpp =================================================================== --- main/trunk/interpreter/runtime/InterpreterInstance.hpp 2012-02-19 19:10:58 UTC (rev 7554) +++ main/trunk/interpreter/runtime/InterpreterInstance.hpp 2012-02-19 21:06:40 UTC (rev 7555) @@ -119,6 +119,10 @@ PackageClass *loadRequires(RexxActivity *activity, RexxString *shortName, RexxString *fullName); void runRequires(RexxActivity *activity, RexxString *name, RoutineClass *code); void addRequiresFile(RexxString *shortName, RexxString *fullName, PackageClass *package); + inline void setupProgram(RexxActivation *activation) + { + sysInstance.setupProgram(activation); + } protected: This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bi...@us...> - 2012-05-28 13:00:48
|
Revision: 7805 http://oorexx.svn.sourceforge.net/oorexx/?rev=7805&view=rev Author: bigrixx Date: 2012-05-28 13:00:41 +0000 (Mon, 28 May 2012) Log Message: ----------- [ oorexx-Bugs-3529966 ] ReleaseLocalReference() causes ooRexx to abend Modified Paths: -------------- main/trunk/interpreter/classes/ListClass.cpp main/trunk/interpreter/classes/ListClass.hpp main/trunk/interpreter/execution/RexxNativeActivation.cpp Modified: main/trunk/interpreter/classes/ListClass.cpp =================================================================== --- main/trunk/interpreter/classes/ListClass.cpp 2012-05-27 00:43:42 UTC (rev 7804) +++ main/trunk/interpreter/classes/ListClass.cpp 2012-05-28 13:00:41 UTC (rev 7805) @@ -1043,6 +1043,41 @@ } +/** + * Removes an item from the collection using Object identity + * comparisons. This is used in some special circumstances when + * we don't want to have the equals method called, which can + * cause some exceptions or false positives. This is used + * primarily for managing the local reference save lists. + * + * @param target The target value. + * + * @return The target item. + */ +RexxObject *RexxList::removeObject(RexxObject *target) +{ + // we require the index to be there. + requiredArgument(target, ARG_ONE); + + // ok, now run the list looking for the target item + size_t nextEntry = this->first; + + for (size_t i = 1; i <= this->count; i++) + { + LISTENTRY *element = ENTRY_POINTER(nextEntry); + // if we got a match, return the item + if (target == element->value) + { + // remove this item + return primitiveRemove(element); + } + nextEntry = element->next; + } + // no match + return TheNilObject; +} + + RexxObject *RexxList::indexOfValue( RexxObject *_value) /*****************************************************************************/ Modified: main/trunk/interpreter/classes/ListClass.hpp =================================================================== --- main/trunk/interpreter/classes/ListClass.hpp 2012-05-27 00:43:42 UTC (rev 7804) +++ main/trunk/interpreter/classes/ListClass.hpp 2012-05-28 13:00:41 UTC (rev 7805) @@ -119,6 +119,7 @@ RexxObject *index(RexxObject *); RexxObject *hasItem(RexxObject *); RexxObject *removeItem(RexxObject *); + RexxObject *removeObject(RexxObject *); void addLast(RexxObject *value); void addFirst(RexxObject *value); Modified: main/trunk/interpreter/execution/RexxNativeActivation.cpp =================================================================== --- main/trunk/interpreter/execution/RexxNativeActivation.cpp 2012-05-27 00:43:42 UTC (rev 7804) +++ main/trunk/interpreter/execution/RexxNativeActivation.cpp 2012-05-28 13:00:41 UTC (rev 7805) @@ -1165,7 +1165,10 @@ // make sure we have a savelist before trying to remove this if (savelist != OREF_NULL) { - savelist->removeItem(objr); + // NB...this is a special remove that functions using the object + // identify to avoid false positives or potential exceptions caused + // by calling EQUALS methods. + savelist->removeObject(objr); } } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bi...@us...> - 2012-06-11 19:50:31
|
Revision: 7875 http://oorexx.svn.sourceforge.net/oorexx/?rev=7875&view=rev Author: bigrixx Date: 2012-06-11 19:50:24 +0000 (Mon, 11 Jun 2012) Log Message: ----------- [ oorexx-Bugs-3534402 ] do over not working with strings Modified Paths: -------------- main/trunk/interpreter/classes/MutableBufferClass.cpp main/trunk/interpreter/classes/MutableBufferClass.hpp main/trunk/interpreter/classes/StringClass.cpp main/trunk/interpreter/classes/StringClass.hpp main/trunk/interpreter/execution/CPPCode.cpp main/trunk/interpreter/execution/RexxNativeActivation.cpp main/trunk/interpreter/memory/Setup.cpp Modified: main/trunk/interpreter/classes/MutableBufferClass.cpp =================================================================== --- main/trunk/interpreter/classes/MutableBufferClass.cpp 2012-06-11 19:50:11 UTC (rev 7874) +++ main/trunk/interpreter/classes/MutableBufferClass.cpp 2012-06-11 19:50:24 UTC (rev 7875) @@ -550,6 +550,17 @@ } /** + * Baseclass optimization for handling request array calls. + * + * @return The string object converted to an array using default arguments. + */ +RexxArray *RexxMutableBuffer::makeArray() +{ + // forward to the Rexx version with default arguments + return this->makeArrayRexx(OREF_NULL); +} + +/** * Handle the primitive class makeString optimization. This * is required because MutableBuffer implements a * STRING method. @@ -673,7 +684,7 @@ } -RexxArray *RexxMutableBuffer::makearray(RexxString *div) +RexxArray *RexxMutableBuffer::makeArrayRexx(RexxString *div) /******************************************************************************/ /* Function: Split string into an array */ /******************************************************************************/ Modified: main/trunk/interpreter/classes/MutableBufferClass.hpp =================================================================== --- main/trunk/interpreter/classes/MutableBufferClass.hpp 2012-06-11 19:50:11 UTC (rev 7874) +++ main/trunk/interpreter/classes/MutableBufferClass.hpp 2012-06-11 19:50:24 UTC (rev 7875) @@ -91,7 +91,8 @@ RexxInteger *getBufferSize() { return new_integer(bufferLength); } RexxObject *setBufferSize(RexxInteger*); - RexxArray *makearray(RexxString *div); + RexxArray *makeArrayRexx(RexxString *div); + RexxArray *makeArray(); RexxString *makeString(); RexxString *primitiveMakeString(); RexxInteger *countStrRexx(RexxString *needle); Modified: main/trunk/interpreter/classes/StringClass.cpp =================================================================== --- main/trunk/interpreter/classes/StringClass.cpp 2012-06-11 19:50:11 UTC (rev 7874) +++ main/trunk/interpreter/classes/StringClass.cpp 2012-06-11 19:50:24 UTC (rev 7875) @@ -211,7 +211,18 @@ } } +/** + * Baseclass optimization for handling request array calls. + * + * @return The string object converted to an array using default arguments. + */ +RexxArray *RexxString::makeArray() +{ + // forward to the Rexx version with default arguments + return this->makeArrayRexx(OREF_NULL); +} + void RexxString::copyIntoTail(RexxCompoundTail *tail) /******************************************************************************/ /* Function: Handle a tail construction request for an internal object */ @@ -1720,7 +1731,7 @@ } } -RexxArray *RexxString::makeArray(RexxString *div) +RexxArray *RexxString::makeArrayRexx(RexxString *div) /******************************************************************************/ /* Function: Split string into an array */ /******************************************************************************/ Modified: main/trunk/interpreter/classes/StringClass.hpp =================================================================== --- main/trunk/interpreter/classes/StringClass.hpp 2012-06-11 19:50:11 UTC (rev 7874) +++ main/trunk/interpreter/classes/StringClass.hpp 2012-06-11 19:50:24 UTC (rev 7875) @@ -159,6 +159,7 @@ RexxNumberString *numberString(); RexxInteger *integerValue(size_t); RexxString *makeString(); + RexxArray *makeArray(); RexxString *primitiveMakeString(); void copyIntoTail(RexxCompoundTail *buffer); RexxString *stringValue(); @@ -312,7 +313,7 @@ RexxInteger *equals(RexxString *other); RexxInteger *caselessEquals(RexxString *other); - RexxArray *makeArray(RexxString *); + RexxArray *makeArrayRexx(RexxString *); /****************************************************************************/ /* */ Modified: main/trunk/interpreter/execution/CPPCode.cpp =================================================================== --- main/trunk/interpreter/execution/CPPCode.cpp 2012-06-11 19:50:11 UTC (rev 7874) +++ main/trunk/interpreter/execution/CPPCode.cpp 2012-06-11 19:50:24 UTC (rev 7875) @@ -882,12 +882,12 @@ CPPM(RexxString::compareToRexx), CPPM(RexxString::caselessCompareToRexx), /* End of BIF methods */ -CPPM(RexxString::makeArray), +CPPM(RexxString::makeArrayRexx), CPPM(RexxString::newRexx), CPPM(RexxMutableBufferClass::newRexx), CPPM(RexxMutableBuffer::lengthRexx), -CPPM(RexxMutableBuffer::makearray), +CPPM(RexxMutableBuffer::makeArrayRexx), CPPM(RexxMutableBuffer::append), CPPM(RexxMutableBuffer::insert), CPPM(RexxMutableBuffer::overlay), Modified: main/trunk/interpreter/execution/RexxNativeActivation.cpp =================================================================== --- main/trunk/interpreter/execution/RexxNativeActivation.cpp 2012-06-11 19:50:11 UTC (rev 7874) +++ main/trunk/interpreter/execution/RexxNativeActivation.cpp 2012-06-11 19:50:24 UTC (rev 7875) @@ -1441,7 +1441,7 @@ enableVariablepool(); // enable the variable pool interface here activity->releaseAccess(); /* force this to "safe" mode */ // now process the function call - functionrc = (*methp)(functionName->getStringData(), count, argPtr, queuename, &funcresult); + functionrc = (int)(*methp)(functionName->getStringData(), count, argPtr, queuename, &funcresult); activity->requestAccess(); /* now in unsafe mode again */ } catch (RexxActivation *) Modified: main/trunk/interpreter/memory/Setup.cpp =================================================================== --- main/trunk/interpreter/memory/Setup.cpp 2012-06-11 19:50:11 UTC (rev 7874) +++ main/trunk/interpreter/memory/Setup.cpp 2012-06-11 19:50:24 UTC (rev 7875) @@ -921,7 +921,7 @@ defineKernelMethod(CHAR_AND ,TheStringBehaviour, CPPM(RexxString::andOp), 1); defineKernelMethod(CHAR_OR ,TheStringBehaviour, CPPM(RexxString::orOp), 1); defineKernelMethod(CHAR_XOR ,TheStringBehaviour, CPPM(RexxString::xorOp), 1); - defineKernelMethod(CHAR_MAKEARRAY ,TheStringBehaviour, CPPM(RexxString::makeArray), 1); + defineKernelMethod(CHAR_MAKEARRAY ,TheStringBehaviour, CPPM(RexxString::makeArrayRexx), 1); defineKernelMethod(CHAR_LOWER ,TheStringBehaviour, CPPM(RexxString::lowerRexx), 2); defineKernelMethod(CHAR_UPPER ,TheStringBehaviour, CPPM(RexxString::upperRexx), 2); defineKernelMethod(CHAR_MATCH ,TheStringBehaviour, CPPM(RexxString::match), 4); @@ -971,7 +971,7 @@ defineKernelMethod(CHAR_SETBUFFERSIZE ,TheMutableBufferBehaviour, CPPM(RexxMutableBuffer::setBufferSize), 1); defineKernelMethod(CHAR_LENGTH ,TheMutableBufferBehaviour, CPPM(RexxMutableBuffer::lengthRexx), 0); - defineKernelMethod(CHAR_MAKEARRAY ,TheMutableBufferBehaviour, CPPM(RexxMutableBuffer::makearray), 1); + defineKernelMethod(CHAR_MAKEARRAY ,TheMutableBufferBehaviour, CPPM(RexxMutableBuffer::makeArrayRexx), 1); defineKernelMethod(CHAR_STRING ,TheMutableBufferBehaviour, CPPM(RexxObject::makeStringRexx), 0); defineKernelMethod(CHAR_COUNTSTR ,TheMutableBufferBehaviour, CPPM(RexxMutableBuffer::countStrRexx), 1); defineKernelMethod(CHAR_CASELESSCOUNTSTR ,TheMutableBufferBehaviour, CPPM(RexxMutableBuffer::caselessCountStrRexx), 1); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bi...@us...> - 2012-07-10 21:47:35
|
Revision: 8029 http://oorexx.svn.sourceforge.net/oorexx/?rev=8029&view=rev Author: bigrixx Date: 2012-07-10 21:47:25 +0000 (Tue, 10 Jul 2012) Log Message: ----------- [ oorexx-Bugs-3542187 ] Stackspace check on 64-bit platform not large enough Modified Paths: -------------- main/trunk/interpreter/concurrency/RexxActivity.cpp main/trunk/interpreter/platform/windows/PlatformDefinitions.h Modified: main/trunk/interpreter/concurrency/RexxActivity.cpp =================================================================== --- main/trunk/interpreter/concurrency/RexxActivity.cpp 2012-07-10 19:36:45 UTC (rev 8028) +++ main/trunk/interpreter/concurrency/RexxActivity.cpp 2012-07-10 21:47:25 UTC (rev 8029) @@ -93,6 +93,10 @@ // save the actitivation level in case there's an error unwind for an unhandled // exception; size_t activityLevel = 0; + // the thread might have terminated for a control stack issue + // so make sure checking is turned back on before trying to run + // anything + this->stackcheck = true; try { @@ -1085,7 +1089,7 @@ restoreActivationLevel(activityLevel); /* we're safe again */ this->requestingString = false; - this->stackcheck = true; /* disable the checking */ + this->stackcheck = true; // reenable the checking } } } @@ -1968,10 +1972,10 @@ /******************************************************************************/ { #ifdef STACKCHECK - size_t temp; /* if checking and there isn't room */ + size_t temp; // if checking and there isn't room if (((char *)&temp - (char *)this->stackBase) < MIN_C_STACK && this->stackcheck == true) { - /* go raise an exception */ + // go raise an exception reportException(Error_Control_stack_full); } #endif Modified: main/trunk/interpreter/platform/windows/PlatformDefinitions.h =================================================================== --- main/trunk/interpreter/platform/windows/PlatformDefinitions.h 2012-07-10 19:36:45 UTC (rev 8028) +++ main/trunk/interpreter/platform/windows/PlatformDefinitions.h 2012-07-10 21:47:25 UTC (rev 8029) @@ -56,7 +56,9 @@ /* REQUIRED: The implemenation must decide on the C_STACK_SIZE defining */ /* constants that are compiler/linker dependent. */ /******************************************************************************/ -#define MIN_C_STACK 1024*32 +// we need a little more space on 64-bit platforms, so add some padding based on +// the size of a pointer +#define MIN_C_STACK 1024*(32 + sizeof(void *)) #define TOTAL_STACK_SIZE 1024*512 #define C_STACK_SIZE 60000 This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bi...@us...> - 2012-08-10 11:23:52
|
Revision: 8178 http://oorexx.svn.sourceforge.net/oorexx/?rev=8178&view=rev Author: bigrixx Date: 2012-08-10 11:23:45 +0000 (Fri, 10 Aug 2012) Log Message: ----------- [ oorexx-Bugs-3555998 ] Error message missing label Modified Paths: -------------- main/trunk/interpreter/classes/RoutineClass.cpp main/trunk/interpreter/concurrency/RexxActivity.cpp main/trunk/interpreter/execution/RexxActivation.cpp main/trunk/interpreter/execution/RexxActivation.hpp main/trunk/interpreter/expression/ExpressionFunction.cpp main/trunk/interpreter/instructions/CallInstruction.cpp Modified: main/trunk/interpreter/classes/RoutineClass.cpp =================================================================== --- main/trunk/interpreter/classes/RoutineClass.cpp 2012-08-09 23:22:30 UTC (rev 8177) +++ main/trunk/interpreter/classes/RoutineClass.cpp 2012-08-10 11:23:45 UTC (rev 8178) @@ -302,7 +302,7 @@ /****************************************************************************/ { ProtectedObject p(this); // belt-and-braces to make sure this is protected - code->call(activity, this, OREF_NONE, arguments, argCount, calltype, environment, PROGRAMCALL, result); + code->call(activity, this, executableName, arguments, argCount, calltype, environment, PROGRAMCALL, result); } @@ -316,7 +316,7 @@ /****************************************************************************/ { ProtectedObject p(this); // belt-and-braces to make sure this is protected - code->call(activity, this, OREF_NONE, arguments, argCount, OREF_COMMAND, activity->getInstance()->getDefaultEnvironment(), PROGRAMCALL, result); + code->call(activity, this, executableName, arguments, argCount, OREF_COMMAND, activity->getInstance()->getDefaultEnvironment(), PROGRAMCALL, result); } Modified: main/trunk/interpreter/concurrency/RexxActivity.cpp =================================================================== --- main/trunk/interpreter/concurrency/RexxActivity.cpp 2012-08-09 23:22:30 UTC (rev 8177) +++ main/trunk/interpreter/concurrency/RexxActivity.cpp 2012-08-10 11:23:45 UTC (rev 8178) @@ -809,11 +809,8 @@ * * @return The created exception dictionary. */ -RexxDirectory *RexxActivity::createExceptionObject( - wholenumber_t errcode, /* REXX error code */ - RexxString *description, /* descriptive information */ - RexxArray *additional, /* substitution information */ - RexxObject *result ) /* result information */ +RexxDirectory *RexxActivity::createExceptionObject(wholenumber_t errcode, + RexxString *description, RexxArray *additional, RexxObject *result ) /******************************************************************************/ /* This routine is used for SYNTAX conditions only. */ /* */ @@ -821,13 +818,12 @@ /* convenient for the calling code in the two cases where this facility */ /* is used. */ /* */ -/* NOTE: The building of the excepption obejct (EXOBJ) has been re-arranged */ +/* NOTE: The building of the exception obejct (EXOBJ) has been re-arranged */ /* so that a garbage collection in the middle of building traceBack/etc */ /* doesn't clean up the newly built objects. SO we create exobj early on */ -/* save it, and add newlly built objects to exobj as we go. */ +/* save it, and add newly built objects to exobj as we go. */ /******************************************************************************/ { - /* All error detection done. we can */ /* build and save exobj now. */ /* get an exception directory */ Modified: main/trunk/interpreter/execution/RexxActivation.cpp =================================================================== --- main/trunk/interpreter/execution/RexxActivation.cpp 2012-08-09 23:22:30 UTC (rev 8177) +++ main/trunk/interpreter/execution/RexxActivation.cpp 2012-08-10 11:23:45 UTC (rev 8178) @@ -395,7 +395,9 @@ size_t instructionCount; /* instructions without yielding */ #endif this->receiver = _receiver; /* save the message receiver */ - this->settings.msgname = msgname; /* use the passed message name */ + // the "msgname" can also be the name of an external routine, the label + // name of an internal routine. + this->settings.msgname = msgname; /* not a reply restart situation? */ if (this->execution_state != REPLIED) @@ -2827,14 +2829,20 @@ } -RexxObject * RexxActivation::internalCall( - RexxInstruction *target, /* target of the call */ - size_t _argcount, /* count of arguments */ - RexxExpressionStack *_stack, /* stack of arguments */ - ProtectedObject &returnObject) -/******************************************************************************/ -/* Function: Process an internal function or subroutine call */ -/******************************************************************************/ +/** + * Process an internal function or subroutine call. + * + * @param name The name of the target label. + * @param target The target instruction where we start executing (this is the label) + * @param _argcount The count of arguments + * @param _stack The context stack holding the arguments + * @param returnObject + * A holder for the return value + * + * @return The return value object + */ +RexxObject * RexxActivation::internalCall(RexxString *name, RexxInstruction *target, + size_t _argcount, RexxExpressionStack *_stack, ProtectedObject &returnObject) { RexxActivation * newActivation; /* new activation for call */ size_t lineNum; /* line number of the call */ @@ -2849,16 +2857,22 @@ this->activity->pushStackFrame(newActivation); /* push on the activity stack */ /* run the internal routine on the */ /* new activation */ - return newActivation->run(receiver, OREF_NULL, _arguments, _argcount, target, returnObject); + return newActivation->run(receiver, name, _arguments, _argcount, target, returnObject); } -RexxObject * RexxActivation::internalCallTrap( - RexxInstruction * target, /* target of the call */ - RexxDirectory * conditionObj, /* processed condition object */ - ProtectedObject &resultObj) -/******************************************************************************/ -/* Function: Call an internal condition trap */ -/******************************************************************************/ +/** + * Processing a call to an internal trap subroutine. + * + * @param name The label name of the internal call. + * @param target The target instruction for the call (the label) + * @param conditionObj + * The associated condition object + * @param resultObj A holder for a result object + * + * @return Any return result + */ +RexxObject * RexxActivation::internalCallTrap(RexxString *name, RexxInstruction * target, + RexxDirectory *conditionObj, ProtectedObject &resultObj) { this->stack.push(conditionObj); /* protect the condition object */ @@ -2872,7 +2886,7 @@ this->activity->pushStackFrame(newActivation); /* push on the activity stack */ /* run the internal routine on the */ /* new activation */ - return newActivation->run(OREF_NULL, OREF_NULL, NULL, 0, target, resultObj); + return newActivation->run(OREF_NULL, name, NULL, 0, target, resultObj); } Modified: main/trunk/interpreter/execution/RexxActivation.hpp =================================================================== --- main/trunk/interpreter/execution/RexxActivation.hpp 2012-08-09 23:22:30 UTC (rev 8177) +++ main/trunk/interpreter/execution/RexxActivation.hpp 2012-08-10 11:23:45 UTC (rev 8178) @@ -242,8 +242,8 @@ void trapUndelay(RexxString *); bool callExternalRexx(RexxString *, RexxObject **, size_t, RexxString *, ProtectedObject &); RexxObject * externalCall(RexxString *, size_t, RexxExpressionStack *, RexxString *, ProtectedObject &); - RexxObject * internalCall(RexxInstruction *, size_t, RexxExpressionStack *, ProtectedObject &); - RexxObject * internalCallTrap(RexxInstruction *, RexxDirectory *, ProtectedObject &); + RexxObject * internalCall(RexxString *, RexxInstruction *, size_t, RexxExpressionStack *, ProtectedObject &); + RexxObject * internalCallTrap(RexxString *, RexxInstruction *, RexxDirectory *, ProtectedObject &); bool callMacroSpaceFunction(RexxString *, RexxObject **, size_t, RexxString *, int, ProtectedObject &); static RoutineClass* getMacroCode(RexxString *macroName); RexxString *resolveProgramName(RexxString *name); Modified: main/trunk/interpreter/expression/ExpressionFunction.cpp =================================================================== --- main/trunk/interpreter/expression/ExpressionFunction.cpp 2012-08-09 23:22:30 UTC (rev 8177) +++ main/trunk/interpreter/expression/ExpressionFunction.cpp 2012-08-10 11:23:45 UTC (rev 8178) @@ -209,7 +209,7 @@ case function_internal: /* need to process internal routine */ /* go process the internal call */ - context->internalCall(this->target, argcount, stack, result); + context->internalCall(this->functionName, this->target, argcount, stack, result); break; case function_builtin: /* builtin function call */ Modified: main/trunk/interpreter/instructions/CallInstruction.cpp =================================================================== --- main/trunk/interpreter/instructions/CallInstruction.cpp 2012-08-09 23:22:30 UTC (rev 8177) +++ main/trunk/interpreter/instructions/CallInstruction.cpp 2012-08-10 11:23:45 UTC (rev 8178) @@ -261,7 +261,7 @@ case call_internal: /* need to process internal routine */ /* go process the internal call */ - context->internalCall(_target, argcount, stack, result); + context->internalCall(_name, _target, argcount, stack, result); break; case call_builtin: /* builtin function call */ @@ -304,7 +304,7 @@ case call_internal: /* need to process internal routine */ /* go process the internal call */ - context->internalCallTrap(this->target, conditionObj, result); + context->internalCallTrap((RexxString *)this->name, this->target, conditionObj, result); break; case call_builtin: /* builtin function call */ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |