From: <bi...@us...> - 2009-04-30 00:25:32
|
Revision: 4559 http://oorexx.svn.sourceforge.net/oorexx/?rev=4559&view=rev Author: bigrixx Date: 2009-04-30 00:25:24 +0000 (Thu, 30 Apr 2009) Log Message: ----------- [ oorexx-Bugs-2782653 ] sysfileexists problem Modified Paths: -------------- main/trunk/interpreter/package/LibraryPackage.hpp main/trunk/interpreter/package/PackageManager.cpp main/trunk/interpreter/package/PackageManager.hpp Modified: main/trunk/interpreter/package/LibraryPackage.hpp =================================================================== --- main/trunk/interpreter/package/LibraryPackage.hpp 2009-04-29 22:38:02 UTC (rev 4558) +++ main/trunk/interpreter/package/LibraryPackage.hpp 2009-04-30 00:25:24 UTC (rev 4559) @@ -84,6 +84,7 @@ void reload(RexxPackageEntry *pack); inline bool isLoaded() { return loaded; } inline bool isInternal() { return internal; } + inline void makeInternal() { internal = true; } protected: Modified: main/trunk/interpreter/package/PackageManager.cpp =================================================================== --- main/trunk/interpreter/package/PackageManager.cpp 2009-04-29 22:38:02 UTC (rev 4558) +++ main/trunk/interpreter/package/PackageManager.cpp 2009-04-30 00:25:24 UTC (rev 4559) @@ -57,6 +57,12 @@ #include "RexxActivation.hpp" #include "PackageClass.hpp" +// this first set is the inital image set, which we preserve the references +// to in order to reset the package loads when the Rexx environment shuts down +RexxDirectory *PackageManager::imagePackages = OREF_NULL; +RexxDirectory *PackageManager::imagePackageRoutines = OREF_NULL; +RexxDirectory *PackageManager::imageRegisteredRoutines = OREF_NULL; +RexxDirectory *PackageManager::imageLoadedRequires = OREF_NULL; RexxDirectory *PackageManager::packages = OREF_NULL; // our loaded packages RexxDirectory *PackageManager::packageRoutines = OREF_NULL; // table of functions loaded from packages @@ -74,7 +80,7 @@ loadedRequires = new_directory(); // load the internal library first loadInternalPackage(OREF_REXX, rexxPackage); - loadLibrary(OREF_REXXUTIL); // load the rexxutil package automatically + loadLibrary(OREF_REXXUTIL); // load the rexxutil package automatically } @@ -106,10 +112,10 @@ { // The memory manager is not initialized yet, so we just store the references // at this point. A little later, we'll replace these with copies. - packages = (RexxDirectory *)imageArray->get(IMAGE_PACKAGES); - packageRoutines = (RexxDirectory *)imageArray->get(IMAGE_PACKAGE_ROUTINES); - registeredRoutines = (RexxDirectory *)imageArray->get(IMAGE_REGISTERED_ROUTINES); - loadedRequires = (RexxDirectory *)imageArray->get(IMAGE_REQUIRES); + imagePackages = (RexxDirectory *)imageArray->get(IMAGE_PACKAGES); + imagePackageRoutines = (RexxDirectory *)imageArray->get(IMAGE_PACKAGE_ROUTINES); + imageRegisteredRoutines = (RexxDirectory *)imageArray->get(IMAGE_REGISTERED_ROUTINES); + imageLoadedRequires = (RexxDirectory *)imageArray->get(IMAGE_REQUIRES); } @@ -118,11 +124,12 @@ */ void PackageManager::restore() { - // we use copies of these directories to avoid old-to-new image problems. - packages = (RexxDirectory *)packages->copy(); - packageRoutines = (RexxDirectory *)packageRoutines->copy(); - registeredRoutines = (RexxDirectory *)registeredRoutines->copy(); - loadedRequires = (RexxDirectory *)loadedRequires->copy(); + // we use copies of the image directories to avoid old-to-new image problems. + // this also allows us to restore the environment after interpreter shutdown + packages = (RexxDirectory *)imagePackages->copy(); + packageRoutines = (RexxDirectory *)imagePackageRoutines->copy(); + registeredRoutines = (RexxDirectory *)imageRegisteredRoutines->copy(); + loadedRequires = (RexxDirectory *)imageLoadedRequires->copy(); for (HashLink i = packages->first(); packages->available(i); i = packages->next(i)) { @@ -132,6 +139,7 @@ if (!package->isInternal()) { package->reload(); + package->makeInternal(); // make this part of the persistent set now } else { @@ -613,6 +621,13 @@ package->unload(); } } + + // now roll back to a copy of the image versions of these directories so we only + // have the orignal image set once again + packages = (RexxDirectory *)imagePackages->copy(); + packageRoutines = (RexxDirectory *)imagePackageRoutines->copy(); + registeredRoutines = (RexxDirectory *)imageRegisteredRoutines->copy(); + loadedRequires = (RexxDirectory *)imageLoadedRequires->copy(); } Modified: main/trunk/interpreter/package/PackageManager.hpp =================================================================== --- main/trunk/interpreter/package/PackageManager.hpp 2009-04-29 22:38:02 UTC (rev 4558) +++ main/trunk/interpreter/package/PackageManager.hpp 2009-04-30 00:25:24 UTC (rev 4559) @@ -108,7 +108,12 @@ IMAGE_ARRAY_SIZE = IMAGE_REQUIRES }; + static RexxDirectory *imagePackages; // our loaded packages + static RexxDirectory *imagePackageRoutines; // table of functions loaded from packages + static RexxDirectory *imageRegisteredRoutines; // table of functions resolved by older registration mechanisms + static RexxDirectory *imageLoadedRequires; // table of previously loaded requires files + static RexxDirectory *packages; // our loaded packages static RexxDirectory *packageRoutines; // table of functions loaded from packages static RexxDirectory *registeredRoutines; // table of functions resolved by older registration mechanisms This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |