From: <bi...@us...> - 2008-08-28 23:16:25
|
Revision: 3111 http://oorexx.svn.sourceforge.net/oorexx/?rev=3111&view=rev Author: bigrixx Date: 2008-08-28 23:16:34 +0000 (Thu, 28 Aug 2008) Log Message: ----------- add more descriptor files Modified Paths: -------------- main/trunk/interpreter/files.html Added Paths: ----------- main/trunk/interpreter/RexxClasses/files.html main/trunk/interpreter/parser/files.html main/trunk/interpreter/runtime/files.html main/trunk/interpreter/streamLibrary/files.html Added: main/trunk/interpreter/RexxClasses/files.html =================================================================== --- main/trunk/interpreter/RexxClasses/files.html (rev 0) +++ main/trunk/interpreter/RexxClasses/files.html 2008-08-28 23:16:34 UTC (rev 3111) @@ -0,0 +1,39 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> +<title>Open Object Rexx - Interpreter Source Files</title> <meta +http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> +</head> +<body> + + <h1>Open Object Rexx - Files</h1> + + <h1>Interpreter RexxClasses Source Files</h1> + + <p>This directory contains the ooRexx code for core classes in rexx.img that + are written partially or fully in ooRexx itself. + </p> + + <p>The following is a partial list of the files to be found in this subdirectory.</p> + + <dl> + <dt><b>CoreClasses.orx</b></dt> + <dd>This contains the main addtions to the core classes. This file + contains fully constructed classes as well as additional methods that + are added to the C++ methods of the base classes. The code contained + in here is saved in the rexx.img file. + </dd> + <dt><b>StreamClasses.orx*</b></dt> + <dd>The stream class definitions, plus the RexxQueue class. + </dd> + <dt><b>SystemMethods.orx*</b></dt> + <dd>This class is called during image build time to decide what platform + specific additional classes need to be included in the image. This + just delegates processing to the appropriate platform specific file + based on the system name. + </dd> + </dl> + +</body> +</html> + Modified: main/trunk/interpreter/files.html =================================================================== --- main/trunk/interpreter/files.html 2008-08-28 21:53:42 UTC (rev 3110) +++ main/trunk/interpreter/files.html 2008-08-28 23:16:34 UTC (rev 3111) @@ -74,7 +74,7 @@ subsystem.</td> </tr> <tr> - <td valign="top"><a href="./parser">parser</a></td> + <td valign="top"><a href="./parser/files.html">parser</a></td> <td valign="top">Files used to translate ooRexx source into an executable format. </td> </tr> @@ -88,7 +88,7 @@ </td> </tr> <tr> - <td valign="top"><a href="./RexxClasses">RexxClasses</a></td> + <td valign="top"><a href="./RexxClasses/files.html">RexxClasses</a></td> <td valign="top">The portion of the interpreter core that is implemented on ooRexx code. These files are loaded during the rexximage build step, and are saved in ready-to-use form inside the @@ -96,7 +96,7 @@ </td> </tr> <tr> - <td valign="top"><a href="./runtime">runtime</a></td> + <td valign="top"><a href="./runtime/files.html">runtime</a></td> <td valign="top">Core interpreter runtime support. This is the portion of code that defines the core interpreter and manages active interpreter instances. This is also where many of the core @@ -104,7 +104,8 @@ </td> </tr> <tr> - <td valign="top"><a href="./streamlibrary">streamlibrary</a></td> + <td valign="top"><a + href="./streamlibrary/files.html">streamlibrary</a></td> <td valign="top">The native methods that implement the .Stream class. These are implemented as external library methods so that interpreter I/O does not block multi-threaded execution while Added: main/trunk/interpreter/parser/files.html =================================================================== --- main/trunk/interpreter/parser/files.html (rev 0) +++ main/trunk/interpreter/parser/files.html 2008-08-28 23:16:34 UTC (rev 3111) @@ -0,0 +1,45 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> +<title>Open Object Rexx - Interpreter Source Files</title> <meta +http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> +</head> +<body> + + <h1>Open Object Rexx - Files</h1> + + <h1>Interpreter Parser Source Files</h1> + + <p>This directory contains the ooRexx syntax parser. The code in this + directory is responsible for converting This code is responsible for + converting ooRexx programs into the exectuble format. + </p> + + <p>The following is a partial list of the files to be found in this subdirectory.</p> + + <dl> + <dt><b>SourceFile.*</b></dt> + <dd>This is the main file for managing source translation. This handles + the general structure of the file and the directives. A lot of the + common parsing such as expression parsing is contained in here. + </dd> + <dt><b>InstructionParser.cpp*</b></dt> + <dd>Code for parsing most of the ooRexx keyword instructions. + </dd> + <dt><b>KeywordConstants.cpp*</b></dt> + <dd>Keyword tables identifying valid keyword tokens. + </dd> + <dt><b>Scanner.cpp*</b></dt> + <dd>The lexical scanner that identifies the basic ooRexx token types. + </dd> + <dt><b>Clause.*</b></dt> + <dd>A representation of an ooRexx clause, as a set of tokens. + </dd> + <dt><b>Token.*</b></dt> + <dd>A representation of an ooRexx lexical token. + </dd> + </dl> + +</body> +</html> + Added: main/trunk/interpreter/runtime/files.html =================================================================== --- main/trunk/interpreter/runtime/files.html (rev 0) +++ main/trunk/interpreter/runtime/files.html 2008-08-28 23:16:34 UTC (rev 3111) @@ -0,0 +1,41 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> +<title>Open Object Rexx - Interpreter Source Files</title> <meta +http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> +</head> +<body> + + <h1>Open Object Rexx - Files</h1> + + <h1>Interpreter Runtime Source Files</h1> + + <p>This directory contains the ooRexx code for the basics of the ooRexx + interpreter runtime. This is the core interpreter control and major + definition files. + </p> + + <p>The following is a partial list of the files to be found in this subdirectory.</p> + + <dl> + <dt><b>RexxCore.h</b></dt> + <dd>The root header file that pulls in most of the major interpreter + definitions. + </dd> + <dt><b>Interpreter.*</b></dt> + <dd>The major interpreter control class. This is comprised of static + methods and static fields and holds the global interpreter state data. + </dd> + <dt><b>InterpreterInstance.*</b></dt> + <dd>The process interpreter environment is made up one or more separate + interpreter instances, described by this class. + </dd> + <dt><b>Numerics.*</b></dt> + <dd>A class consisting of static methods and fields for global numeric + processing. + </dd> + </dl> + +</body> +</html> + Added: main/trunk/interpreter/streamLibrary/files.html =================================================================== --- main/trunk/interpreter/streamLibrary/files.html (rev 0) +++ main/trunk/interpreter/streamLibrary/files.html 2008-08-28 23:16:34 UTC (rev 3111) @@ -0,0 +1,31 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> +<title>Open Object Rexx - Interpreter Source Files</title> <meta +http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> +</head> +<body> + + <h1>Open Object Rexx - Files</h1> + + <h1>Interpreter Stream Library Source Files</h1> + + <p>This directory contains the native code backing the stream class. + </p> + + <p>The following is a partial list of the files to be found in this subdirectory.</p> + + <dl> + <dt><b>StreamNative.*</b></dt> + <dd>The implementation of the native methods that makes up the stream + library. + </dd> + <dt><b>StreamCommandParser.*</b></dt> + <dd>A generalized command parser used to parse stream commands and + options. + </dd> + </dl> + +</body> +</html> + This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bi...@us...> - 2008-08-28 23:23:26
|
Revision: 3112 http://oorexx.svn.sourceforge.net/oorexx/?rev=3112&view=rev Author: bigrixx Date: 2008-08-28 23:23:34 +0000 (Thu, 28 Aug 2008) Log Message: ----------- [ 2074349 ] Multiple interpreter instances mix up .local & .environment Modified Paths: -------------- main/trunk/interpreter/RexxClasses/CoreClasses.orx main/trunk/interpreter/api/ThreadContextStubs.cpp main/trunk/interpreter/classes/DirectoryClass.cpp main/trunk/interpreter/concurrency/ActivityManager.cpp main/trunk/interpreter/concurrency/ActivityManager.hpp main/trunk/interpreter/concurrency/RexxActivity.cpp main/trunk/interpreter/concurrency/RexxActivity.hpp main/trunk/interpreter/execution/RexxActivation.cpp main/trunk/interpreter/execution/RexxActivation.hpp main/trunk/interpreter/expression/BuiltinFunctions.cpp main/trunk/interpreter/parser/SourceFile.cpp main/trunk/interpreter/runtime/GlobalNames.h main/trunk/interpreter/runtime/Interpreter.cpp main/trunk/interpreter/runtime/Interpreter.hpp main/trunk/interpreter/runtime/InterpreterInstance.cpp main/trunk/interpreter/runtime/InterpreterInstance.hpp main/trunk/interpreter/runtime/RexxConstants.hpp main/trunk/interpreter/runtime/RexxMisc.cpp Modified: main/trunk/interpreter/RexxClasses/CoreClasses.orx =================================================================== --- main/trunk/interpreter/RexxClasses/CoreClasses.orx 2008-08-28 23:16:34 UTC (rev 3111) +++ main/trunk/interpreter/RexxClasses/CoreClasses.orx 2008-08-28 23:23:34 UTC (rev 3112) @@ -98,6 +98,7 @@ server_mdict = .table~new server_mdict~put(.methods~server_init, 'INIT') +server_mdict~put(.methods~server_init_instance, 'INITINSTANCE') server~!define_methods(server_mdict) server~!rexxdefined /* Mark as unchangeable */ @@ -403,20 +404,29 @@ ::METHOD server_init /* initialize a server */ - expose localenv + expose input output error + /* set system objects in the local environment */ + input = .stream~new('STDIN')~~command('open nobuffer') + output = .stream~new('STDOUT')~~command('open nobuffer') + error = .stream~new('STDERR')~~command('open nobuffer') + self~initinstance +::METHOD server_init_instance + /* initialize a server */ + expose input output error + .local~objectname = "The Local Directory" -- give the local environment a nicer descriptive name. .local~setentry('LOCALSERVER', self) /* set system objects in the local environment */ - .local~setentry('STDIN',.stream~new('STDIN')~~command('open nobuffer')) + .local~setentry('STDIN', input) .local~setentry('INPUT',.monitor~new(.stdin)) .input~objectname = "The INPUT monitor" - .local~setentry('STDOUT',.stream~new('STDOUT')~~command('open nobuffer')) + .local~setentry('STDOUT', output) .local~setentry('OUTPUT',.monitor~new(.stdout)) .output~objectname = "The OUTPUT monitor" - .local~setentry('STDERR',.stream~new('STDERR')~~command('open nobuffer')) + .local~setentry('STDERR', error) .local~setentry('ERROR', .monitor~new(.stderr)) .error~objectname = "The ERROR monitor" Modified: main/trunk/interpreter/api/ThreadContextStubs.cpp =================================================================== --- main/trunk/interpreter/api/ThreadContextStubs.cpp 2008-08-28 23:16:34 UTC (rev 3111) +++ main/trunk/interpreter/api/ThreadContextStubs.cpp 2008-08-28 23:23:34 UTC (rev 3112) @@ -209,7 +209,7 @@ ApiContext context(c); try { - return (RexxDirectoryObject)ActivityManager::localEnvironment; + return (RexxDirectoryObject)context.activity->getLocal(); } catch (RexxNativeActivation *) { Modified: main/trunk/interpreter/classes/DirectoryClass.cpp =================================================================== --- main/trunk/interpreter/classes/DirectoryClass.cpp 2008-08-28 23:16:34 UTC (rev 3111) +++ main/trunk/interpreter/classes/DirectoryClass.cpp 2008-08-28 23:23:34 UTC (rev 3112) @@ -600,7 +600,7 @@ /* get as a string parameter */ _index = stringArgument(_index, ARG_ONE); // is this the .local object? We'll need to check with the security manager - if ((RexxDirectory *)(ActivityManager::localEnvironment) == this) + if (ActivityManager::getLocal() == this) { SecurityManager *manager = ActivityManager::currentActivity->getEffectiveSecurityManager(); temp = manager->checkLocalAccess(_index); Modified: main/trunk/interpreter/concurrency/ActivityManager.cpp =================================================================== --- main/trunk/interpreter/concurrency/ActivityManager.cpp 2008-08-28 23:16:34 UTC (rev 3111) +++ main/trunk/interpreter/concurrency/ActivityManager.cpp 2008-08-28 23:23:34 UTC (rev 3112) @@ -83,9 +83,6 @@ // number of active interpreter instances in this process size_t ActivityManager::interpreterInstances = 0; -// the local environment -RexxDirectory *ActivityManager::localEnvironment = OREF_NULL; - // global lock for the interpreter SysMutex ActivityManager::kernelSemaphore; @@ -129,7 +126,6 @@ nativeActivationCacheSize = NATIVE_ACTIVATION_CACHE_SIZE; currentActivity = OREF_NULL; - localEnvironment = new_directory(); } void ActivityManager::live(size_t liveMark) @@ -146,10 +142,9 @@ memory_mark(availableActivities); memory_mark(allActivities); memory_mark(activations); -memory_mark(nativeActivations); + memory_mark(nativeActivations); memory_mark(firstWaitingActivity); memory_mark(lastWaitingActivity); - memory_mark(localEnvironment); } void ActivityManager::liveGeneral(int reason) @@ -170,7 +165,6 @@ memory_mark_general(nativeActivations); memory_mark_general(firstWaitingActivity); memory_mark_general(lastWaitingActivity); - memory_mark_general(localEnvironment); } } @@ -305,10 +299,6 @@ /* done after uninit calls. incas */ /* uninits needed some. */ clearActivityPool(); - // if there are no activities yet to shutdown, we can terminate immediately. - // Otherwise, we need to wait for the rest of the threads to finish cleaning - // up. Once the last thread terminates, we can shutdown. - localEnvironment = OREF_NULL; /* no local environment */ } @@ -1011,6 +1001,39 @@ /** + * Retrieve a variable from the current local environment + * object. + * + * @param name The name of the environment variable. + * + * @return The object stored in .local at the requested name. + */ +RexxObject *ActivityManager::getLocalEnvironment(RexxString *name) +{ + if (currentActivity == OREF_NULL) + { + return TheNilObject; + } + return currentActivity->getLocalEnvironment(name); +} + + +/** + * Retrieve the current .local directory instance. + * + * @return The .local directory for the current activity. + */ +RexxDirectory *ActivityManager::getLocal() +{ + if (currentActivity == OREF_NULL) + { + return OREF_NULL; + } + return currentActivity->getLocal(); +} + + +/** * Enter a native context block. This will locate the appropriate * activity for this callback and acquire kernel access on that * activity. If this thread has never been used, then a new @@ -1067,3 +1090,4 @@ self->createLocalReference(o); return o; } + Modified: main/trunk/interpreter/concurrency/ActivityManager.hpp =================================================================== --- main/trunk/interpreter/concurrency/ActivityManager.hpp 2008-08-28 23:16:34 UTC (rev 3111) +++ main/trunk/interpreter/concurrency/ActivityManager.hpp 2008-08-28 23:23:34 UTC (rev 3112) @@ -93,9 +93,10 @@ static void relinquish(RexxActivity *activity); static RexxActivity *getRootActivity(); static RexxActivity *attachThread(); + static RexxObject *getLocalEnvironment(RexxString *name); + static RexxDirectory *getLocal(); static RexxActivity *currentActivity; // the currently active thread - static RexxDirectory *localEnvironment; // the .local environment static inline void postTermination() { Modified: main/trunk/interpreter/concurrency/RexxActivity.cpp =================================================================== --- main/trunk/interpreter/concurrency/RexxActivity.cpp 2008-08-28 23:16:34 UTC (rev 3111) +++ main/trunk/interpreter/concurrency/RexxActivity.cpp 2008-08-28 23:23:34 UTC (rev 3112) @@ -1851,12 +1851,13 @@ #endif } -RexxObject *RexxActivity::localMethod() + +RexxDirectory *RexxActivity::getLocal() /******************************************************************************/ /* Function: Retrive the activities local environment */ /******************************************************************************/ { - return ActivityManager::localEnvironment; // just return the .local directory + return instance->getLocal(); // just return the .local directory } thread_id_t RexxActivity::threadIdMethod() @@ -2657,7 +2658,7 @@ if (this->callTraceExit(activation, line)) { /* get the default output stream */ - RexxObject *stream = ActivityManager::localEnvironment->at(OREF_ERRORNAME); + RexxObject *stream = getLocalEnvironment(OREF_ERRORNAME); /* have .local set up yet? */ if (stream != OREF_NULL && stream != TheNilObject) { @@ -2681,7 +2682,7 @@ if (this->callSayExit(activation, line)) { /* get the default output stream */ - RexxObject *stream = ActivityManager::localEnvironment->at(OREF_OUTPUT); + RexxObject *stream = getLocalEnvironment(OREF_OUTPUT); /* have .local set up yet? */ if (stream != OREF_NULL && stream != TheNilObject) { @@ -2707,7 +2708,7 @@ if (this->callDebugInputExit(activation, value)) { /* get the input stream */ - RexxObject *stream = ActivityManager::localEnvironment->at(OREF_INPUT); + RexxObject *stream = getLocalEnvironment(OREF_INPUT); if (stream != OREF_NULL) /* have a stream? */ { /* read from it */ @@ -2739,7 +2740,7 @@ if (this->callPullExit(activation, value)) { /* get the external data queue */ - RexxObject *stream = ActivityManager::localEnvironment->at(OREF_REXXQUEUE); + RexxObject *stream = getLocalEnvironment(OREF_REXXQUEUE); if (stream != OREF_NULL) /* have a data queue? */ { /* pull from the queue */ @@ -2782,7 +2783,7 @@ if (this->callTerminalInputExit(activation, value)) { /* get the input stream */ - RexxObject *stream = ActivityManager::localEnvironment->at(OREF_INPUT); + RexxObject *stream = getLocalEnvironment(OREF_INPUT); if (stream != OREF_NULL) /* have a stream? */ { /* read from it */ @@ -2814,7 +2815,7 @@ if (this->callPushExit(activation, line, order)) { /* get the default queue */ - RexxObject *targetQueue = ActivityManager::localEnvironment->at(OREF_REXXQUEUE); + RexxObject *targetQueue = getLocalEnvironment(OREF_REXXQUEUE); if (targetQueue != OREF_NULL) /* have a data queue? */ { /* pull from the queue */ @@ -2998,3 +2999,16 @@ { return instance->resolveProgramName(name, dir, ext); } + + +/** + * Retrieve a value from the instance local environment. + * + * @param name The name of the .local object. + * + * @return The object stored at the given name. + */ +RexxObject *RexxActivity::getLocalEnvironment(RexxString *name) +{ + return instance->getLocalEnvironment(name); +} Modified: main/trunk/interpreter/concurrency/RexxActivity.hpp =================================================================== --- main/trunk/interpreter/concurrency/RexxActivity.hpp 2008-08-28 23:16:34 UTC (rev 3111) +++ main/trunk/interpreter/concurrency/RexxActivity.hpp 2008-08-28 23:23:34 UTC (rev 3112) @@ -199,10 +199,8 @@ void checkStackSpace(); void cleanupActivityResources(); void terminatePoolActivity(); - RexxObject *localMethod(); thread_id_t threadIdMethod(); bool isThread(thread_id_t id) { return currentThread.equals(id); } - void setShvVal(RexxString *); inline bool isClauseExitUsed() { return clauseExitUsed; } void queryTrcHlt(); bool callExit(RexxActivation * activation, const char *exitName, int function, int subfunction, void *exitbuffer); @@ -313,6 +311,8 @@ void createMethodContext(MethodContext &context, RexxNativeActivation *owner); void createCallContext(CallContext &context, RexxNativeActivation *owner); void createExitContext(ExitContext &context, RexxNativeActivation *owner); + RexxObject *getLocalEnvironment(RexxString *name); + RexxDirectory *getLocal(); static void initializeThreadContext(); Modified: main/trunk/interpreter/execution/RexxActivation.cpp =================================================================== --- main/trunk/interpreter/execution/RexxActivation.cpp 2008-08-28 23:16:34 UTC (rev 3111) +++ main/trunk/interpreter/execution/RexxActivation.cpp 2008-08-28 23:23:34 UTC (rev 3112) @@ -3644,7 +3644,7 @@ /******************************************************************************/ { /* get the handler from .local */ - RexxObject *novalue_handler = ActivityManager::localEnvironment->fastAt(OREF_NOVALUE); + RexxObject *novalue_handler = getLocalEnvironment(OREF_NOVALUE); if (novalue_handler != OREF_NULL) /* have a novalue handler? */ { /* ask it to process this */ @@ -4037,3 +4037,16 @@ } return activity->getInstanceSecurityManager(); } + + +/** + * Retrieve a value from the instance local environment. + * + * @param name The name of the .local object. + * + * @return The object stored at the given name. + */ +RexxObject *RexxActivation::getLocalEnvironment(RexxString *name) +{ + return activity->getLocalEnvironment(name); +} Modified: main/trunk/interpreter/execution/RexxActivation.hpp =================================================================== --- main/trunk/interpreter/execution/RexxActivation.hpp 2008-08-28 23:16:34 UTC (rev 3111) +++ main/trunk/interpreter/execution/RexxActivation.hpp 2008-08-28 23:23:34 UTC (rev 3112) @@ -338,6 +338,7 @@ RexxSource *getSourceObject(); PackageClass *getPackage(); RexxObject *getExecutableObject() { return executable; } + RexxObject *getLocalEnvironment(RexxString *name); inline void setCallType(RexxString *type) {this->settings.calltype = type; } inline void pushBlock(RexxDoBlock *block) { block->setPrevious(this->dostack); this->dostack = block; } Modified: main/trunk/interpreter/expression/BuiltinFunctions.cpp =================================================================== --- main/trunk/interpreter/expression/BuiltinFunctions.cpp 2008-08-28 23:16:34 UTC (rev 3111) +++ main/trunk/interpreter/expression/BuiltinFunctions.cpp 2008-08-28 23:23:34 UTC (rev 3112) @@ -1856,6 +1856,8 @@ } return result; /* return old trace setting */ } + + /* resolve a stream name */ RexxObject *resolve_stream( RexxString *name, /* name of the stream */ @@ -1883,31 +1885,31 @@ if (input) /* input operation? */ { /* get the default output stream */ - return ActivityManager::localEnvironment->at(OREF_INPUT); + return context->getLocalEnvironment(OREF_INPUT); } else { /* get the default output stream */ - return ActivityManager::localEnvironment->at(OREF_OUTPUT); + return context->getLocalEnvironment(OREF_OUTPUT); } } /* standard input stream? */ else if (name->strICompare(CHAR_STDIN) || name->strICompare(CHAR_CSTDIN)) { /* get the default output stream */ - return ActivityManager::localEnvironment->at(OREF_INPUT); + return context->getLocalEnvironment(OREF_INPUT); } /* standard output stream? */ else if (name->strICompare(CHAR_STDOUT) || name->strICompare(CHAR_CSTDOUT)) { /* get the default output stream */ - return ActivityManager::localEnvironment->at(OREF_OUTPUT); + return context->getLocalEnvironment(OREF_OUTPUT); } /* standard error stream? */ else if (name->strICompare(CHAR_STDERR) || name->strICompare(CHAR_CSTDERR)) { /* get the default output stream */ - return ActivityManager::localEnvironment->at(OREF_ERRORNAME); + return context->getLocalEnvironment(OREF_ERRORNAME); } else { @@ -1987,7 +1989,7 @@ if (context->getActivity()->callPullExit(context, result)) { /* get the default output stream */ - RexxObject *stream = ActivityManager::localEnvironment->at(OREF_REXXQUEUE); + RexxObject *stream = context->getLocalEnvironment(OREF_REXXQUEUE); /* pull from the queue */ return stream->sendMessage(OREF_LINEIN); } @@ -2078,7 +2080,7 @@ if (string != OREF_NULL) { /* have an actual string to write? */ /* get the default output stream */ - RexxObject *stream = ActivityManager::localEnvironment->at(OREF_REXXQUEUE); + RexxObject *stream = context->getLocalEnvironment(OREF_REXXQUEUE); /* push onto the queue */ return stream->sendMessage(OREF_QUEUENAME, string); } @@ -2167,7 +2169,7 @@ if (check_queue(name)) { /* is this "QUEUE:" */ /* get the default output stream */ - RexxObject *stream = ActivityManager::localEnvironment->at(OREF_REXXQUEUE); + RexxObject *stream = context->getLocalEnvironment(OREF_REXXQUEUE); /* return count on the queue */ result = stream->sendMessage(OREF_QUERY); } @@ -2365,7 +2367,7 @@ /* get the default output stream */ if (context->getActivity()->callQueueSizeExit(context, queuesize)) { - RexxObject *queue = ActivityManager::localEnvironment->at(OREF_REXXQUEUE); + RexxObject *queue = context->getLocalEnvironment(OREF_REXXQUEUE); /* return count on the queue */ return queue->sendMessage(OREF_QUEUED); } Modified: main/trunk/interpreter/parser/SourceFile.cpp =================================================================== --- main/trunk/interpreter/parser/SourceFile.cpp 2008-08-28 23:16:34 UTC (rev 3111) +++ main/trunk/interpreter/parser/SourceFile.cpp 2008-08-28 23:23:34 UTC (rev 3112) @@ -1588,7 +1588,7 @@ } /* send message to .local */ - classObject = (RexxClass *)(ActivityManager::localEnvironment->at(internalName)); + classObject = (RexxClass *)(ActivityManager::getLocalEnvironment(internalName)); if (classObject != OREF_NULL) { return classObject; Modified: main/trunk/interpreter/runtime/GlobalNames.h =================================================================== --- main/trunk/interpreter/runtime/GlobalNames.h 2008-08-28 23:16:34 UTC (rev 3111) +++ main/trunk/interpreter/runtime/GlobalNames.h 2008-08-28 23:23:34 UTC (rev 3112) @@ -94,6 +94,7 @@ GLOBAL_NAME(HASHCODE, CHAR_HASHCODE) GLOBAL_NAME(INHERIT, CHAR_INHERIT) GLOBAL_NAME(INIT, CHAR_INIT) + GLOBAL_NAME(INITINSTANCE, CHAR_INITINSTANCE) GLOBAL_NAME(INITIALADDRESS, CHAR_INITIALADDRESS) GLOBAL_NAME(INPUT, CHAR_INPUT) GLOBAL_NAME(INSERT, CHAR_INSERT) Modified: main/trunk/interpreter/runtime/Interpreter.cpp =================================================================== --- main/trunk/interpreter/runtime/Interpreter.cpp 2008-08-28 23:16:34 UTC (rev 3111) +++ main/trunk/interpreter/runtime/Interpreter.cpp 2008-08-28 23:23:34 UTC (rev 3112) @@ -162,6 +162,21 @@ /** + * Initialize an instance .local object. + */ +void Interpreter::initLocal() +{ + // only do this if the local server has already been created. + if (localServer != OREF_NULL) + { + // this will insert the initial .local objects + ProtectedObject result; + localServer->messageSend(OREF_INITINSTANCE, 0, OREF_NULL, result); + } +} + + +/** * Terminate the global interpreter environment, shutting down * all of the interpreter instances that we can and releasing * the object heap memory. @@ -462,7 +477,7 @@ { RexxString *internalName = className->upper(); /* upper case it */ /* send message to .local */ - RexxClass *classObject = (RexxClass *)(ActivityManager::localEnvironment->at(internalName)); + RexxClass *classObject = (RexxClass *)(ActivityManager::getLocalEnvironment(internalName)); if (classObject != OREF_NULL) { return classObject; @@ -480,7 +495,7 @@ */ RexxString *Interpreter::getCurrentQueue() { - RexxObject *queue = ActivityManager::localEnvironment->at(OREF_REXXQUEUE); + RexxObject *queue = ActivityManager::getLocalEnvironment(OREF_REXXQUEUE); if (queue == OREF_NULL) /* no queue? */ { Modified: main/trunk/interpreter/runtime/Interpreter.hpp =================================================================== --- main/trunk/interpreter/runtime/Interpreter.hpp 2008-08-28 23:16:34 UTC (rev 3111) +++ main/trunk/interpreter/runtime/Interpreter.hpp 2008-08-28 23:23:34 UTC (rev 3112) @@ -94,6 +94,7 @@ static inline InterpreterInstance *createInterpreterInstance() { return createInterpreterInstance(NULL); } static bool terminateInterpreterInstance(InterpreterInstance *instance); static RexxString *getVersionNumber(); + static void initLocal(); static inline bool hasTimeSliceElapsed() { Modified: main/trunk/interpreter/runtime/InterpreterInstance.cpp =================================================================== --- main/trunk/interpreter/runtime/InterpreterInstance.cpp 2008-08-28 23:16:34 UTC (rev 3111) +++ main/trunk/interpreter/runtime/InterpreterInstance.cpp 2008-08-28 23:23:34 UTC (rev 3112) @@ -46,6 +46,7 @@ #include "ActivityManager.hpp" #include "RexxActivation.hpp" #include "PackageManager.hpp" +#include "DirectoryClass.hpp" /** * Create a new Package object instance. @@ -89,6 +90,7 @@ memory_mark(searchPath); memory_mark(searchExtensions); memory_mark(securityManager); + memory_mark(localEnvironment); } @@ -104,6 +106,7 @@ memory_mark_general(searchPath); memory_mark_general(searchExtensions); memory_mark_general(securityManager); + memory_mark_general(localEnvironment); } @@ -134,7 +137,10 @@ // associate the thread with this instance activity->setupAttachedActivity(this); - + // create a local environment + localEnvironment = new_directory(); + // now do the local initialization; + Interpreter::initLocal(); } @@ -669,3 +675,20 @@ { return rootActivity->getThreadContext(); } + + +/** + * Retrieve a value from the instance local environment. + * + * @param name The name of the .local object. + * + * @return The object stored at the given name. + */ +RexxObject *InterpreterInstance::getLocalEnvironment(RexxString *name) +{ + if (localEnvironment == OREF_NULL) + { + return TheNilObject; + } + return localEnvironment->at(name); +} Modified: main/trunk/interpreter/runtime/InterpreterInstance.hpp =================================================================== --- main/trunk/interpreter/runtime/InterpreterInstance.hpp 2008-08-28 23:16:34 UTC (rev 3111) +++ main/trunk/interpreter/runtime/InterpreterInstance.hpp 2008-08-28 23:23:34 UTC (rev 3112) @@ -48,6 +48,8 @@ #include "ActivationApiContexts.hpp" #include "SysInterpreterInstance.hpp" +class RexxDirectory; + class InterpreterInstance : public RexxInternalObject { // the SysInterpreterInstance is essentially an extension of this class, @@ -104,6 +106,8 @@ void setSecurityManager(RexxObject *m); RexxInstance *getInstanceContext() { return &context.instanceContext; } RexxThreadContext *getRootThreadContext(); + RexxObject *getLocalEnvironment(RexxString *); + inline RexxDirectory *getLocal() { return localEnvironment; } protected: @@ -120,11 +124,12 @@ RexxList *activeActivities; // the activity table RexxList *attachedActivities; // our list of attached vs. spawned activities RexxList *spawnedActivities; // activities this instance has spawned off - RexxIdentityTable *globalReferences; // our global reference table + RexxIdentityTable *globalReferences; // our global reference table RexxString *defaultEnvironment; // the default address environment RexxString *searchPath; // additional Rexx search path RexxList *searchExtensions; // extensions to search on for external calls void *applicationData; // application specific data + RexxDirectory *localEnvironment; // the current local environment bool terminating; // shutdown indicator bool terminated; // last thread cleared indicator Modified: main/trunk/interpreter/runtime/RexxConstants.hpp =================================================================== --- main/trunk/interpreter/runtime/RexxConstants.hpp 2008-08-28 23:16:34 UTC (rev 3111) +++ main/trunk/interpreter/runtime/RexxConstants.hpp 2008-08-28 23:23:34 UTC (rev 3112) @@ -36,7 +36,7 @@ /* */ /*----------------------------------------------------------------------------*/ /******************************************************************************/ -/* REXX Kernel RexxConstants.h */ +/* REXX Kernel RexxConstants.hpp */ /* */ /* Global Object REXX constants */ /* */ @@ -166,6 +166,7 @@ CHARCONSTANT(IMPORTEDROUTINES, "IMPORTEDROUTINES"); CHARCONSTANT(INDEX, "INDEX"); CHARCONSTANT(INHERIT, "INHERIT"); +CHARCONSTANT(INITINSTANCE, "INITINSTANCE"); CHARCONSTANT(INIT, "INIT"); CHARCONSTANT(INITIALADDRESS, SYSINITIALADDRESS); CHARCONSTANT(INPUT, "INPUT"); Modified: main/trunk/interpreter/runtime/RexxMisc.cpp =================================================================== --- main/trunk/interpreter/runtime/RexxMisc.cpp 2008-08-28 23:16:34 UTC (rev 3111) +++ main/trunk/interpreter/runtime/RexxMisc.cpp 2008-08-28 23:23:34 UTC (rev 3112) @@ -67,6 +67,6 @@ { /* just return the current local */ /* environment */ - return ActivityManager::localEnvironment; + return ActivityManager::getLocal(); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bi...@us...> - 2008-09-01 14:32:19
|
Revision: 3132 http://oorexx.svn.sourceforge.net/oorexx/?rev=3132&view=rev Author: bigrixx Date: 2008-09-01 14:32:29 +0000 (Mon, 01 Sep 2008) Log Message: ----------- move setting of the .endofline variable to the platform specific code Modified Paths: -------------- main/trunk/interpreter/RexxClasses/CoreClasses.orx main/trunk/interpreter/platform/unix/PlatformObjects.orx main/trunk/interpreter/platform/windows/PlatformObjects.orx Modified: main/trunk/interpreter/RexxClasses/CoreClasses.orx =================================================================== --- main/trunk/interpreter/RexxClasses/CoreClasses.orx 2008-09-01 13:56:51 UTC (rev 3131) +++ main/trunk/interpreter/RexxClasses/CoreClasses.orx 2008-09-01 14:32:29 UTC (rev 3132) @@ -90,15 +90,6 @@ .environment~setentry('INVERTINGCOMPARATOR', .invertingcomparator) .environment~setentry('ORDERABLE', .orderable) -/* There are only 2 possibilities for end of line at this time. */ -sysIntName = .system~internalname~translate -if 'WINDOWS' = sysIntName | 'WINDOWSNT' = sysIntName | 'WINDOWS95' = sysIntName then do - .environment~setentry('ENDOFLINE', '0d0a'x) -end -else do - .environment~setentry('ENDOFLINE', '0a'x) -end - say ('creating .!server and defining its instance methods') server = .object~subclass('server') server_mdict = .table~new Modified: main/trunk/interpreter/platform/unix/PlatformObjects.orx =================================================================== --- main/trunk/interpreter/platform/unix/PlatformObjects.orx 2008-09-01 13:56:51 UTC (rev 3131) +++ main/trunk/interpreter/platform/unix/PlatformObjects.orx 2008-09-01 14:32:29 UTC (rev 3132) @@ -1 +1,2 @@ --- Nothing defined yet for Unix systems +-- set the endOfLine environment variable + .environment~setentry('ENDOFLINE', '0a'x) Modified: main/trunk/interpreter/platform/windows/PlatformObjects.orx =================================================================== --- main/trunk/interpreter/platform/windows/PlatformObjects.orx 2008-09-01 13:56:51 UTC (rev 3131) +++ main/trunk/interpreter/platform/windows/PlatformObjects.orx 2008-09-01 14:32:29 UTC (rev 3132) @@ -1,2 +1,5 @@ +-- set the endOfLine environment variable +.environment~setentry('ENDOFLINE', '0d0a'x) + /* load the OLE support under windows */ call 'orexxole.cls' 'REXX' This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bi...@us...> - 2008-09-02 18:59:31
|
Revision: 3138 http://oorexx.svn.sourceforge.net/oorexx/?rev=3138&view=rev Author: bigrixx Date: 2008-09-02 18:59:30 +0000 (Tue, 02 Sep 2008) Log Message: ----------- Fix string value error in Pointer class Modified Paths: -------------- main/trunk/interpreter/classes/PointerClass.cpp main/trunk/interpreter/execution/RexxNativeActivation.cpp main/trunk/interpreter/runtime/Numerics.cpp main/trunk/interpreter/runtime/Numerics.hpp Modified: main/trunk/interpreter/classes/PointerClass.cpp =================================================================== --- main/trunk/interpreter/classes/PointerClass.cpp 2008-09-02 18:45:05 UTC (rev 3137) +++ main/trunk/interpreter/classes/PointerClass.cpp 2008-09-02 18:59:30 UTC (rev 3138) @@ -136,11 +136,13 @@ } +/** + * Format this as a character string value. + * + * @return The character string value. + */ RexxString *RexxPointer::stringValue() { - char buffer[36]; // large enough for even a 16-byte pointer value - // format the pointer value and transform into a string - sprintf(buffer, "0x%p", pointer()); - return new_string(buffer); + return Numerics::pointerToString(pointer()); } Modified: main/trunk/interpreter/execution/RexxNativeActivation.cpp =================================================================== --- main/trunk/interpreter/execution/RexxNativeActivation.cpp 2008-09-02 18:45:05 UTC (rev 3137) +++ main/trunk/interpreter/execution/RexxNativeActivation.cpp 2008-09-02 18:59:30 UTC (rev 3138) @@ -724,9 +724,7 @@ case REXX_VALUE_POINTERSTRING: { // format this into a chracter string - char temp[32]; - sprintf(temp, "0x%p", value->value.value_POINTER); - return new_string(temp); + return Numerics::pointerToString(value->value.value_POINTER); } case 0: Modified: main/trunk/interpreter/runtime/Numerics.cpp =================================================================== --- main/trunk/interpreter/runtime/Numerics.cpp 2008-09-02 18:45:05 UTC (rev 3137) +++ main/trunk/interpreter/runtime/Numerics.cpp 2008-09-02 18:59:30 UTC (rev 3138) @@ -672,3 +672,27 @@ // that a wholenumber_t is the same size as an intptr_t. return new_numberstringFromWholenumber((wholenumber_t)v); } + + +/** + * Format a pointer into a string value using a consistent + * formatting style. + * + * @param p The pointer valut to format. + * + * @return The pointer as a string value in the format 0xnnnnnnnn. + */ +RexxString *Numerics::pointerToString(void *p) +{ + // format this into a chracter string + char temp[32]; + // unfortunately, the formation of %p is not consistent across platforms. + // We first format this directly, and if the value does not be + sprintf(temp, "%p", p); + if (temp[1] != 'x') + { + sprintf(temp, "0x%p", p); + } + return new_string(temp); + +} Modified: main/trunk/interpreter/runtime/Numerics.hpp =================================================================== --- main/trunk/interpreter/runtime/Numerics.hpp 2008-09-02 18:45:05 UTC (rev 3137) +++ main/trunk/interpreter/runtime/Numerics.hpp 2008-09-02 18:59:30 UTC (rev 3138) @@ -126,7 +126,9 @@ return validMaxWhole[e - 1]; } + static RexxString *pointerToString(void *); + protected: static NumericSettings *settings; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bi...@us...> - 2008-09-03 12:15:39
|
Revision: 3143 http://oorexx.svn.sourceforge.net/oorexx/?rev=3143&view=rev Author: bigrixx Date: 2008-09-03 12:15:49 +0000 (Wed, 03 Sep 2008) Log Message: ----------- Fix memory management constants for 64-bit systems Modified Paths: -------------- main/trunk/interpreter/memory/DeadObject.hpp main/trunk/interpreter/memory/RexxMemory.hpp main/trunk/interpreter/parser/InstructionParser.cpp Modified: main/trunk/interpreter/memory/DeadObject.hpp =================================================================== --- main/trunk/interpreter/memory/DeadObject.hpp 2008-09-02 21:42:07 UTC (rev 3142) +++ main/trunk/interpreter/memory/DeadObject.hpp 2008-09-03 12:15:49 UTC (rev 3143) @@ -123,7 +123,6 @@ ObjectHeader header; /* header info just like any obj */ DeadObject *next; /* next dead object on this chain */ DeadObject *previous; /* prev dead object on this chain */ - }; /* A pool of dead objects. This is the anchor for a set of dead */ Modified: main/trunk/interpreter/memory/RexxMemory.hpp =================================================================== --- main/trunk/interpreter/memory/RexxMemory.hpp 2008-09-02 21:42:07 UTC (rev 3142) +++ main/trunk/interpreter/memory/RexxMemory.hpp 2008-09-03 12:15:49 UTC (rev 3143) @@ -48,20 +48,40 @@ #include "SysSemaphore.hpp" #include "IdentityTableClass.hpp" +#ifdef __REXX64__ +// The minimum allocation unit for an object. +// 16 is needed for 64-bit to maintain some required alignments +#define ObjectGrain 16 +/* The unit of granularity for large allocation */ +#define LargeAllocationUnit 2048 +/* The unit of granularity for extremely large objects */ +#define VeryLargeAllocationUnit 8192 +/* Minimum size of an object. This is not the actual minimum size, */ +/* but we allocate objects with an 8-byte granularity */ +/* this is the granularity for objects greater than 16Mb. */ +#define VeryLargeObjectGrain 512 + +/* Minimum size of an object. This is not the actual minimum size, */ +/* but we allocate objects with a defined granularity */ +/* This is the smallest object we'll allocate from storage. */ +#define MinimumObjectSize ((size_t)48) +#define MaximumObjectSize ((size_t)0xfffffffffffffff0ull) +#else /* The minimum allocation unit for an object. */ #define ObjectGrain 8 /* The unit of granularity for large allocation */ #define LargeAllocationUnit 1024 /* The unit of granularity for extremely large objects */ #define VeryLargeAllocationUnit 4096 -/* Minimum size of an object. This is not the actual minimum size, */ -/* but we allocate objects with an 8-byte granularity */ /* this is the granularity for objects greater than 16Mb. */ #define VeryLargeObjectGrain 256 +/* Minimum size of an object. This is not the actual minimum size, */ +/* but we allocate objects with an 8-byte granularity */ /* This is the smallest object we'll allocate from storage. */ #define MinimumObjectSize ((size_t)24) #define MaximumObjectSize ((size_t)0xfffffff0) +#endif inline void SetObjectLive(void *o, size_t mark) { ((RexxObject *)o)->setObjectLive(mark); Modified: main/trunk/interpreter/parser/InstructionParser.cpp =================================================================== --- main/trunk/interpreter/parser/InstructionParser.cpp 2008-09-02 21:42:07 UTC (rev 3142) +++ main/trunk/interpreter/parser/InstructionParser.cpp 2008-09-03 12:15:49 UTC (rev 3143) @@ -193,7 +193,6 @@ */ RexxInstruction *RexxSource::assignmentOpNew(RexxToken *target, RexxToken *operation) { - ProtectedObject p(target); this->needVariable(target); // make sure this is a variable // we require an expression for the additional part, which is required RexxObject *_expression = this->expression(TERM_EOC); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bi...@us...> - 2008-09-06 17:58:29
|
Revision: 3197 http://oorexx.svn.sourceforge.net/oorexx/?rev=3197&view=rev Author: bigrixx Date: 2008-09-06 17:58:39 +0000 (Sat, 06 Sep 2008) Log Message: ----------- Fix printf issues with 64-bit values Modified Paths: -------------- main/trunk/interpreter/classes/IntegerClass.cpp main/trunk/interpreter/classes/NumberStringClass.cpp main/trunk/interpreter/concurrency/RexxActivity.cpp main/trunk/interpreter/memory/DeadObject.cpp main/trunk/interpreter/memory/MemorySegment.cpp main/trunk/interpreter/memory/MemoryStats.cpp main/trunk/interpreter/memory/RexxMemory.cpp main/trunk/interpreter/parser/SourceFile.cpp main/trunk/interpreter/platform/unix/ErrorMessages.cpp Modified: main/trunk/interpreter/classes/IntegerClass.cpp =================================================================== --- main/trunk/interpreter/classes/IntegerClass.cpp 2008-09-06 15:56:30 UTC (rev 3196) +++ main/trunk/interpreter/classes/IntegerClass.cpp 2008-09-06 17:58:39 UTC (rev 3197) @@ -99,8 +99,8 @@ /* Function: Normal garbage collection live marking */ /******************************************************************************/ { - memory_mark(this->objectVariables); - memory_mark(this->stringrep); + memory_mark(this->objectVariables); + memory_mark(this->stringrep); } void RexxInteger::liveGeneral(int reason) @@ -108,8 +108,8 @@ /* Function: Generalized object marking */ /******************************************************************************/ { - memory_mark_general(this->objectVariables); - memory_mark_general(this->stringrep); + memory_mark_general(this->objectVariables); + memory_mark_general(this->stringrep); } void RexxInteger::flatten(RexxEnvelope *envelope) @@ -130,7 +130,7 @@ /* Function: Handle a REQUEST('STRING') request for a REXX integer object */ /******************************************************************************/ { - return this->stringValue(); /* return the string value */ + return this->stringValue(); /* return the string value */ } RexxInteger *RexxInteger::hasMethod(RexxString *methodName) @@ -139,7 +139,7 @@ /******************************************************************************/ { /* return the string value's answer */ - return this->stringValue()->hasMethod(methodName); + return this->stringValue()->hasMethod(methodName); } RexxString *RexxInteger::primitiveMakeString() @@ -147,20 +147,20 @@ /* Function: Handle a REQUEST('STRING') request for a REXX integer object */ /******************************************************************************/ { - char stringBuffer[11]; /* integer formatting buffer */ - RexxString *string; /* string value */ + if (this->stringrep != OREF_NULL) /* have a string already? */ + { + return this->stringrep; /* return it directly */ + } + char stringBuffer[32]; /* integer formatting buffer */ + /* convert value into string */ + sprintf(stringBuffer, "%zd", this->value); - if (this->stringrep != OREF_NULL) /* have a string already? */ - return this->stringrep; /* return it directly */ - /* convert value into string */ - sprintf(stringBuffer, "%d", this->value); - - /* return as a string */ - string = new_string(stringBuffer, strlen(stringBuffer)); - /* cache this away for later */ - OrefSet(this, this->stringrep, string); - this->setHasReferences(); // now have references that need marking - return string; /* return the new string */ + /* return as a string */ + RexxString *string = new_string(stringBuffer, strlen(stringBuffer)); + /* cache this away for later */ + OrefSet(this, this->stringrep, string); + this->setHasReferences(); // now have references that need marking + return string; /* return the new string */ } RexxString *RexxInteger::stringValue() @@ -168,19 +168,19 @@ /* Function: Return the string value for an integer */ /******************************************************************************/ { - char stringBuffer[11]; /* integer formatting buffer */ - RexxString *string; /* string value */ - - if (this->stringrep != OREF_NULL) /* have a string already? */ - return this->stringrep; /* return it directly */ - /* convert value into string */ - sprintf(stringBuffer, "%d", this->value); - /* return as a string */ - string = new_string(stringBuffer, strlen(stringBuffer)); - /* cache this away for later */ - OrefSet(this, this->stringrep, string); - this->setHasReferences(); /* we now have references */ - return string; /* return the new string */ + if (this->stringrep != OREF_NULL) /* have a string already? */ + { + return this->stringrep; /* return it directly */ + } + /* convert value into string */ + char stringBuffer[32]; /* integer formatting buffer */ + sprintf(stringBuffer, "%zd", this->value); + /* return as a string */ + RexxString *string = new_string(stringBuffer, strlen(stringBuffer)); + /* cache this away for later */ + OrefSet(this, this->stringrep, string); + this->setHasReferences(); /* we now have references */ + return string; /* return the new string */ } void RexxInteger::copyIntoTail(RexxCompoundTail *tail) @@ -188,17 +188,17 @@ /* Function: Copy the value of an integer into a compound variable name */ /******************************************************************************/ { - char stringBuffer[11]; /* integer formatting buffer */ - - if (this->stringrep != OREF_NULL) { /* have a string already? */ - /* copying directly from an existing string rep is faster */ - /* than formatting a new value and copying. */ - tail->append(stringrep->getStringData(), stringrep->getLength()); - return; - } - sprintf(stringBuffer, "%d", this->value); - /* append this to the buffer */ - tail->append(stringBuffer, strlen(stringBuffer)); + if (this->stringrep != OREF_NULL) /* have a string already? */ + { + /* copying directly from an existing string rep is faster */ + /* than formatting a new value and copying. */ + tail->append(stringrep->getStringData(), stringrep->getLength()); + return; + } + char stringBuffer[32]; /* integer formatting buffer */ + sprintf(stringBuffer, "%zd", this->value); + /* append this to the buffer */ + tail->append(stringBuffer, strlen(stringBuffer)); } @@ -329,7 +329,7 @@ /* Function: Convert an integer to an integer (real easy!) */ /******************************************************************************/ { - return this; /* just return directly */ + return this; /* just return directly */ } void RexxInteger::setString( @@ -339,8 +339,8 @@ /******************************************************************************/ { /* set the strign */ - OrefSet(this, this->stringrep, string); - this->setHasReferences(); /* we now have references */ + OrefSet(this, this->stringrep, string); + this->setHasReferences(); /* we now have references */ } bool RexxInteger::truthValue( @@ -349,11 +349,15 @@ /* Function: Determine the truth value of an integer object */ /******************************************************************************/ { - if (this->value == 0L) /* have a zero? */ - return false; /* this is false */ - else if (this->value != 1L) /* how about a one? */ - reportException(errorcode, this);/* report the error */ - return true; /* this is true */ + if (this->value == 0) /* have a zero? */ + { + return false; /* this is false */ + } + else if (this->value != 1) /* how about a one? */ + { + reportException(errorcode, this);/* report the error */ + } + return true; /* this is true */ } /******************************************************************************/ @@ -372,7 +376,7 @@ /******************************************************************************/ { /* just reissue this */ - return this->stringValue()->sendMessage(msgname, arguments); + return this->stringValue()->sendMessage(msgname, arguments); } @@ -439,10 +443,10 @@ /* Function: Concatenate an object to an integer */ /******************************************************************************/ { - required_arg(other, ONE); /* this is required */ - other = REQUEST_STRING(other); /* ensure a string value */ - /* do the concatenate */ - return this->stringValue()->concat(other); + required_arg(other, ONE); /* this is required */ + other = REQUEST_STRING(other); /* ensure a string value */ + /* do the concatenate */ + return this->stringValue()->concat(other); } RexxObject *RexxInteger::plus( @@ -451,23 +455,31 @@ /* Function: Add an integer to another object */ /******************************************************************************/ { - /* are we using default digits? */ - if (number_digits() != Numerics::DEFAULT_DIGITS ) - /* nope, we can't do integer arith */ - return integer_forward(this, plus, other); - if (other == OREF_NULL) /* unary */ - return this; /* just return ourselves */ - else { /* binary */ - if (isOfClass(Integer, other)) { /* adding two integers together? */ - /* add the numbers */ - wholenumber_t tempVal = this->value + other->value; - /* result still within range? */ - if (tempVal <= Numerics::MAX_WHOLENUMBER && tempVal >= Numerics::MIN_WHOLENUMBER) - return new_integer(tempVal); /* return as an integer number */ + /* are we using default digits? */ + if (number_digits() != Numerics::DEFAULT_DIGITS ) + { + /* nope, we can't do integer arith */ + return integer_forward(this, plus, other); } - /* need to do full arithmetic */ - return integer_forward(this, plus, other); - } + if (other == OREF_NULL) /* unary */ + { + return this; /* just return ourselves */ + } + else /* binary */ + { + if (isOfClass(Integer, other)) /* adding two integers together? */ + { + /* add the numbers */ + wholenumber_t tempVal = this->value + other->value; + /* result still within range? */ + if (tempVal <= Numerics::MAX_WHOLENUMBER && tempVal >= Numerics::MIN_WHOLENUMBER) + { + return new_integer(tempVal); /* return as an integer number */ + } + } + /* need to do full arithmetic */ + return integer_forward(this, plus, other); + } } RexxObject *RexxInteger::minus( @@ -476,25 +488,32 @@ /* Function: Subtract another object from an integer */ /******************************************************************************/ { - /* are we using default digits? */ - if (number_digits() != Numerics::DEFAULT_DIGITS ) - /* nope, then we can do integer arith*/ - return integer_forward(this, minus, other); + /* are we using default digits? */ + if (number_digits() != Numerics::DEFAULT_DIGITS ) + { + /* nope, then we can do integer arith*/ + return integer_forward(this, minus, other); + } - if (other == OREF_NULL) { /* unary subtraction operator */ - return new_integer(-this->value); /* and return a new integer */ - } - else { /* binary subtraction operation */ - if (isOfClass(Integer, other)) { /* subtracting two integers? */ - /* subtract the numbers */ - wholenumber_t tempVal = this->value - other->value; - /* result still within range? */ - if (tempVal <= Numerics::MAX_WHOLENUMBER && tempVal >= Numerics::MIN_WHOLENUMBER) - return new_integer(tempVal); /* return as an integer number */ + if (other == OREF_NULL) /* unary subtraction operator */ + { + return new_integer(-this->value); /* and return a new integer */ } - /* need to do full arithmetic */ - return integer_forward(this, minus, other); - } + else /* binary subtraction operation */ + { + if (isOfClass(Integer, other)) /* subtracting two integers? */ + { + /* subtract the numbers */ + wholenumber_t tempVal = this->value - other->value; + /* result still within range? */ + if (tempVal <= Numerics::MAX_WHOLENUMBER && tempVal >= Numerics::MIN_WHOLENUMBER) + { + return new_integer(tempVal); /* return as an integer number */ + } + } + /* need to do full arithmetic */ + return integer_forward(this, minus, other); + } } RexxObject *RexxInteger::multiply( @@ -503,20 +522,24 @@ /* Function: Multiply an integer by another object */ /******************************************************************************/ { - /* are we using default digits? */ - if (number_digits() != Numerics::DEFAULT_DIGITS ) - /* nope, we can't do integer math */ - return integer_forward(this, multiply, other); - required_arg(other, ONE); /* make sure the argument is there */ - /* is the other an integer and will */ - /* the result be in a good range? */ - if (isOfClass(Integer, other) && Numerics::abs(this->value) <= 99999 && Numerics::abs(other->value) <= 9999) - { - /* multiply directly */ - return new_integer(this->value * other->value); - } - else /* do the slow way */ - return integer_forward(this, multiply, other); + /* are we using default digits? */ + if (number_digits() != Numerics::DEFAULT_DIGITS ) + { + /* nope, we can't do integer math */ + return integer_forward(this, multiply, other); + } + required_arg(other, ONE); /* make sure the argument is there */ + /* is the other an integer and will */ + /* the result be in a good range? */ + if (isOfClass(Integer, other) && Numerics::abs(this->value) <= 99999 && Numerics::abs(other->value) <= 9999) + { + /* multiply directly */ + return new_integer(this->value * other->value); + } + else /* do the slow way */ + { + return integer_forward(this, multiply, other); + } } RexxObject *RexxInteger::divide( @@ -526,7 +549,7 @@ /******************************************************************************/ { /* just forward this */ - return integer_forward(this, divide, other); + return integer_forward(this, divide, other); } RexxObject *RexxInteger::integerDivide( @@ -535,25 +558,30 @@ /* Function: Perform integer division */ /******************************************************************************/ { - /* are we using default digits? */ - if (number_digits() != Numerics::DEFAULT_DIGITS ) - /* nope, we can't do integer arith */ - return integer_forward(this, integerDivide, other); - required_arg(other, ONE); /* make sure this is really there */ + /* are we using default digits? */ + if (number_digits() != Numerics::DEFAULT_DIGITS ) + { + /* nope, we can't do integer arith */ + return integer_forward(this, integerDivide, other); + } + required_arg(other, ONE); /* make sure this is really there */ - if (isOfClass(Integer, other)) { /* is right object an integer? */ - /* is right number 0? */ - if (other->value != 0) + if (isOfClass(Integer, other)) /* is right object an integer? */ { - // do the division directly - return new_integer(this->value / other->value); + /* is right number 0? */ + if (other->value != 0) + { + // do the division directly + return new_integer(this->value / other->value); + } + else /* yes, raise error. */ + { + reportException(Error_Overflow_zero); + } } - else /* yes, raise error. */ - reportException(Error_Overflow_zero); - } - /* not integer, forward to */ - /*numberstring. */ - return integer_forward(this, integerDivide, other); + /* not integer, forward to */ + /*numberstring. */ + return integer_forward(this, integerDivide, other); } RexxObject *RexxInteger::remainder( @@ -562,25 +590,30 @@ /* Function: Perform remainder division */ /******************************************************************************/ { - /* are we using default digits? */ - if (number_digits() != Numerics::DEFAULT_DIGITS ) - /* nope, we can't do integer arith */ - return integer_forward(this, remainder, other); - required_arg(other, ONE); /* make sure this is really there */ + /* are we using default digits? */ + if (number_digits() != Numerics::DEFAULT_DIGITS ) + { + /* nope, we can't do integer arith */ + return integer_forward(this, remainder, other); + } + required_arg(other, ONE); /* make sure this is really there */ - if (isOfClass(Integer, other)) { /* is right object an integer? */ - /* is right number 0? */ - if (other->value != 0) + if (isOfClass(Integer, other)) /* is right object an integer? */ { - // we can do this directly - return new_integer(this->value % other->value); + /* is right number 0? */ + if (other->value != 0) + { + // we can do this directly + return new_integer(this->value % other->value); + } + else /* yes, raise error. */ + { + reportException(Error_Overflow_zero); + } } - else /* yes, raise error. */ - reportException(Error_Overflow_zero); - } - /* not integer, forward to */ - /*numberstring. */ - return integer_forward(this, remainder, other); + /* not integer, forward to */ + /*numberstring. */ + return integer_forward(this, remainder, other); } RexxObject *RexxInteger::power( @@ -590,7 +623,7 @@ /******************************************************************************/ { /* just send along */ - return integer_forward(this, power, other); + return integer_forward(this, power, other); } bool RexxInteger::isEqual( @@ -600,17 +633,19 @@ /* only strict equality, not greater or less than values. */ /******************************************************************************/ { - if (this->isSubClassOrEnhanced()) /* not a primitive? */ - { - /* do the full lookup compare */ - return this->sendMessage(OREF_STRICT_EQUAL, other)->truthValue(Error_Logical_value_method); - } + if (this->isSubClassOrEnhanced()) /* not a primitive? */ + { + /* do the full lookup compare */ + return this->sendMessage(OREF_STRICT_EQUAL, other)->truthValue(Error_Logical_value_method); + } - if (isOfClass(Integer, other)) /* two integers? */ - /* just directly compare the values */ - return this->value == ((RexxInteger *)other)->value; - /* go do a string compare */ - return this->stringValue()->isEqual(other); + if (isOfClass(Integer, other)) /* two integers? */ + { + /* just directly compare the values */ + return this->value == ((RexxInteger *)other)->value; + } + /* go do a string compare */ + return this->stringValue()->isEqual(other); } wholenumber_t RexxInteger::strictComp( @@ -623,12 +658,16 @@ /* return >0 if this is greater than other */ /******************************************************************************/ { - required_arg(other, ONE); /* make sure this is really there */ - if (isOfClass(Integer, other)) /* string compare is simple */ - /* just return their difference */ - return this->value - ((RexxInteger *)other)->value; - else /* go do a string compare */ - return this->stringValue()->strictComp((RexxString *)other); + required_arg(other, ONE); /* make sure this is really there */ + if (isOfClass(Integer, other)) /* string compare is simple */ + { + /* just return their difference */ + return this->value - ((RexxInteger *)other)->value; + } + else /* go do a string compare */ + { + return this->stringValue()->strictComp((RexxString *)other); + } } @@ -689,7 +728,7 @@ /******************************************************************************/ { /* return strict compare result */ - return (this->strictComp(other) != 0) ? TheTrueObject : TheFalseObject; + return (this->strictComp(other) != 0) ? TheTrueObject : TheFalseObject; } RexxInteger *RexxInteger::equal( @@ -698,7 +737,7 @@ /* Function: non-strict "=" operator */ /******************************************************************************/ { - return this->comp(other) == 0 ? TheTrueObject : TheFalseObject; + return this->comp(other) == 0 ? TheTrueObject : TheFalseObject; } RexxInteger *RexxInteger::notEqual( @@ -707,7 +746,7 @@ /* Function: non-strict "\=" operator */ /******************************************************************************/ { - return this->comp(other) != 0 ? TheTrueObject : TheFalseObject; + return this->comp(other) != 0 ? TheTrueObject : TheFalseObject; } RexxInteger *RexxInteger::isGreaterThan( @@ -716,7 +755,7 @@ /* Function: non-strict ">" operator */ /******************************************************************************/ { - return this->comp(other) > 0 ? TheTrueObject : TheFalseObject; + return this->comp(other) > 0 ? TheTrueObject : TheFalseObject; } RexxInteger *RexxInteger::isLessThan( @@ -725,7 +764,7 @@ /* Function: non-strict "<" operator */ /******************************************************************************/ { - return this->comp(other) < 0 ? TheTrueObject : TheFalseObject; + return this->comp(other) < 0 ? TheTrueObject : TheFalseObject; } RexxInteger *RexxInteger::isGreaterOrEqual( @@ -734,7 +773,7 @@ /* Function: non-strict ">=" operator */ /******************************************************************************/ { - return this->comp(other) >= 0 ? TheTrueObject : TheFalseObject; + return this->comp(other) >= 0 ? TheTrueObject : TheFalseObject; } RexxInteger *RexxInteger::isLessOrEqual( @@ -743,7 +782,7 @@ /* Function: non-strict "<=" operator */ /******************************************************************************/ { - return this->comp(other) <= 0 ? TheTrueObject : TheFalseObject; + return this->comp(other) <= 0 ? TheTrueObject : TheFalseObject; } @@ -753,7 +792,7 @@ /* Function: strict ">>" operator */ /******************************************************************************/ { - return this->strictComp(other) > 0 ? TheTrueObject : TheFalseObject; + return this->strictComp(other) > 0 ? TheTrueObject : TheFalseObject; } RexxInteger *RexxInteger::strictLessThan( @@ -762,7 +801,7 @@ /* Function: strict "<<" operator */ /******************************************************************************/ { - return this->strictComp(other) < 0 ? TheTrueObject : TheFalseObject; + return this->strictComp(other) < 0 ? TheTrueObject : TheFalseObject; } RexxInteger *RexxInteger::strictGreaterOrEqual( @@ -771,7 +810,7 @@ /* Function: strict ">>=" operator */ /******************************************************************************/ { - return this->strictComp(other) >= 0 ? TheTrueObject : TheFalseObject; + return this->strictComp(other) >= 0 ? TheTrueObject : TheFalseObject; } RexxInteger *RexxInteger::strictLessOrEqual( @@ -780,7 +819,7 @@ /* Function: strict "<<=" operator */ /******************************************************************************/ { - return this->strictComp(other) <= 0 ? TheTrueObject : TheFalseObject; + return this->strictComp(other) <= 0 ? TheTrueObject : TheFalseObject; } RexxObject *RexxInteger::notOp() @@ -789,7 +828,7 @@ /******************************************************************************/ { /* perform the operation */ - return this->truthValue(Error_Logical_value_method) ? TheFalseObject : TheTrueObject; + return this->truthValue(Error_Logical_value_method) ? TheFalseObject : TheTrueObject; } RexxObject *RexxInteger::operatorNot( @@ -799,7 +838,7 @@ /******************************************************************************/ { /* perform the operation */ - return this->truthValue(Error_Logical_value_method) ? TheFalseObject : TheTrueObject; + return this->truthValue(Error_Logical_value_method) ? TheFalseObject : TheTrueObject; } RexxObject *RexxInteger::andOp( @@ -808,13 +847,11 @@ /* Function: Logically AND two objects together */ /******************************************************************************/ { - RexxObject *otherTruth; /* truth value of the other object */ - - required_arg(other, ONE); /* make sure the argument is there */ - /* validate the boolean */ - otherTruth = other->truthValue(Error_Logical_value_method) ? TheTrueObject : TheFalseObject; - /* perform the operation */ - return (!this->truthValue(Error_Logical_value_method)) ? TheFalseObject : otherTruth; + required_arg(other, ONE); /* make sure the argument is there */ + /* validate the boolean */ + RexxObject *otherTruth = other->truthValue(Error_Logical_value_method) ? TheTrueObject : TheFalseObject; + /* perform the operation */ + return(!this->truthValue(Error_Logical_value_method)) ? TheFalseObject : otherTruth; } RexxObject *RexxInteger::orOp( @@ -823,13 +860,11 @@ /* Function: Logically OR two objects together */ /******************************************************************************/ { - RexxObject *otherTruth; /* truth value of the other object */ - - required_arg(other, ONE); /* make sure the argument is there */ - /* validate the boolean */ - otherTruth = other->truthValue(Error_Logical_value_method) ? TheTrueObject : TheFalseObject; - /* perform the operation */ - return (this->truthValue(Error_Logical_value_method)) ? TheTrueObject : otherTruth; + required_arg(other, ONE); /* make sure the argument is there */ + /* validate the boolean */ + RexxObject *otherTruth = other->truthValue(Error_Logical_value_method) ? TheTrueObject : TheFalseObject; + /* perform the operation */ + return(this->truthValue(Error_Logical_value_method)) ? TheTrueObject : otherTruth; } RexxObject *RexxInteger::xorOp( @@ -838,15 +873,19 @@ /* Function: Logically XOR two objects together */ /******************************************************************************/ { - required_arg(other, ONE); /* make sure the argument is there */ - /* get as a boolean */ - bool truth = other->truthValue(Error_Logical_value_method); - /* first one false? */ - if (!this->truthValue(Error_Logical_value_method)) - /* value is always the second */ - return truth ? TheTrueObject : TheFalseObject; - else /* value is inverse of second */ - return (truth) ? TheFalseObject : TheTrueObject; + required_arg(other, ONE); /* make sure the argument is there */ + /* get as a boolean */ + bool truth = other->truthValue(Error_Logical_value_method); + /* first one false? */ + if (!this->truthValue(Error_Logical_value_method)) + { + /* value is always the second */ + return truth ? TheTrueObject : TheFalseObject; + } + else /* value is inverse of second */ + { + return(truth) ? TheFalseObject : TheTrueObject; + } } RexxObject *RexxInteger::abs() @@ -854,16 +893,20 @@ /* Function: Take the absolute value of an integer object */ /******************************************************************************/ { - /* working under the default digits? */ - if (number_digits() == Numerics::DEFAULT_DIGITS) { - /* if we're already positive, this is a quick return */ - if (value >= 0) { - return this; - } - return new_integer(-value); /* return as an integer object */ - } - else - return this->numberString()->abs(); /* do a numberstring operation */ + /* working under the default digits? */ + if (number_digits() == Numerics::DEFAULT_DIGITS) + { + /* if we're already positive, this is a quick return */ + if (value >= 0) + { + return this; + } + return new_integer(-value); /* return as an integer object */ + } + else + { + return this->numberString()->abs(); /* do a numberstring operation */ + } } RexxObject *RexxInteger::sign() @@ -871,15 +914,18 @@ /* Function: SIGN() function on an integer object */ /******************************************************************************/ { - RexxObject *result; /* returned result */ - - if (this->value > 0) /* positive number? */ - result = IntegerOne; /* result is "1" */ - else if (this->value < 0) /* negative number? */ - result = new_integer(-1); /* result is "-1" */ - else - result = IntegerZero; /* exactly zero */ - return result; /* return the value */ + if (this->value > 0) /* positive number? */ + { + return IntegerOne; /* result is "1" */ + } + else if (this->value < 0) /* negative number? */ + { + return new_integer(-1); /* result is "-1" */ + } + else + { + return IntegerZero; /* exactly zero */ + } } RexxObject *RexxInteger::Max( @@ -889,45 +935,54 @@ /* Function: Perform MAX function on integer objects */ /******************************************************************************/ { - wholenumber_t maxvalue; /* current maximum */ - size_t arg; /* current arg position */ - RexxObject * argument; /* current argument object */ + wholenumber_t maxvalue; /* current maximum */ + size_t arg; /* current arg position */ + RexxObject * argument; /* current argument object */ - /* are we using default digits? */ - if (number_digits() != Numerics::DEFAULT_DIGITS ) - /* nope, we can't do integer max. */ - return this->numberString()->Max(args, argCount); + /* are we using default digits? */ + if (number_digits() != Numerics::DEFAULT_DIGITS ) + { + /* nope, we can't do integer max. */ + return this->numberString()->Max(args, argCount); + } - if (argCount < 1) /* no comparisons to do? */ - return (RexxObject *)this; /* just return this as the result */ + if (argCount < 1) /* no comparisons to do? */ + { + return(RexxObject *)this; /* just return this as the result */ + } + maxvalue = this->value; /* assume first number is our max. */ - maxvalue = this->value; /* assume first number is our max. */ + /* check each numbers to see if */ + /* larger than the max. */ + for (arg = 0; arg < argCount; arg++) + { + argument = args[arg]; /* get next argument element */ - /* check each numbers to see if */ - /* larger than the max. */ - for (arg = 0; arg < argCount; arg++) { - argument = args[arg]; /* get next argument element */ + if (argument == OREF_NULL) /* was argument missging ? */ + { + /* Yes, report the error. */ + reportException(Error_Incorrect_method_noarg, arg); + } - if (argument == OREF_NULL) /* was argument missging ? */ - /* Yes, report the error. */ - reportException(Error_Incorrect_method_noarg, arg); - - if (isOfClass(Integer, argument)) { /* is this an INTEGER object? */ - /* yes, gets its value. */ - wholenumber_t v = ((RexxInteger *)argument)->getValue(); - if (v > maxvalue) /* is this number larger than max? */ - maxvalue = v; /* yes, it is our new max. */ + if (isOfClass(Integer, argument)) /* is this an INTEGER object? */ + { + /* yes, gets its value. */ + wholenumber_t v = ((RexxInteger *)argument)->getValue(); + if (v > maxvalue) /* is this number larger than max? */ + { + maxvalue = v; /* yes, it is our new max. */ + } + } + else /* not an integer, compare isn't */ + { + /* not all integers, convert into a */ + /* NumberString, and let NumberString*/ + /* figure this out. */ + return this->numberString()->Max(args, argCount); + } } - else { /* not an integer, compare isn't */ - /* not all integers, convert into a */ - /* NumberString, and let NumberString*/ - /* figure this out. */ - return this->numberString()->Max(args, argCount); - } - } - - return new_integer(maxvalue); /* yes, then max is our max number */ + return new_integer(maxvalue); /* yes, then max is our max number */ } RexxObject *RexxInteger::Min( @@ -937,44 +992,55 @@ /* Function: Perform MAX function on integer objects */ /******************************************************************************/ { - wholenumber_t minvalue; /* current minimum */ - size_t arg; /* current arg position */ - RexxObject * argument; /* current argument object */ + wholenumber_t minvalue; /* current minimum */ + size_t arg; /* current arg position */ + RexxObject * argument; /* current argument object */ - /* are we using default digits? */ - if (number_digits() != Numerics::DEFAULT_DIGITS ) - /* nope, we can't do integer max. */ - return this->numberString()->Min(args, argCount); + /* are we using default digits? */ + if (number_digits() != Numerics::DEFAULT_DIGITS ) + { + /* nope, we can't do integer max. */ + return this->numberString()->Min(args, argCount); + } - if (argCount < 1) /* no comparisons to do? */ - return (RexxObject *)this; /* just return this as the result */ + if (argCount < 1) /* no comparisons to do? */ + { + return(RexxObject *)this; /* just return this as the result */ + } - minvalue = this->value; /* assume first number is our min. */ + minvalue = this->value; /* assume first number is our min. */ - /* check each numbers to see if */ - /* larger than the max. */ - for (arg = 0; arg < argCount; arg++) { - argument = args[arg]; /* get next argument element */ + /* check each numbers to see if */ + /* larger than the max. */ + for (arg = 0; arg < argCount; arg++) + { + argument = args[arg]; /* get next argument element */ - if (argument == OREF_NULL) /* was argument missging ? */ - /* Yes, report the error. */ - reportException(Error_Incorrect_method_noarg, arg); + if (argument == OREF_NULL) /* was argument missging ? */ + { + /* Yes, report the error. */ + reportException(Error_Incorrect_method_noarg, arg); + } - if (isOfClass(Integer, argument)) { /* is this an INTEGER object? */ - /* yes, gets its value. */ - wholenumber_t v = ((RexxInteger *)argument)->getValue(); - if (v < minvalue) /* is this number larger than min? */ - minvalue = v; /* yes, it is our new max. */ + if (isOfClass(Integer, argument)) /* is this an INTEGER object? */ + { + /* yes, gets its value. */ + wholenumber_t v = ((RexxInteger *)argument)->getValue(); + if (v < minvalue) /* is this number larger than min? */ + { + minvalue = v; /* yes, it is our new max. */ + } + } + else /* not an integer, compare isn't */ + { + /* not all integers, convert into a */ + /* NumberString, and let NumberString*/ + /* figure this out. */ + return this->numberString()->Min(args, argCount); + } } - else { /* not an integer, compare isn't */ - /* not all integers, convert into a */ - /* NumberString, and let NumberString*/ - /* figure this out. */ - return this->numberString()->Min(args, argCount); - } - } - return new_integer(minvalue); /* yes, then max is our max number */ + return new_integer(minvalue); /* yes, then max is our max number */ } RexxObject *RexxInteger::trunc( @@ -984,7 +1050,7 @@ /******************************************************************************/ { /* just forward to numberstring */ - return this->numberString()->trunc(decimals); + return this->numberString()->trunc(decimals); } RexxObject *RexxInteger::format( @@ -996,7 +1062,7 @@ /* Function: Act as a front end for the actual FORMAT REXX method */ /******************************************************************************/ { - return this->numberString()->formatRexx(Integers, Decimals, MathExp, ExpTrigger); + return this->numberString()->formatRexx(Integers, Decimals, MathExp, ExpTrigger); } RexxObject *RexxInteger::d2c( @@ -1006,7 +1072,7 @@ /******************************************************************************/ { /* format as a string value */ - return this->numberString()->d2xD2c(length, true); + return this->numberString()->d2xD2c(length, true); } RexxObject *RexxInteger::d2x( @@ -1016,7 +1082,7 @@ /******************************************************************************/ { /* format as a string value */ - return this->numberString()->d2xD2c(length, false); + return this->numberString()->d2xD2c(length, false); } RexxObject *RexxInteger::evaluate( @@ -1027,10 +1093,10 @@ /* term for literals */ /******************************************************************************/ { - stack->push(this); /* place on the evaluation stack */ + stack->push(this); /* place on the evaluation stack */ /* trace if necessary */ - context->traceIntermediate(this, TRACE_PREFIX_LITERAL); - return this; /* also return the result */ + context->traceIntermediate(this, TRACE_PREFIX_LITERAL); + return this; /* also return the result */ } @@ -1040,7 +1106,7 @@ /* Function: Polymorphic get_value function used with expression terms */ /******************************************************************************/ { - return (RexxObject *)this; /* just return this value */ + return (RexxObject *)this; /* just return this value */ } @@ -1050,7 +1116,7 @@ /* Function: Polymorphic get_value function used with expression terms */ /******************************************************************************/ { - return (RexxObject *)this; /* just return this value */ + return (RexxObject *)this; /* just return this value */ } @@ -1060,7 +1126,7 @@ /* Function: Polymorphic get_value function used with expression terms */ /******************************************************************************/ { - return (RexxObject *)this; /* just return this value */ + return (RexxObject *)this; /* just return this value */ } @@ -1070,7 +1136,7 @@ /* Function: Polymorphic get_value function used with expression terms */ /******************************************************************************/ { - return (RexxObject *)this; /* just return this value */ + return (RexxObject *)this; /* just return this value */ } /* **************************************** */ @@ -1085,16 +1151,17 @@ /* memory_new. */ /******************************************************************************/ { - int i; /* loop counter */ + int i; /* loop counter */ - for (i=INTEGERCACHELOW; i<INTEGERCACHESIZE; i++ ) { /* now create all our cached integers*/ - OrefSet(this, this->integercache[i - INTEGERCACHELOW], new RexxInteger (i)); - /* force the item to create its string value too. This can save */ - /* us a lot of time when string indices are used for compound */ - /* variables and also eliminate a bunch of old-new table */ - /* references. */ - this->integercache[i - INTEGERCACHELOW]->stringValue(); - } + for (i=INTEGERCACHELOW; i<INTEGERCACHESIZE; i++ ) /* now create all our cached integers*/ + { + OrefSet(this, this->integercache[i - INTEGERCACHELOW], new RexxInteger (i)); + /* force the item to create its string value too. This can save */ + /* us a lot of time when string indices are used for compound */ + /* variables and also eliminate a bunch of old-new table */ + /* references. */ + this->integercache[i - INTEGERCACHELOW]->stringValue(); + } } void RexxIntegerClass::live(size_t liveMark) @@ -1102,15 +1169,15 @@ /* Function: Normal garbage collection live marking */ /******************************************************************************/ { - int i; /* loop counter */ + int i; /* loop counter */ - this->RexxClass::live(liveMark); /* do RexxClass level marking */ + this->RexxClass::live(liveMark); /* do RexxClass level marking */ - /* now mark the cached integers */ - for (i = INTEGERCACHELOW; i < INTEGERCACHESIZE ;i++ ) - { - memory_mark(this->integercache[i - INTEGERCACHELOW]); - } + /* now mark the cached integers */ + for (i = INTEGERCACHELOW; i < INTEGERCACHESIZE ;i++ ) + { + memory_mark(this->integercache[i - INTEGERCACHELOW]); + } } void RexxIntegerClass::liveGeneral(int reason) @@ -1118,15 +1185,15 @@ /* Function: Generalized object marking */ /******************************************************************************/ { - int i; /* loop counter */ + int i; /* loop counter */ - this->RexxClass::liveGeneral(reason); /* do RexxClass level marking */ + this->RexxClass::liveGeneral(reason); /* do RexxClass level marking */ - /* now mark the cached integers */ - for (i = INTEGERCACHELOW; i < INTEGERCACHESIZE ;i++ ) - { - memory_mark_general(this->integercache[i - INTEGERCACHELOW]); - } + /* now mark the cached integers */ + for (i = INTEGERCACHELOW; i < INTEGERCACHESIZE ;i++ ) + { + memory_mark_general(this->integercache[i - INTEGERCACHELOW]); + } } void *RexxInteger::operator new(size_t size) @@ -1134,15 +1201,10 @@ /* Function: Create a new integer object */ /******************************************************************************/ { - RexxObject * newObject; /* newly create object */ - - newObject = new_object(size); /* get a new object */ - /* add in the integer behaviour, and */ - /* make sure old2new knows about it */ - newObject->setBehaviour(TheIntegerBehaviour); - newObject->clearObject(); /* clear the object */ - newObject->setHasNoReferences(); /* Tell GC, not to bother with Live */ - return newObject; /* return the new object. */ + RexxObject *newObject = new_object(size, T_Integer); /* get a new object */ + newObject->clearObject(); /* clear the object */ + newObject->setHasNoReferences(); /* Tell GC, not to bother with Live */ + return newObject; /* return the new object. */ } void RexxInteger::createInstance() Modified: main/trunk/interpreter/classes/NumberStringClass.cpp =================================================================== --- main/trunk/interpreter/classes/NumberStringClass.cpp 2008-09-06 15:56:30 UTC (rev 3196) +++ main/trunk/interpreter/classes/NumberStringClass.cpp 2008-09-06 17:58:39 UTC (rev 3197) @@ -305,13 +305,13 @@ if (temp < 0) { /* convert exponent value into string*/ - sprintf(expstring, "E%d", temp); + sprintf(expstring, "E%zd", temp); } else if (temp > 0) { strcpy(expstring, "E+"); /* convert exponent value into string*/ - sprintf(expstring, "E+%d", temp); + sprintf(expstring, "E+%zd", temp); } temp = Numerics::abs(temp); /* get positive exponent factor */ @@ -1472,7 +1472,7 @@ expfactor = temp; /* save the factor */ temp = Numerics::abs(temp); /* get positive exponent value */ /* format exponent to a string */ - sprintf(exponent, "%d", temp); + sprintf(exponent, "%zd", temp); /* get the number of digits needed */ exponentsize = strlen(exponent); if (mathexp == (size_t)-1) @@ -1557,7 +1557,7 @@ /* adjust the exponent factor */ expfactor = expfactor + temp; /* format exponent to a string */ - sprintf(exponent, "%d", expfactor); + sprintf(exponent, "%zd", expfactor); /* get the number of digits needed */ exponentsize = strlen(exponent); @@ -2076,7 +2076,7 @@ integer = -integer; /* take the positive version */ } /* convert value into string */ - sprintf(this->number, "%d", integer); + sprintf(this->number, "%zd", integer); current = this->number; /* point to the data start */ while (*current != '\0') { /* while still have digits */ @@ -2104,7 +2104,7 @@ { /* number is non-zero */ /* Format the number */ /* convert value into string */ - sprintf((char *)this->number, "%u", integer); + sprintf((char *)this->number, "%zu", integer); current = this->number; /* point to the data start */ while (*current != '\0') { /* while still have digits */ Modified: main/trunk/interpreter/concurrency/RexxActivity.cpp =================================================================== --- main/trunk/interpreter/concurrency/RexxActivity.cpp 2008-09-06 15:56:30 UTC (rev 3196) +++ main/trunk/interpreter/concurrency/RexxActivity.cpp 2008-09-06 17:58:39 UTC (rev 3197) @@ -770,7 +770,7 @@ char work[32]; /* format the number (string) into */ /* work buffer. */ - sprintf(work,"%d.%1d", errcode/1000, errcode - primary); + sprintf(work,"%zd.%1zd", errcode/1000, errcode - primary); RexxString *code = new_string(work); /* get the formatted code */ exobj->put(code, OREF_CODE); Modified: main/trunk/interpreter/memory/DeadObject.cpp =================================================================== --- main/trunk/interpreter/memory/DeadObject.cpp 2008-09-06 15:56:30 UTC (rev 3196) +++ main/trunk/interpreter/memory/DeadObject.cpp 2008-09-06 17:58:39 UTC (rev 3197) @@ -218,7 +218,7 @@ while (check != NULL && check->isReal()) { if (check->overlaps(obj)) { - printf("Object at %p for length %d overlaps object at %p for length %d\n", obj, obj->getObjectSize(), check, check->getObjectSize()); + printf("Object at %p for length %zu overlaps object at %p for length %zu\n", obj, obj->getObjectSize(), check, check->getObjectSize()); Interpreter::logicError("Overlapping dead objects added to the cache."); } check = check->next; Modified: main/trunk/interpreter/memory/MemorySegment.cpp =================================================================== --- main/trunk/interpreter/memory/MemorySegment.cpp 2008-09-06 15:56:30 UTC (rev 3196) +++ main/trunk/interpreter/memory/MemorySegment.cpp 2008-09-06 17:58:39 UTC (rev 3197) @@ -51,10 +51,10 @@ /******************************************************************************/ { /* print header for segment */ - fprintf(stderr,"Dumping %s Segment %d from %p for %u\n", owner, counter, &segmentStart, segmentSize); + fprintf(stderr,"Dumping %s Segment %zd from %p for %zu\n", owner, counter, &segmentStart, segmentSize); /* now dump the segment */ - fprintf(keyfile, "%s addr.%d = %p\n", owner, counter, &segmentStart); - fprintf(keyfile, "%s size.%d = %u\n", owner, counter, segmentSize); + fprintf(keyfile, "%s addr.%zd = %p\n", owner, counter, &segmentStart); + fprintf(keyfile, "%s size.%zd = %zu\n", owner, counter, segmentSize); fwrite(&segmentStart, 1, segmentSize, dumpfile); } @@ -216,7 +216,7 @@ { /* there are only */ /* DeadPools subpools! (<, not <=) */ char buffer[100]; - sprintf(buffer, "Normal allocation subpool %d for blocks of size %d", i, DeadPoolToLength(i)); + sprintf(buffer, "Normal allocation subpool %d for blocks of size %zu", i, DeadPoolToLength(i)); subpools[i].setID(buffer); /* make sure these are properly set up as single size */ /* keepers */ @@ -498,7 +498,7 @@ /* entire block as a dead object. */ size_t deadLength = segment->realSize(); previous->combine(segment); - memory->verboseMessage("Combining newly allocated segment of %d bytes to create new segment of %d bytes\n", deadLength, previous->size()); + memory->verboseMessage("Combining newly allocated segment of %zu bytes to create new segment of %zu bytes\n", deadLength, previous->size()); addDeadObject((char *)segment, deadLength); } else @@ -895,7 +895,7 @@ { /* go add as many segments as are required to reach that */ /* level. */ - memory->verboseMessage("Expanding normal segment set by %d\n", suggestedExpansion); + memory->verboseMessage("Expanding normal segment set by %zu\n", suggestedExpansion); addSegments(suggestedExpansion); } #if 0 @@ -1096,7 +1096,7 @@ /******************************************************************************/ { #ifdef VERBOSE_GC - memory->verboseMessage("Large segment sweep complete. Largest block is %d, smallest block is %d\n", largestObject, smallestObject); + memory->verboseMessage("Large segment sweep complete. Largest block is %zu, smallest block is %zu\n", largestObject, smallestObject); #endif } @@ -1661,7 +1661,7 @@ /* merge these two segments together. */ removeSegment(tailSegment); segment->combine(tailSegment); - memory->verboseMessage("Non-empty segments combined to create segment of %d bytes\n", se... [truncated message content] |
From: <bi...@us...> - 2008-09-06 19:29:00
|
Revision: 3199 http://oorexx.svn.sourceforge.net/oorexx/?rev=3199&view=rev Author: bigrixx Date: 2008-09-06 19:29:10 +0000 (Sat, 06 Sep 2008) Log Message: ----------- Back off previous printf changes and try a different approach Modified Paths: -------------- main/trunk/interpreter/classes/IntegerClass.cpp main/trunk/interpreter/classes/NumberStringClass.cpp main/trunk/interpreter/concurrency/RexxActivity.cpp main/trunk/interpreter/memory/DeadObject.cpp main/trunk/interpreter/memory/MemorySegment.cpp main/trunk/interpreter/memory/MemoryStats.cpp main/trunk/interpreter/memory/RexxMemory.cpp main/trunk/interpreter/parser/SourceFile.cpp main/trunk/interpreter/platform/unix/ErrorMessages.cpp Modified: main/trunk/interpreter/classes/IntegerClass.cpp =================================================================== --- main/trunk/interpreter/classes/IntegerClass.cpp 2008-09-06 18:14:54 UTC (rev 3198) +++ main/trunk/interpreter/classes/IntegerClass.cpp 2008-09-06 19:29:10 UTC (rev 3199) @@ -99,8 +99,8 @@ /* Function: Normal garbage collection live marking */ /******************************************************************************/ { - memory_mark(this->objectVariables); - memory_mark(this->stringrep); + memory_mark(this->objectVariables); + memory_mark(this->stringrep); } void RexxInteger::liveGeneral(int reason) @@ -108,8 +108,8 @@ /* Function: Generalized object marking */ /******************************************************************************/ { - memory_mark_general(this->objectVariables); - memory_mark_general(this->stringrep); + memory_mark_general(this->objectVariables); + memory_mark_general(this->stringrep); } void RexxInteger::flatten(RexxEnvelope *envelope) @@ -130,7 +130,7 @@ /* Function: Handle a REQUEST('STRING') request for a REXX integer object */ /******************************************************************************/ { - return this->stringValue(); /* return the string value */ + return this->stringValue(); /* return the string value */ } RexxInteger *RexxInteger::hasMethod(RexxString *methodName) @@ -139,7 +139,7 @@ /******************************************************************************/ { /* return the string value's answer */ - return this->stringValue()->hasMethod(methodName); + return this->stringValue()->hasMethod(methodName); } RexxString *RexxInteger::primitiveMakeString() @@ -151,9 +151,9 @@ { return this->stringrep; /* return it directly */ } - char stringBuffer[32]; /* integer formatting buffer */ + char stringBuffer[32]; /* integer formatting buffer */ /* convert value into string */ - sprintf(stringBuffer, "%zd", this->value); + Numerics::formatWholeNumber(this->value, stringBuffer); /* return as a string */ RexxString *string = new_string(stringBuffer, strlen(stringBuffer)); @@ -172,9 +172,10 @@ { return this->stringrep; /* return it directly */ } - /* convert value into string */ - char stringBuffer[32]; /* integer formatting buffer */ - sprintf(stringBuffer, "%zd", this->value); + + char stringBuffer[32]; /* integer formatting buffer */ + /* convert value into string */ + Numerics::formatWholeNumber(this->value, stringBuffer); /* return as a string */ RexxString *string = new_string(stringBuffer, strlen(stringBuffer)); /* cache this away for later */ @@ -196,7 +197,8 @@ return; } char stringBuffer[32]; /* integer formatting buffer */ - sprintf(stringBuffer, "%zd", this->value); + /* convert value into string */ + Numerics::formatWholeNumber(this->value, stringBuffer); /* append this to the buffer */ tail->append(stringBuffer, strlen(stringBuffer)); } @@ -329,7 +331,7 @@ /* Function: Convert an integer to an integer (real easy!) */ /******************************************************************************/ { - return this; /* just return directly */ + return this; /* just return directly */ } void RexxInteger::setString( @@ -339,8 +341,8 @@ /******************************************************************************/ { /* set the strign */ - OrefSet(this, this->stringrep, string); - this->setHasReferences(); /* we now have references */ + OrefSet(this, this->stringrep, string); + this->setHasReferences(); /* we now have references */ } bool RexxInteger::truthValue( @@ -349,15 +351,11 @@ /* Function: Determine the truth value of an integer object */ /******************************************************************************/ { - if (this->value == 0) /* have a zero? */ - { - return false; /* this is false */ - } - else if (this->value != 1) /* how about a one? */ - { - reportException(errorcode, this);/* report the error */ - } - return true; /* this is true */ + if (this->value == 0L) /* have a zero? */ + return false; /* this is false */ + else if (this->value != 1L) /* how about a one? */ + reportException(errorcode, this);/* report the error */ + return true; /* this is true */ } /******************************************************************************/ @@ -376,7 +374,7 @@ /******************************************************************************/ { /* just reissue this */ - return this->stringValue()->sendMessage(msgname, arguments); + return this->stringValue()->sendMessage(msgname, arguments); } @@ -443,10 +441,10 @@ /* Function: Concatenate an object to an integer */ /******************************************************************************/ { - required_arg(other, ONE); /* this is required */ - other = REQUEST_STRING(other); /* ensure a string value */ - /* do the concatenate */ - return this->stringValue()->concat(other); + required_arg(other, ONE); /* this is required */ + other = REQUEST_STRING(other); /* ensure a string value */ + /* do the concatenate */ + return this->stringValue()->concat(other); } RexxObject *RexxInteger::plus( @@ -455,31 +453,23 @@ /* Function: Add an integer to another object */ /******************************************************************************/ { - /* are we using default digits? */ - if (number_digits() != Numerics::DEFAULT_DIGITS ) - { - /* nope, we can't do integer arith */ - return integer_forward(this, plus, other); + /* are we using default digits? */ + if (number_digits() != Numerics::DEFAULT_DIGITS ) + /* nope, we can't do integer arith */ + return integer_forward(this, plus, other); + if (other == OREF_NULL) /* unary */ + return this; /* just return ourselves */ + else { /* binary */ + if (isOfClass(Integer, other)) { /* adding two integers together? */ + /* add the numbers */ + wholenumber_t tempVal = this->value + other->value; + /* result still within range? */ + if (tempVal <= Numerics::MAX_WHOLENUMBER && tempVal >= Numerics::MIN_WHOLENUMBER) + return new_integer(tempVal); /* return as an integer number */ } - if (other == OREF_NULL) /* unary */ - { - return this; /* just return ourselves */ - } - else /* binary */ - { - if (isOfClass(Integer, other)) /* adding two integers together? */ - { - /* add the numbers */ - wholenumber_t tempVal = this->value + other->value; - /* result still within range? */ - if (tempVal <= Numerics::MAX_WHOLENUMBER && tempVal >= Numerics::MIN_WHOLENUMBER) - { - return new_integer(tempVal); /* return as an integer number */ - } - } - /* need to do full arithmetic */ - return integer_forward(this, plus, other); - } + /* need to do full arithmetic */ + return integer_forward(this, plus, other); + } } RexxObject *RexxInteger::minus( @@ -488,32 +478,25 @@ /* Function: Subtract another object from an integer */ /******************************************************************************/ { - /* are we using default digits? */ - if (number_digits() != Numerics::DEFAULT_DIGITS ) - { - /* nope, then we can do integer arith*/ - return integer_forward(this, minus, other); - } + /* are we using default digits? */ + if (number_digits() != Numerics::DEFAULT_DIGITS ) + /* nope, then we can do integer arith*/ + return integer_forward(this, minus, other); - if (other == OREF_NULL) /* unary subtraction operator */ - { - return new_integer(-this->value); /* and return a new integer */ + if (other == OREF_NULL) { /* unary subtraction operator */ + return new_integer(-this->value); /* and return a new integer */ + } + else { /* binary subtraction operation */ + if (isOfClass(Integer, other)) { /* subtracting two integers? */ + /* subtract the numbers */ + wholenumber_t tempVal = this->value - other->value; + /* result still within range? */ + if (tempVal <= Numerics::MAX_WHOLENUMBER && tempVal >= Numerics::MIN_WHOLENUMBER) + return new_integer(tempVal); /* return as an integer number */ } - else /* binary subtraction operation */ - { - if (isOfClass(Integer, other)) /* subtracting two integers? */ - { - /* subtract the numbers */ - wholenumber_t tempVal = this->value - other->value; - /* result still within range? */ - if (tempVal <= Numerics::MAX_WHOLENUMBER && tempVal >= Numerics::MIN_WHOLENUMBER) - { - return new_integer(tempVal); /* return as an integer number */ - } - } - /* need to do full arithmetic */ - return integer_forward(this, minus, other); - } + /* need to do full arithmetic */ + return integer_forward(this, minus, other); + } } RexxObject *RexxInteger::multiply( @@ -522,24 +505,20 @@ /* Function: Multiply an integer by another object */ /******************************************************************************/ { - /* are we using default digits? */ - if (number_digits() != Numerics::DEFAULT_DIGITS ) - { - /* nope, we can't do integer math */ - return integer_forward(this, multiply, other); - } - required_arg(other, ONE); /* make sure the argument is there */ - /* is the other an integer and will */ - /* the result be in a good range? */ - if (isOfClass(Integer, other) && Numerics::abs(this->value) <= 99999 && Numerics::abs(other->value) <= 9999) - { - /* multiply directly */ - return new_integer(this->value * other->value); - } - else /* do the slow way */ - { - return integer_forward(this, multiply, other); - } + /* are we using default digits? */ + if (number_digits() != Numerics::DEFAULT_DIGITS ) + /* nope, we can't do integer math */ + return integer_forward(this, multiply, other); + required_arg(other, ONE); /* make sure the argument is there */ + /* is the other an integer and will */ + /* the result be in a good range? */ + if (isOfClass(Integer, other) && Numerics::abs(this->value) <= 99999 && Numerics::abs(other->value) <= 9999) + { + /* multiply directly */ + return new_integer(this->value * other->value); + } + else /* do the slow way */ + return integer_forward(this, multiply, other); } RexxObject *RexxInteger::divide( @@ -549,7 +528,7 @@ /******************************************************************************/ { /* just forward this */ - return integer_forward(this, divide, other); + return integer_forward(this, divide, other); } RexxObject *RexxInteger::integerDivide( @@ -558,30 +537,25 @@ /* Function: Perform integer division */ /******************************************************************************/ { - /* are we using default digits? */ - if (number_digits() != Numerics::DEFAULT_DIGITS ) - { - /* nope, we can't do integer arith */ - return integer_forward(this, integerDivide, other); - } - required_arg(other, ONE); /* make sure this is really there */ + /* are we using default digits? */ + if (number_digits() != Numerics::DEFAULT_DIGITS ) + /* nope, we can't do integer arith */ + return integer_forward(this, integerDivide, other); + required_arg(other, ONE); /* make sure this is really there */ - if (isOfClass(Integer, other)) /* is right object an integer? */ + if (isOfClass(Integer, other)) { /* is right object an integer? */ + /* is right number 0? */ + if (other->value != 0) { - /* is right number 0? */ - if (other->value != 0) - { - // do the division directly - return new_integer(this->value / other->value); - } - else /* yes, raise error. */ - { - reportException(Error_Overflow_zero); - } + // do the division directly + return new_integer(this->value / other->value); } - /* not integer, forward to */ - /*numberstring. */ - return integer_forward(this, integerDivide, other); + else /* yes, raise error. */ + reportException(Error_Overflow_zero); + } + /* not integer, forward to */ + /*numberstring. */ + return integer_forward(this, integerDivide, other); } RexxObject *RexxInteger::remainder( @@ -590,30 +564,25 @@ /* Function: Perform remainder division */ /******************************************************************************/ { - /* are we using default digits? */ - if (number_digits() != Numerics::DEFAULT_DIGITS ) - { - /* nope, we can't do integer arith */ - return integer_forward(this, remainder, other); - } - required_arg(other, ONE); /* make sure this is really there */ + /* are we using default digits? */ + if (number_digits() != Numerics::DEFAULT_DIGITS ) + /* nope, we can't do integer arith */ + return integer_forward(this, remainder, other); + required_arg(other, ONE); /* make sure this is really there */ - if (isOfClass(Integer, other)) /* is right object an integer? */ + if (isOfClass(Integer, other)) { /* is right object an integer? */ + /* is right number 0? */ + if (other->value != 0) { - /* is right number 0? */ - if (other->value != 0) - { - // we can do this directly - return new_integer(this->value % other->value); - } - else /* yes, raise error. */ - { - reportException(Error_Overflow_zero); - } + // we can do this directly + return new_integer(this->value % other->value); } - /* not integer, forward to */ - /*numberstring. */ - return integer_forward(this, remainder, other); + else /* yes, raise error. */ + reportException(Error_Overflow_zero); + } + /* not integer, forward to */ + /*numberstring. */ + return integer_forward(this, remainder, other); } RexxObject *RexxInteger::power( @@ -623,7 +592,7 @@ /******************************************************************************/ { /* just send along */ - return integer_forward(this, power, other); + return integer_forward(this, power, other); } bool RexxInteger::isEqual( @@ -633,19 +602,17 @@ /* only strict equality, not greater or less than values. */ /******************************************************************************/ { - if (this->isSubClassOrEnhanced()) /* not a primitive? */ - { - /* do the full lookup compare */ - return this->sendMessage(OREF_STRICT_EQUAL, other)->truthValue(Error_Logical_value_method); - } + if (this->isSubClassOrEnhanced()) /* not a primitive? */ + { + /* do the full lookup compare */ + return this->sendMessage(OREF_STRICT_EQUAL, other)->truthValue(Error_Logical_value_method); + } - if (isOfClass(Integer, other)) /* two integers? */ - { - /* just directly compare the values */ - return this->value == ((RexxInteger *)other)->value; - } - /* go do a string compare */ - return this->stringValue()->isEqual(other); + if (isOfClass(Integer, other)) /* two integers? */ + /* just directly compare the values */ + return this->value == ((RexxInteger *)other)->value; + /* go do a string compare */ + return this->stringValue()->isEqual(other); } wholenumber_t RexxInteger::strictComp( @@ -658,16 +625,12 @@ /* return >0 if this is greater than other */ /******************************************************************************/ { - required_arg(other, ONE); /* make sure this is really there */ - if (isOfClass(Integer, other)) /* string compare is simple */ - { - /* just return their difference */ - return this->value - ((RexxInteger *)other)->value; - } - else /* go do a string compare */ - { - return this->stringValue()->strictComp((RexxString *)other); - } + required_arg(other, ONE); /* make sure this is really there */ + if (isOfClass(Integer, other)) /* string compare is simple */ + /* just return their difference */ + return this->value - ((RexxInteger *)other)->value; + else /* go do a string compare */ + return this->stringValue()->strictComp((RexxString *)other); } @@ -728,7 +691,7 @@ /******************************************************************************/ { /* return strict compare result */ - return (this->strictComp(other) != 0) ? TheTrueObject : TheFalseObject; + return (this->strictComp(other) != 0) ? TheTrueObject : TheFalseObject; } RexxInteger *RexxInteger::equal( @@ -737,7 +700,7 @@ /* Function: non-strict "=" operator */ /******************************************************************************/ { - return this->comp(other) == 0 ? TheTrueObject : TheFalseObject; + return this->comp(other) == 0 ? TheTrueObject : TheFalseObject; } RexxInteger *RexxInteger::notEqual( @@ -746,7 +709,7 @@ /* Function: non-strict "\=" operator */ /******************************************************************************/ { - return this->comp(other) != 0 ? TheTrueObject : TheFalseObject; + return this->comp(other) != 0 ? TheTrueObject : TheFalseObject; } RexxInteger *RexxInteger::isGreaterThan( @@ -755,7 +718,7 @@ /* Function: non-strict ">" operator */ /******************************************************************************/ { - return this->comp(other) > 0 ? TheTrueObject : TheFalseObject; + return this->comp(other) > 0 ? TheTrueObject : TheFalseObject; } RexxInteger *RexxInteger::isLessThan( @@ -764,7 +727,7 @@ /* Function: non-strict "<" operator */ /******************************************************************************/ { - return this->comp(other) < 0 ? TheTrueObject : TheFalseObject; + return this->comp(other) < 0 ? TheTrueObject : TheFalseObject; } RexxInteger *RexxInteger::isGreaterOrEqual( @@ -773,7 +736,7 @@ /* Function: non-strict ">=" operator */ /******************************************************************************/ { - return this->comp(other) >= 0 ? TheTrueObject : TheFalseObject; + return this->comp(other) >= 0 ? TheTrueObject : TheFalseObject; } RexxInteger *RexxInteger::isLessOrEqual( @@ -782,7 +745,7 @@ /* Function: non-strict "<=" operator */ /******************************************************************************/ { - return this->comp(other) <= 0 ? TheTrueObject : TheFalseObject; + return this->comp(other) <= 0 ? TheTrueObject : TheFalseObject; } @@ -792,7 +755,7 @@ /* Function: strict ">>" operator */ /******************************************************************************/ { - return this->strictComp(other) > 0 ? TheTrueObject : TheFalseObject; + return this->strictComp(other) > 0 ? TheTrueObject : TheFalseObject; } RexxInteger *RexxInteger::strictLessThan( @@ -801,7 +764,7 @@ /* Function: strict "<<" operator */ /******************************************************************************/ { - return this->strictComp(other) < 0 ? TheTrueObject : TheFalseObject; + return this->strictComp(other) < 0 ? TheTrueObject : TheFalseObject; } RexxInteger *RexxInteger::strictGreaterOrEqual( @@ -810,7 +773,7 @@ /* Function: strict ">>=" operator */ /******************************************************************************/ { - return this->strictComp(other) >= 0 ? TheTrueObject : TheFalseObject; + return this->strictComp(other) >= 0 ? TheTrueObject : TheFalseObject; } RexxInteger *RexxInteger::strictLessOrEqual( @@ -819,7 +782,7 @@ /* Function: strict "<<=" operator */ /******************************************************************************/ { - return this->strictComp(other) <= 0 ? TheTrueObject : TheFalseObject; + return this->strictComp(other) <= 0 ? TheTrueObject : TheFalseObject; } RexxObject *RexxInteger::notOp() @@ -828,7 +791,7 @@ /******************************************************************************/ { /* perform the operation */ - return this->truthValue(Error_Logical_value_method) ? TheFalseObject : TheTrueObject; + return this->truthValue(Error_Logical_value_method) ? TheFalseObject : TheTrueObject; } RexxObject *RexxInteger::operatorNot( @@ -838,7 +801,7 @@ /******************************************************************************/ { /* perform the operation */ - return this->truthValue(Error_Logical_value_method) ? TheFalseObject : TheTrueObject; + return this->truthValue(Error_Logical_value_method) ? TheFalseObject : TheTrueObject; } RexxObject *RexxInteger::andOp( @@ -847,11 +810,13 @@ /* Function: Logically AND two objects together */ /******************************************************************************/ { - required_arg(other, ONE); /* make sure the argument is there */ - /* validate the boolean */ - RexxObject *otherTruth = other->truthValue(Error_Logical_value_method) ? TheTrueObject : TheFalseObject; - /* perform the operation */ - return(!this->truthValue(Error_Logical_value_method)) ? TheFalseObject : otherTruth; + RexxObject *otherTruth; /* truth value of the other object */ + + required_arg(other, ONE); /* make sure the argument is there */ + /* validate the boolean */ + otherTruth = other->truthValue(Error_Logical_value_method) ? TheTrueObject : TheFalseObject; + /* perform the operation */ + return (!this->truthValue(Error_Logical_value_method)) ? TheFalseObject : otherTruth; } RexxObject *RexxInteger::orOp( @@ -860,11 +825,13 @@ /* Function: Logically OR two objects together */ /******************************************************************************/ { - required_arg(other, ONE); /* make sure the argument is there */ - /* validate the boolean */ - RexxObject *otherTruth = other->truthValue(Error_Logical_value_method) ? TheTrueObject : TheFalseObject; - /* perform the operation */ - return(this->truthValue(Error_Logical_value_method)) ? TheTrueObject : otherTruth; + RexxObject *otherTruth; /* truth value of the other object */ + + required_arg(other, ONE); /* make sure the argument is there */ + /* validate the boolean */ + otherTruth = other->truthValue(Error_Logical_value_method) ? TheTrueObject : TheFalseObject; + /* perform the operation */ + return (this->truthValue(Error_Logical_value_method)) ? TheTrueObject : otherTruth; } RexxObject *RexxInteger::xorOp( @@ -873,19 +840,15 @@ /* Function: Logically XOR two objects together */ /******************************************************************************/ { - required_arg(other, ONE); /* make sure the argument is there */ - /* get as a boolean */ - bool truth = other->truthValue(Error_Logical_value_method); - /* first one false? */ - if (!this->truthValue(Error_Logical_value_method)) - { - /* value is always the second */ - return truth ? TheTrueObject : TheFalseObject; - } - else /* value is inverse of second */ - { - return(truth) ? TheFalseObject : TheTrueObject; - } + required_arg(other, ONE); /* make sure the argument is there */ + /* get as a boolean */ + bool truth = other->truthValue(Error_Logical_value_method); + /* first one false? */ + if (!this->truthValue(Error_Logical_value_method)) + /* value is always the second */ + return truth ? TheTrueObject : TheFalseObject; + else /* value is inverse of second */ + return (truth) ? TheFalseObject : TheTrueObject; } RexxObject *RexxInteger::abs() @@ -893,20 +856,16 @@ /* Function: Take the absolute value of an integer object */ /******************************************************************************/ { - /* working under the default digits? */ - if (number_digits() == Numerics::DEFAULT_DIGITS) - { - /* if we're already positive, this is a quick return */ - if (value >= 0) - { - return this; - } - return new_integer(-value); /* return as an integer object */ - } - else - { - return this->numberString()->abs(); /* do a numberstring operation */ - } + /* working under the default digits? */ + if (number_digits() == Numerics::DEFAULT_DIGITS) { + /* if we're already positive, this is a quick return */ + if (value >= 0) { + return this; + } + return new_integer(-value); /* return as an integer object */ + } + else + return this->numberString()->abs(); /* do a numberstring operation */ } RexxObject *RexxInteger::sign() @@ -914,18 +873,15 @@ /* Function: SIGN() function on an integer object */ /******************************************************************************/ { - if (this->value > 0) /* positive number? */ - { - return IntegerOne; /* result is "1" */ - } - else if (this->value < 0) /* negative number? */ - { - return new_integer(-1); /* result is "-1" */ - } - else - { - return IntegerZero; /* exactly zero */ - } + RexxObject *result; /* returned result */ + + if (this->value > 0) /* positive number? */ + result = IntegerOne; /* result is "1" */ + else if (this->value < 0) /* negative number? */ + result = new_integer(-1); /* result is "-1" */ + else + result = IntegerZero; /* exactly zero */ + return result; /* return the value */ } RexxObject *RexxInteger::Max( @@ -935,54 +891,45 @@ /* Function: Perform MAX function on integer objects */ /******************************************************************************/ { - wholenumber_t maxvalue; /* current maximum */ - size_t arg; /* current arg position */ - RexxObject * argument; /* current argument object */ + wholenumber_t maxvalue; /* current maximum */ + size_t arg; /* current arg position */ + RexxObject * argument; /* current argument object */ - /* are we using default digits? */ - if (number_digits() != Numerics::DEFAULT_DIGITS ) - { - /* nope, we can't do integer max. */ - return this->numberString()->Max(args, argCount); - } + /* are we using default digits? */ + if (number_digits() != Numerics::DEFAULT_DIGITS ) + /* nope, we can't do integer max. */ + return this->numberString()->Max(args, argCount); - if (argCount < 1) /* no comparisons to do? */ - { - return(RexxObject *)this; /* just return this as the result */ - } - maxvalue = this->value; /* assume first number is our max. */ + if (argCount < 1) /* no comparisons to do? */ + return (RexxObject *)this; /* just return this as the result */ - /* check each numbers to see if */ - /* larger than the max. */ - for (arg = 0; arg < argCount; arg++) - { - argument = args[arg]; /* get next argument element */ + maxvalue = this->value; /* assume first number is our max. */ - if (argument == OREF_NULL) /* was argument missging ? */ - { - /* Yes, report the error. */ - reportException(Error_Incorrect_method_noarg, arg); - } + /* check each numbers to see if */ + /* larger than the max. */ + for (arg = 0; arg < argCount; arg++) { + argument = args[arg]; /* get next argument element */ - if (isOfClass(Integer, argument)) /* is this an INTEGER object? */ - { - /* yes, gets its value. */ - wholenumber_t v = ((RexxInteger *)argument)->getValue(); - if (v > maxvalue) /* is this number larger than max? */ - { - maxvalue = v; /* yes, it is our new max. */ - } - } - else /* not an integer, compare isn't */ - { - /* not all integers, convert into a */ - /* NumberString, and let NumberString*/ - /* figure this out. */ - return this->numberString()->Max(args, argCount); - } + if (argument == OREF_NULL) /* was argument missging ? */ + /* Yes, report the error. */ + reportException(Error_Incorrect_method_noarg, arg); + + if (isOfClass(Integer, argument)) { /* is this an INTEGER object? */ + /* yes, gets its value. */ + wholenumber_t v = ((RexxInteger *)argument)->getValue(); + if (v > maxvalue) /* is this number larger than max? */ + maxvalue = v; /* yes, it is our new max. */ } - return new_integer(maxvalue); /* yes, then max is our max number */ + else { /* not an integer, compare isn't */ + /* not all integers, convert into a */ + /* NumberString, and let NumberString*/ + /* figure this out. */ + return this->numberString()->Max(args, argCount); + } + } + + return new_integer(maxvalue); /* yes, then max is our max number */ } RexxObject *RexxInteger::Min( @@ -992,55 +939,44 @@ /* Function: Perform MAX function on integer objects */ /******************************************************************************/ { - wholenumber_t minvalue; /* current minimum */ - size_t arg; /* current arg position */ - RexxObject * argument; /* current argument object */ + wholenumber_t minvalue; /* current minimum */ + size_t arg; /* current arg position */ + RexxObject * argument; /* current argument object */ - /* are we using default digits? */ - if (number_digits() != Numerics::DEFAULT_DIGITS ) - { - /* nope, we can't do integer max. */ - return this->numberString()->Min(args, argCount); - } + /* are we using default digits? */ + if (number_digits() != Numerics::DEFAULT_DIGITS ) + /* nope, we can't do integer max. */ + return this->numberString()->Min(args, argCount); - if (argCount < 1) /* no comparisons to do? */ - { - return(RexxObject *)this; /* just return this as the result */ - } + if (argCount < 1) /* no comparisons to do? */ + return (RexxObject *)this; /* just return this as the result */ - minvalue = this->value; /* assume first number is our min. */ + minvalue = this->value; /* assume first number is our min. */ - /* check each numbers to see if */ - /* larger than the max. */ - for (arg = 0; arg < argCount; arg++) - { - argument = args[arg]; /* get next argument element */ + /* check each numbers to see if */ + /* larger than the max. */ + for (arg = 0; arg < argCount; arg++) { + argument = args[arg]; /* get next argument element */ - if (argument == OREF_NULL) /* was argument missging ? */ - { - /* Yes, report the error. */ - reportException(Error_Incorrect_method_noarg, arg); - } + if (argument == OREF_NULL) /* was argument missging ? */ + /* Yes, report the error. */ + reportException(Error_Incorrect_method_noarg, arg); - if (isOfClass(Integer, argument)) /* is this an INTEGER object? */ - { - /* yes, gets its value. */ - wholenumber_t v = ((RexxInteger *)argument)->getValue(); - if (v < minvalue) /* is this number larger than min? */ - { - minvalue = v; /* yes, it is our new max. */ - } - } - else /* not an integer, compare isn't */ - { - /* not all integers, convert into a */ - /* NumberString, and let NumberString*/ - /* figure this out. */ - return this->numberString()->Min(args, argCount); - } + if (isOfClass(Integer, argument)) { /* is this an INTEGER object? */ + /* yes, gets its value. */ + wholenumber_t v = ((RexxInteger *)argument)->getValue(); + if (v < minvalue) /* is this number larger than min? */ + minvalue = v; /* yes, it is our new max. */ } + else { /* not an integer, compare isn't */ + /* not all integers, convert into a */ + /* NumberString, and let NumberString*/ + /* figure this out. */ + return this->numberString()->Min(args, argCount); + } + } - return new_integer(minvalue); /* yes, then max is our max number */ + return new_integer(minvalue); /* yes, then max is our max number */ } RexxObject *RexxInteger::trunc( @@ -1050,7 +986,7 @@ /******************************************************************************/ { /* just forward to numberstring */ - return this->numberString()->trunc(decimals); + return this->numberString()->trunc(decimals); } RexxObject *RexxInteger::format( @@ -1062,7 +998,7 @@ /* Function: Act as a front end for the actual FORMAT REXX method */ /******************************************************************************/ { - return this->numberString()->formatRexx(Integers, Decimals, MathExp, ExpTrigger); + return this->numberString()->formatRexx(Integers, Decimals, MathExp, ExpTrigger); } RexxObject *RexxInteger::d2c( @@ -1072,7 +1008,7 @@ /******************************************************************************/ { /* format as a string value */ - return this->numberString()->d2xD2c(length, true); + return this->numberString()->d2xD2c(length, true); } RexxObject *RexxInteger::d2x( @@ -1082,7 +1018,7 @@ /******************************************************************************/ { /* format as a string value */ - return this->numberString()->d2xD2c(length, false); + return this->numberString()->d2xD2c(length, false); } RexxObject *RexxInteger::evaluate( @@ -1093,10 +1029,10 @@ /* term for literals */ /******************************************************************************/ { - stack->push(this); /* place on the evaluation stack */ + stack->push(this); /* place on the evaluation stack */ /* trace if necessary */ - context->traceIntermediate(this, TRACE_PREFIX_LITERAL); - return this; /* also return the result */ + context->traceIntermediate(this, TRACE_PREFIX_LITERAL); + return this; /* also return the result */ } @@ -1106,7 +1042,7 @@ /* Function: Polymorphic get_value function used with expression terms */ /******************************************************************************/ { - return (RexxObject *)this; /* just return this value */ + return (RexxObject *)this; /* just return this value */ } @@ -1116,7 +1052,7 @@ /* Function: Polymorphic get_value function used with expression terms */ /******************************************************************************/ { - return (RexxObject *)this; /* just return this value */ + return (RexxObject *)this; /* just return this value */ } @@ -1126,7 +1062,7 @@ /* Function: Polymorphic get_value function used with expression terms */ /******************************************************************************/ { - return (RexxObject *)this; /* just return this value */ + return (RexxObject *)this; /* just return this value */ } @@ -1136,7 +1072,7 @@ /* Function: Polymorphic get_value function used with expression terms */ /******************************************************************************/ { - return (RexxObject *)this; /* just return this value */ + return (RexxObject *)this; /* just return this value */ } /* **************************************** */ @@ -1151,17 +1087,16 @@ /* memory_new. */ /******************************************************************************/ { - int i; /* loop counter */ + int i; /* loop counter */ - for (i=INTEGERCACHELOW; i<INTEGERCACHESIZE; i++ ) /* now create all our cached integers*/ - { - OrefSet(this, this->integercache[i - INTEGERCACHELOW], new RexxInteger (i)); - /* force the item to create its string value too. This can save */ - /* us a lot of time when string indices are used for compound */ - /* variables and also eliminate a bunch of old-new table */ - /* references. */ - this->integercache[i - INTEGERCACHELOW]->stringValue(); - } + for (i=INTEGERCACHELOW; i<INTEGERCACHESIZE; i++ ) { /* now create all our cached integers*/ + OrefSet(this, this->integercache[i - INTEGERCACHELOW], new RexxInteger (i)); + /* force the item to create its string value too. This can save */ + /* us a lot of time when string indices are used for compound */ + /* variables and also eliminate a bunch of old-new table */ + /* references. */ + this->integercache[i - INTEGERCACHELOW]->stringValue(); + } } void RexxIntegerClass::live(size_t liveMark) @@ -1169,15 +1104,15 @@ /* Function: Normal garbage collection live marking */ /******************************************************************************/ { - int i; /* loop counter */ + int i; /* loop counter */ - this->RexxClass::live(liveMark); /* do RexxClass level marking */ + this->RexxClass::live(liveMark); /* do RexxClass level marking */ - /* now mark the cached integers */ - for (i = INTEGERCACHELOW; i < INTEGERCACHESIZE ;i++ ) - { - memory_mark(this->integercache[i - INTEGERCACHELOW]); - } + /* now mark the cached integers */ + for (i = INTEGERCACHELOW; i < INTEGERCACHESIZE ;i++ ) + { + memory_mark(this->integercache[i - INTEGERCACHELOW]); + } } void RexxIntegerClass::liveGeneral(int reason) @@ -1185,15 +1120,15 @@ /* Function: Generalized object marking */ /******************************************************************************/ { - int i; /* loop counter */ + int i; /* loop counter */ - this->RexxClass::liveGeneral(reason); /* do RexxClass level marking */ + this->RexxClass::liveGeneral(reason); /* do RexxClass level marking */ - /* now mark the cached integers */ - for (i = INTEGERCACHELOW; i < INTEGERCACHESIZE ;i++ ) - { - memory_mark_general(this->integercache[i - INTEGERCACHELOW]); - } + /* now mark the cached integers */ + for (i = INTEGERCACHELOW; i < INTEGERCACHESIZE ;i++ ) + { + memory_mark_general(this->integercache[i - INTEGERCACHELOW]); + } } void *RexxInteger::operator new(size_t size) @@ -1201,10 +1136,15 @@ /* Function: Create a new integer object */ /******************************************************************************/ { - RexxObject *newObject = new_object(size, T_Integer); /* get a new object */ - newObject->clearObject(); /* clear the object */ - newObject->setHasNoReferences(); /* Tell GC, not to bother with Live */ - return newObject; /* return the new object. */ + RexxObject * newObject; /* newly create object */ + + newObject = new_object(size); /* get a new object */ + /* add in the integer behaviour, and */ + /* make sure old2new knows about it */ + newObject->setBehaviour(TheIntegerBehaviour); + newObject->clearObject(); /* clear the object */ + newObject->setHasNoReferences(); /* Tell GC, not to bother with Live */ + return newObject; /* return the new object. */ } void RexxInteger::createInstance() Modified: main/trunk/interpreter/classes/NumberStringClass.cpp =================================================================== --- main/trunk/interpreter/classes/NumberStringClass.cpp 2008-09-06 18:14:54 UTC (rev 3198) +++ main/trunk/interpreter/classes/NumberStringClass.cpp 2008-09-06 19:29:10 UTC (rev 3199) @@ -304,14 +304,15 @@ if (temp < 0) { + *expstring = 'E'; /* convert exponent value into string*/ - sprintf(expstring, "E%zd", temp); + Numerics::formatWholeNumber(temp, expstring + 1); } else if (temp > 0) { strcpy(expstring, "E+"); /* convert exponent value into string*/ - sprintf(expstring, "E+%zd", temp); + Numerics::formatWholeNumber(temp, expstring + 2); } temp = Numerics::abs(temp); /* get positive exponent factor */ @@ -1472,7 +1473,7 @@ expfactor = temp; /* save the factor */ temp = Numerics::abs(temp); /* get positive exponent value */ /* format exponent to a string */ - sprintf(exponent, "%zd", temp); + Numerics::formatWholeNumber(temp, exponent); /* get the number of digits needed */ exponentsize = strlen(exponent); if (mathexp == (size_t)-1) @@ -1557,7 +1558,7 @@ /* adjust the exponent factor */ expfactor = expfactor + temp; /* format exponent to a string */ - sprintf(exponent, "%zd", expfactor); + Numerics::formatWholeNumber(expfactor, exponent); /* get the number of digits needed */ exponentsize = strlen(exponent); @@ -2076,7 +2077,7 @@ integer = -integer; /* take the positive version */ } /* convert value into string */ - sprintf(this->number, "%zd", integer); + Numerics::formatWholeNumber(integer, (char *)this->number); current = this->number; /* point to the data start */ while (*current != '\0') { /* while still have digits */ @@ -2104,7 +2105,7 @@ { /* number is non-zero */ /* Format the number */ /* convert value into string */ - sprintf((char *)this->number, "%zu", integer); + Numerics::formatStringSize(integer, (char *)this->number); current = this->number; /* point to the data start */ while (*current != '\0') { /* while still have digits */ Modified: main/trunk/interpreter/concurrency/RexxActivity.cpp =================================================================== --- main/trunk/interpreter/concurrency/RexxActivity.cpp 2008-09-06 18:14:54 UTC (rev 3198) +++ main/trunk/interpreter/concurrency/RexxActivity.cpp 2008-09-06 19:29:10 UTC (rev 3199) @@ -770,7 +770,7 @@ char work[32]; /* format the number (string) into */ /* work buffer. */ - sprintf(work,"%zd.%1zd", errcode/1000, errcode - primary); + sprintf(work,"%d.%1d", errcode/1000, errcode - primary); RexxString *code = new_string(work); /* get the formatted code */ exobj->put(code, OREF_CODE); Modified: main/trunk/interpreter/memory/DeadObject.cpp =================================================================== --- main/trunk/interpreter/memory/DeadObject.cpp 2008-09-06 18:14:54 UTC (rev 3198) +++ main/trunk/interpreter/memory/DeadObject.cpp 2008-09-06 19:29:10 UTC (rev 3199) @@ -218,7 +218,7 @@ while (check != NULL && check->isReal()) { if (check->overlaps(obj)) { - printf("Object at %p for length %zu overlaps object at %p for length %zu\n", obj, obj->getObjectSize(), check, check->getObjectSize()); + printf("Object at %p for length %d overlaps object at %p for length %d\n", obj, obj->getObjectSize(), check, check->getObjectSize()); Interpreter::logicError("Overlapping dead objects added to the cache."); } check = check->next; Modified: main/trunk/interpreter/memory/MemorySegment.cpp =================================================================== --- main/trunk/interpreter/memory/MemorySegment.cpp 2008-09-06 18:14:54 UTC (rev 3198) +++ main/trunk/interpreter/memory/MemorySegment.cpp 2008-09-06 19:29:10 UTC (rev 3199) @@ -51,10 +51,10 @@ /******************************************************************************/ { /* print header for segment */ - fprintf(stderr,"Dumping %s Segment %zd from %p for %zu\n", owner, counter, &segmentStart, segmentSize); + fprintf(stderr,"Dumping %s Segment %d from %p for %u\n", owner, counter, &segmentStart, segmentSize); /* now dump the segment */ - fprintf(keyfile, "%s addr.%zd = %p\n", owner, counter, &segmentStart); - fprintf(keyfile, "%s size.%zd = %zu\n", owner, counter, segmentSize); + fprintf(keyfile, "%s addr.%d = %p\n", owner, counter, &segmentStart); + fprintf(keyfile, "%s size.%d = %u\n", owner, counter, segmentSize); fwrite(&segmentStart, 1, segmentSize, dumpfile); } @@ -216,7 +216,7 @@ { /* there are only */ /* DeadPools subpools! (<, not <=) */ char buffer[100]; - sprintf(buffer, "Normal allocation subpool %d for blocks of size %zu", i, DeadPoolToLength(i)); + sprintf(buffer, "Normal allocation subpool %d for blocks of size %d", i, DeadPoolToLength(i)); subpools[i].setID(buffer); /* make sure these are properly set up as single size */ /* keepers */ @@ -498,7 +498,7 @@ /* entire block as a dead object. */ size_t deadLength = segment->realSize(); previous->combine(segment); - memory->verboseMessage("Combining newly allocated segment of %zu bytes to create new segment of %zu bytes\n", deadLength, previous->size()); + memory->verboseMessage("Combining newly allocated segment of %d bytes to create new segment of %d bytes\n", deadLength, previous->size()); addDeadObject((char *)segment, deadLength); } else @@ -895,7 +895,7 @@ { /* go add as many segments as are required to reach that */ /* level. */ - memory->verboseMessage("Expanding normal segment set by %zu\n", suggestedExpansion); + memory->verboseMessage("Expanding normal segment set by %d\n", suggestedExpansion); addSegments(suggestedExpansion); } #if 0 @@ -1096,7 +1096,7 @@ /******************************************************************************/ { #ifdef VERBOSE_GC - memory->verboseMessage("Large segment sweep complete. Largest block is %zu, smallest block is %zu\n", largestObject, smallestObject); + memory->verboseMessage("Large segment sweep complete. Largest block is %d, smallest block is %d\n", largestObject, smallestObject); #endif } @@ -1661,7 +1661,7 @@ /* merge these two segments together. */ removeSegment(tailSegment); segment->combine(tailSegment); - memory->verboseMessage("Non-empty segments combined to create segment of %zu bytes\n", segment->size()); + memory->verboseMessage("Non-empty segments combined to create segment of %d bytes\n", segment->size()); /* Now that this has been combined with one or more */ /* segments, the merged segment may still be a */ /* candidate for one more level of merge. Step to the */ @@ -1699,7 +1699,7 @@ /* add the space to the front segment */ front->combine(back); - memory->verboseMessage("Two segments combined to create segment of %zu bytes\n", front->size()); + memory->verboseMessage("Two segments combined to create segment of %d bytes\n", front->size()); /* and add the resulting dead object to the cache */ DeadObject *ptr = front->createDeadObject(); addDeadObject(ptr); @@ -1732,7 +1732,7 @@ /* we allocate this as the size we need. No sense in */ /* trying to over allocate here, as we'd like to free */ /* this up as soon as we can. */ - memory->verboseMessage("Expanding large segment set by %zu\n", allocationLength); + memory->verboseMessage("Expanding large segment set by %d\n", allocationLength); newSegment(allocationLength, allocationLength); } /* for the smaller of the large blocks, we expand by a full */ @@ -1741,7 +1741,7 @@ /* smaller size segment. */ else if (allocationLength < SegmentDeadSpace) { - memory->verboseMessage("Expanding large segment set by %zu\n", LargeSegmentDeadSpace); + memory->verboseMessage("Expanding large segment set by %d\n", LargeSegmentDeadSpace); newSegment(LargeSegmentDeadSpace, SegmentDeadSpace); } /* we've got a "tweener" block. We'll round up to the next */ @@ -1756,7 +1756,7 @@ { requestLength += SegmentDeadSpace; } - memory->verboseMessage("Expanding large segment set by %zu\n", requestLength); + memory->verboseMessage("Expanding large segment set by %d\n", requestLength); newSegment(requestLength, allocationLength); } } Modified: main/trunk/interpreter/memory/MemoryStats.cpp =================================================================== --- main/trunk/interpreter/memory/MemoryStats.cpp 2008-09-06 18:14:54 UTC (rev 3198) +++ main/trunk/interpreter/memory/MemoryStats.cpp 2008-09-06 19:29:10 UTC (rev 3199) @@ -130,10 +130,10 @@ /* Function: Print out statistics for a segment set snapshot */ /******************************************************************************/ { - printf("\n\n %s: Total bytes %zu in %d segments \n", name, totalBytes, count); - printf("Largest segment is %zu bytes, smallest is %zu bytes\n", largestSegment, smallestSegment); - printf("Total Live objects %zu, using %zu bytes\n", liveObjects, liveBytes); - printf("Total Dead objects %zu, using %zu bytes\n\n", deadObjects, deadBytes); + printf("\n\n %s: Total bytes %d in %d segments \n", name, totalBytes, count); + printf("Largest segment is %d bytes, smallest is %d bytes\n", largestSegment, smallestSegment); + printf("Total Live objects %d, using %d bytes\n", liveObjects, liveBytes); + printf("Total Dead objects %d,... [truncated message content] |
From: <bi...@us...> - 2008-09-07 21:08:40
|
Revision: 3222 http://oorexx.svn.sourceforge.net/oorexx/?rev=3222&view=rev Author: bigrixx Date: 2008-09-07 21:08:48 +0000 (Sun, 07 Sep 2008) Log Message: ----------- Fix linux compile errors Modified Paths: -------------- main/trunk/interpreter/classes/NumberStringClass.cpp main/trunk/interpreter/platform/windows/PlatformDefinitions.h Modified: main/trunk/interpreter/classes/NumberStringClass.cpp =================================================================== --- main/trunk/interpreter/classes/NumberStringClass.cpp 2008-09-07 21:01:00 UTC (rev 3221) +++ main/trunk/interpreter/classes/NumberStringClass.cpp 2008-09-07 21:08:48 UTC (rev 3222) @@ -3182,7 +3182,7 @@ /******************************************************************************/ { // make a nan value a string value - if (_isnan(num)) + if (isnan(num)) { return (RexxNumberString *)new_string("nan"); } @@ -3209,7 +3209,7 @@ /******************************************************************************/ { // make a nan value a string value - if (_isnan(number)) + if (isnan(number)) { return (RexxNumberString *)new_string("nan"); } @@ -3243,7 +3243,7 @@ RexxNumberString *RexxNumberString::newInstanceFromDouble(double number, size_t precision) { // make a nan value a string value - if (_isnan(number)) + if (isnan(number)) { return (RexxNumberString *)new_string("nan"); } Modified: main/trunk/interpreter/platform/windows/PlatformDefinitions.h =================================================================== --- main/trunk/interpreter/platform/windows/PlatformDefinitions.h 2008-09-07 21:01:00 UTC (rev 3221) +++ main/trunk/interpreter/platform/windows/PlatformDefinitions.h 2008-09-07 21:08:48 UTC (rev 3222) @@ -140,6 +140,8 @@ /******************************************************************************/ // Re-directed output... #include <stdio.h> // for following file ref... + // another annoying incompatibility in MS compiler. + #define isnan(x) _isnan(x) // Exception handling typedef BOOL __stdcall CONSOLECTRLHANDLER(DWORD); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bi...@us...> - 2008-09-08 11:21:53
|
Revision: 3227 http://oorexx.svn.sourceforge.net/oorexx/?rev=3227&view=rev Author: bigrixx Date: 2008-09-08 11:17:11 +0000 (Mon, 08 Sep 2008) Log Message: ----------- some numeric cleanup, fix to InvalidRoutine(), better error reporting for beep() Modified Paths: -------------- main/trunk/interpreter/api/CallContextStubs.cpp main/trunk/interpreter/classes/MutableBufferClass.cpp main/trunk/interpreter/classes/NumberStringClass.cpp main/trunk/interpreter/classes/NumberStringClass.hpp main/trunk/interpreter/classes/NumberStringMath.cpp main/trunk/interpreter/classes/NumberStringMath2.cpp main/trunk/interpreter/classes/StringClassWord.cpp main/trunk/interpreter/classes/support/StringUtil.cpp main/trunk/interpreter/platform/windows/ExternalFunctions.cpp Modified: main/trunk/interpreter/api/CallContextStubs.cpp =================================================================== --- main/trunk/interpreter/api/CallContextStubs.cpp 2008-09-08 04:14:47 UTC (rev 3226) +++ main/trunk/interpreter/api/CallContextStubs.cpp 2008-09-08 11:17:11 UTC (rev 3227) @@ -164,7 +164,7 @@ try { // raise an exception which will be reraised when the caller returns. - reportException(Error_Incorrect_call_external); + reportException(Error_Incorrect_call_external, context.context->getMessageName()); } catch (RexxNativeActivation *) { Modified: main/trunk/interpreter/classes/MutableBufferClass.cpp =================================================================== --- main/trunk/interpreter/classes/MutableBufferClass.cpp 2008-09-08 04:14:47 UTC (rev 3226) +++ main/trunk/interpreter/classes/MutableBufferClass.cpp 2008-09-08 11:17:11 UTC (rev 3227) @@ -1445,7 +1445,7 @@ size_t _wordPos = positionArgument(position, ARG_ONE); /* get num of words to delete, the */ /* default is "a very large number" */ - size_t count = optionalLengthArgument(plength, MAXNUM, ARG_TWO); + size_t count = optionalLengthArgument(plength, Numerics::MAX_WHOLENUMBER, ARG_TWO); size_t length = getLength(); /* get string length */ if (length == 0) /* null string? */ Modified: main/trunk/interpreter/classes/NumberStringClass.cpp =================================================================== --- main/trunk/interpreter/classes/NumberStringClass.cpp 2008-09-08 04:14:47 UTC (rev 3226) +++ main/trunk/interpreter/classes/NumberStringClass.cpp 2008-09-08 11:17:11 UTC (rev 3227) @@ -276,8 +276,8 @@ carry = 0; /* assume rounding-up NOT necessary */ /*is number just flat out too big? */ - if ((( ExpValue + (wholenumber_t)LenValue - 1) > MAXNUM) || - (ExpValue < (-MAXNUM)) ) /* Yes, report Overflow error. */ + if ((( ExpValue + (wholenumber_t)LenValue - 1) > Numerics::MAX_EXPONENT) || + (ExpValue < (Numerics::MIN_EXPONENT)) ) /* Yes, report Overflow error. */ { reportException(Error_Conversion_operator, this); } @@ -300,17 +300,17 @@ } temp = (temp/3) * 3; /* get count to the right of Decimal */ } - if (Numerics::abs(temp) > MAXNUM) + if (Numerics::abs(temp) > Numerics::MAX_EXPONENT) { /* is adjusted number too big? */ - if (temp > MAXNUM) /* did it overflow? */ + if (temp > Numerics::MAX_EXPONENT) /* did it overflow? */ { /* Yes, report overflow error. */ - reportException(Error_Overflow_expoverflow, temp, IntegerNine); + reportException(Error_Overflow_expoverflow, temp, Numerics::DEFAULT_DIGITS); } else { /* Actually an underflow error. */ - reportException(Error_Overflow_expunderflow, temp, IntegerNine); + reportException(Error_Overflow_expunderflow, temp, Numerics::DEFAULT_DIGITS); } } ExpValue -= temp; /* adjust the exponent */ @@ -321,7 +321,7 @@ else { ExpFactor = false; /* no need to save the factor */ - } /* endif */ + } if (temp < 0) { @@ -2070,7 +2070,7 @@ this->roundUp(MSDigit); /* Round up the number if necessary */ /*is number just flat out too big? */ - if ((this->exp + (wholenumber_t)this->length - 1) > MAXNUM) + if ((this->exp + (wholenumber_t)this->length - 1) > Numerics::MAX_EXPONENT) { return 1; /* also bad */ } Modified: main/trunk/interpreter/classes/NumberStringClass.hpp =================================================================== --- main/trunk/interpreter/classes/NumberStringClass.hpp 2008-09-08 04:14:47 UTC (rev 3226) +++ main/trunk/interpreter/classes/NumberStringClass.hpp 2008-09-08 11:17:11 UTC (rev 3227) @@ -46,12 +46,6 @@ #include "Numerics.hpp" -// TODO: redo these -#define MAXNUM 999999999 /* maximum size of 9 digits int */ -#define MAXPOSNUM 4294967294u /* maximum size of a ULONG */ -#define MAXNEGNUM 2147483647u /* maximum size of a negative long */ -#define MAXPOSBASE 429496729 /* maximum size value ULONG before * 10 */ -#define MAXNEGBASE 214748365 /* maximum size neg long before * 10 */ /* Define char data used in OKNUMSTR */ #define ch_BLANK ' ' /* Define a Blank character. */ #define ch_MINUS '-' /* Define the MINUS character */ @@ -63,9 +57,6 @@ #define ch_NINE '9' /* Define the Nine character. */ #define ch_TAB '\t' /* Define the alternate whitespace char */ -#define DEFAULTDIGITS 9 /* Define the default digits setting. */ -#define DEFAULTFUZZ 0 /* Define the default fuzz setting. */ - #define NumFormScientific 0x00000001 /* Define Numeric form setting at Object*/ /* creation time. */ #define NumberRounded 0x00000010 /* Indicate the number was rounded once */ Modified: main/trunk/interpreter/classes/NumberStringMath.cpp =================================================================== --- main/trunk/interpreter/classes/NumberStringMath.cpp 2008-09-08 04:14:47 UTC (rev 3226) +++ main/trunk/interpreter/classes/NumberStringMath.cpp 2008-09-08 11:17:11 UTC (rev 3227) @@ -194,14 +194,14 @@ /* At this point number is all setup,*/ /* Check for overflow */ numVal = this->exp + this->length - 1; - if (numVal > MAXNUM) + if (numVal > Numerics::MAX_EXPONENT) { - reportException(Error_Overflow_expoverflow, numVal, IntegerNine); + reportException(Error_Overflow_expoverflow, numVal, Numerics::DEFAULT_DIGITS); } /* Check for underflow. */ - else if (this->exp < -MAXNUM) + else if (this->exp < Numerics::MIN_EXPONENT) { - reportException(Error_Overflow_expunderflow, this->exp, IntegerNine); + reportException(Error_Overflow_expunderflow, this->exp, Numerics::DEFAULT_DIGITS); } return; } @@ -232,13 +232,13 @@ /* At this point number is all setup,*/ /* Check for overflow */ resultVal = this->exp + this->length - 1; - if (resultVal > MAXNUM) + if (resultVal > Numerics::MAX_EXPONENT) { - reportException(Error_Overflow_expoverflow, resultVal, IntegerNine); + reportException(Error_Overflow_expoverflow, resultVal, Numerics::DEFAULT_DIGITS); } - else if (this->exp < -MAXNUM) + else if (this->exp < Numerics::MIN_EXPONENT) { /* Check for underflow. */ - reportException(Error_Overflow_expunderflow, this->exp, IntegerNine); + reportException(Error_Overflow_expunderflow, this->exp, Numerics::DEFAULT_DIGITS); } } return; /* just return to caller. */ @@ -370,13 +370,13 @@ /* At this point number is all setup,*/ /* Check for overflow */ resultVal = this->exp + this->length - 1; - if (resultVal > MAXNUM) + if (resultVal > Numerics::MAX_EXPONENT) { - reportException(Error_Overflow_expoverflow, resultVal, IntegerNine); + reportException(Error_Overflow_expoverflow, resultVal, Numerics::DEFAULT_DIGITS); } - else if (this->exp < -MAXNUM) + else if (this->exp < Numerics::MIN_EXPONENT) { /* Check for underflow. */ - reportException(Error_Overflow_expunderflow, this->exp, IntegerNine); + reportException(Error_Overflow_expunderflow, this->exp, Numerics::DEFAULT_DIGITS); } } return; /* just return to caller. */ Modified: main/trunk/interpreter/classes/NumberStringMath2.cpp =================================================================== --- main/trunk/interpreter/classes/NumberStringMath2.cpp 2008-09-08 04:14:47 UTC (rev 3226) +++ main/trunk/interpreter/classes/NumberStringMath2.cpp 2008-09-08 11:17:11 UTC (rev 3227) @@ -737,13 +737,13 @@ highBits(Numerics::abs(powerValue)) + 1) > LONGBITS ) { /* yes, report error and return. */ - reportException(Error_Overflow_overflow, this, (RexxObject *)OREF_POWER, PowerObj); + reportException(Error_Overflow_overflow, this, OREF_POWER, PowerObj); } /* Will the result overflow ? */ - if (Numerics::abs((wholenumber_t)(left->exp + left->length - 1)) * powerValue > MAXNUM) + if (Numerics::abs((wholenumber_t)(left->exp + left->length - 1)) * powerValue > Numerics::MAX_EXPONENT) { /* yes, report error and return. */ - reportException(Error_Overflow_overflow, this, (RexxObject *)OREF_POWER, PowerObj); + reportException(Error_Overflow_overflow, this, OREF_POWER, PowerObj); } if (powerValue != 0) Modified: main/trunk/interpreter/classes/StringClassWord.cpp =================================================================== --- main/trunk/interpreter/classes/StringClassWord.cpp 2008-09-08 04:14:47 UTC (rev 3226) +++ main/trunk/interpreter/classes/StringClassWord.cpp 2008-09-08 11:17:11 UTC (rev 3227) @@ -75,7 +75,7 @@ WordPos = positionArgument(position, ARG_ONE); /* get num of words to delete, the */ /* default is "a very large number" */ - Count = optionalLengthArgument(plength, MAXNUM, ARG_TWO); + Count = optionalLengthArgument(plength, Numerics::MAX_WHOLENUMBER, ARG_TWO); Length = this->getLength(); /* get string length */ if (!Length) /* null string? */ Modified: main/trunk/interpreter/classes/support/StringUtil.cpp =================================================================== --- main/trunk/interpreter/classes/support/StringUtil.cpp 2008-09-08 04:14:47 UTC (rev 3226) +++ main/trunk/interpreter/classes/support/StringUtil.cpp 2008-09-08 11:17:11 UTC (rev 3227) @@ -1486,7 +1486,7 @@ /* convert position to binary */ size_t wordPos = positionArgument(position, ARG_ONE); // get num of words to extract. The default is a "very large number - size_t count = optionalLengthArgument(plength, MAXNUM, ARG_TWO); + size_t count = optionalLengthArgument(plength, Numerics::MAX_WHOLENUMBER, ARG_TWO); // handle cases that will always result in a null string if (length == 0 || count == 0) Modified: main/trunk/interpreter/platform/windows/ExternalFunctions.cpp =================================================================== --- main/trunk/interpreter/platform/windows/ExternalFunctions.cpp 2008-09-08 04:14:47 UTC (rev 3226) +++ main/trunk/interpreter/platform/windows/ExternalFunctions.cpp 2008-09-08 11:17:11 UTC (rev 3227) @@ -105,15 +105,31 @@ RexxRoutine2(CSTRING, sysBeep, wholenumber_t, Frequency, wholenumber_t, Duration) { - /* out of range? */ - if (Frequency > MAX_FREQUENCY || Frequency < MIN_FREQUENCY || Duration > MAX_DURATION || Duration < MIN_DURATION) - { - context->InvalidRoutine(); - return NULLOBJECT; - } + /* out of range? */ + if (Frequency > MAX_FREQUENCY || Frequency < MIN_FREQUENCY) + { + RexxArrayObject subs = context->NewArray(4); + context->ArrayAppend(subs, context->NewStringFromAsciiz("frequency")); + context->ArrayAppend(subs, context->NumberToObject(MIN_FREQUENCY)); + context->ArrayAppend(subs, context->NumberToObject(MAX_FREQUENCY)); + context->ArrayAppend(subs, context->NumberToObject(Frequency)); + context->RaiseExceptionArray(Rexx_Error_Invalid_argument_range, subs); + return NULL; + } + /* out of range? */ + if (Duration > MAX_DURATION || Duration < MIN_DURATION) + { + RexxArrayObject subs = context->NewArray(4); + context->ArrayAppend(subs, context->NewStringFromAsciiz("duration")); + context->ArrayAppend(subs, context->NumberToObject(MIN_DURATION)); + context->ArrayAppend(subs, context->NumberToObject(MAX_DURATION)); + context->ArrayAppend(subs, context->NumberToObject(Duration)); + context->RaiseExceptionArray(Rexx_Error_Invalid_argument_range, subs); + return NULL; + } - Beep((DWORD)Frequency, (DWORD)Duration); /* sound beep */ - return ""; /* always returns a null */ + Beep((DWORD)Frequency, (DWORD)Duration); /* sound beep */ + return ""; /* always returns a null */ } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bi...@us...> - 2008-09-08 12:32:09
|
Revision: 3229 http://oorexx.svn.sourceforge.net/oorexx/?rev=3229&view=rev Author: bigrixx Date: 2008-09-08 12:32:19 +0000 (Mon, 08 Sep 2008) Log Message: ----------- some error message cleanup to rmeove references to 999,999,999 Modified Paths: -------------- main/trunk/interpreter/messages/DocErrorMessages.sgml main/trunk/interpreter/messages/rexxmsg.xml main/trunk/interpreter/platform/windows/winmsgtb.rc Modified: main/trunk/interpreter/messages/DocErrorMessages.sgml =================================================================== --- main/trunk/interpreter/messages/DocErrorMessages.sgml 2008-09-08 11:17:45 UTC (rev 3228) +++ main/trunk/interpreter/messages/DocErrorMessages.sgml 2008-09-08 12:32:19 UTC (rev 3229) @@ -1134,7 +1134,8 @@ <para> <emphasis role="bold">Explanation:</emphasis> </para> -<para>An expression was found that did not evaluate to a whole number or is greater than the limit (the default is 999 999 999): +<para>An expression was found that did not evaluate to a whole number or is greater than the limit (the default is 999,999,999 for 32-bit system + and 999,999,999,999,999,999 for 64-bit systems): <itemizedlist> <listitem> <para>The positional patterns in parsing templates (including variable positional patterns)</para> @@ -2058,7 +2059,7 @@ <term>902</term> <listitem> <para> -<emphasis>function_name</emphasis> argument <emphasis>argument_number</emphasis> must not exceed 999,999,999</para> +<emphasis>function_name</emphasis> argument <emphasis>argument_number</emphasis> must not exceed the whole number limit.</para> </listitem> </varlistentry> <varlistentry> @@ -2139,7 +2140,7 @@ <para> <emphasis role="bold">Explanation:</emphasis> </para> -<para>A term in an arithmetic expression is not a valid number or has an exponent outside the allowed range of -999 999 999 to +999 999 999.</para> +<para>A term in an arithmetic expression is not a valid number or has an exponent outside the allowed range of whole number range.</para> <para>You might have mistyped a variable name, or included an arithmetic operator in a character expression without putting it in quotation marks.</para> <para>The associated subcodes are: </para> <variablelist> @@ -2200,7 +2201,7 @@ <para> <emphasis role="bold">Explanation:</emphasis> </para> -<para>The result of an arithmetic operation requires an exponent that is greater than the limit of nine digits (more than 999 999 999 or less than -999 999 999).</para> +<para>The result of an arithmetic operation requires an exponent that is greater than the platform limit of nine digits for 32-bit systems or 18 for 64-bit systems.</para> <para>This error can occur during the evaluation of an expression (often as a result of trying to divide a number by 0) or while stepping a DO loop control variable.</para> <para>The associated subcodes are: </para> <variablelist> Modified: main/trunk/interpreter/messages/rexxmsg.xml =================================================================== --- main/trunk/interpreter/messages/rexxmsg.xml 2008-09-08 11:17:45 UTC (rev 3228) +++ main/trunk/interpreter/messages/rexxmsg.xml 2008-09-08 12:32:19 UTC (rev 3229) @@ -1561,7 +1561,8 @@ <Severity>Warning</Severity> <SymbolicName>Error_Invalid_whole_number</SymbolicName> <Text>Invalid whole number</Text> - <Explanation><para>An expression was found that did not evaluate to a whole number or is greater than the limit (the default is 999 999 999): + <Explanation><para>An expression was found that did not evaluate to a whole number or is greater than the limit (the default is 999,999,999 for 32-bit system + and 999,999,999,999,999,999 for 64-bit systems): <itemizedlist> <listitem><para>The positional patterns in parsing templates (including variable positional patterns)</para></listitem> <listitem><para>The operand to the right of the power operator</para></listitem> @@ -2656,7 +2657,7 @@ <Component>Rexx</Component> <Severity>Warning</Severity> <SymbolicName>Error_Incorrect_call_toobig</SymbolicName> - <Text><Sub position="1" name="function_name"/> argument <Sub position="2" name="argument_number"/> must not exceed 999,999,999</Text> + <Text><Sub position="1" name="function_name"/> argument <Sub position="2" name="argument_number"/> must not exceed the whole number limit.</Text> </SubMessage> <SubMessage> <Code>40</Code> @@ -2911,7 +2912,7 @@ <Severity>Warning</Severity> <SymbolicName>Error_Conversion</SymbolicName> <Text>Bad arithmetic conversion</Text> - <Explanation><para>A term in an arithmetic expression is not a valid number or has an exponent outside the allowed range of -999 999 999 to +999 999 999.</para> + <Explanation><para>A term in an arithmetic expression is not a valid number or has an exponent outside the allowed range of whole number range.</para> <para>You might have mistyped a variable name, or included an arithmetic operator in a character expression without putting it in quotation marks.</para></Explanation> <Subcodes> <SubMessage> @@ -2996,7 +2997,7 @@ <Severity>Warning</Severity> <SymbolicName>Error_Overflow</SymbolicName> <Text>Arithmetic overflow/underflow</Text> - <Explanation><para>The result of an arithmetic operation requires an exponent that is greater than the limit of nine digits (more than 999 999 999 or less than -999 999 999).</para> + <Explanation><para>The result of an arithmetic operation requires an exponent that is greater than the platform limit of nine digits for 32-bit systems or 18 for 64-bit systems.</para> <para>This error can occur during the evaluation of an expression (often as a result of trying to divide a number by 0) or while stepping a DO loop control variable.</para></Explanation> <Subcodes> <SubMessage> Modified: main/trunk/interpreter/platform/windows/winmsgtb.rc =================================================================== --- main/trunk/interpreter/platform/windows/winmsgtb.rc 2008-09-08 11:17:45 UTC (rev 3228) +++ main/trunk/interpreter/platform/windows/winmsgtb.rc 2008-09-08 12:32:19 UTC (rev 3229) @@ -319,7 +319,7 @@ Error_Incorrect_call_whole "&1 argument &2 must be a whole number; found ""&3""" Error_Incorrect_call_nonnegative "&1 argument &2 must be zero or positive; found ""&3""" Error_Incorrect_call_positive "&1 argument &2 must be positive; found ""&3""" - Error_Incorrect_call_toobig "&1 argument &2 must not exceed 999,999,999" + Error_Incorrect_call_toobig "&1 argument &2 must not exceed the whole number limit." Error_Incorrect_call_range "&1 argument &2 must be in the range 0-99; found ""&3""" Error_Incorrect_call_null "&1 argument &2 must not be a null string" Error_Incorrect_call_option "&1 argument &2 must be a single character or null; found ""&3""" This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bi...@us...> - 2008-09-09 13:04:37
|
Revision: 3247 http://oorexx.svn.sourceforge.net/oorexx/?rev=3247&view=rev Author: bigrixx Date: 2008-09-09 13:04:46 +0000 (Tue, 09 Sep 2008) Log Message: ----------- [ 2100109 ] Lift size limit for arrays on 64-bit systems. Modified Paths: -------------- main/trunk/interpreter/classes/ArrayClass.cpp main/trunk/interpreter/classes/ArrayClass.hpp main/trunk/interpreter/runtime/Numerics.cpp main/trunk/interpreter/runtime/Numerics.hpp Modified: main/trunk/interpreter/classes/ArrayClass.cpp =================================================================== --- main/trunk/interpreter/classes/ArrayClass.cpp 2008-09-09 03:02:40 UTC (rev 3246) +++ main/trunk/interpreter/classes/ArrayClass.cpp 2008-09-09 13:04:46 UTC (rev 3247) @@ -81,6 +81,9 @@ RexxClass *RexxArray::classInstance = OREF_NULL; RexxArray *RexxArray::nullArray = OREF_NULL; +const size_t RexxArray::MAX_FIXEDARRAY_SIZE = (Numerics::MAX_WHOLENUMBER/10) + 1; +const size_t RexxArray::ARRAY_MIN_SIZE = 4; +const size_t RexxArray::ARRAY_DEFAULT_SIZE = 10; // we use a larger default for ooRexx allocated arrays /** * Create initial class object at bootstrap time. @@ -1505,18 +1508,7 @@ } size_t newSize = this->size() + extension; - size_t extendSize; - /* are we still a relative small array? */ - if (newSize < ARRAY_EXTEND_EXTRA_LARGE_SIZE) - { - /* just bump this the small extra amount */ - extendSize = ARRAY_EXTEND_EXTRA_SIZE; - } - else - { - /* we're getting large. We'll start bumping by a larger amount. */ - extendSize = this->size() / 2; /* add 50% to the size */ - } + size_t extendSize = this->size() / 2; /* get a new array, total size is */ /* size of both arrays. */ @@ -2028,7 +2020,7 @@ return newArray; /* return the new array */ } -void * RexxArray::operator new(size_t size, RexxObject **args, size_t argCount, RexxClass *arrayClass) +void *RexxArray::operator new(size_t size, RexxObject **args, size_t argCount, RexxClass *arrayClass) /******************************************************************************/ /* Function: Rexx level creation of an ARRAY object */ /******************************************************************************/ @@ -2046,7 +2038,7 @@ { /* If no argument is passed */ /* create an empty array. */ - temp = new ((size_t)0, arrayClass) RexxArray; + temp = new (ARRAY_DEFAULT_SIZE, arrayClass) RexxArray; ProtectedObject p(temp); temp->sendMessage(OREF_INIT); /* call any rexx init's */ return temp; @@ -2579,7 +2571,7 @@ RexxArray *aref; aref = (RexxArray *)new_array(1); - aref->put(first, 1L); + aref->put(first, 1); return aref; } @@ -2589,8 +2581,8 @@ RexxArray *aref; aref = new_array(2); - aref->put(first, 1L); - aref->put(second, 2L); + aref->put(first, 1); + aref->put(second, 2); return aref; } @@ -2605,9 +2597,9 @@ RexxArray *aref; aref = new_array(3); - aref->put(first, 1L); - aref->put(second, 2L); - aref->put(third, 3L); + aref->put(first, 1); + aref->put(second, 2); + aref->put(third, 3); return aref; } @@ -2624,16 +2616,15 @@ RexxArray *aref; aref = new_array(4); - aref->put(first, 1L); - aref->put(second, 2L); - aref->put(third, 3L); - aref->put(fourth, 4L); + aref->put(first, 1); + aref->put(second, 2); + aref->put(third, 3); + aref->put(fourth, 4); return aref; } -void * RexxArray::operator new(size_t newSize, - size_t size, RexxClass *arrayClass) +void *RexxArray::operator new(size_t newSize, size_t size, RexxClass *arrayClass) /******************************************************************************/ /* Function: Low level array creation */ /******************************************************************************/ Modified: main/trunk/interpreter/classes/ArrayClass.hpp =================================================================== --- main/trunk/interpreter/classes/ArrayClass.hpp 2008-09-09 03:02:40 UTC (rev 3246) +++ main/trunk/interpreter/classes/ArrayClass.hpp 2008-09-09 13:04:46 UTC (rev 3247) @@ -44,11 +44,6 @@ #ifndef Included_RexxArray #define Included_RexxArray -#define MAX_FIXEDARRAY_SIZE 100000000L -#define ARRAY_EXTEND_EXTRA_SIZE 10 -#define ARRAY_EXTEND_EXTRA_LARGE_SIZE 100 -#define ARRAY_MIN_SIZE 4 - #define RaiseBoundsNone 0x00000000 #define RaiseBoundsUpper 0x00000001 #define RaiseBoundsInvalid 0x00000002 @@ -189,6 +184,10 @@ protected: + static const size_t MAX_FIXEDARRAY_SIZE; + static const size_t ARRAY_MIN_SIZE; + static const size_t ARRAY_DEFAULT_SIZE; // default size for ooRexx allocation + size_t arraySize; /* current size of array */ size_t maximumSize; /* Maximum size array can grow */ size_t lastElement; // location of last set element Modified: main/trunk/interpreter/runtime/Numerics.cpp =================================================================== --- main/trunk/interpreter/runtime/Numerics.cpp 2008-09-09 03:02:40 UTC (rev 3246) +++ main/trunk/interpreter/runtime/Numerics.cpp 2008-09-09 13:04:46 UTC (rev 3247) @@ -50,19 +50,19 @@ #include <limits.h> #ifdef __REXX64__ -wholenumber_t Numerics::MAX_WHOLENUMBER = __INT64_C(999999999999999999); -wholenumber_t Numerics::MIN_WHOLENUMBER = __INT64_C(-999999999999999999); -wholenumber_t Numerics::MAX_EXPONENT = __INT64_C(999999999999999999); -wholenumber_t Numerics::MIN_EXPONENT = __INT64_C(-999999999999999999); -stringsize_t Numerics::DEFAULT_DIGITS = ((stringsize_t)18); +const wholenumber_t Numerics::MAX_WHOLENUMBER = __INT64_C(999999999999999999); +const wholenumber_t Numerics::MIN_WHOLENUMBER = __INT64_C(-999999999999999999); +const wholenumber_t Numerics::MAX_EXPONENT = __INT64_C(999999999999999999); +const wholenumber_t Numerics::MIN_EXPONENT = __INT64_C(-999999999999999999); +const size_t Numerics::DEFAULT_DIGITS = ((size_t)18); // the digits setting used internally for function/method arguments to allow // for the full range -stringsize_t Numerics::ARGUMENT_DIGITS = ((stringsize_t)20); +const size_t Numerics::ARGUMENT_DIGITS = ((size_t)20); /* Array for valid whole number at various digits settings */ /* for value 1-18. */ -wholenumber_t Numerics::validMaxWhole[] = {10, +const wholenumber_t Numerics::validMaxWhole[] = {10, 100, 1000, 10000, @@ -81,19 +81,19 @@ 100000000000000000, 1000000000000000000}; #else -wholenumber_t Numerics::MAX_WHOLENUMBER = 999999999; -wholenumber_t Numerics::MIN_WHOLENUMBER = -999999999; -wholenumber_t Numerics::MAX_EXPONENT = 999999999; -wholenumber_t Numerics::MIN_EXPONENT = -999999999; -stringsize_t Numerics::DEFAULT_DIGITS = ((stringsize_t)9); +const wholenumber_t Numerics::MAX_WHOLENUMBER = 999999999; +const wholenumber_t Numerics::MIN_WHOLENUMBER = -999999999; +const wholenumber_t Numerics::MAX_EXPONENT = 999999999; +const wholenumber_t Numerics::MIN_EXPONENT = -999999999; +const size_t Numerics::DEFAULT_DIGITS = ((size_t)9); // the digits setting used internally for function/method arguments to allow // for the full binary value range -stringsize_t Numerics::ARGUMENT_DIGITS = ((stringsize_t)10); +const size_t Numerics::ARGUMENT_DIGITS = ((size_t)10); /* Array for valid whole number at various digits settings */ /* for value 1-9. */ -wholenumber_t Numerics::validMaxWhole[] = {10, +const wholenumber_t Numerics::validMaxWhole[] = {10, 100, 1000, 10000, @@ -103,15 +103,15 @@ 100000000, 1000000000}; #endif -stringsize_t Numerics::MAX_STRINGSIZE = SIZE_MAX; +const stringsize_t Numerics::MAX_STRINGSIZE = SIZE_MAX; // max numeric digits value for explicit 64-bit conversions -stringsize_t Numerics::DIGITS64 = ((stringsize_t)20); -bool Numerics::FORM_SCIENTIFIC = false; -bool Numerics::FORM_ENGINEERING = true; +const size_t Numerics::DIGITS64 = ((size_t)20); +const bool Numerics::FORM_SCIENTIFIC = false; +const bool Numerics::FORM_ENGINEERING = true; -stringsize_t Numerics::DEFAULT_FUZZ = ((stringsize_t)0); /* default numeric fuzz setting */ +const size_t Numerics::DEFAULT_FUZZ = ((size_t)0); /* default numeric fuzz setting */ /* default numeric form setting */ -bool Numerics::DEFAULT_FORM = Numerics::FORM_SCIENTIFIC; +const bool Numerics::DEFAULT_FORM = Numerics::FORM_SCIENTIFIC; NumericSettings Numerics::defaultSettings; NumericSettings *Numerics::settings = &Numerics::defaultSettings; Modified: main/trunk/interpreter/runtime/Numerics.hpp =================================================================== --- main/trunk/interpreter/runtime/Numerics.hpp 2008-09-09 03:02:40 UTC (rev 3246) +++ main/trunk/interpreter/runtime/Numerics.hpp 2008-09-09 13:04:46 UTC (rev 3247) @@ -59,25 +59,27 @@ class Numerics { public: - static wholenumber_t MAX_WHOLENUMBER; - static wholenumber_t MIN_WHOLENUMBER; - static wholenumber_t MAX_EXPONENT; - static wholenumber_t MIN_EXPONENT; - static stringsize_t DEFAULT_DIGITS; + static const wholenumber_t MAX_WHOLENUMBER; + static const wholenumber_t MIN_WHOLENUMBER; + static const wholenumber_t MAX_EXPONENT; + static const wholenumber_t MIN_EXPONENT; + static const size_t DEFAULT_DIGITS; // the digits setting used internally for function/method arguments to allow // for the full range - static stringsize_t ARGUMENT_DIGITS; - static stringsize_t MAX_STRINGSIZE; + static const size_t ARGUMENT_DIGITS; + static const size_t MAX_STRINGSIZE; // max numeric digits value for explicit 64-bit conversions - static stringsize_t DIGITS64; - static bool FORM_SCIENTIFIC; - static bool FORM_ENGINEERING; + static const size_t DIGITS64; + static const bool FORM_SCIENTIFIC; + static const bool FORM_ENGINEERING; - static stringsize_t DEFAULT_FUZZ; + static const size_t DEFAULT_FUZZ; /* default numeric form setting */ - static bool DEFAULT_FORM; + static const bool DEFAULT_FORM; + static const wholenumber_t validMaxWhole[]; // table of maximum values per digits setting + static RexxObject *wholenumberToObject(wholenumber_t v); static RexxObject *stringsizeToObject(stringsize_t v); static RexxObject *int64ToObject(int64_t v); @@ -97,7 +99,6 @@ static stringsize_t formatInt64(int64_t integer, char *dest); static stringsize_t formatUnsignedInt64(uint64_t integer, char *dest); - static wholenumber_t validMaxWhole[]; // table of maximum values per digits setting static size_t digits() { return settings->digits; } static size_t fuzz() { return settings->fuzz; } static bool form() { return settings->form; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bi...@us...> - 2008-09-11 22:00:59
|
Revision: 3278 http://oorexx.svn.sourceforge.net/oorexx/?rev=3278&view=rev Author: bigrixx Date: 2008-09-11 22:01:10 +0000 (Thu, 11 Sep 2008) Log Message: ----------- Fix edge cases for integer formatting Modified Paths: -------------- main/trunk/interpreter/classes/NumberStringClass.cpp main/trunk/interpreter/runtime/Numerics.cpp main/trunk/interpreter/runtime/Numerics.hpp Modified: main/trunk/interpreter/classes/NumberStringClass.cpp =================================================================== --- main/trunk/interpreter/classes/NumberStringClass.cpp 2008-09-11 20:19:30 UTC (rev 3277) +++ main/trunk/interpreter/classes/NumberStringClass.cpp 2008-09-11 22:01:10 UTC (rev 3278) @@ -2101,8 +2101,6 @@ /* Function : Format the integer num into a numberstring. */ /******************************************************************************/ { - char *current; /* current position */ - if (integer == 0) { /* is integer 0? */ /* indicate this. */ @@ -2114,18 +2112,9 @@ if (integer < 0 ) { /* Negative integer number? */ this->sign = -1; - integer = -integer; /* take the positive version */ } /* convert value into string */ - Numerics::formatWholeNumber(integer, (char *)this->number); - current = this->number; /* point to the data start */ - while (*current != '\0') - { /* while still have digits */ - *current -= '0'; /* make zero based */ - current++; /* step to the next one */ - } - /* set the proper length */ - this->length = current - this->number; + this->length = Numerics::normalizeWholeNumber(integer, (char *)this->number); } } Modified: main/trunk/interpreter/runtime/Numerics.cpp =================================================================== --- main/trunk/interpreter/runtime/Numerics.cpp 2008-09-11 20:19:30 UTC (rev 3277) +++ main/trunk/interpreter/runtime/Numerics.cpp 2008-09-11 22:01:10 UTC (rev 3278) @@ -463,39 +463,137 @@ // zero? this is pretty easy if (integer == 0) { - strcpy((char *)dest, "0"); + strcpy(dest, "0"); return 1; } size_t sign = 0; + // we convert this directly because portable numeric-to-ascii routines + // don't really exist for the various 32/64 bit values. + char buffer[24]; + size_t index = sizeof(buffer); + // negative number? copy a negative sign, and take the abs value if (integer < 0) { *dest++ = '-'; - integer = -integer; + integer = -(integer + 1); sign = 1; // added in to the length + int carry = 1; // we add this in when handling the first digit + + while (integer > 0) + { + // get the digit and reduce the size of the integer + int digit = (int)(integer % 10) + carry; + // if adding the carry caused a carry, we need to propagate this along + if (digit > 9) + { + digit = 0; // this is a zero digit, keep the carry + } + else + { + carry = 0; // done adding in + } + integer = integer / 10; + // store the digit + buffer[--index] = digit + '0'; + } + // we might have a carry out here + if (carry != 0) + { + buffer[--index] = '1'; + } } + else + { + while (integer > 0) + { + // get the digit and reduce the size of the integer + int digit = (int)(integer % 10) + '0'; + integer = integer / 10; + // store the digit + buffer[--index] = digit; + } + } + // copy into the buffer and set the length + stringsize_t length = sizeof(buffer) - index; + memcpy(dest, &buffer[index], length); + // make sure we have a terminating null + dest[length] = '\0'; + return length + sign; +} + + +/** + * Do portable formatting of a wholenumber value into + * numberstring format. + * + * @param integer The value to convert. + * @param dest The location to store the formatted string. + * + * @return The length of the converted number. + */ +stringsize_t Numerics::normalizeWholeNumber(wholenumber_t integer, char *dest) +{ + // zero? this is pretty easy + if (integer == 0) + { + *dest = '\0'; + return 1; + } + // we convert this directly because portable numeric-to-ascii routines // don't really exist for the various 32/64 bit values. char buffer[24]; size_t index = sizeof(buffer); - while (integer > 0) + // negative number? copy a negative sign, and take the abs value + if (integer < 0) { - // get the digit and reduce the size of the integer - int digit = (int)(integer % 10) + '0'; - integer = integer / 10; - // store the digit - buffer[--index] = digit; + integer = -(integer + 1); + int carry = 1; // we add this in when handling the first digit + while (integer > 0) + { + // get the digit and reduce the size of the integer + int digit = (int)(integer % 10) + carry; + // if adding the carry caused a carry, we need to propagate this along + if (digit > 9) + { + digit = 0; // this is a zero digit, keep the carry + } + else + { + carry = 0; // done adding in + } + integer = integer / 10; + // store the digit + buffer[--index] = digit; + } + // we might have had a carry out + if (carry != 0) + { + buffer[--index] = 1; + } } + else + { + while (integer > 0) + { + // get the digit and reduce the size of the integer + int digit = (int)(integer % 10); + integer = integer / 10; + // store the digit + buffer[--index] = digit; + } + } // copy into the buffer and set the length stringsize_t length = sizeof(buffer) - index; memcpy(dest, &buffer[index], length); // make sure we have a terminating null dest[length] = '\0'; - return length + sign; + return length; } /** @@ -557,27 +655,53 @@ return 1; } + // we convert this directly because portable numeric-to-ascii routines + // don't really exist for the various 32/64 bit values. + char buffer[32]; + size_t index = sizeof(buffer); size_t sign = 0; + // negative number? copy a negative sign, and take the abs value if (integer < 0) { *dest++ = '-'; - integer = -integer; - sign = 1; // added in to the length + integer = -(integer + 1); + sign = 1; // added in to the length + int carry = 1; // we add this in when handling the first digit + + while (integer > 0) + { + // get the digit and reduce the size of the integer + int digit = (int)(integer % 10) + carry; + // if adding the carry caused a carry, we need to propagate this along + if (digit > 9) + { + digit = 0; // this is a zero digit, keep the carry + } + else + { + carry = 0; // done adding in + } + integer = integer / 10; + // store the digit + buffer[--index] = digit + '0'; + } + // we might have a carry out here + if (carry != 0) + { + buffer[--index] = '1'; + } } - - // we convert this directly because portable numeric-to-ascii routines - // don't really exist for the various 32/64 bit values. - char buffer[32]; - size_t index = sizeof(buffer); - - while (integer > 0) + else { - // get the digit and reduce the size of the integer - int digit = (int)(integer % 10) + '0'; - integer = integer / 10; - // store the digit - buffer[--index] = digit; + while (integer > 0) + { + // get the digit and reduce the size of the integer + int digit = (int)(integer % 10) + '0'; + integer = integer / 10; + // store the digit + buffer[--index] = digit; + } } // copy into the buffer and set the length Modified: main/trunk/interpreter/runtime/Numerics.hpp =================================================================== --- main/trunk/interpreter/runtime/Numerics.hpp 2008-09-11 20:19:30 UTC (rev 3277) +++ main/trunk/interpreter/runtime/Numerics.hpp 2008-09-11 22:01:10 UTC (rev 3278) @@ -94,11 +94,13 @@ static bool objectToUintptr(RexxObject *source, uintptr_t &result); static bool objectToIntptr(RexxObject *source, intptr_t &result); - static stringsize_t formatWholeNumber(wholenumber_t integer, char *dest); - static stringsize_t formatStringSize(stringsize_t integer, char *dest); - static stringsize_t formatInt64(int64_t integer, char *dest); - static stringsize_t formatUnsignedInt64(uint64_t integer, char *dest); + static size_t formatWholeNumber(wholenumber_t integer, char *dest); + static size_t formatStringSize(stringsize_t integer, char *dest); + static size_t formatInt64(int64_t integer, char *dest); + static size_t formatUnsignedInt64(uint64_t integer, char *dest); + static size_t normalizeWholeNumber(wholenumber_t integer, char *dest); + static size_t digits() { return settings->digits; } static size_t fuzz() { return settings->fuzz; } static bool form() { return settings->form; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bi...@us...> - 2008-09-12 11:12:48
|
Revision: 3285 http://oorexx.svn.sourceforge.net/oorexx/?rev=3285&view=rev Author: bigrixx Date: 2008-09-12 11:12:58 +0000 (Fri, 12 Sep 2008) Log Message: ----------- Make error messages for signed and unsigned arg types consistent Modified Paths: -------------- main/trunk/interpreter/execution/RexxNativeActivation.cpp main/trunk/interpreter/messages/DocErrorMessages.sgml main/trunk/interpreter/messages/rexxmsg.xml main/trunk/interpreter/platform/windows/winmsgtb.rc Modified: main/trunk/interpreter/execution/RexxNativeActivation.cpp =================================================================== --- main/trunk/interpreter/execution/RexxNativeActivation.cpp 2008-09-11 23:48:01 UTC (rev 3284) +++ main/trunk/interpreter/execution/RexxNativeActivation.cpp 2008-09-12 11:12:58 UTC (rev 3285) @@ -1654,7 +1654,7 @@ // convert using the whole value range if (!Numerics::objectToWholeNumber(o, temp, maxValue, minValue)) { - reportException(Error_Invalid_argument_whole, position + 1, o); + reportException(Error_Invalid_argument_range, new_array(new_integer(position + 1), Numerics::wholenumberToObject(minValue), Numerics::wholenumberToObject(maxValue), o)); } return temp; } @@ -1677,7 +1677,7 @@ // convert using the whole value range if (!Numerics::objectToStringSize(o, temp, maxValue)) { - reportException(Error_Invalid_argument_range, new_array(new_integer(position + 1), IntegerZero, new_numberstringFromStringsize(maxValue), o)); + reportException(Error_Invalid_argument_range, new_array(new_integer(position + 1), IntegerZero, Numerics::stringsizeToObject(maxValue), o)); } return temp; } Modified: main/trunk/interpreter/messages/DocErrorMessages.sgml =================================================================== --- main/trunk/interpreter/messages/DocErrorMessages.sgml 2008-09-11 23:48:01 UTC (rev 3284) +++ main/trunk/interpreter/messages/DocErrorMessages.sgml 2008-09-12 11:12:58 UTC (rev 3285) @@ -2495,7 +2495,7 @@ <varlistentry> <term>907</term> <listitem> -<para>Argument <emphasis>argument</emphasis> must be in the range <emphasis>min</emphasis>-<emphasis>max</emphasis>; found "<emphasis>value</emphasis>"</para> +<para>Argument <emphasis>argument</emphasis> must be in the range <emphasis>min</emphasis> to <emphasis>max</emphasis>; found "<emphasis>value</emphasis>"</para> </listitem> </varlistentry> <varlistentry> Modified: main/trunk/interpreter/messages/rexxmsg.xml =================================================================== --- main/trunk/interpreter/messages/rexxmsg.xml 2008-09-11 23:48:01 UTC (rev 3284) +++ main/trunk/interpreter/messages/rexxmsg.xml 2008-09-12 11:12:58 UTC (rev 3285) @@ -3373,7 +3373,7 @@ <Component>Rexx</Component> <Severity>Warning</Severity> <SymbolicName>Error_Invalid_argument_range</SymbolicName> - <Text>Argument <Sub position="1" name="argument"/> must be in the range <Sub position="2" name="min"/>-<Sub position="3" name="max"/>; found <q><Sub position="4" name="value"/></q></Text> + <Text>Argument <Sub position="1" name="argument"/> must be in the range <Sub position="2" name="min"/> to <Sub position="3" name="max"/>; found <q><Sub position="4" name="value"/></q></Text> </SubMessage> <SubMessage> <Code>88</Code> Modified: main/trunk/interpreter/platform/windows/winmsgtb.rc =================================================================== --- main/trunk/interpreter/platform/windows/winmsgtb.rc 2008-09-11 23:48:01 UTC (rev 3284) +++ main/trunk/interpreter/platform/windows/winmsgtb.rc 2008-09-12 11:12:58 UTC (rev 3285) @@ -581,7 +581,7 @@ Error_Invalid_argument_nonnegative "Argument &1 must be zero or a positive whole number; found ""&2""" Error_Invalid_argument_positive "Argument &1 must be a positive whole number; found ""&2""" Error_Invalid_argument_toobig "Argument &1 must not exceed &2; found ""&3""" - Error_Invalid_argument_range "Argument &1 must be in the range &2-&3; found ""&4""" + Error_Invalid_argument_range "Argument &1 must be in the range &2 to &3; found ""&4""" Error_Invalid_argument_null "Argument &1 must not be a null string" Error_Invalid_argument_string "Argument &1 must have a string value" Error_Invalid_argument_pad "Argument &1 is an incorrect pad or character argument; found ""&2""" This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bi...@us...> - 2008-09-12 18:17:42
|
Revision: 3293 http://oorexx.svn.sourceforge.net/oorexx/?rev=3293&view=rev Author: bigrixx Date: 2008-09-12 18:17:52 +0000 (Fri, 12 Sep 2008) Log Message: ----------- Fix edge case for 64-bit numbers Modified Paths: -------------- main/trunk/interpreter/classes/NumberStringClass.cpp main/trunk/interpreter/execution/RexxNativeActivation.cpp Modified: main/trunk/interpreter/classes/NumberStringClass.cpp =================================================================== --- main/trunk/interpreter/classes/NumberStringClass.cpp 2008-09-12 17:24:50 UTC (rev 3292) +++ main/trunk/interpreter/classes/NumberStringClass.cpp 2008-09-12 18:17:52 UTC (rev 3293) @@ -942,12 +942,26 @@ // is this easily within limits (very common)? if (length <= numDigits && numberExp >= 0) { - if (!createUnsignedInt64Value(number, length, false, numberExp, INT64_MAX, intnum)) + // the minimum negative value requires one more than the max positive + if (!createUnsignedInt64Value(number, length, false, numberExp, ((uint64_t)INT64_MAX) + 1, intnum)) { return false; // too big to handle } - // adjust for the sign - *result = ((int64_t)intnum) * sign; + // this edge case can be a problem, so check for it specifically + if (intnum == ((uint64_t)INT64_MAX) + 1) + { + // if at the limit, this must be a negative number + if (sign != -1) + { + return false; + } + *result = INT64_MIN; + } + else + { + // adjust for the sign + *result = ((int64_t)intnum) * sign; + } return true; } @@ -976,21 +990,33 @@ if (numberExp < 0) { // now convert this into an unsigned value - if (!createUnsignedInt64Value(number, numberLength + numberExp, carry, 0, INT64_MAX, intnum)) + if (!createUnsignedInt64Value(number, numberLength + numberExp, carry, 0, ((uint64_t)INT64_MAX) + 1, intnum)) { return false; // to big to handle } } else { /* straight out number. just compute.*/ - if (!createUnsignedInt64Value(number, numberLength, carry, numberExp, INT64_MAX, intnum)) + if (!createUnsignedInt64Value(number, numberLength, carry, numberExp, ((uint64_t)INT64_MAX) + 1, intnum)) { return false; // to big to handle } } - - // adjust for the sign - *result = ((int64_t)intnum) * sign; + // the edge case is a problem, so handle it directly + if (intnum == ((uint64_t)INT64_MAX) + 1) + { + // if at the limit, this must be a negative number + if (sign != -1) + { + return false; + } + *result = INT64_MAX; + } + else + { + // adjust for the sign + *result = ((int64_t)intnum) * sign; + } return true; } @@ -2159,27 +2185,42 @@ } else { /* number is non-zero */ - /* Format the number */ - if (integer < 0 ) - { /* Negative integer number? */ - this->sign = -1; - integer = -integer; /* take the positive version */ - } - - // we convert this directly because A) we need to post-process the numbers - // to make them zero based, and B) portable numeric-to-ascii routines + // we convert this directly because portable numeric-to-ascii routines // don't really exist for the various 32/64 bit values. char buffer[32]; size_t index = sizeof(buffer); - while (integer > 0) + // negative number? copy a negative sign, and take the abs value + if (integer < 0) { - // get the digit and reduce the size of the integer - int digit = (int)(integer % 10); - integer = integer / 10; - // store the digit - buffer[--index] = digit; + // work from an unsigned version that can hold all of the digits + // we need to use a version we can negate first, then add the + // digit back in + uint64_t working = (uint64_t)(-(integer + 1)); + working++; // undoes the +1 above + sign = -1; // negative number + + while (working > 0) + { + // get the digit and reduce the size of the integer + int digit = (int)(working % 10); + working = working / 10; + // store the digit + buffer[--index] = digit; + } } + else + { + sign = 1; // positive number + while (integer > 0) + { + // get the digit and reduce the size of the integer + int digit = (int)(integer % 10); + integer = integer / 10; + // store the digit + buffer[--index] = digit; + } + } // copy into the buffer and set the length this->length = sizeof(buffer) - index; Modified: main/trunk/interpreter/execution/RexxNativeActivation.cpp =================================================================== --- main/trunk/interpreter/execution/RexxNativeActivation.cpp 2008-09-12 17:24:50 UTC (rev 3292) +++ main/trunk/interpreter/execution/RexxNativeActivation.cpp 2008-09-12 18:17:52 UTC (rev 3293) @@ -1698,7 +1698,7 @@ // convert using the whole value range if (!Numerics::objectToInt64(o, temp)) { - reportException(Error_Invalid_argument_whole, position + 1, o); + reportException(Error_Invalid_argument_range, new_array(new_integer(position + 1), Numerics::int64ToObject(INT64_MAX), Numerics::int64ToObject(INT64_MIN), o)); } return temp; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bi...@us...> - 2008-09-12 21:19:24
|
Revision: 3295 http://oorexx.svn.sourceforge.net/oorexx/?rev=3295&view=rev Author: bigrixx Date: 2008-09-12 18:28:40 +0000 (Fri, 12 Sep 2008) Log Message: ----------- Uint64 values not rejecting negative numbers Modified Paths: -------------- main/trunk/interpreter/classes/NumberStringClass.cpp main/trunk/interpreter/execution/RexxNativeActivation.cpp main/trunk/interpreter/runtime/Numerics.cpp Modified: main/trunk/interpreter/classes/NumberStringClass.cpp =================================================================== --- main/trunk/interpreter/classes/NumberStringClass.cpp 2008-09-12 18:18:53 UTC (rev 3294) +++ main/trunk/interpreter/classes/NumberStringClass.cpp 2008-09-12 18:28:40 UTC (rev 3295) @@ -1039,6 +1039,12 @@ return true; } + // no signed values allowed + if (sign == -1) + { + return false; + } + // is this easily within limits (very common)? if (length <= numDigits && numberExp >= 0) { Modified: main/trunk/interpreter/execution/RexxNativeActivation.cpp =================================================================== --- main/trunk/interpreter/execution/RexxNativeActivation.cpp 2008-09-12 18:18:53 UTC (rev 3294) +++ main/trunk/interpreter/execution/RexxNativeActivation.cpp 2008-09-12 18:28:40 UTC (rev 3295) @@ -1719,7 +1719,7 @@ // convert using the whole value range if (!Numerics::objectToUnsignedInt64(o, temp)) { - reportException(Error_Invalid_argument_nonnegative, position + 1, o); + reportException(Error_Invalid_argument_range, new_array(new_integer(position + 1), IntegerZero, Numerics::int64ToObject(INT64_MAX), o)); } return temp; } Modified: main/trunk/interpreter/runtime/Numerics.cpp =================================================================== --- main/trunk/interpreter/runtime/Numerics.cpp 2008-09-12 18:18:53 UTC (rev 3294) +++ main/trunk/interpreter/runtime/Numerics.cpp 2008-09-12 18:28:40 UTC (rev 3295) @@ -359,6 +359,11 @@ // is this an integer value (very common) if (isInteger(source)) { + // reject any signed values. + if (((RexxInteger *)source)->wholeNumber() < 0) + { + return false; + } result = ((RexxInteger *)source)->stringSize(); return true; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bi...@us...> - 2008-09-13 00:03:13
|
Revision: 3300 http://oorexx.svn.sourceforge.net/oorexx/?rev=3300&view=rev Author: bigrixx Date: 2008-09-13 00:03:24 +0000 (Sat, 13 Sep 2008) Log Message: ----------- Fix errors in the ObjectToXXXX conversion APIs Modified Paths: -------------- main/trunk/interpreter/api/ThreadContextStubs.cpp main/trunk/interpreter/runtime/Numerics.cpp Modified: main/trunk/interpreter/api/ThreadContextStubs.cpp =================================================================== --- main/trunk/interpreter/api/ThreadContextStubs.cpp 2008-09-12 20:47:01 UTC (rev 3299) +++ main/trunk/interpreter/api/ThreadContextStubs.cpp 2008-09-13 00:03:24 UTC (rev 3300) @@ -684,7 +684,7 @@ // this uses the entire value range // NB: SSIZE_MIN appears to be defined as 0 for some bizarre reason on some platforms, // so we'll make things relative to SIZE_MAX. - if (Numerics::objectToWholeNumber((RexxObject *)o, temp, SSIZE_MAX, (-SSIZE_MAX) - 1)) + if (Numerics::objectToWholeNumber((RexxObject *)o, temp, Numerics::MAX_WHOLENUMBER, Numerics::MIN_WHOLENUMBER)) { *n = (wholenumber_t)temp; return true; @@ -733,7 +733,7 @@ { stringsize_t temp; // this uses the entire value range - if (Numerics::objectToStringSize((RexxObject *)o, temp, SIZE_MAX)) + if (Numerics::objectToStringSize((RexxObject *)o, temp, Numerics::MAX_WHOLENUMBER)) { *n = (stringsize_t)temp; return true; Modified: main/trunk/interpreter/runtime/Numerics.cpp =================================================================== --- main/trunk/interpreter/runtime/Numerics.cpp 2008-09-12 20:47:01 UTC (rev 3299) +++ main/trunk/interpreter/runtime/Numerics.cpp 2008-09-13 00:03:24 UTC (rev 3300) @@ -394,31 +394,15 @@ */ bool Numerics::objectToUintptr(RexxObject *source, uintptr_t &result) { - // is this an integer value (very common) - if (isInteger(source)) + stringsize_t temp; + // if it didn't convert for the range, give a failure back + if (!Numerics::objectToStringSize(source, temp, UINTPTR_MAX)) { - result = ((RexxInteger *)source)->stringSize(); - return true; - } - else - { - // get this as a numberstring (which it might already be) - RexxNumberString *nString = source->numberString(); - // not convertible to number string? get out now - if (nString == OREF_NULL) - { - return false; - } - uint64_t temp; - - // if not a valid whole number, reject this too - if (nString->unsignedInt64Value(&temp, ARGUMENT_DIGITS)) - { - result = (uintptr_t)temp; - return true; - } return false; } + // ok, this worked + result = (uintptr_t)temp; + return true; } @@ -433,31 +417,15 @@ */ bool Numerics::objectToIntptr(RexxObject *source, intptr_t &result) { - // is this an integer value (very common) - if (isInteger(source)) + wholenumber_t temp; + // if it didn't convert for the range, give a failure back + if (!Numerics::objectToWholeNumber(source, temp, INTPTR_MAX, INTPTR_MIN)) { - result = ((RexxInteger *)source)->wholeNumber(); - return true; - } - else - { - // get this as a numberstring (which it might already be) - RexxNumberString *nString = source->numberString(); - // not convertible to number string? get out now - if (nString == OREF_NULL) - { - return false; - } - int64_t temp; - - // if not a valid whole number, reject this too - if (nString->int64Value(&temp, ARGUMENT_DIGITS)) - { - result = (intptr_t)temp; - return true; - } return false; } + // ok, this worked + result = (intptr_t)temp; + return true; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bi...@us...> - 2008-09-15 19:13:11
|
Revision: 3325 http://oorexx.svn.sourceforge.net/oorexx/?rev=3325&view=rev Author: bigrixx Date: 2008-09-15 19:12:56 +0000 (Mon, 15 Sep 2008) Log Message: ----------- Reorg variable handling a bit to enable GetObjectVariable() et al to work correctly Modified Paths: -------------- main/trunk/interpreter/execution/RexxActivation.cpp main/trunk/interpreter/execution/RexxActivation.hpp main/trunk/interpreter/execution/RexxNativeActivation.cpp main/trunk/interpreter/execution/RexxVariableDictionary.cpp main/trunk/interpreter/execution/RexxVariableDictionary.hpp main/trunk/interpreter/expression/BuiltinFunctions.cpp main/trunk/interpreter/expression/ExpressionBaseVariable.hpp main/trunk/interpreter/expression/ExpressionCompoundVariable.cpp main/trunk/interpreter/expression/ExpressionCompoundVariable.hpp main/trunk/interpreter/expression/ExpressionStem.cpp main/trunk/interpreter/expression/ExpressionStem.hpp main/trunk/interpreter/expression/ExpressionVariable.cpp main/trunk/interpreter/expression/ExpressionVariable.hpp main/trunk/interpreter/expression/IndirectVariableReference.cpp main/trunk/interpreter/parser/SourceFile.cpp Modified: main/trunk/interpreter/execution/RexxActivation.cpp =================================================================== --- main/trunk/interpreter/execution/RexxActivation.cpp 2008-09-15 17:22:07 UTC (rev 3324) +++ main/trunk/interpreter/execution/RexxActivation.cpp 2008-09-15 19:12:56 UTC (rev 3325) @@ -65,11 +65,6 @@ #include "CallInstruction.hpp" #include "DoBlock.hpp" #include "DoInstruction.hpp" -#include "ExpressionBaseVariable.hpp" -#include "ExpressionDotVariable.hpp" -#include "ExpressionVariable.hpp" -#include "ExpressionStem.hpp" -#include "ExpressionCompoundVariable.hpp" #include "ProtectedObject.hpp" #include "ActivityManager.hpp" #include "Interpreter.hpp" @@ -3653,228 +3648,7 @@ return TheNilObject; /* return the handled result */ } -RexxVariableBase *RexxActivation::getVariableRetriever( - RexxString *variable ) /* name of the variable */ -/******************************************************************************/ -/* Arguments: Name of variable to generate retriever */ -/* */ -/* Returned: Retriever for variable (returns OREF_NULL for invalids) */ -/******************************************************************************/ -{ - variable = variable->upper(); /* upper case the variable */ - int type = variable->isSymbol(); /* validate the symbol */ - /* create a retriever object */ - switch (type) - { - case STRING_BAD_VARIABLE: /* if it didn't validate */ - return OREF_NULL; /* don't return a retriever object */ - case STRING_LITERAL_DOT: /* if is is a literal */ - case STRING_NUMERIC: - /* these are literals */ - return(RexxVariableBase *)variable; - - // Dot variables retrieve from the environment - case STRING_LITERAL: - // this is only a dot variable if it begins with a period - if (variable->getChar(0) == '.') - { - return (RexxVariableBase *)new RexxDotVariable(variable->extract(1, variable->getLength() - 1)); - } - // this is a literal symbol not beginning with a period - return (RexxVariableBase *)variable; - - /* if it is a stem */ - case STRING_STEM: - /* create a new stem retriever */ - return(RexxVariableBase *)new RexxStemVariable(variable, 0); - /* if it is a compound */ - case STRING_COMPOUND_NAME: - /* create a new compound retriever */ - return(RexxVariableBase *)buildCompoundVariable(variable, false); - /* if it is a simple */ - case STRING_NAME: - /* create a new variable retriever */ - return(RexxVariableBase *)new RexxParseVariable(variable, 0); - /* if we don't know what it is */ - default: - return OREF_NULL; /* don't return a retriever object */ - } -} - - -RexxVariableBase *RexxActivation::getDirectVariableRetriever( - RexxString *variable ) /* name of the variable */ -/******************************************************************************/ -/* Function: Return a retriever for a variable using direct access (i.e. */ -/* no substitution in compound variable tails) */ -/******************************************************************************/ -{ - size_t length = variable->getLength(); /* get the name length */ - /* get the first character */ - char character = variable->getChar(0); - bool literal = false; /* literal indicator */ - /* constant symbol? */ - if (character == '.' || (character >= '0' && character <= '9')) - { - literal = true; /* this is a literal value */ - } - /* have a valid length? */ - if (length <= (size_t)MAX_SYMBOL_LENGTH && length > 0) - { - size_t compound = 0; /* no periods yet */ - size_t scan = 0; /* start at string beginning */ - size_t nonnumeric = 0; /* count of non-numeric characters */ - char last = 0; /* no last character */ - while (scan < length) - { - /* get the next character */ - character = variable->getChar(scan); - /* have a period? */ - if (character == '.') - { - if (!literal) /* not a literal value? */ - { - /* don't process past here */ - return(RexxVariableBase *)buildCompoundVariable(variable, true); - } - else - { - compound++; /* count the character */ - } - } - /* may have a special character */ - else if (!RexxSource::isSymbolCharacter(character)) - { - /* maybe exponential form? */ - if (character == '+' || character == '-') - { - /* front part not valid? */ - if (compound > 1 || nonnumeric > 1 || last != 'E') - { - return OREF_NULL; /* got a bad symbol */ - } - scan++; /* step over the sign */ - if (scan >= length) /* sign as last character? */ - { - return OREF_NULL; /* this is bad also */ - } - /* scan remainder */ - while (scan < length) - { - /* get the next character */ - character = variable->getChar(scan); - /* outside numeric range? */ - if (character < '0' || character > '9') - { - return OREF_NULL; /* not valid either */ - } - scan++; /* step scan position */ - } - break; /* done with scanning */ - } - } - /* non-numeric character? */ - else if (character < '0' || character > '9') - { - nonnumeric++; /* count the non-numeric */ - } - /* lower case character? */ - else if (RexxSource::translateChar(character) != character) - { - return OREF_NULL; /* this is bad, return */ - } - last = character; /* remember last one */ - scan++; /* step the pointer */ - } - } - if (literal) /* was this a literal? */ - { - /* these are both just literals */ - return(RexxVariableBase *)variable; - } - else /* simple variable */ - { - /* create a new variable retriever */ - return(RexxVariableBase *)new RexxParseVariable(variable, 0); - } -} - - -RexxObject *buildCompoundVariable( - RexxString *variable_name, /* full variable name of compound */ - bool direct) /* this is direct access */ -/******************************************************************************/ -/* Function: Build a dynamically created compound variable */ -/******************************************************************************/ -{ - size_t length = variable_name->getLength(); /* get the string length */ - size_t position = 0; /* start scanning at first character */ - /* scan to the first period */ - while (variable_name->getChar(position) != '.') - { - position++; /* step to the next character */ - length--; /* reduce the length also */ - } - /* extract the stem part */ - RexxString *stem = variable_name->extract(0, position + 1); - ProtectedObject p(stem); - /* processing to decompose the name */ - /* into its component parts */ - - RexxQueue *tails = new_queue(); /* get a new list for the tails */ - ProtectedObject p1(tails); - position++; /* step past previous period */ - length--; /* adjust the length */ - /* direct access? */ - if (direct == true) - { - /* extract the tail part */ - RexxString *tail = variable_name->extract(position, length); - tails->push(tail); /* add to the tail piece list */ - } - else - { - size_t endPosition = position + length; - - while (position < endPosition) /* process rest of the variable */ - { - size_t start = position; /* save the start position */ - /* scan for the next period */ - while (position < endPosition && variable_name->getChar(position) != '.') - { - position++; /* step to the next character */ - } - /* extract the tail part */ - RexxString *tail = variable_name->extract(start, position - start); - /* have a null tail piece or */ - /* section begin with a digit? */ - /* ASCII '0' to '9' to recognize a digit */ - - RexxObject *tailPart; - if (tail->getLength() == 0 || (tail->getChar(0) >= '0' && tail->getChar(0) <= '9')) - { - tailPart = (RexxObject *)tail; /* this is a literal piece */ - } - else - { - /* create a new variable retriever */ - tailPart = (RexxObject *)new RexxParseVariable(tail, 0); - } - tails->push(tailPart); /* add to the tail piece list */ - position++; /* step past previous period */ - } - /* have a trailing period? */ - if (variable_name->getChar(position - 1) == '.') - { - tails->push(OREF_NULLSTRING); /* add to the tail piece list */ - } - } - /* create and return a new compound */ - return(RexxObject *)new (tails->getSize()) RexxCompoundVariable(stem, 0, tails, tails->getSize()); -} - - /** * Get the source object for the current execution context. * Modified: main/trunk/interpreter/execution/RexxActivation.hpp =================================================================== --- main/trunk/interpreter/execution/RexxActivation.hpp 2008-09-15 17:22:07 UTC (rev 3324) +++ main/trunk/interpreter/execution/RexxActivation.hpp 2008-09-15 19:12:56 UTC (rev 3325) @@ -173,8 +173,6 @@ #define SCOPE_RESERVED 1 #define SCOPE_RELEASED 0 -RexxObject *buildCompoundVariable(RexxString * variable_name, bool direct); - class RexxActivation : public RexxActivationBase { public: void *operator new(size_t); @@ -234,8 +232,6 @@ void exitFrom(RexxObject *); void procedureExpose(RexxVariableBase **variables, size_t count); void expose(RexxVariableBase **variables, size_t count); - RexxVariableBase *getVariableRetriever(RexxString *variable); - RexxVariableBase *getDirectVariableRetriever(RexxString *variable); void setTrace(size_t, size_t); void setTrace(RexxString *); void raise(RexxString *, RexxObject *, RexxString *, RexxObject *, RexxObject *, RexxDirectory *); Modified: main/trunk/interpreter/execution/RexxNativeActivation.cpp =================================================================== --- main/trunk/interpreter/execution/RexxNativeActivation.cpp 2008-09-15 17:22:07 UTC (rev 3324) +++ main/trunk/interpreter/execution/RexxNativeActivation.cpp 2008-09-15 19:12:56 UTC (rev 3325) @@ -2426,7 +2426,7 @@ name = name->concatWithCstring("."); } - RexxVariableBase *retriever = activation->getVariableRetriever(name); + RexxVariableBase *retriever = RexxVariableDictionary::getVariableRetriever(name); // if this didn't parse, it's an illegal name // it must also resolve to a stem type...this could be a compound one if (retriever == OREF_NULL || !isOfClass(StemVariableTerm, retriever)) @@ -2448,7 +2448,7 @@ */ RexxObject *RexxNativeActivation::getContextVariable(const char *name) { - RexxVariableBase *retriever = activation->getVariableRetriever(new_string(name)); + RexxVariableBase *retriever = RexxVariableDictionary::getVariableRetriever(new_string(name)); // if this didn't parse, it's an illegal name if (retriever == OREF_NULL) { @@ -2478,7 +2478,7 @@ void RexxNativeActivation::setContextVariable(const char *name, RexxObject *value) { // get the REXX activation for the target context - RexxVariableBase *retriever = activation->getVariableRetriever(new_string(name)); + RexxVariableBase *retriever = RexxVariableDictionary::getVariableRetriever(new_string(name)); // if this didn't parse, it's an illegal name if (retriever == OREF_NULL || isString((RexxObject *)retriever)) { @@ -2499,7 +2499,7 @@ void RexxNativeActivation::dropContextVariable(const char *name) { // get the REXX activation for the target context - RexxVariableBase *retriever = activation->getVariableRetriever(new_string(name)); + RexxVariableBase *retriever = RexxVariableDictionary::getVariableRetriever(new_string(name)); // if this didn't parse, it's an illegal name if (retriever == OREF_NULL || isString((RexxObject *)retriever)) { @@ -2532,7 +2532,17 @@ */ RexxObject *RexxNativeActivation::getObjectVariable(const char *name) { - return methodVariables()->realValue(new_upper_string(name)); + // get the REXX activation for the target context + RexxVariableBase *retriever = RexxVariableDictionary::getVariableRetriever(new_string(name)); + // if this didn't parse, it's an illegal name + // we also don't allow compound variables here because the source for + // resolving the tail pieces is not defined. + if (retriever == OREF_NULL || isString((RexxObject *)retriever) || isOfClassType(CompoundVariableTerm, retriever)) + { + return OREF_NULL; + } + // retrieve the value + return retriever->getRealValue(methodVariables()); } /** @@ -2543,7 +2553,17 @@ */ void RexxNativeActivation::setObjectVariable(const char *name, RexxObject *value) { - methodVariables()->set(new_upper_string(name), value); + // get the REXX activation for the target context + RexxVariableBase *retriever = RexxVariableDictionary::getVariableRetriever(new_string(name)); + // if this didn't parse, it's an illegal name + // we also don't allow compound variables here because the source for + // resolving the tail pieces is not defined. + if (retriever == OREF_NULL || isString((RexxObject *)retriever) || isOfClassType(CompoundVariableTerm, retriever)) + { + return; + } + // do the assignment + retriever->set(methodVariables(), value); } /** @@ -2553,7 +2573,17 @@ */ void RexxNativeActivation::dropObjectVariable(const char *name) { - methodVariables()->drop(new_upper_string(name)); + // get the REXX activation for the target context + RexxVariableBase *retriever = RexxVariableDictionary::getVariableRetriever(new_string(name)); + // if this didn't parse, it's an illegal name + // we also don't allow compound variables here because the source for + // resolving the tail pieces is not defined. + if (retriever == OREF_NULL || isString((RexxObject *)retriever) || isOfClassType(CompoundVariableTerm, retriever)) + { + return; + } + // do the assignment + retriever->drop(methodVariables()); } @@ -2694,11 +2724,11 @@ if (symbolic) { /* get a symbolic retriever */ - retriever = activation->getVariableRetriever(variable); + retriever = RexxVariableDictionary::getVariableRetriever(variable); } else /* need a direct retriever */ { - retriever = activation->getDirectVariableRetriever(variable); + retriever = RexxVariableDictionary::getDirectVariableRetriever(variable); } if (retriever == OREF_NULL) /* have a bad name? */ { @@ -3061,7 +3091,7 @@ RexxString *variable = new_string(stemname); ProtectedObject p1(variable); /* and get a retriever for this variable */ - RexxStemVariable *retriever = (RexxStemVariable *)contextActivation->getVariableRetriever(variable); + RexxStemVariable *retriever = (RexxStemVariable *)RexxVariableDictionary::getVariableRetriever(variable); /* this must be a stem variable in order for the sorting to work. */ Modified: main/trunk/interpreter/execution/RexxVariableDictionary.cpp =================================================================== --- main/trunk/interpreter/execution/RexxVariableDictionary.cpp 2008-09-15 17:22:07 UTC (rev 3324) +++ main/trunk/interpreter/execution/RexxVariableDictionary.cpp 2008-09-15 19:12:56 UTC (rev 3325) @@ -50,12 +50,15 @@ #include "ListClass.hpp" #include "RexxVariableDictionary.hpp" #include "StemClass.hpp" +#include "ExpressionBaseVariable.hpp" #include "ExpressionStem.hpp" #include "ExpressionVariable.hpp" #include "ExpressionCompoundVariable.hpp" +#include "ExpressionDotVariable.hpp" #include "ProtectedObject.hpp" #include "SupplierClass.hpp" #include "RexxCompoundTail.hpp" +#include "SourceFile.hpp" RexxObject *RexxVariableDictionary::copy() @@ -526,7 +529,6 @@ } - /** * Set a compound variable in the dictionary. * @@ -544,3 +546,244 @@ /* and set the value */ stem_table->setCompoundVariable(&resolved_tail, value); } + + +/** + * Drop a compound variable in the dictionary. + * + * @param stemName The name of the stem. + * @param tail The tail elements. + * @param tailCount The count of tail elements. + * @param value The value to set. + */ +void RexxVariableDictionary::dropCompoundVariable(RexxString *stemName, RexxObject **tail, size_t tailCount) +{ + /* new tail for compound */ + RexxCompoundTail resolved_tail(this, tail, tailCount); + + RexxStem *stem_table = getStem(stemName); /* get the stem entry from this dictionary */ + /* and set the value */ + stem_table->dropCompoundVariable(&resolved_tail); +} + + +RexxVariableBase *RexxVariableDictionary::getVariableRetriever( + RexxString *variable ) /* name of the variable */ +/******************************************************************************/ +/* Arguments: Name of variable to generate retriever */ +/* */ +/* Returned: Retriever for variable (returns OREF_NULL for invalids) */ +/******************************************************************************/ +{ + variable = variable->upper(); /* upper case the variable */ + int type = variable->isSymbol(); /* validate the symbol */ + /* create a retriever object */ + switch (type) + { + case STRING_BAD_VARIABLE: /* if it didn't validate */ + return OREF_NULL; /* don't return a retriever object */ + + case STRING_LITERAL_DOT: /* if is is a literal */ + case STRING_NUMERIC: + /* these are literals */ + return(RexxVariableBase *)variable; + + // Dot variables retrieve from the environment + case STRING_LITERAL: + // this is only a dot variable if it begins with a period + if (variable->getChar(0) == '.') + { + return (RexxVariableBase *)new RexxDotVariable(variable->extract(1, variable->getLength() - 1)); + } + // this is a literal symbol not beginning with a period + return (RexxVariableBase *)variable; + + /* if it is a stem */ + case STRING_STEM: + /* create a new stem retriever */ + return(RexxVariableBase *)new RexxStemVariable(variable, 0); + /* if it is a compound */ + case STRING_COMPOUND_NAME: + /* create a new compound retriever */ + return(RexxVariableBase *)buildCompoundVariable(variable, false); + /* if it is a simple */ + case STRING_NAME: + /* create a new variable retriever */ + return(RexxVariableBase *)new RexxParseVariable(variable, 0); + /* if we don't know what it is */ + default: + return OREF_NULL; /* don't return a retriever object */ + } +} + + +RexxVariableBase *RexxVariableDictionary::getDirectVariableRetriever( + RexxString *variable ) /* name of the variable */ +/******************************************************************************/ +/* Function: Return a retriever for a variable using direct access (i.e. */ +/* no substitution in compound variable tails) */ +/******************************************************************************/ +{ + size_t length = variable->getLength(); /* get the name length */ + /* get the first character */ + char character = variable->getChar(0); + bool literal = false; /* literal indicator */ + /* constant symbol? */ + if (character == '.' || (character >= '0' && character <= '9')) + { + literal = true; /* this is a literal value */ + } + /* have a valid length? */ + if (length <= (size_t)MAX_SYMBOL_LENGTH && length > 0) + { + size_t compound = 0; /* no periods yet */ + size_t scan = 0; /* start at string beginning */ + size_t nonnumeric = 0; /* count of non-numeric characters */ + char last = 0; /* no last character */ + while (scan < length) + { + /* get the next character */ + character = variable->getChar(scan); + /* have a period? */ + if (character == '.') + { + if (!literal) /* not a literal value? */ + { + /* don't process past here */ + return(RexxVariableBase *)buildCompoundVariable(variable, true); + } + else + { + compound++; /* count the character */ + } + } + /* may have a special character */ + else if (!RexxSource::isSymbolCharacter(character)) + { + /* maybe exponential form? */ + if (character == '+' || character == '-') + { + /* front part not valid? */ + if (compound > 1 || nonnumeric > 1 || last != 'E') + { + return OREF_NULL; /* got a bad symbol */ + } + scan++; /* step over the sign */ + if (scan >= length) /* sign as last character? */ + { + return OREF_NULL; /* this is bad also */ + } + /* scan remainder */ + while (scan < length) + { + /* get the next character */ + character = variable->getChar(scan); + /* outside numeric range? */ + if (character < '0' || character > '9') + { + return OREF_NULL; /* not valid either */ + } + scan++; /* step scan position */ + } + break; /* done with scanning */ + } + } + /* non-numeric character? */ + else if (character < '0' || character > '9') + { + nonnumeric++; /* count the non-numeric */ + } + /* lower case character? */ + else if (RexxSource::translateChar(character) != character) + { + return OREF_NULL; /* this is bad, return */ + } + last = character; /* remember last one */ + scan++; /* step the pointer */ + } + } + if (literal) /* was this a literal? */ + { + /* these are both just literals */ + return(RexxVariableBase *)variable; + } + else /* simple variable */ + { + /* create a new variable retriever */ + return(RexxVariableBase *)new RexxParseVariable(variable, 0); + } +} + + +RexxObject *RexxVariableDictionary::buildCompoundVariable( + RexxString *variable_name, /* full variable name of compound */ + bool direct) /* this is direct access */ +/******************************************************************************/ +/* Function: Build a dynamically created compound variable */ +/******************************************************************************/ +{ + size_t length = variable_name->getLength(); /* get the string length */ + size_t position = 0; /* start scanning at first character */ + /* scan to the first period */ + while (variable_name->getChar(position) != '.') + { + position++; /* step to the next character */ + length--; /* reduce the length also */ + } + /* extract the stem part */ + RexxString *stem = variable_name->extract(0, position + 1); + ProtectedObject p(stem); + /* processing to decompose the name */ + /* into its component parts */ + + RexxQueue *tails = new_queue(); /* get a new list for the tails */ + ProtectedObject p1(tails); + position++; /* step past previous period */ + length--; /* adjust the length */ + /* direct access? */ + if (direct == true) + { + /* extract the tail part */ + RexxString *tail = variable_name->extract(position, length); + tails->push(tail); /* add to the tail piece list */ + } + else + { + size_t endPosition = position + length; + + while (position < endPosition) /* process rest of the variable */ + { + size_t start = position; /* save the start position */ + /* scan for the next period */ + while (position < endPosition && variable_name->getChar(position) != '.') + { + position++; /* step to the next character */ + } + /* extract the tail part */ + RexxString *tail = variable_name->extract(start, position - start); + /* have a null tail piece or */ + /* section begin with a digit? */ + /* ASCII '0' to '9' to recognize a digit */ + + RexxObject *tailPart; + if (tail->getLength() == 0 || (tail->getChar(0) >= '0' && tail->getChar(0) <= '9')) + { + tailPart = (RexxObject *)tail; /* this is a literal piece */ + } + else + { + /* create a new variable retriever */ + tailPart = (RexxObject *)new RexxParseVariable(tail, 0); + } + tails->push(tailPart); /* add to the tail piece list */ + position++; /* step past previous period */ + } + /* have a trailing period? */ + if (variable_name->getChar(position - 1) == '.') + { + tails->push(OREF_NULLSTRING); /* add to the tail piece list */ + } + } + /* create and return a new compound */ + return(RexxObject *)new (tails->getSize()) RexxCompoundVariable(stem, 0, tails, tails->getSize()); +} Modified: main/trunk/interpreter/execution/RexxVariableDictionary.hpp =================================================================== --- main/trunk/interpreter/execution/RexxVariableDictionary.hpp 2008-09-15 17:22:07 UTC (rev 3324) +++ main/trunk/interpreter/execution/RexxVariableDictionary.hpp 2008-09-15 19:12:56 UTC (rev 3325) @@ -105,6 +105,7 @@ } void setCompoundVariable(RexxString *stemName, RexxObject **tail, size_t tailCount, RexxObject *value); + void dropCompoundVariable(RexxString *stemName, RexxObject **tail, size_t tailCount); RexxDirectory *getAllVariables(); inline void remove(RexxString *n) { contents->remove(n); } @@ -127,6 +128,10 @@ void setNextDictionary(RexxVariableDictionary *next); + static RexxVariableBase *getVariableRetriever(RexxString *variable); + static RexxVariableBase *getDirectVariableRetriever(RexxString *variable); + static RexxObject *buildCompoundVariable(RexxString * variable_name, bool direct); + static RexxVariableDictionary *newInstance(size_t); static RexxVariableDictionary *newInstance(RexxObject *); Modified: main/trunk/interpreter/expression/BuiltinFunctions.cpp =================================================================== --- main/trunk/interpreter/expression/BuiltinFunctions.cpp 2008-09-15 17:22:07 UTC (rev 3324) +++ main/trunk/interpreter/expression/BuiltinFunctions.cpp 2008-09-15 19:12:56 UTC (rev 3325) @@ -1568,7 +1568,7 @@ /* get the variable name */ RexxString *name = required_string(SYMBOL, name); /* get a variable retriever */ - RexxVariableBase *variable = context->getVariableRetriever(name); + RexxVariableBase *variable = RexxVariableDictionary::getVariableRetriever(name); if (variable == OREF_NULL) /* invalid variable name? */ { /* return the 'BAD' result */ @@ -1605,7 +1605,7 @@ /* get the variable name */ RexxString *variable = required_string(VAR, name); /* get a variable retriever */ - RexxVariableBase *retriever = context->getVariableRetriever(variable); + RexxVariableBase *retriever = RexxVariableDictionary::getVariableRetriever(variable); if (retriever == OREF_NULL) /* invalid variable name? */ { return TheFalseObject; /* return the 'BAD' result */ @@ -1643,7 +1643,7 @@ if (selector == OREF_NULL) /* have a selector? */ { /* get a variable retriever */ - RexxVariableBase *retriever = context->getVariableRetriever(variable); + RexxVariableBase *retriever = RexxVariableDictionary::getVariableRetriever(variable); // this could an invalid name, or we might be trying to assign a value to a non-variable // symbol. if (retriever == OREF_NULL || (newvalue != OREF_NULL && !assignable)) Modified: main/trunk/interpreter/expression/ExpressionBaseVariable.hpp =================================================================== --- main/trunk/interpreter/expression/ExpressionBaseVariable.hpp 2008-09-15 17:22:07 UTC (rev 3324) +++ main/trunk/interpreter/expression/ExpressionBaseVariable.hpp 2008-09-15 19:12:56 UTC (rev 3325) @@ -52,6 +52,7 @@ virtual void set(RexxVariableDictionary *, RexxObject *) {;} virtual void assign(RexxActivation *, RexxExpressionStack *, RexxObject *) {;} virtual void drop(RexxActivation *) {;} + virtual void drop(RexxVariableDictionary *) {;} virtual void setGuard(RexxActivation *) {;} virtual void clearGuard(RexxActivation *) {;} virtual void expose(RexxActivation *, RexxExpressionStack *, RexxVariableDictionary *) {;} Modified: main/trunk/interpreter/expression/ExpressionCompoundVariable.cpp =================================================================== --- main/trunk/interpreter/expression/ExpressionCompoundVariable.cpp 2008-09-15 17:22:07 UTC (rev 3324) +++ main/trunk/interpreter/expression/ExpressionCompoundVariable.cpp 2008-09-15 19:12:56 UTC (rev 3325) @@ -318,7 +318,18 @@ context->dropLocalCompoundVariable(stemName, index, &tails[0], tailCount); } +/** + * Drop a variable that's directly in a variable dictionary. + * + * @param dictionary The target dictionary + */ +void RexxCompoundVariable::drop(RexxVariableDictionary *dictionary) +{ + /* the dictionary manages all of these details */ + dictionary->dropCompoundVariable(stemName, &tails[0], tailCount); +} + void RexxCompoundVariable::procedureExpose( RexxActivation *context, /* current activation context */ RexxActivation *parent, /* the parent activation context */ Modified: main/trunk/interpreter/expression/ExpressionCompoundVariable.hpp =================================================================== --- main/trunk/interpreter/expression/ExpressionCompoundVariable.hpp 2008-09-15 17:22:07 UTC (rev 3324) +++ main/trunk/interpreter/expression/ExpressionCompoundVariable.hpp 2008-09-15 19:12:56 UTC (rev 3325) @@ -73,6 +73,7 @@ void set(RexxVariableDictionary *, RexxObject *); void assign(RexxActivation *, RexxExpressionStack *, RexxObject *); void drop(RexxActivation *); + void drop(RexxVariableDictionary *); void setGuard(RexxActivation *); void clearGuard(RexxActivation *); void expose(RexxActivation *, RexxExpressionStack *, RexxVariableDictionary *); Modified: main/trunk/interpreter/expression/ExpressionStem.cpp =================================================================== --- main/trunk/interpreter/expression/ExpressionStem.cpp 2008-09-15 17:22:07 UTC (rev 3324) +++ main/trunk/interpreter/expression/ExpressionStem.cpp 2008-09-15 19:12:56 UTC (rev 3325) @@ -253,6 +253,17 @@ context->dropLocalStem(stem, index); } +/** + * Drop a variable that's directly in a variable dictionary. + * + * @param dictionary The target dictionary + */ +void RexxStemVariable::drop(RexxVariableDictionary *dictionary) +{ + // dropping the stem name is sufficient + dictionary->drop(stem); +} + void RexxStemVariable::procedureExpose( RexxActivation *context, /* current activation context */ RexxActivation *parent, /* the parent activation context */ Modified: main/trunk/interpreter/expression/ExpressionStem.hpp =================================================================== --- main/trunk/interpreter/expression/ExpressionStem.hpp 2008-09-15 17:22:07 UTC (rev 3324) +++ main/trunk/interpreter/expression/ExpressionStem.hpp 2008-09-15 19:12:56 UTC (rev 3325) @@ -68,6 +68,7 @@ void set(RexxVariableDictionary *, RexxObject *) ; void assign(RexxActivation *, RexxExpressionStack *, RexxObject *); void drop(RexxActivation *); + void drop(RexxVariableDictionary *); void setGuard(RexxActivation *); void clearGuard(RexxActivation *); void expose(RexxActivation *, RexxExpressionStack *, RexxVariableDictionary *); Modified: main/trunk/interpreter/expression/ExpressionVariable.cpp =================================================================== --- main/trunk/interpreter/expression/ExpressionVariable.cpp 2008-09-15 17:22:07 UTC (rev 3324) +++ main/trunk/interpreter/expression/ExpressionVariable.cpp 2008-09-15 19:12:56 UTC (rev 3325) @@ -98,21 +98,18 @@ /* Function: Evaluate a REXX simple variable */ /******************************************************************************/ { - RexxVariable *variable; /* retrieved variable entry */ - RexxObject *value; /* final variable value */ - - /* look up the name */ - variable = context->getLocalVariable(variableName, index); - value = variable->getVariableValue();/* get the value */ - if (value == OREF_NULL) /* no value yet? */ - { - // try the various novalue mechanisms - value = context->handleNovalueEvent(variableName, variable); - } - stack->push(value); /* place on the evaluation stack */ - /* trace if necessary */ - context->traceVariable(variableName, value); - return value; /* return the located variable */ + /* look up the name */ + RexxVariable *variable = context->getLocalVariable(variableName, index); + RexxObject *value = variable->getVariableValue();/* get the value */ + if (value == OREF_NULL) /* no value yet? */ + { + // try the various novalue mechanisms + value = context->handleNovalueEvent(variableName, variable); + } + stack->push(value); /* place on the evaluation stack */ + /* trace if necessary */ + context->traceVariable(variableName, value); + return value; /* return the located variable */ } RexxObject *RexxParseVariable::getValue( @@ -122,15 +119,14 @@ /* not be raised) */ /******************************************************************************/ { - RexxVariable *variable; /* retrieved variable entry */ - RexxObject *value; /* final variable value */ - - /* look up the name */ - variable = dictionary->getVariable(variableName); - value = variable->getVariableValue();/* get the value */ - if (value == OREF_NULL) /* no value yet? */ - value = this->variableName; /* just use the name */ - return value; /* return the located variable */ + /* look up the name */ + RexxVariable *variable = dictionary->getVariable(variableName); + RexxObject *value = variable->getVariableValue();/* get the value */ + if (value == OREF_NULL) /* no value yet? */ + { + value = this->variableName; /* just use the name */ + } + return value; /* return the located variable */ } RexxObject *RexxParseVariable::getValue( @@ -140,15 +136,14 @@ /* not be raised) */ /******************************************************************************/ { - RexxVariable *variable; /* retrieved variable entry */ - RexxObject *value; /* final variable value */ - - /* look up the name */ - variable = context->getLocalVariable(variableName, index); - value = variable->getVariableValue();/* get the value */ - if (value == OREF_NULL) /* no value yet? */ - value = this->variableName; /* just use the name */ - return value; /* return the located variable */ + /* look up the name */ + RexxVariable *variable = context->getLocalVariable(variableName, index); + RexxObject *value = variable->getVariableValue();/* get the value */ + if (value == OREF_NULL) /* no value yet? */ + { + value = this->variableName; /* just use the name */ + } + return value; /* return the located variable */ } /** @@ -163,8 +158,8 @@ RexxObject *RexxParseVariable::getRealValue(RexxVariableDictionary *dictionary) { /* look up the name */ - RexxVariable *variable = dictionary->getVariable(variableName); - return variable->getVariableValue();/* get the value */ + RexxVariable *variable = dictionary->getVariable(variableName); + return variable->getVariableValue();/* get the value */ } @@ -180,8 +175,8 @@ */ RexxObject *RexxParseVariable::getRealValue(RexxActivation *context) { - RexxVariable *variable = context->getLocalVariable(variableName, index); - return variable->getVariableValue();/* get the value */ + RexxVariable *variable = context->getLocalVariable(variableName, index); + return variable->getVariableValue();/* get the value */ } void RexxParseVariable::set( @@ -191,11 +186,9 @@ /* Function: Fast set of a variable value */ /******************************************************************************/ { - RexxVariable *variable; /* target variable object */ - /* look up the name */ - variable = dictionary->getVariable(variableName); - variable->set(value); /* and perform the set */ + RexxVariable *variable = dictionary->getVariable(variableName); + variable->set(value); /* and perform the set */ } void RexxParseVariable::set( @@ -241,17 +234,27 @@ context->dropLocalVariable(variableName, index); } +/** + * Drop a variable that's directly in a variable dictionary. + * + * @param dictionary The target dictionary + */ +void RexxParseVariable::drop(RexxVariableDictionary *dictionary) +{ + /* look up the name */ + RexxVariable *variable = dictionary->getVariable(variableName); + variable->drop(); /* and perform the set */ +} + void RexxParseVariable::setGuard( RexxActivation *context ) /* current activation context */ /******************************************************************************/ /* Set a guard variable notification on an object variable */ /******************************************************************************/ { - RexxVariable *variable; /* target variable object */ - /* look up the name */ - variable = context->getLocalVariable(variableName, index); - variable->inform(ActivityManager::currentActivity); /* mark the variable entry */ + RexxVariable *variable = context->getLocalVariable(variableName, index); + variable->inform(ActivityManager::currentActivity); /* mark the variable entry */ } void RexxParseVariable::clearGuard( @@ -260,11 +263,9 @@ /* Remove a guard variable notification on an object variable */ /******************************************************************************/ { - RexxVariable *variable; /* target variable object */ - /* look up the name */ - variable = context->getLocalVariable(variableName, index); - variable->uninform(ActivityManager::currentActivity); /* remove the notification */ + RexxVariable *variable = context->getLocalVariable(variableName, index); + variable->uninform(ActivityManager::currentActivity); /* remove the notification */ } void RexxParseVariable::procedureExpose( @@ -275,12 +276,10 @@ /* Function: Expose a variable */ /******************************************************************************/ { - RexxVariable *old_variable; /* variable from the prior level */ - - /* get the old variable entry */ - old_variable = parent->getLocalVariable(variableName, index); - /* set the entry in the new table */ - context->putLocalVariable(old_variable, index); + /* get the old variable entry */ + RexxVariable *old_variable = parent->getLocalVariable(variableName, index); + /* set the entry in the new table */ + context->putLocalVariable(old_variable, index); } @@ -293,12 +292,10 @@ /* Function: Expose a variable */ /******************************************************************************/ { - RexxVariable *old_variable; /* variable from the prior level */ - - /* get the old variable entry */ - old_variable = object_dictionary->getVariable(variableName); - /* set the entry in the new table */ - context->putLocalVariable(old_variable, index); + /* get the old variable entry */ + RexxVariable *old_variable = object_dictionary->getVariable(variableName); + /* set the entry in the new table */ + context->putLocalVariable(old_variable, index); } /** @@ -317,11 +314,6 @@ /* Function: Create a REXX variable translator object */ /******************************************************************************/ { - RexxObject *newObject; - - newObject = new_object(size); /* Get new object */ - /* object parse_assignment behaviour */ - newObject->setBehaviour(TheVariableTermBehaviour); - return newObject; + return new_object(size, T_VariableTerm); /* Get new object */ } Modified: main/trunk/interpreter/expression/ExpressionVariable.hpp =================================================================== --- main/trunk/interpreter/expression/ExpressionVariable.hpp 2008-09-15 17:22:07 UTC (rev 3324) +++ main/trunk/interpreter/expression/ExpressionVariable.hpp 2008-09-15 19:12:56 UTC (rev 3325) @@ -68,6 +68,7 @@ void set(RexxVariableDictionary *, RexxObject *) ; void assign(RexxActivation *, RexxExpressionStack *, RexxObject *); void drop(RexxActivation *); + void drop(RexxVariableDictionary *); void setGuard(RexxActivation *); void clearGuard(RexxActivation *); void expose(RexxActivation *, RexxExpressionStack *, RexxVariableDictionary *); Modified: main/trunk/interpreter/expression/IndirectVariableReference.cpp =================================================================== --- main/trunk/interpreter/expression/IndirectVariableReference.cpp 2008-09-15 17:22:07 UTC (rev 3324) +++ main/trunk/interpreter/expression/IndirectVariableReference.cpp 2008-09-15 19:12:56 UTC (rev 3325) @@ -97,46 +97,45 @@ /* retrievers. */ /******************************************************************************/ { - RexxList *name_list; /* list of variables */ - RexxString *name_string; /* string of variable names */ - RexxString *variable_name; /* current variable name */ - RexxVariableBase *retriever; /* variable retriever */ - RexxObject *value; /* variable value */ - size_t i; /* loop variable */ - int character; /* first character of name */ - - /* get the variable value */ - value = this->variableObject->evaluate(context, stack); - stack->toss(); /* remove the stack item */ - name_string = REQUEST_STRING(value); /* force to string form */ - stack->push(name_string); /* protect this on the stack */ - name_list = new_list(); /* create a new list item */ - stack->push(name_list); /* protect this also */ - i = 1; /* start with the first word */ - /* get the next variable */ - variable_name = (RexxString *)name_string->word(new_integer(i)); - i++; /* step the index */ - while (variable_name->getLength() != 0) { - /* get the first character */ - character = variable_name->getChar(0); - if (character == '.') /* start with a period? */ - /* report that error */ - reportException(Error_Invalid_variable_period, variable_name); - /* how about a digit? */ - else if (character >= '0' && character <= '9') - /* constant symbol */ - reportException(Error_Invalid_variable_number, variable_name); - /* convert into a variable reference */ - retriever = context->getVariableRetriever(variable_name); - if (retriever == OREF_NULL) /* not converted ok? */ - reportException(Error_Symbol_expected_expose); - /* add to the processing list */ - name_list->addLast((RexxObject *)retriever); - /* get the next variable */ - variable_name = (RexxString *)name_string->word(new_integer(i)); - i++; /* and step the index */ - } - return name_list; /* return the list directly */ + /* get the variable value */ + RexxObject *value = this->variableObject->evaluate(context, stack); + stack->toss(); /* remove the stack item */ + RexxString *name_string = REQUEST_STRING(value); /* force to string form */ + stack->push(name_string); /* protect this on the stack */ + RexxList *name_list = new_list(); /* create a new list item */ + stack->push(name_list); /* protect this also */ + size_t i = 1; /* start with the first word */ + /* get the next variable */ + RexxString *variable_name = (RexxString *)name_string->word(new_integer(i)); + i++; /* step the index */ + while (variable_name->getLength() != 0) + { + /* get the first character */ + int character = variable_name->getChar(0); + if (character == '.') /* start with a period? */ + { + /* report that error */ + reportException(Error_Invalid_variable_period, variable_name); + } + /* how about a digit? */ + else if (character >= '0' && character <= '9') + { + /* constant symbol */ + reportException(Error_Invalid_variable_number, variable_name); + } + /* convert into a variable reference */ + RexxVariableBase *retriever = RexxVariableDictionary::getVariableRetriever(variable_name); + if (retriever == OREF_NULL) /* not converted ok? */ + { + reportException(Error_Symbol_expected_expose); + } + /* add to the processing list */ + name_list->addLast((RexxObject *)retriever); + /* get the next variable */ + variable_name = (RexxString *)name_string->word(new_integer(i)); + i++; /* and step the index */ + } + return name_list; /* return the list directly */ } void RexxVariableReference::drop( @@ -145,21 +144,18 @@ /* Function: Drop a subsidiary list of variables */ /******************************************************************************/ { - RexxList *name_list; /* list of names to process */ - RexxVariableBase *variable; /* current variable */ - RexxExpressionStack *stack; /* evaluation stack */ - - stack = context->getStack(); /* get the stack from the context */ - /* evaluate into a variable list */ - name_list = this->list(context, stack); - /* get the first list item */ - variable = (RexxVariableBase *)name_list->removeFirst(); - /* while more list items */ - while (variable != (RexxVariableBase *)TheNilObject) { - variable->drop(context); /* drop the this variable */ - /* get the next list item */ - variable = (RexxVariableBase *)name_list->removeFirst(); - } + RexxExpressionStack *stack = context->getStack(); /* get the stack from the context */ + /* evaluate into a variable list */ + RexxList *name_list = this->list(context, stack); + /* get the first list item */ + RexxVariableBase *variable = (RexxVariableBase *)name_list->removeFirst(); + /* while more list items */ + while (variable != (RexxVariableBase *)TheNilObject) + { + variable->drop(context); /* drop the this variable */ + /* get the next list item */ + variable = (RexxVariableBase *)name_list->removeFirst(); + } } @@ -171,22 +167,20 @@ /* Function: Expose a subsidiary list of variables */ /******************************************************************************/ { - RexxList *name_list; /* list of names to process */ - RexxVariableBase *variable; /* current variable */ - - /* expose the variable first */ - variableObject->procedureExpose(context, parent, stack); - /* evaluate into a variable list */ - name_list = this->list(context, stack); - /* get the first list item */ - variable = (RexxVariableBase *)name_list->removeFirst(); - /* while more list items */ - while (variable != (RexxVariableBase *)TheNilObject) { - /* expose this variable */ - variable->procedureExpose(context, parent, stack); - /* get the next list item */ - variable = (RexxVariableBase *)name_list->removeFirst(); - } + /* expose the variable first */ + variableObject->procedureExpose(context, parent, stack); + /* evaluate into a variable list */ + RexxList *name_list = this->list(context, stack); + /* get the first list item */ + RexxVariableBase *variable = (RexxVariableBase *)name_list->removeFirst(); + /* while more list items */ + while (variable != (RexxVariableBase *)TheNilObject) + { + /* expose this variable */ + variable->procedureExpose(context, parent, stack); + /* get the next list item */ + variable = (RexxVariableBase *)name_list->removeFirst(); + } } @@ -199,22 +193,20 @@ /* Function: Expose a subsidiary list of variables */ /******************************************************************************/ { - RexxList *name_list; /* list of names to process */ - RexxVariableBase *variable; /* current variable */ - - /* expose the variable first */ - variableObject->expose(context, stack, object... [truncated message content] |
From: <bi...@us...> - 2008-09-15 19:50:38
|
Revision: 3326 http://oorexx.svn.sourceforge.net/oorexx/?rev=3326&view=rev Author: bigrixx Date: 2008-09-15 19:50:47 +0000 (Mon, 15 Sep 2008) Log Message: ----------- Fix crash caused by dropping a stem variable Modified Paths: -------------- main/trunk/interpreter/execution/RexxVariableDictionary.cpp main/trunk/interpreter/execution/RexxVariableDictionary.hpp main/trunk/interpreter/expression/ExpressionStem.cpp Modified: main/trunk/interpreter/execution/RexxVariableDictionary.cpp =================================================================== --- main/trunk/interpreter/execution/RexxVariableDictionary.cpp 2008-09-15 19:12:56 UTC (rev 3325) +++ main/trunk/interpreter/execution/RexxVariableDictionary.cpp 2008-09-15 19:50:47 UTC (rev 3326) @@ -128,6 +128,24 @@ } +/** + * Drop the value of a named variable in the method dictionary. + * + * @param name The string name of the variable. + */ +void RexxVariableDictionary::dropStemVariable(RexxString *name) +{ + // if the variable exists, drop the value + RexxVariable *variable = resolveVariable(name); + if (variable != OREF_NULL) + { + variable->drop(); + /* create a new stem element and set this */ + variable->set(new RexxStem(name)); + } +} + + RexxCompoundElement *RexxVariableDictionary::getCompoundVariable( RexxString *stemName, /* name of stem for compound */ RexxObject **tail, /* tail of the compound element */ Modified: main/trunk/interpreter/execution/RexxVariableDictionary.hpp =================================================================== --- main/trunk/interpreter/execution/RexxVariableDictionary.hpp 2008-09-15 19:12:56 UTC (rev 3325) +++ main/trunk/interpreter/execution/RexxVariableDictionary.hpp 2008-09-15 19:50:47 UTC (rev 3326) @@ -112,6 +112,7 @@ RexxVariable *nextVariable(RexxNativeActivation *); void set(RexxString *, RexxObject *); void drop(RexxString *); + void dropStemVariable(RexxString *); void reserve(RexxActivity *); void release(RexxActivity *); bool transfer(RexxActivity *); Modified: main/trunk/interpreter/expression/ExpressionStem.cpp =================================================================== --- main/trunk/interpreter/expression/ExpressionStem.cpp 2008-09-15 19:12:56 UTC (rev 3325) +++ main/trunk/interpreter/expression/ExpressionStem.cpp 2008-09-15 19:50:47 UTC (rev 3326) @@ -261,7 +261,7 @@ void RexxStemVariable::drop(RexxVariableDictionary *dictionary) { // dropping the stem name is sufficient - dictionary->drop(stem); + dictionary->dropStemVariable(stem); } void RexxStemVariable::procedureExpose( This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bi...@us...> - 2008-09-15 21:58:38
|
Revision: 3328 http://oorexx.svn.sourceforge.net/oorexx/?rev=3328&view=rev Author: bigrixx Date: 2008-09-15 21:58:48 +0000 (Mon, 15 Sep 2008) Log Message: ----------- Create Rexx exported versions of package findClass and findRoutine Modified Paths: -------------- main/trunk/interpreter/classes/PackageClass.cpp main/trunk/interpreter/classes/PackageClass.hpp main/trunk/interpreter/execution/CPPCode.cpp main/trunk/interpreter/memory/Setup.cpp Modified: main/trunk/interpreter/classes/PackageClass.cpp =================================================================== --- main/trunk/interpreter/classes/PackageClass.cpp 2008-09-15 19:51:13 UTC (rev 3327) +++ main/trunk/interpreter/classes/PackageClass.cpp 2008-09-15 21:58:48 UTC (rev 3328) @@ -458,6 +458,24 @@ /** + * Resolve a class in the context of a package. + * + * @param name The required class name. + * + * @return The resolved class object. + */ +RexxClass *PackageClass::findClassRexx(RexxString *name) +{ + RexxClass *cls = source->findClass(name); + if (cls == OREF_NULL) + { + return (RexxClass *)TheNilObject; + } + return cls; +} + + +/** * Resolve a routine in the context of a package. * * @param name The required routine name. @@ -469,7 +487,24 @@ return source->findRoutine(name); } +/** + * Resolve a routine in the context of a package. + * + * @param name The required routine name. + * + * @return The resolved routine object. + */ +RoutineClass *PackageClass::findRoutineRexx(RexxString *name) +{ + RoutineClass *routine = findRoutine(name); + if (routine == OREF_NULL) + { + return (RoutineClass *)TheNilObject; + } + return routine; +} + /** * Set a security manager on a package. * Modified: main/trunk/interpreter/classes/PackageClass.hpp =================================================================== --- main/trunk/interpreter/classes/PackageClass.hpp 2008-09-15 19:51:13 UTC (rev 3327) +++ main/trunk/interpreter/classes/PackageClass.hpp 2008-09-15 21:58:48 UTC (rev 3328) @@ -78,7 +78,9 @@ PackageClass *loadPackage(RexxString *name, RexxArray *source); RexxObject *addPackage(PackageClass *package); RexxClass *findClass(RexxString *name); + RexxClass *findClassRexx(RexxString *name); RoutineClass *findRoutine(RexxString *name); + RoutineClass *findRoutineRexx(RexxString *name); RexxObject *addRoutine(RexxString *name, RoutineClass *routine); RexxObject *addPublicRoutine(RexxString *name, RoutineClass *routine); RexxObject *addClass(RexxString *name, RexxClass *clazz); Modified: main/trunk/interpreter/execution/CPPCode.cpp =================================================================== --- main/trunk/interpreter/execution/CPPCode.cpp 2008-09-15 19:51:13 UTC (rev 3327) +++ main/trunk/interpreter/execution/CPPCode.cpp 2008-09-15 21:58:48 UTC (rev 3328) @@ -639,8 +639,8 @@ CPPM(PackageClass::getImportedPackages), CPPM(PackageClass::loadPackage), CPPM(PackageClass::addPackage), -CPPM(PackageClass::findClass), -CPPM(PackageClass::findRoutine), +CPPM(PackageClass::findClassRexx), +CPPM(PackageClass::findRoutineRexx), CPPM(PackageClass::addRoutine), CPPM(PackageClass::addPublicRoutine), CPPM(PackageClass::addClass), Modified: main/trunk/interpreter/memory/Setup.cpp =================================================================== --- main/trunk/interpreter/memory/Setup.cpp 2008-09-15 19:51:13 UTC (rev 3327) +++ main/trunk/interpreter/memory/Setup.cpp 2008-09-15 21:58:48 UTC (rev 3328) @@ -598,8 +598,8 @@ defineKernelMethod(CHAR_IMPORTEDPACKAGES ,ThePackageBehaviour, CPPM(PackageClass::getImportedPackages), 0); defineKernelMethod(CHAR_LOADPACKAGE ,ThePackageBehaviour, CPPM(PackageClass::loadPackage), 2); defineKernelMethod(CHAR_ADDPACKAGE ,ThePackageBehaviour, CPPM(PackageClass::addPackage), 1); - defineKernelMethod(CHAR_FINDCLASS ,ThePackageBehaviour, CPPM(PackageClass::findClass), 1); - defineKernelMethod(CHAR_FINDROUTINE ,ThePackageBehaviour, CPPM(PackageClass::findRoutine), 1); + defineKernelMethod(CHAR_FINDCLASS ,ThePackageBehaviour, CPPM(PackageClass::findClassRexx), 1); + defineKernelMethod(CHAR_FINDROUTINE ,ThePackageBehaviour, CPPM(PackageClass::findRoutineRexx), 1); defineKernelMethod(CHAR_ADDROUTINE ,ThePackageBehaviour, CPPM(PackageClass::addRoutine), 2); defineKernelMethod(CHAR_ADDPUBLICROUTINE ,ThePackageBehaviour, CPPM(PackageClass::addPublicRoutine), 2); defineKernelMethod(CHAR_ADDCLASS ,ThePackageBehaviour, CPPM(PackageClass::addClass), 2); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bi...@us...> - 2008-09-16 22:17:24
|
Revision: 3342 http://oorexx.svn.sourceforge.net/oorexx/?rev=3342&view=rev Author: bigrixx Date: 2008-09-16 22:17:35 +0000 (Tue, 16 Sep 2008) Log Message: ----------- Fix return value error for DirectoryRemove() API Modified Paths: -------------- main/trunk/interpreter/classes/DirectoryClass.cpp main/trunk/interpreter/classes/DirectoryClass.hpp main/trunk/interpreter/execution/CPPCode.cpp main/trunk/interpreter/memory/Setup.cpp Modified: main/trunk/interpreter/classes/DirectoryClass.cpp =================================================================== --- main/trunk/interpreter/classes/DirectoryClass.cpp 2008-09-16 21:34:18 UTC (rev 3341) +++ main/trunk/interpreter/classes/DirectoryClass.cpp 2008-09-16 22:17:35 UTC (rev 3342) @@ -409,19 +409,34 @@ return OREF_NULL; /* don't return a value */ } + +/** + * ooRexx exported version of the directory remove method. + * + * @param entryname The index name. + * + * @return The removed item. Returns .nil if the item did not exist + * in the directory. + */ +RexxObject *RexxDirectory::removeRexx(RexxString *entryname) +{ + /* get as a string parameter */ + entryname = stringArgument(entryname, ARG_ONE); + RexxObject *oldVal = remove(entryname); + if (oldVal == OREF_NULL) + { + oldVal = TheNilObject; + } + return oldVal; +} + RexxObject *RexxDirectory::remove( RexxString *entryname) /* name to retrieve */ /******************************************************************************/ /* Function: Remove an entry from a directory. */ /******************************************************************************/ { - /* get as a string parameter */ - entryname = stringArgument(entryname, ARG_ONE); RexxObject *oldVal = this->at(entryname); /* go get the directory value */ - if (oldVal == OREF_NULL) /* nothing to return? */ - { - oldVal = TheNilObject; /* return TheNilObject as a default */ - } /* have a real entry? */ if (this->contents->stringGet(entryname) != OREF_NULL) { Modified: main/trunk/interpreter/classes/DirectoryClass.hpp =================================================================== --- main/trunk/interpreter/classes/DirectoryClass.hpp 2008-09-16 21:34:18 UTC (rev 3341) +++ main/trunk/interpreter/classes/DirectoryClass.hpp 2008-09-16 22:17:35 UTC (rev 3342) @@ -71,6 +71,7 @@ size_t items(); RexxObject *itemsRexx(); RexxObject *remove(RexxString *); + RexxObject *removeRexx(RexxString *); RexxObject *setEntry(RexxString *, RexxObject *); RexxObject *setMethod(RexxString *, RexxMethod *); RexxObject *unknown(RexxString *, RexxArray *); Modified: main/trunk/interpreter/execution/CPPCode.cpp =================================================================== --- main/trunk/interpreter/execution/CPPCode.cpp 2008-09-16 21:34:18 UTC (rev 3341) +++ main/trunk/interpreter/execution/CPPCode.cpp 2008-09-16 22:17:35 UTC (rev 3342) @@ -519,7 +519,7 @@ CPPM(RexxDirectory::hasIndex), CPPM(RexxDirectory::itemsRexx), CPPM(RexxHashTableCollection::merge), -CPPM(RexxDirectory::remove), +CPPM(RexxDirectory::removeRexx), CPPM(RexxDirectory::setEntry), CPPM(RexxDirectory::setMethod), CPPM(RexxDirectory::supplier), Modified: main/trunk/interpreter/memory/Setup.cpp =================================================================== --- main/trunk/interpreter/memory/Setup.cpp 2008-09-16 21:34:18 UTC (rev 3341) +++ main/trunk/interpreter/memory/Setup.cpp 2008-09-16 22:17:35 UTC (rev 3342) @@ -413,12 +413,12 @@ defineKernelMethod(CHAR_EMPTY , TheDirectoryBehaviour, CPPM(RexxDirectory::empty), 0); defineKernelMethod(CHAR_ISEMPTY , TheDirectoryBehaviour, CPPM(RexxDirectory::isEmpty), 0); defineKernelMethod(CHAR_PUT , TheDirectoryBehaviour, CPPM(RexxDirectory::put), 2); - defineKernelMethod(CHAR_REMOVE , TheDirectoryBehaviour, CPPM(RexxDirectory::remove), 1); + defineKernelMethod(CHAR_REMOVE , TheDirectoryBehaviour, CPPM(RexxDirectory::removeRexx), 1); defineKernelMethod(CHAR_SETENTRY , TheDirectoryBehaviour, CPPM(RexxDirectory::setEntry), 2); defineProtectedKernelMethod(CHAR_SETMETHOD , TheDirectoryBehaviour, CPPM(RexxDirectory::setMethod), 2); defineKernelMethod(CHAR_SUPPLIER , TheDirectoryBehaviour, CPPM(RexxDirectory::supplier), 0); defineKernelMethod(CHAR_UNKNOWN , TheDirectoryBehaviour, CPPM(RexxObject::unknownRexx), 2); - defineProtectedKernelMethod(CHAR_UNSETMETHOD , TheDirectoryBehaviour, CPPM(RexxDirectory::remove), 1); + defineProtectedKernelMethod(CHAR_UNSETMETHOD , TheDirectoryBehaviour, CPPM(RexxDirectory::removeRexx), 1); defineKernelMethod(CHAR_INDEX , TheDirectoryBehaviour, CPPM(RexxDirectory::indexRexx), 1); defineKernelMethod(CHAR_HASITEM , TheDirectoryBehaviour, CPPM(RexxDirectory::hasItem), 1); defineKernelMethod(CHAR_REMOVEITEM , TheDirectoryBehaviour, CPPM(RexxDirectory::removeItem), 1); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bi...@us...> - 2008-09-22 18:46:27
|
Revision: 3375 http://oorexx.svn.sourceforge.net/oorexx/?rev=3375&view=rev Author: bigrixx Date: 2008-09-22 18:46:16 +0000 (Mon, 22 Sep 2008) Log Message: ----------- Fix some errors in the package class Modified Paths: -------------- main/trunk/interpreter/classes/PackageClass.cpp main/trunk/interpreter/execution/CPPCode.cpp main/trunk/interpreter/memory/Setup.cpp Modified: main/trunk/interpreter/classes/PackageClass.cpp =================================================================== --- main/trunk/interpreter/classes/PackageClass.cpp 2008-09-22 03:11:07 UTC (rev 3374) +++ main/trunk/interpreter/classes/PackageClass.cpp 2008-09-22 18:46:16 UTC (rev 3375) @@ -336,7 +336,16 @@ */ RexxArray *PackageClass::getImportedPackages() { - return source->getPackages()->makeArray(); + RexxList *packages = source->getPackages(); + if (packages != OREF_NULL) + { + return packages->makeArray(); + } + else + { + return new_array((size_t)0); + } + } Modified: main/trunk/interpreter/execution/CPPCode.cpp =================================================================== --- main/trunk/interpreter/execution/CPPCode.cpp 2008-09-22 03:11:07 UTC (rev 3374) +++ main/trunk/interpreter/execution/CPPCode.cpp 2008-09-22 18:46:16 UTC (rev 3375) @@ -636,6 +636,7 @@ CPPM(PackageClass::getMethods), CPPM(PackageClass::getRoutines), CPPM(PackageClass::getPublicRoutines), +CPPM(PackageClass::getImportedRoutines), CPPM(PackageClass::getImportedPackages), CPPM(PackageClass::loadPackage), CPPM(PackageClass::addPackage), Modified: main/trunk/interpreter/memory/Setup.cpp =================================================================== --- main/trunk/interpreter/memory/Setup.cpp 2008-09-22 03:11:07 UTC (rev 3374) +++ main/trunk/interpreter/memory/Setup.cpp 2008-09-22 18:46:16 UTC (rev 3375) @@ -595,6 +595,7 @@ defineKernelMethod(CHAR_DEFINEDMETHODS, ThePackageBehaviour, CPPM(PackageClass::getMethods), 0); defineKernelMethod(CHAR_ROUTINES ,ThePackageBehaviour, CPPM(PackageClass::getRoutines), 0); defineKernelMethod(CHAR_PUBLICROUTINES ,ThePackageBehaviour, CPPM(PackageClass::getPublicRoutines), 0); + defineKernelMethod(CHAR_IMPORTEDROUTINES ,ThePackageBehaviour, CPPM(PackageClass::getImportedRoutines), 0); defineKernelMethod(CHAR_IMPORTEDPACKAGES ,ThePackageBehaviour, CPPM(PackageClass::getImportedPackages), 0); defineKernelMethod(CHAR_LOADPACKAGE ,ThePackageBehaviour, CPPM(PackageClass::loadPackage), 2); defineKernelMethod(CHAR_ADDPACKAGE ,ThePackageBehaviour, CPPM(PackageClass::addPackage), 1); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bi...@us...> - 2008-09-24 13:50:51
|
Revision: 3383 http://oorexx.svn.sourceforge.net/oorexx/?rev=3383&view=rev Author: bigrixx Date: 2008-09-24 13:50:40 +0000 (Wed, 24 Sep 2008) Log Message: ----------- Fix various FindClass() APIs to only return real class objects Modified Paths: -------------- main/trunk/interpreter/classes/PackageClass.cpp main/trunk/interpreter/execution/RexxActivation.cpp main/trunk/interpreter/execution/RexxActivation.hpp main/trunk/interpreter/execution/RexxNativeActivation.cpp main/trunk/interpreter/expression/ExpressionDotVariable.cpp Modified: main/trunk/interpreter/classes/PackageClass.cpp =================================================================== --- main/trunk/interpreter/classes/PackageClass.cpp 2008-09-24 13:49:53 UTC (rev 3382) +++ main/trunk/interpreter/classes/PackageClass.cpp 2008-09-24 13:50:40 UTC (rev 3383) @@ -462,7 +462,13 @@ */ RexxClass *PackageClass::findClass(RexxString *name) { - return source->findClass(name); + RexxClass *classObject = source->findClass(name); + // we need to filter this to always return a class object + if (classObject != OREF_NULL && classObject->isInstanceOf(TheClassClass)) + { + return classObject; + } + return OREF_NULL; } Modified: main/trunk/interpreter/execution/RexxActivation.cpp =================================================================== --- main/trunk/interpreter/execution/RexxActivation.cpp 2008-09-24 13:49:53 UTC (rev 3382) +++ main/trunk/interpreter/execution/RexxActivation.cpp 2008-09-24 13:50:40 UTC (rev 3383) @@ -2416,6 +2416,25 @@ */ RexxClass *RexxActivation::findClass(RexxString *name) { + RexxClass *classObject = getSourceObject()->findClass(name); + // we need to filter this to always return a class object + if (classObject != OREF_NULL && classObject->isInstanceOf(TheClassClass)) + { + return classObject; + } + return OREF_NULL; +} + + +/** + * Resolve a class in this activation's context. + * + * @param name The name to resolve. + * + * @return The resolved class, or OREF_NULL if not found. + */ +RexxObject *RexxActivation::resolveDotVariable(RexxString *name) +{ return getSourceObject()->findClass(name); } Modified: main/trunk/interpreter/execution/RexxActivation.hpp =================================================================== --- main/trunk/interpreter/execution/RexxActivation.hpp 2008-09-24 13:49:53 UTC (rev 3382) +++ main/trunk/interpreter/execution/RexxActivation.hpp 2008-09-24 13:50:40 UTC (rev 3383) @@ -262,7 +262,7 @@ static RoutineClass* getMacroCode(RexxString *macroName); RexxString *resolveProgramName(RexxString *name); RexxClass *findClass(RexxString *name); - RexxClass *findCallerClass(RexxString *name); + RexxObject *resolveDotVariable(RexxString *name); RexxObject * command(RexxString *, RexxString *); int64_t getElapsed(); RexxDateTime getTime(); Modified: main/trunk/interpreter/execution/RexxNativeActivation.cpp =================================================================== --- main/trunk/interpreter/execution/RexxNativeActivation.cpp 2008-09-24 13:49:53 UTC (rev 3382) +++ main/trunk/interpreter/execution/RexxNativeActivation.cpp 2008-09-24 13:50:40 UTC (rev 3383) @@ -2597,12 +2597,23 @@ */ RexxClass *RexxNativeActivation::findClass(RexxString *className) { + RexxClass *classObject; + // if we have an executable context, use that as the context. if (executable != OREF_NULL) { - return executable->findClass(className); + classObject = executable->findClass(className); } - return Interpreter::findClass(className); + else + { + classObject = Interpreter::findClass(className); + } + // we need to filter this to always return a class object + if (classObject != OREF_NULL && classObject->isInstanceOf(TheClassClass)) + { + return classObject; + } + return OREF_NULL; } @@ -2616,16 +2627,23 @@ */ RexxClass *RexxNativeActivation::findCallerClass(RexxString *className) { + RexxClass *classObject; // have a caller context? if not, just do the default environment searches if (activation == OREF_NULL) { - return Interpreter::findClass(className); + classObject = Interpreter::findClass(className); } else { // use the caller activation to resolve this - return activation->findClass(className); + classObject = activation->findClass(className); } + // we need to filter this to always return a class object + if (classObject != OREF_NULL && classObject->isInstanceOf(TheClassClass)) + { + return classObject; + } + return OREF_NULL; } Modified: main/trunk/interpreter/expression/ExpressionDotVariable.cpp =================================================================== --- main/trunk/interpreter/expression/ExpressionDotVariable.cpp 2008-09-24 13:49:53 UTC (rev 3382) +++ main/trunk/interpreter/expression/ExpressionDotVariable.cpp 2008-09-24 13:50:40 UTC (rev 3383) @@ -94,7 +94,7 @@ /****************************************************************************/ { /* get this from the source */ - RexxObject *result = context->findClass(this->variableName); + RexxObject *result = context->resolveDotVariable(this->variableName); if (result == OREF_NULL) /* not there? */ { /* try for a REXX defined name */ @@ -119,7 +119,7 @@ /****************************************************************************/ { /* get this from the source */ - RexxObject *result = context->findClass(this->variableName); + RexxObject *result = context->resolveDotVariable(this->variableName); if (result == OREF_NULL) /* not there? */ { /* try for a REXX defined name */ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bi...@us...> - 2008-09-24 20:11:01
|
Revision: 3389 http://oorexx.svn.sourceforge.net/oorexx/?rev=3389&view=rev Author: bigrixx Date: 2008-09-24 20:10:47 +0000 (Wed, 24 Sep 2008) Log Message: ----------- [ 2126990 ] Add a means to dynamically load an external library. Modified Paths: -------------- main/trunk/interpreter/classes/PackageClass.cpp main/trunk/interpreter/classes/PackageClass.hpp main/trunk/interpreter/execution/CPPCode.cpp main/trunk/interpreter/memory/Setup.cpp Modified: main/trunk/interpreter/classes/PackageClass.cpp =================================================================== --- main/trunk/interpreter/classes/PackageClass.cpp 2008-09-24 18:58:16 UTC (rev 3388) +++ main/trunk/interpreter/classes/PackageClass.cpp 2008-09-24 20:10:47 UTC (rev 3389) @@ -503,6 +503,7 @@ return source->findRoutine(name); } + /** * Resolve a routine in the context of a package. * @@ -579,3 +580,21 @@ package->sendMessage(OREF_INIT, init_args, initCount); return package; /* return the new method */ } + + +/** + * Dynamically load a library package + * + * @param name The required package name. + * + * @return True if the package was loaded and resolved, false if + * the package could not be loaded. + */ +RexxObject *PackageClass::loadLibrary(RexxString *name) +{ + name = stringArgument(name, "name"); + // have we already loaded this package? + // may need to bootstrap it up first. + LibraryPackage *package = PackageManager::loadLibrary(name); + return package == NULL ? TheFalseObject : TheTrueObject; +} Modified: main/trunk/interpreter/classes/PackageClass.hpp =================================================================== --- main/trunk/interpreter/classes/PackageClass.hpp 2008-09-24 18:58:16 UTC (rev 3388) +++ main/trunk/interpreter/classes/PackageClass.hpp 2008-09-24 20:10:47 UTC (rev 3389) @@ -85,6 +85,7 @@ RexxObject *addPublicRoutine(RexxString *name, RoutineClass *routine); RexxObject *addClass(RexxString *name, RexxClass *clazz); RexxObject *addPublicClass(RexxString *name, RexxClass *clazz); + RexxObject *loadLibrary(RexxString *name); PackageClass *newRexx(RexxObject **init_args, size_t argCount); Modified: main/trunk/interpreter/execution/CPPCode.cpp =================================================================== --- main/trunk/interpreter/execution/CPPCode.cpp 2008-09-24 18:58:16 UTC (rev 3388) +++ main/trunk/interpreter/execution/CPPCode.cpp 2008-09-24 20:10:47 UTC (rev 3389) @@ -647,6 +647,7 @@ CPPM(PackageClass::addClass), CPPM(PackageClass::addPublicClass), CPPM(PackageClass::getName), +CPPM(PackageClass::loadLibrary), CPPM(PackageClass::newRexx), Modified: main/trunk/interpreter/memory/Setup.cpp =================================================================== --- main/trunk/interpreter/memory/Setup.cpp 2008-09-24 18:58:16 UTC (rev 3388) +++ main/trunk/interpreter/memory/Setup.cpp 2008-09-24 20:10:47 UTC (rev 3389) @@ -606,6 +606,7 @@ defineKernelMethod(CHAR_ADDCLASS ,ThePackageBehaviour, CPPM(PackageClass::addClass), 2); defineKernelMethod(CHAR_ADDPUBLICCLASS ,ThePackageBehaviour, CPPM(PackageClass::addPublicClass), 2); defineKernelMethod(CHAR_NAME ,ThePackageBehaviour, CPPM(PackageClass::getName), 0); + defineKernelMethod("LOADLIBRARY" ,ThePackageBehaviour, CPPM(PackageClass::loadLibrary), 1); /* set the scope of the methods to */ /* this classes oref */ ThePackageBehaviour->setMethodDictionaryScope(ThePackageClass); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bi...@us...> - 2008-09-24 22:35:53
|
Revision: 3391 http://oorexx.svn.sourceforge.net/oorexx/?rev=3391&view=rev Author: bigrixx Date: 2008-09-24 22:35:44 +0000 (Wed, 24 Sep 2008) Log Message: ----------- [ 2126996 ] Allow dynamic creation of external methods and routines. Modified Paths: -------------- main/trunk/interpreter/classes/MethodClass.cpp main/trunk/interpreter/classes/MethodClass.hpp main/trunk/interpreter/classes/RoutineClass.cpp main/trunk/interpreter/classes/RoutineClass.hpp main/trunk/interpreter/classes/support/StringUtil.cpp main/trunk/interpreter/classes/support/StringUtil.hpp main/trunk/interpreter/execution/CPPCode.cpp main/trunk/interpreter/memory/Setup.cpp main/trunk/interpreter/package/PackageManager.cpp main/trunk/interpreter/package/PackageManager.hpp main/trunk/interpreter/parser/SourceFile.cpp Modified: main/trunk/interpreter/classes/MethodClass.cpp =================================================================== --- main/trunk/interpreter/classes/MethodClass.cpp 2008-09-24 20:11:47 UTC (rev 3390) +++ main/trunk/interpreter/classes/MethodClass.cpp 2008-09-24 22:35:44 UTC (rev 3391) @@ -61,6 +61,7 @@ #include "RoutineClass.hpp" #include "Interpreter.hpp" #include "RexxCode.hpp" +#include "PackageManager.hpp" // singleton class instance RexxClass *RexxMethod::classInstance = OREF_NULL; @@ -833,3 +834,60 @@ return OREF_NULL; } + + +/** + * Create a method from an external library source. + * + * @param name The method name. + * + * @return The resolved method object, or OREF_NULL if unable to + * load the routine. + */ +RexxMethod *RexxMethod::loadExternalMethod(RexxString *name, RexxString *descriptor) +{ + name = stringArgument(name, "name"); + descriptor = stringArgument(descriptor, "descriptor"); + /* convert external into words */ + RexxArray *_words = StringUtil::words(descriptor->getStringData(), descriptor->getLength()); + ProtectedObject p(_words); + // "LIBRARY libbar [foo]" + if (((RexxString *)(_words->get(1)))->strCompare(CHAR_LIBRARY)) + { + RexxString *library = OREF_NULL; + // the default entry point name is the internal name + RexxString *entry = name; + + // full library with entry name version? + if (_words->size() == 3) + { + library = (RexxString *)_words->get(2); + entry = (RexxString *)_words->get(3); + } + else if (_words->size() == 2) + { + library = (RexxString *)_words->get(2); + } + else // wrong number of tokens + { + /* this is an error */ + reportException(Error_Translation_bad_external, descriptor); + } + /* create a new native method */ + RexxNativeCode *nmethod = PackageManager::loadMethod(library, entry); + // raise an exception if this entry point is not found. + if (nmethod == OREF_NULL) + { + return (RexxMethod *)TheNilObject; + } + /* turn into a real method object */ + return new RexxMethod(name, nmethod); + } + else + { + /* unknown external type */ + reportException(Error_Translation_bad_external, descriptor); + } + return OREF_NULL; +} + Modified: main/trunk/interpreter/classes/MethodClass.hpp =================================================================== --- main/trunk/interpreter/classes/MethodClass.hpp 2008-09-24 20:11:47 UTC (rev 3390) +++ main/trunk/interpreter/classes/MethodClass.hpp 2008-09-24 22:35:44 UTC (rev 3391) @@ -144,6 +144,7 @@ inline BaseCode *getCode() { return this->code; } RexxMethod *newRexx(RexxObject **, size_t); RexxMethod *newFileRexx(RexxString *); + RexxMethod *loadExternalMethod(RexxString *name, RexxString *descriptor); static RexxMethod *newMethodObject(RexxString *, RexxObject *, RexxObject *, RexxSource *a); static RexxMethod *restore(RexxBuffer *, char *); Modified: main/trunk/interpreter/classes/RoutineClass.cpp =================================================================== --- main/trunk/interpreter/classes/RoutineClass.cpp 2008-09-24 20:11:47 UTC (rev 3390) +++ main/trunk/interpreter/classes/RoutineClass.cpp 2008-09-24 22:35:44 UTC (rev 3391) @@ -62,6 +62,7 @@ #include "ProgramMetaData.hpp" #include "Utilities.hpp" #include "SystemInterpreter.hpp" +#include "PackageManager.hpp" #include <ctype.h> @@ -869,4 +870,58 @@ } +/** + * Create a routine from an external library source. + * + * @param name The routine name. + * + * @return The resolved routine object, or OREF_NULL if unable to load + * the routine. + */ +RoutineClass *RoutineClass::loadExternalRoutine(RexxString *name, RexxString *descriptor) +{ + name = stringArgument(name, "name"); + descriptor = stringArgument(descriptor, "descriptor"); + /* convert external into words */ + RexxArray *_words = StringUtil::words(descriptor->getStringData(), descriptor->getLength()); + ProtectedObject p(_words); + // "LIBRARY libbar [foo]" + if (((RexxString *)(_words->get(1)))->strCompare(CHAR_LIBRARY)) + { + RexxString *library = OREF_NULL; + // the default entry point name is the internal name + RexxString *entry = name; + // full library with entry name version? + if (_words->size() == 3) + { + library = (RexxString *)_words->get(2); + entry = (RexxString *)_words->get(3); + } + else if (_words->size() == 2) + { + library = (RexxString *)_words->get(2); + } + else // wrong number of tokens + { + /* this is an error */ + reportException(Error_Translation_bad_external, descriptor); + } + + /* create a new native method */ + RoutineClass *routine = PackageManager::loadRoutine(library, entry); + // raise an exception if this entry point is not found. + if (routine == OREF_NULL) + { + return (RoutineClass *)TheNilObject; + } + return routine; + } + else + { + /* unknown external type */ + reportException(Error_Translation_bad_external, descriptor); + } + return OREF_NULL; +} + Modified: main/trunk/interpreter/classes/RoutineClass.hpp =================================================================== --- main/trunk/interpreter/classes/RoutineClass.hpp 2008-09-24 20:11:47 UTC (rev 3390) +++ main/trunk/interpreter/classes/RoutineClass.hpp 2008-09-24 22:35:44 UTC (rev 3391) @@ -78,6 +78,7 @@ RoutineClass *newRexx(RexxObject **, size_t); RoutineClass *newFileRexx(RexxString *); + RoutineClass *loadExternalRoutine(RexxString *name, RexxString *descriptor); static RoutineClass *restore(RexxBuffer *, char *); static RoutineClass *restore(const char *data, size_t length); Modified: main/trunk/interpreter/classes/support/StringUtil.cpp =================================================================== --- main/trunk/interpreter/classes/support/StringUtil.cpp 2008-09-24 20:11:47 UTC (rev 3390) +++ main/trunk/interpreter/classes/support/StringUtil.cpp 2008-09-24 22:35:44 UTC (rev 3391) @@ -1563,6 +1563,36 @@ /** + * Extract all words from a buffer + * + * @param data The data pointer + * @param length the length of the data buffer. + * @param position the target word position. + * + * @return The string value of the word at the indicated position. + */ +RexxArray *StringUtil::words(const char *data, size_t length) +{ + const char *word = data; /* point to the string */ + const char *nextSite = NULL; + + RexxArray *result = new_array((size_t)0); + ProtectedObject p(result); + /* get the first word */ + size_t wordLength = nextWord(&word, &length, &nextSite); + while (wordLength != 0) + { + // add to the result array + result->append(new_string(word, wordLength)); + word = nextSite; /* copy the start pointer */ + /* get the next word */ + wordLength = nextWord(&word, &length, &nextSite); + } + return result; // return whatever we've accumulated +} + + +/** * Return the index position for a given word * * @param data The data containing the words Modified: main/trunk/interpreter/classes/support/StringUtil.hpp =================================================================== --- main/trunk/interpreter/classes/support/StringUtil.hpp 2008-09-24 20:11:47 UTC (rev 3390) +++ main/trunk/interpreter/classes/support/StringUtil.hpp 2008-09-24 22:35:44 UTC (rev 3391) @@ -46,6 +46,7 @@ class RexxString; class RexxInteger; +class RexxArray; class StringUtil { @@ -87,6 +88,7 @@ static RexxInteger *wordLength(const char *data, size_t length, RexxInteger *position); static RexxInteger *wordPos(const char *data, size_t length, RexxString *phrase, RexxInteger *pstart); static RexxInteger *caselessWordPos(const char *data, size_t length, RexxString *phrase, RexxInteger *pstart); + static RexxArray *words(const char *data, size_t length); }; #endif Modified: main/trunk/interpreter/execution/CPPCode.cpp =================================================================== --- main/trunk/interpreter/execution/CPPCode.cpp 2008-09-24 20:11:47 UTC (rev 3390) +++ main/trunk/interpreter/execution/CPPCode.cpp 2008-09-24 22:35:44 UTC (rev 3391) @@ -618,6 +618,7 @@ CPPM(RexxMethod::newFileRexx), CPPM(RexxMethod::newRexx), +CPPM(RexxMethod::loadExternalMethod), CPPM(RoutineClass::setSecurityManager), CPPM(RoutineClass::callRexx), @@ -625,6 +626,7 @@ CPPM(RoutineClass::newFileRexx), CPPM(RoutineClass::newRexx), +CPPM(RoutineClass::loadExternalRoutine), CPPM(PackageClass::setSecurityManager), CPPM(PackageClass::getSource), Modified: main/trunk/interpreter/memory/Setup.cpp =================================================================== --- main/trunk/interpreter/memory/Setup.cpp 2008-09-24 20:11:47 UTC (rev 3390) +++ main/trunk/interpreter/memory/Setup.cpp 2008-09-24 22:35:44 UTC (rev 3391) @@ -520,6 +520,7 @@ /* class behaviour */ defineKernelMethod(CHAR_NEW , TheMethodClassBehaviour, CPPM(RexxMethod::newRexx), A_COUNT); defineKernelMethod(CHAR_NEWFILE , TheMethodClassBehaviour, CPPM(RexxMethod::newFileRexx), 1); + defineKernelMethod("LOADEXTERNALMETHOD" , TheMethodClassBehaviour, CPPM(RexxMethod::loadExternalMethod), 2); /* set the scope of the methods to */ /* this classes oref */ TheMethodClassBehaviour->setMethodDictionaryScope(TheMethodClass); @@ -552,6 +553,7 @@ /* class behaviour */ defineKernelMethod(CHAR_NEW , TheRoutineClassBehaviour, CPPM(RoutineClass::newRexx), A_COUNT); defineKernelMethod(CHAR_NEWFILE , TheRoutineClassBehaviour, CPPM(RoutineClass::newFileRexx), 1); + defineKernelMethod("LOADEXTERNALROUTINE" , TheRoutineClassBehaviour, CPPM(RoutineClass::loadExternalRoutine), 2); /* set the scope of the methods to */ /* this classes oref */ TheRoutineClassBehaviour->setMethodDictionaryScope(TheRoutineClass); Modified: main/trunk/interpreter/package/PackageManager.cpp =================================================================== --- main/trunk/interpreter/package/PackageManager.cpp 2008-09-24 20:11:47 UTC (rev 3390) +++ main/trunk/interpreter/package/PackageManager.cpp 2008-09-24 22:35:44 UTC (rev 3391) @@ -241,7 +241,34 @@ } +/** + * Quietly create a Native method from a registered package. + * + * @param packageName + * The name of the package the library is loaded from. + * + * @param methodName The name of the procedure to resolve from the package. + * + * @return A Native method that represents this package entry. Returns + * NULL if not found. + */ +RexxNativeMethod *PackageManager::loadMethod(RexxString *packageName, RexxString *methodName) +{ + // have we already loaded this package? + // may need to bootstrap it up first. + LibraryPackage *package = loadLibrary(packageName); + // silently fail this if it couldn't load + if (package == OREF_NULL) + { + return OREF_NULL; + } + // now see if this can be resolved. + return package->resolveMethod(methodName); +} + + + /** * Resolve a package function activator. * @@ -272,7 +299,6 @@ } - /** * Resolve a registered function. * @@ -297,13 +323,12 @@ } - /** - * Resolve a registered function. This goes explicitly to a - * loaded package to resolve the name rather than relying - * on the global cache. This will resolve to the same routine - * object as the global cache, but this prevents us from - * picking one a different one in case of a name conflict. + * Resolve a package function. This goes explicitly to a loaded + * package to resolve the name rather than relying on the global + * cache. This will resolve to the same routine object as the + * global cache, but this prevents us from picking one a + * different one in case of a name conflict. * * @param packageName * The package name. @@ -322,7 +347,35 @@ } +/** + * Quietly load a package function. This goes explicitly to a + * loaded package to resolve the name rather than relying on the + * global cache. This will resolve to the same routine object + * as the global cache, but this prevents us from picking one a + * different one in case of a name conflict. + * + * @param packageName + * The package name. + * @param function The function name. + * + * @return A routine object for this function. + */ +RoutineClass *PackageManager::loadRoutine(RexxString *packageName, RexxString *function) +{ + // have we already loaded this package? + // may need to bootstrap it up first. + LibraryPackage *package = loadLibrary(packageName); + if (package == OREF_NULL) + { + return OREF_NULL; + } + // now see if this can be resolved. + return package->resolveRoutine(function); +} + + + /** * Locate an already loaded function. * Modified: main/trunk/interpreter/package/PackageManager.hpp =================================================================== --- main/trunk/interpreter/package/PackageManager.hpp 2008-09-24 20:11:47 UTC (rev 3390) +++ main/trunk/interpreter/package/PackageManager.hpp 2008-09-24 22:35:44 UTC (rev 3391) @@ -70,8 +70,10 @@ static LibraryPackage *loadLibrary(RexxString *name); static void unload(); static RexxNativeMethod *resolveMethod(RexxString *packageName, RexxString *methodName); + static RexxNativeMethod *loadMethod(RexxString *packageName, RexxString *methodName); static RoutineClass *resolveRoutine(RexxString *function, RexxString *packageName, RexxString *procedure); static RoutineClass *resolveRoutine(RexxString *packageName, RexxString *function); + static RoutineClass *loadRoutine(RexxString *packageName, RexxString *function); static RoutineClass *resolveRoutine(RexxString *function); static RoutineClass *createRegisteredRoutine(RexxString *function); static RoutineClass *getLoadedRoutine(RexxString *function); Modified: main/trunk/interpreter/parser/SourceFile.cpp =================================================================== --- main/trunk/interpreter/parser/SourceFile.cpp 2008-09-24 20:11:47 UTC (rev 3390) +++ main/trunk/interpreter/parser/SourceFile.cpp 2008-09-24 22:35:44 UTC (rev 3391) @@ -2292,7 +2292,7 @@ { /* convert external into words */ RexxArray *_words = this->words(externalname); - /* not 'PACKAGE library [entry]' form? */ + /* not 'LIBRARY library [entry]' form? */ if (((RexxString *)(_words->get(1)))->strCompare(CHAR_LIBRARY)) { RexxString *library = OREF_NULL; @@ -2809,7 +2809,7 @@ { /* convert external into words */ RexxArray *_words = this->words(externalname); - // ::ROUTINE foo EXTERNAL "PACKAGE libbar [foo]" + // ::ROUTINE foo EXTERNAL "LIBRARY libbar [foo]" if (((RexxString *)(_words->get(1)))->strCompare(CHAR_LIBRARY)) { RexxString *library = OREF_NULL; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bi...@us...> - 2008-09-28 15:31:24
|
Revision: 3408 http://oorexx.svn.sourceforge.net/oorexx/?rev=3408&view=rev Author: bigrixx Date: 2008-09-28 15:31:12 +0000 (Sun, 28 Sep 2008) Log Message: ----------- fix problem with .RexxContext NEW method Modified Paths: -------------- main/trunk/interpreter/memory/Setup.cpp main/trunk/interpreter/messages/rexxmsg.xml Modified: main/trunk/interpreter/memory/Setup.cpp =================================================================== --- main/trunk/interpreter/memory/Setup.cpp 2008-09-27 15:05:18 UTC (rev 3407) +++ main/trunk/interpreter/memory/Setup.cpp 2008-09-28 15:31:12 UTC (rev 3408) @@ -624,7 +624,7 @@ /* Add the NEW methods to the */ /* class behaviour */ - defineKernelMethod(CHAR_NEW , TheRexxContextBehaviour, CPPM(RexxContext::newRexx), A_COUNT); + defineKernelMethod(CHAR_NEW ,TheRexxContextClassBehaviour, CPPM(RexxContext::newRexx), A_COUNT); /* set the scope of the methods to */ /* this classes oref */ TheRexxContextBehaviour->setMethodDictionaryScope(TheRexxContextClass); Modified: main/trunk/interpreter/messages/rexxmsg.xml =================================================================== --- main/trunk/interpreter/messages/rexxmsg.xml 2008-09-27 15:05:18 UTC (rev 3407) +++ main/trunk/interpreter/messages/rexxmsg.xml 2008-09-28 15:31:12 UTC (rev 3408) @@ -4308,7 +4308,7 @@ <Component>Rexx</Component> <Severity>Warning</Severity> <SymbolicName>Error_Unsupported_new_method</SymbolicName> - <Text>New method is not supported for the <Sub position="1" name="name"/> class</Text> + <Text>NEW method is not supported for the <Sub position="1" name="name"/> class</Text> </SubMessage> <SubMessage> <Code>93</Code> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |