From: <bi...@us...> - 2008-01-26 22:13:50
|
Revision: 2313 http://oorexx.svn.sourceforge.net/oorexx/?rev=2313&view=rev Author: bigrixx Date: 2008-01-26 14:13:52 -0800 (Sat, 26 Jan 2008) Log Message: ----------- [ 1868512 ] The interpreter should initialize at library load time. [ 1869753 ] Fix unix version of RexxExecuteMacroSpace to hide shared mem Modified Paths: -------------- interpreter-3.x/trunk/Makefile.am interpreter-3.x/trunk/api/platform/unix/rexxapitypes.h interpreter-3.x/trunk/api/platform/unix/rexxplatformapis.h interpreter-3.x/trunk/api/platform/windows/rexxapitypes.h interpreter-3.x/trunk/api/platform/windows/rexxplatformapis.h interpreter-3.x/trunk/api/rexx.h interpreter-3.x/trunk/kernel/RexxClasses/CoreClasses.orx interpreter-3.x/trunk/kernel/classes/BufferClass.hpp interpreter-3.x/trunk/kernel/classes/ClassClass.cpp interpreter-3.x/trunk/kernel/classes/MessageClass.cpp interpreter-3.x/trunk/kernel/classes/MethodClass.cpp interpreter-3.x/trunk/kernel/classes/MethodClass.hpp interpreter-3.x/trunk/kernel/classes/NumberStringMath.cpp interpreter-3.x/trunk/kernel/classes/ObjectClass.cpp interpreter-3.x/trunk/kernel/classes/ObjectClass.hpp interpreter-3.x/trunk/kernel/classes/StringClass.cpp interpreter-3.x/trunk/kernel/classes/StringClass.hpp interpreter-3.x/trunk/kernel/kernel.mak interpreter-3.x/trunk/kernel/platform/unix/ExternalFunctions.cpp interpreter-3.x/trunk/kernel/platform/unix/FileSystem.cpp interpreter-3.x/trunk/kernel/platform/unix/MemorySupport.cpp interpreter-3.x/trunk/kernel/platform/unix/MiscSystem.cpp interpreter-3.x/trunk/kernel/platform/unix/PlatformDefinitions.h interpreter-3.x/trunk/kernel/platform/unix/RexxMain.cpp interpreter-3.x/trunk/kernel/platform/unix/RexxQueues.cpp interpreter-3.x/trunk/kernel/platform/unix/StoredMetaData.cpp interpreter-3.x/trunk/kernel/platform/unix/SystemCommands.cpp interpreter-3.x/trunk/kernel/platform/unix/ThreadSupport.cpp interpreter-3.x/trunk/kernel/platform/unix/TimeSupport.cpp interpreter-3.x/trunk/kernel/platform/unix/VariablePool.cpp interpreter-3.x/trunk/kernel/platform/windows/ErrorMessages.cpp interpreter-3.x/trunk/kernel/platform/windows/ExternalFunctions.cpp interpreter-3.x/trunk/kernel/platform/windows/FileSystem.cpp interpreter-3.x/trunk/kernel/platform/windows/MemorySupport.cpp interpreter-3.x/trunk/kernel/platform/windows/MiscSystem.cpp interpreter-3.x/trunk/kernel/platform/windows/PlatformDefinitions.h interpreter-3.x/trunk/kernel/platform/windows/RexxCompiler.cpp interpreter-3.x/trunk/kernel/platform/windows/RexxMain.cpp interpreter-3.x/trunk/kernel/platform/windows/RexxQueues.cpp interpreter-3.x/trunk/kernel/platform/windows/StoredMetaData.cpp interpreter-3.x/trunk/kernel/platform/windows/SystemCommands.cpp interpreter-3.x/trunk/kernel/platform/windows/SystemInitialization.cpp interpreter-3.x/trunk/kernel/platform/windows/TimeSupport.cpp interpreter-3.x/trunk/kernel/platform/windows/VariablePool.cpp interpreter-3.x/trunk/kernel/platform/windows/wrexx.def interpreter-3.x/trunk/kernel/runtime/ActivityManager.cpp interpreter-3.x/trunk/kernel/runtime/ActivityManager.hpp interpreter-3.x/trunk/kernel/runtime/CPPCode.cpp interpreter-3.x/trunk/kernel/runtime/ClassTypeCodes.h interpreter-3.x/trunk/kernel/runtime/ExitHandler.cpp interpreter-3.x/trunk/kernel/runtime/ExitHandler.hpp interpreter-3.x/trunk/kernel/runtime/GlobalData.cpp interpreter-3.x/trunk/kernel/runtime/GlobalNames.h interpreter-3.x/trunk/kernel/runtime/Interpreter.cpp interpreter-3.x/trunk/kernel/runtime/Interpreter.hpp interpreter-3.x/trunk/kernel/runtime/PrimitiveBehaviourNames.h interpreter-3.x/trunk/kernel/runtime/PrimitiveBehaviours.cpp interpreter-3.x/trunk/kernel/runtime/PrimitiveClasses.xml interpreter-3.x/trunk/kernel/runtime/RexxActivation.cpp interpreter-3.x/trunk/kernel/runtime/RexxActivation.hpp interpreter-3.x/trunk/kernel/runtime/RexxActivity.cpp interpreter-3.x/trunk/kernel/runtime/RexxActivity.hpp interpreter-3.x/trunk/kernel/runtime/RexxBehaviour.cpp interpreter-3.x/trunk/kernel/runtime/RexxCode.cpp interpreter-3.x/trunk/kernel/runtime/RexxConstants.hpp interpreter-3.x/trunk/kernel/runtime/RexxMemory.cpp interpreter-3.x/trunk/kernel/runtime/RexxMemory.hpp interpreter-3.x/trunk/kernel/runtime/RexxMisc.cpp interpreter-3.x/trunk/kernel/runtime/RexxMisc.hpp interpreter-3.x/trunk/kernel/runtime/RexxNativeAPI.h interpreter-3.x/trunk/kernel/runtime/RexxNativeActivation.cpp interpreter-3.x/trunk/kernel/runtime/RexxNativeActivation.hpp interpreter-3.x/trunk/kernel/runtime/RexxNativeCode.cpp interpreter-3.x/trunk/kernel/runtime/RexxStartup.cpp interpreter-3.x/trunk/kernel/runtime/Setup.cpp interpreter-3.x/trunk/kernel/runtime/VirtualFunctionTable.cpp interpreter-3.x/trunk/lib/RexxPlatformInterface.h interpreter-3.x/trunk/platform/unix/RexxCompiler.cpp interpreter-3.x/trunk/platform/unix/rexx.cpp interpreter-3.x/trunk/platform/windows/buildorx.bat interpreter-3.x/trunk/platform/windows/ole/events.cpp interpreter-3.x/trunk/platform/windows/ole/events.h interpreter-3.x/trunk/platform/windows/ole/orexxole.c interpreter-3.x/trunk/platform/windows/oodialog/oovbmp.c interpreter-3.x/trunk/platform/windows/oodialog/oovdata.c interpreter-3.x/trunk/platform/windows/oodialog/oovdeskt.c interpreter-3.x/trunk/platform/windows/oodialog/oovdraw.c interpreter-3.x/trunk/platform/windows/oodialog/oovmsg.c interpreter-3.x/trunk/platform/windows/oodialog/oovother.c interpreter-3.x/trunk/platform/windows/oodialog/oovscrll.c interpreter-3.x/trunk/platform/windows/oodialog/oovtext.c interpreter-3.x/trunk/platform/windows/oodialog/oovtools.c interpreter-3.x/trunk/platform/windows/oodialog/oovuser.c interpreter-3.x/trunk/platform/windows/oodialog/oovutil.c interpreter-3.x/trunk/platform/windows/oodialog/oovutil.h interpreter-3.x/trunk/platform/windows/orxscrpt/eng2rexx.cpp interpreter-3.x/trunk/platform/windows/orxscrpt/eng2rexx.hpp interpreter-3.x/trunk/platform/windows/orxscrpt/orxdispid.cpp interpreter-3.x/trunk/platform/windows/orxscrpt/orxevents.cpp interpreter-3.x/trunk/platform/windows/orxscrpt/orxidispatch.cpp interpreter-3.x/trunk/platform/windows/orxscrpt/orxscrpt.cpp interpreter-3.x/trunk/platform/windows/orxscrpt/orxscrpt.hpp interpreter-3.x/trunk/platform/windows/orxscrpt/orxscrpterror.cpp interpreter-3.x/trunk/platform/windows/orxscrpt/orxscrpterror.hpp interpreter-3.x/trunk/platform/windows/oryxwin.mak interpreter-3.x/trunk/platform/windows/rexx.c interpreter-3.x/trunk/platform/windows/rexxc.c interpreter-3.x/trunk/platform/windows/rexxhide.c interpreter-3.x/trunk/platform/windows/rexxpaws.c interpreter-3.x/trunk/platform/windows/winlist.c interpreter-3.x/trunk/platform/windows/winlist.h interpreter-3.x/trunk/rexutils/rxmath.cpp interpreter-3.x/trunk/rexutils/rxsock.cpp interpreter-3.x/trunk/rexutils/rxsockfn.cpp interpreter-3.x/trunk/rexutils/unix/rexxutil.cpp interpreter-3.x/trunk/rexutils/windows/rexxutil.cpp interpreter-3.x/trunk/rexutils/windows/rxwinsys.c interpreter-3.x/trunk/rexxapi/unix/MacroSpace.cpp interpreter-3.x/trunk/rexxapi/unix/QueuesAPI.cpp interpreter-3.x/trunk/rexxapi/unix/RexxAPIManager.cpp interpreter-3.x/trunk/rexxapi/unix/SUBCOMCommand.cpp interpreter-3.x/trunk/rexxapi/unix/SubcommandAPI.cpp interpreter-3.x/trunk/rexxapi/unix/SubcommandAPI.h interpreter-3.x/trunk/rexxapi/windows/MacroSpace.c interpreter-3.x/trunk/rexxapi/windows/QueuesAPI.c interpreter-3.x/trunk/rexxapi/windows/RexxAPIManager.c interpreter-3.x/trunk/rexxapi/windows/RexxAPIManager.h interpreter-3.x/trunk/rexxapi/windows/SUBCOMCommand.c interpreter-3.x/trunk/rexxapi/windows/SubcommandAPI.c interpreter-3.x/trunk/rexxapi/windows/SubcommandAPI.h interpreter-3.x/trunk/samples/unix/api/wpipe1/rexxasp1.c interpreter-3.x/trunk/samples/unix/api/wpipe2/rexxasp2.c interpreter-3.x/trunk/samples/unix/api/wpipe3/rexxasp3.c interpreter-3.x/trunk/samples/windows/api/callrxwn/callrxwn.c interpreter-3.x/trunk/samples/windows/api/callrxwn/callrxwn.h interpreter-3.x/trunk/samples/windows/api/rexxexit/rexxexit.c interpreter-3.x/trunk/samples/windows/api/wpipe/wpipe1/rexxapi1.c interpreter-3.x/trunk/samples/windows/api/wpipe/wpipe2/rexxapi2.c interpreter-3.x/trunk/samples/windows/api/wpipe/wpipe3/rexxapi3.c Added Paths: ----------- interpreter-3.x/trunk/kernel/platform/unix/SystemInitialization.cpp interpreter-3.x/trunk/kernel/platform/unix/SystemInterpreter.cpp interpreter-3.x/trunk/kernel/platform/unix/SystemInterpreter.hpp interpreter-3.x/trunk/kernel/platform/windows/SystemInterpreter.cpp interpreter-3.x/trunk/kernel/platform/windows/SystemInterpreter.hpp interpreter-3.x/trunk/kernel/runtime/ActivityDispatcher.cpp interpreter-3.x/trunk/kernel/runtime/ActivityDispatcher.hpp interpreter-3.x/trunk/kernel/runtime/CallbackDispatcher.cpp interpreter-3.x/trunk/kernel/runtime/CallbackDispatcher.hpp interpreter-3.x/trunk/kernel/runtime/CreateMethodDispatcher.cpp interpreter-3.x/trunk/kernel/runtime/CreateMethodDispatcher.hpp interpreter-3.x/trunk/kernel/runtime/InterpreterInstance.cpp interpreter-3.x/trunk/kernel/runtime/InterpreterInstance.hpp interpreter-3.x/trunk/kernel/runtime/RexxStartDispatcher.cpp interpreter-3.x/trunk/kernel/runtime/RexxStartDispatcher.hpp interpreter-3.x/trunk/kernel/runtime/TranslateDispatcher.cpp interpreter-3.x/trunk/kernel/runtime/TranslateDispatcher.hpp interpreter-3.x/trunk/lib/RexxInternalApis.h interpreter-3.x/trunk/platform/unix/rexximage.cpp interpreter-3.x/trunk/platform/windows/rexximage.cpp Removed Paths: ------------- interpreter-3.x/trunk/lib/LocalProcessData.cpp Modified: interpreter-3.x/trunk/Makefile.am =================================================================== --- interpreter-3.x/trunk/Makefile.am 2008-01-26 21:45:08 UTC (rev 2312) +++ interpreter-3.x/trunk/Makefile.am 2008-01-26 22:13:52 UTC (rev 2313) @@ -191,7 +191,8 @@ $(kernel_platform_unix_dir)/SharedMemorySupport.h \ $(kernel_platform_unix_dir)/SystemCommands.h \ $(kernel_platform_unix_dir)/SystemSemaphores.h \ - $(kernel_platform_unix_dir)/ThreadSupport.hpp + $(kernel_platform_unix_dir)/ThreadSupport.hpp \ + $(kernel_platform_unix_dir)/SystemInterpreter.hpp platformcommonHeaders = runtimeHeaders = $(runtime_dir)/DeadObject.hpp \ $(runtime_dir)/ClassTypeCodes.h \ @@ -208,6 +209,7 @@ $(runtime_dir)/ActivityManager.hpp \ $(runtime_dir)/LibraryManager.hpp \ $(runtime_dir)/Interpreter.hpp \ + $(runtime_dir)/InterpreterInstance.hpp \ $(runtime_dir)/ProtectedObject.hpp \ $(runtime_dir)/ExitHandler.hpp \ $(runtime_dir)/RexxBehaviour.hpp \ @@ -233,7 +235,12 @@ $(runtime_dir)/RexxNativeCode.hpp \ $(runtime_dir)/RexxSmartBuffer.hpp \ $(runtime_dir)/RexxVariable.hpp \ - $(runtime_dir)/RexxVariableDictionary.hpp + $(runtime_dir)/RexxVariableDictionary.hpp \ + $(runtime_dir)/RexxStartDispatcher.hpp \ + $(runtime_dir)/ActivityDispatcher.hpp \ + $(runtime_dir)/TranslateDispatcher.hpp \ + $(runtime_dir)/CreateMethodDispatcher.hpp \ + $(runtime_dir)/CallbackDispatcher.hpp streamlibraryHeaders = $(streamlibrary_dir)/StreamCommandParser.h \ $(streamlibrary_dir)/StreamNative.h libHeaders = $(lib_dir)/RexxPlatformDefinitions.h \ @@ -297,7 +304,7 @@ # # Binary targets # -bin_PROGRAMS = rexx rexxc rxqueue rxsubcom rxdelipc +bin_PROGRAMS = rexximage rexx rexxc rxqueue rxsubcom rxdelipc # # Shared library targets @@ -461,8 +468,9 @@ $(kernel_platform_unix_dir)/TimeSupport.cpp \ $(kernel_platform_unix_dir)/UseridFunction.cpp \ $(kernel_platform_unix_dir)/ValueFunction.cpp \ - $(kernel_platform_unix_dir)/VariablePool.cpp -# $(runtime_dir)/RexxVariableDictionary2.cpp + $(kernel_platform_unix_dir)/VariablePool.cpp \ + $(kernel_platform_unix_dir)/SystemInitialization.cpp \ + $(kernel_platform_unix_dir)/SystemInterpreter.cpp runtime_sources = $(runtime_dir)/DeadObject.cpp \ $(runtime_dir)/GlobalData.cpp \ $(runtime_dir)/GlobalNames.cpp \ @@ -477,6 +485,7 @@ $(runtime_dir)/ActivityManager.cpp \ $(runtime_dir)/LibraryManager.cpp \ $(runtime_dir)/Interpreter.cpp \ + $(runtime_dir)/InterpreterInstance.cpp \ $(runtime_dir)/RexxBehaviour.cpp \ $(runtime_dir)/RexxCode.cpp \ $(runtime_dir)/CPPCode.cpp \ @@ -503,10 +512,14 @@ $(runtime_dir)/Setup.cpp \ $(runtime_dir)/Utilities.cpp \ $(runtime_dir)/Version.cpp \ - $(runtime_dir)/VirtualFunctionTable.cpp + $(runtime_dir)/VirtualFunctionTable.cpp \ + $(runtime_dir)/RexxStartDispatcher.cpp \ + $(runtime_dir)/ActivityDispatcher.cpp \ + $(runtime_dir)/TranslateDispatcher.cpp \ + $(runtime_dir)/CreateMethodDispatcher.cpp \ + $(runtime_dir)/CallbackDispatcher.cpp streamlibrary_sources = $(streamlibrary_dir)/StreamCommandParser.cpp \ $(streamlibrary_dir)/StreamNative.cpp -lib_sources = $(lib_dir)/LocalProcessData.cpp librexx_la_SOURCES = $(classes_sources) \ $(expression_sources) \ $(instructions_sources) \ @@ -514,8 +527,7 @@ $(kernel_platform_common_sources) \ $(platform_sources) \ $(runtime_sources) \ - $(streamlibrary_sources) \ - $(lib_sources) + $(streamlibrary_sources) core_classes = $(rexxclasses_dir)/CoreClasses.orx \ $(rexxclasses_dir)/StreamClasses.orx \ $(rexxclasses_dir)/SystemMethods.orx @@ -540,7 +552,7 @@ -I$(kernel_platform_unix_dir) \ -I$(rexxapi_unix_dir) -librexx_la_LDFLAGS = $(VERSION_INFO) +librexx_la_LDFLAGS = $(VERSION_INFO) -nostartfiles #################### rexx ########################## # Sources for rexx # @@ -561,6 +573,27 @@ rexx_LDADD = librexx.la librexxapi.la @ORX_LDADD_EXECUTABLE@ rexx_LDFLAGS = @ORX_LDFLAGS_EXECUTABLE@ + +#################### rexx ########################## +# Sources for rexx +# +rexximage_SOURCES = $(platform_unix_dir)/rexximage.cpp +# +# Preprocessor flags for rexximage +# +rexximage_CXXFLAGS = $(COMMON_CPPFLAGS) \ + -I$(lib_dir) \ + -I$(api_dir) \ + -I$(platform_api_dir) \ + -I$(messages_dir) \ + -I$(kernel_platform_unix_dir) \ + -I$(rexxapi_unix_dir) +# +# Extra libraries for rexx +# +rexximage_LDADD = librexx.la librexxapi.la @ORX_LDADD_EXECUTABLE@ +rexximage_LDFLAGS = @ORX_LDFLAGS_EXECUTABLE@ + #################### rexxc ######################### # Sources for rexxc # @@ -761,10 +794,10 @@ $(runtime_dir)/VirtualFunctionTables.cpp: $(runtime_dir)/VirtualFunctionTable.xsl $(classesXML) sh ./xsl.sh $(@) $(classesXML) $(runtime_dir)/VirtualFunctionTable.xsl -rexx.img: rexx librexxutil.la $(core_classes) $(core_platform_classes) +rexx.img: rexximage librexxutil.la $(core_classes) $(core_platform_classes) cp $(rexxclasses_dir)/*.orx . cp $(kernel_platform_unix_dir)/*.orx . - ./rexx -i + ./rexximage -i rm -f *.orx # Modified: interpreter-3.x/trunk/api/platform/unix/rexxapitypes.h =================================================================== --- interpreter-3.x/trunk/api/platform/unix/rexxapitypes.h 2008-01-26 21:45:08 UTC (rev 2312) +++ interpreter-3.x/trunk/api/platform/unix/rexxapitypes.h 2008-01-26 22:13:52 UTC (rev 2313) @@ -54,9 +54,7 @@ #undef __REXX64__ #endif -#define APIENTRY -#define RexxEntry APIENTRY -#define REXXENTRY APIENTRY +#define REXXENTRY typedef void *REXXPFN; typedef pid_t process_id_t; Modified: interpreter-3.x/trunk/api/platform/unix/rexxplatformapis.h =================================================================== --- interpreter-3.x/trunk/api/platform/unix/rexxplatformapis.h 2008-01-26 21:45:08 UTC (rev 2312) +++ interpreter-3.x/trunk/api/platform/unix/rexxplatformapis.h 2008-01-26 22:13:52 UTC (rev 2313) @@ -54,12 +54,12 @@ /*** RexxPullQueue - Retrieve data from an External Data Queue */ -APIRET APIENTRY RexxPullQueue ( +APIRET REXXENTRY RexxPullQueue ( const char *, /* Name of queue to read from */ PRXSTRING, /* RXSTRING to receive data */ REXXDATETIME *, /* Stor for data date/time */ size_t); /* wait status (WAIT|NOWAIT) */ -typedef APIRET (APIENTRY *PFNREXXPULLQUEUE)(const char *, PCONSTRXSTRING, REXXDATETIME *, +typedef APIRET (REXXENTRY *PFNREXXPULLQUEUE)(const char *, PCONSTRXSTRING, REXXDATETIME *, size_t); #endif /* REXXPLATFORMAPIS_INCLUDED */ Modified: interpreter-3.x/trunk/api/platform/windows/rexxapitypes.h =================================================================== --- interpreter-3.x/trunk/api/platform/windows/rexxapitypes.h 2008-01-26 21:45:08 UTC (rev 2312) +++ interpreter-3.x/trunk/api/platform/windows/rexxapitypes.h 2008-01-26 22:13:52 UTC (rev 2313) @@ -63,13 +63,12 @@ typedef DWORD thread_id_t; typedef DWORD process_id_t; -#define RexxEntry APIENTRY #define REXXENTRY APIENTRY #ifdef __cplusplus extern "C" { #endif -typedef size_t (RexxEntry *REXXPFN)(); +typedef size_t (REXXENTRY *REXXPFN)(); #ifdef __cplusplus } #endif Modified: interpreter-3.x/trunk/api/platform/windows/rexxplatformapis.h =================================================================== --- interpreter-3.x/trunk/api/platform/windows/rexxplatformapis.h 2008-01-26 21:45:08 UTC (rev 2312) +++ interpreter-3.x/trunk/api/platform/windows/rexxplatformapis.h 2008-01-26 22:13:52 UTC (rev 2313) @@ -40,12 +40,12 @@ /*** RexxPullQueue - Retrieve data from an External Data Queue */ -APIRET APIENTRY RexxPullQueue ( +APIRET REXXENTRY RexxPullQueue ( const char *, /* Name of queue to read from */ PRXSTRING, /* RXSTRING to receive data */ SYSTEMTIME *, /* Stor for data date/time */ unsigned int); /* wait status (WAIT|NOWAIT) */ -typedef APIRET (APIENTRY *PFNREXXPULLQUEUE)(const char *, PCONSTRXSTRING, SYSTEMTIME *, +typedef APIRET (REXXENTRY *PFNREXXPULLQUEUE)(const char *, PCONSTRXSTRING, SYSTEMTIME *, unsigned int); #endif /* REXXPLATFORMAPIS_INCLUDED */ Modified: interpreter-3.x/trunk/api/rexx.h =================================================================== --- interpreter-3.x/trunk/api/rexx.h 2008-01-26 21:45:08 UTC (rev 2312) +++ interpreter-3.x/trunk/api/rexx.h 2008-01-26 22:13:52 UTC (rev 2313) @@ -136,6 +136,8 @@ typedef char *PEXIT; /* ptr to exit parameter block */ + + /*----------------------------------------------------------------------------*/ /*** Include the other common and platform specific stuff */ /*----------------------------------------------------------------------------*/ @@ -147,6 +149,17 @@ typedef size_t stringsize_t; // a Rexx string size typedef ssize_t wholenumber_t; // a Rexx whole number + +typedef struct _RexxConditionData +{ + wholenumber_t code; // The condition CODE information + wholenumber_t rc; // The condition RC value + RXSTRING message; // The condition secondary message text + RXSTRING errortext; // The condition error text. + size_t position; // The failure line number value + RXSTRING program; // The running program name +} RexxConditionData; + /*----------------------------------------------------------------------------*/ /* */ /* 32-bit */ @@ -161,7 +174,7 @@ extern "C" { #endif -int APIENTRY RexxStart ( +int REXXENTRY RexxStart ( size_t, /* Num of args passed to rexx */ PCONSTRXSTRING, /* Array of args passed to rex */ const char *, /* [d:][path] filename[.ext] */ @@ -171,31 +184,49 @@ PRXSYSEXIT, /* SysExit env. names & codes */ short *, /* Ret code from if numeric */ PRXSTRING ); /* Retvalue from the rexx proc */ -typedef APIRET (APIENTRY *PFNREXXSTART)(size_t, PCONSTRXSTRING, const char *, PRXSTRING, +typedef APIRET (REXXENTRY *PFNREXXSTART)(size_t, PCONSTRXSTRING, const char *, PRXSTRING, const char *, int, PRXSYSEXIT, short *, PRXSTRING); #define REXXSTART RexxStart +APIRET REXXENTRY RexxTranslateProgram( + const char *, // input program name + const char *, // output file name + PRXSYSEXIT); // system exits to use during translation + + +typedef APIRET (REXXENTRY *PFNREXXTRANSLATEPROGRAM)(const char *, const char *, PRXSYSEXIT); + +#define REXXTRANSLATEPROGRAM RexxTranslateProgram + + +char *REXXENTRY RexxGetVersionInformation(); + +typedef char *(REXXENTRY *PFNGETVERSIONINFORMATION)(); + +#define REXXGETVERSIONINFORMATON RexxGetVersionInformation + + /*----------------------------------------------------------------------------*/ /*** Subcommand Interface */ /*----------------------------------------------------------------------------*/ /* This typedef simplifies coding of a Subcommand handler. */ -typedef APIRET APIENTRY RexxSubcomHandler(PCONSTRXSTRING, +typedef APIRET REXXENTRY RexxSubcomHandler(PCONSTRXSTRING, unsigned short *, PRXSTRING); /*** RexxRegisterSubcomDll -- Register a DLL entry point */ /*** as a Subcommand handler */ -APIRET APIENTRY RexxRegisterSubcomDll ( +APIRET REXXENTRY RexxRegisterSubcomDll ( const char *, /* Name of subcom handler */ const char *, /* Name of DLL */ const char *, /* Name of procedure in DLL */ const char *, /* User area */ size_t ); /* Drop authority. */ -typedef APIRET (APIENTRY *PFNREXXREGISTERSUBCOMDLL)(const char *, const char *, const char *, +typedef APIRET (REXXENTRY *PFNREXXREGISTERSUBCOMDLL)(const char *, const char *, const char *, char *, size_t); #define REXXREGISTERSUBCOMDLL RexxRegisterSubcomDll @@ -203,22 +234,22 @@ /*** RexxRegisterSubcomExe -- Register an EXE entry point */ /*** as a Subcommand handler */ -APIRET APIENTRY RexxRegisterSubcomExe ( +APIRET REXXENTRY RexxRegisterSubcomExe ( const char *, /* Name of subcom handler */ REXXPFN, /* address of handler in EXE */ const char *); /* User area */ -typedef APIRET (APIENTRY *PFNREXXREGISTERSUBCOMEXE)(const char *, REXXPFN, char *); +typedef APIRET (REXXENTRY *PFNREXXREGISTERSUBCOMEXE)(const char *, REXXPFN, char *); #define REXXREGISTERSUBCOMEXE RexxRegisterSubcomExe /*** RexxQuerySubcom - Query an environment for Existance */ -APIRET APIENTRY RexxQuerySubcom( +APIRET REXXENTRY RexxQuerySubcom( const char *, /* Name of the Environment */ const char *, /* DLL Module Name */ unsigned short *, /* Stor for existance code */ char *); /* Stor for user word */ -typedef APIRET (APIENTRY *PFNREXXQUERYSUBCOM)(const char *, const char *, unsigned short *, +typedef APIRET (REXXENTRY *PFNREXXQUERYSUBCOM)(const char *, const char *, unsigned short *, char *); #define REXXQUERYSUBCOM RexxQuerySubcom @@ -226,10 +257,10 @@ /*** RexxDeregisterSubcom - Drop registration of a Subcommand */ /*** environment */ -APIRET APIENTRY RexxDeregisterSubcom( +APIRET REXXENTRY RexxDeregisterSubcom( const char *, /* Name of the Environment */ const char * ); /* DLL Module Name */ -typedef APIRET (APIENTRY *PFNREXXDEREGISTERSUBCOM)(const char *, const char *); +typedef APIRET (REXXENTRY *PFNREXXDEREGISTERSUBCOM)(const char *, const char *); #define REXXDEREGISTERSUBCOM RexxDeregisterSubcom @@ -239,9 +270,9 @@ /*** RexxVariablePool - Request Variable Pool Service */ -APIRET APIENTRY RexxVariablePool( +APIRET REXXENTRY RexxVariablePool( PSHVBLOCK); /* Pointer to list of SHVBLOCKs*/ -typedef APIRET (APIENTRY *PFNREXXVARIABLEPOOL)(PSHVBLOCK); +typedef APIRET (REXXENTRY *PFNREXXVARIABLEPOOL)(PSHVBLOCK); #define REXXVARIABLEPOOL RexxVariablePool @@ -251,7 +282,7 @@ /* This typedef simplifies coding of an External Function. */ -typedef unsigned int APIENTRY RexxFunctionHandler(const char *, +typedef unsigned int REXXENTRY RexxFunctionHandler(const char *, size_t, PCONSTRXSTRING, const char *, @@ -259,36 +290,36 @@ /*** RexxRegisterFunctionDll - Register a function in the AFT */ -APIRET APIENTRY RexxRegisterFunctionDll ( +APIRET REXXENTRY RexxRegisterFunctionDll ( const char *, /* Name of function to add */ const char *, /* Dll file name (if in dll) */ const char *); /* Entry in dll */ -typedef APIRET (APIENTRY *PFNREXXREGISTERFUNCTIONDLL)(const char *, const char *, const char *); +typedef APIRET (REXXENTRY *PFNREXXREGISTERFUNCTIONDLL)(const char *, const char *, const char *); #define REXXREGISTERFUNCTIONDLL RexxRegisterFunctionDll /*** RexxRegisterFunctionExe - Register a function in the AFT */ -APIRET APIENTRY RexxRegisterFunctionExe ( +APIRET REXXENTRY RexxRegisterFunctionExe ( const char *, /* Name of function to add */ REXXPFN); /* Entry point in EXE */ -typedef APIRET (APIENTRY *PFNREXXREGISTERFUNCTIONEXE)(const char *, REXXPFN); +typedef APIRET (REXXENTRY *PFNREXXREGISTERFUNCTIONEXE)(const char *, REXXPFN); #define REXXREGISTERFUNCTIONEXE RexxRegisterFunctionExe /*** RexxDeregisterFunction - Delete a function from the AFT */ -APIRET APIENTRY RexxDeregisterFunction ( +APIRET REXXENTRY RexxDeregisterFunction ( const char * ); /* Name of function to remove */ -typedef APIRET (APIENTRY *PFNREXXDEREGISTERFUNCTION)(const char *); +typedef APIRET (REXXENTRY *PFNREXXDEREGISTERFUNCTION)(const char *); #define REXXDEREGISTERFUNCTION RexxDeregisterFunction /*** RexxQueryFunction - Scan the AFT for a function */ -APIRET APIENTRY RexxQueryFunction ( +APIRET REXXENTRY RexxQueryFunction ( const char * ); /* Name of function to find */ -typedef APIRET (APIENTRY *PFNREXXQUERYFUNCTION)(const char *); +typedef APIRET (REXXENTRY *PFNREXXQUERYFUNCTION)(const char *); #define REXXQUERYFUNCTION RexxQueryFunction @@ -463,48 +494,48 @@ } RXVALCALL_PARM; /* This typedef simplifies coding of an Exit handler. */ -typedef int APIENTRY RexxExitHandler(int, int, PEXIT); +typedef int REXXENTRY RexxExitHandler(int, int, PEXIT); /*** RexxRegisterExitDll - Register a system exit. */ -APIRET APIENTRY RexxRegisterExitDll ( +APIRET REXXENTRY RexxRegisterExitDll ( const char *, /* Name of the exit handler */ const char *, /* Name of the DLL */ const char *, /* Name of the procedure */ const char *, /* User area */ size_t); /* Drop authority */ -typedef APIRET (APIENTRY *PFNREXXREGISTEREXITDLL)(const char *, const char *, const char *, +typedef APIRET (REXXENTRY *PFNREXXREGISTEREXITDLL)(const char *, const char *, const char *, char *, size_t); #define REXXREGISTEREXITDLL RexxRegisterExitDll /*** RexxRegisterExitExe - Register a system exit. */ -APIRET APIENTRY RexxRegisterExitExe ( +APIRET REXXENTRY RexxRegisterExitExe ( const char *, /* Name of the exit handler */ REXXPFN, /* Address of exit handler */ const char *); /* User area */ -typedef APIRET (APIENTRY *PFNREXXREGISTEREXITEXE)(const char *, REXXPFN, char *); +typedef APIRET (REXXENTRY *PFNREXXREGISTEREXITEXE)(const char *, REXXPFN, char *); #define REXXREGISTEREXITEXE RexxRegisterExitExe /*** RexxDeregisterExit - Drop registration of a system exit. */ -APIRET APIENTRY RexxDeregisterExit ( +APIRET REXXENTRY RexxDeregisterExit ( const char *, /* Exit name */ const char * ) ; /* DLL module name */ -typedef APIRET (APIENTRY *PFNREXXDEREGISTEREXIT)(const char *, const char *); +typedef APIRET (REXXENTRY *PFNREXXDEREGISTEREXIT)(const char *, const char *); #define REXXDEREGISTEREXIT RexxDeregisterExit /*** RexxQueryExit - Query an exit for existance. */ -APIRET APIENTRY RexxQueryExit ( +APIRET REXXENTRY RexxQueryExit ( const char *, /* Exit name */ const char *, /* DLL Module name. */ unsigned short *, /* Existance flag. */ char * ); /* User data. */ -typedef APIRET (APIENTRY *PFNREXXQUERYEXIT)(const char *, const char *, unsigned short *, char *); +typedef APIRET (REXXENTRY *PFNREXXQUERYEXIT)(const char *, const char *, unsigned short *, char *); #define REXXQUERYEXIT RexxQueryExit @@ -514,28 +545,28 @@ /*** RexxSetHalt - Request Program Halt */ -APIRET APIENTRY RexxSetHalt( +APIRET REXXENTRY RexxSetHalt( process_id_t, /* Process Id */ thread_id_t); /* Thread Id */ -typedef APIRET (APIENTRY *PFNREXXSETHALT)(process_id_t, thread_id_t); +typedef APIRET (REXXENTRY *PFNREXXSETHALT)(process_id_t, thread_id_t); #define REXXSETHALT RexxSetHalt /*** RexxSetTrace - Request Program Trace */ -APIRET APIENTRY RexxSetTrace( +APIRET REXXENTRY RexxSetTrace( process_id_t, /* Process Id */ thread_id_t); /* Thread Id */ -typedef APIRET (APIENTRY *PFNREXXSETTRACE)(process_id_t, thread_id_t); +typedef APIRET (REXXENTRY *PFNREXXSETTRACE)(process_id_t, thread_id_t); #define REXXSETTRACE RexxSetTrace /*** RexxResetTrace - Turn Off Program Trace */ -APIRET APIENTRY RexxResetTrace( +APIRET REXXENTRY RexxResetTrace( process_id_t, /* Process Id */ thread_id_t); /* Thread Id */ -typedef APIRET (APIENTRY *PFNREXXRESETTRACE)(process_id_t, thread_id_t); +typedef APIRET (REXXENTRY *PFNREXXRESETTRACE)(process_id_t, thread_id_t); #define REXXRESETTRACE RexxResetTrace @@ -545,66 +576,66 @@ /*** RexxAddMacro - Register a function in the Macro Space */ -APIRET APIENTRY RexxAddMacro( +APIRET REXXENTRY RexxAddMacro( const char *, /* Function to add or change */ const char *, /* Name of file to get function*/ size_t); /* Flag indicating search pos */ -typedef APIRET (APIENTRY *PFNREXXADDMACRO)(const char *, const char *, size_t); +typedef APIRET (REXXENTRY *PFNREXXADDMACRO)(const char *, const char *, size_t); #define REXXADDMACRO RexxAddMacro /*** RexxDropMacro - Remove a function from the Macro Space */ -APIRET APIENTRY RexxDropMacro ( +APIRET REXXENTRY RexxDropMacro ( const char * ); /* Name of function to remove */ -typedef APIRET (APIENTRY *PFNREXXDROPMACRO)(const char *); +typedef APIRET (REXXENTRY *PFNREXXDROPMACRO)(const char *); #define REXXDROPMACRO RexxDropMacro /*** RexxSaveMacroSpace - Save Macro Space functions to a file */ -APIRET APIENTRY RexxSaveMacroSpace ( +APIRET REXXENTRY RexxSaveMacroSpace ( size_t, /* Argument count (0==save all)*/ const char * *, /* List of funct names to save */ const char *); /* File to save functions in */ -typedef APIRET (APIENTRY * PFNREXXSAVEMACROSPACE)(size_t, const char * *, const char *); +typedef APIRET (REXXENTRY * PFNREXXSAVEMACROSPACE)(size_t, const char * *, const char *); #define REXXSAVEMACROSPACE RexxSaveMacroSpace /*** RexxLoadMacroSpace - Load Macro Space functions from a file */ -APIRET APIENTRY RexxLoadMacroSpace ( +APIRET REXXENTRY RexxLoadMacroSpace ( size_t, /* Argument count (0==load all)*/ const char * *, /* List of funct names to load */ const char *); /* File to load functions from */ -typedef APIRET (APIENTRY *PFNREXXLOADMACROSPACE)(size_t, const char * *, const char *); +typedef APIRET (REXXENTRY *PFNREXXLOADMACROSPACE)(size_t, const char * *, const char *); #define REXXLOADMACROSPACE RexxLoadMacroSpace /*** RexxQueryMacro - Find a function's search-order position */ -APIRET APIENTRY RexxQueryMacro ( +APIRET REXXENTRY RexxQueryMacro ( const char *, /* Function to search for */ unsigned short * ); /* Ptr for position flag return*/ -typedef APIRET (APIENTRY *PFNREXXQUERYMACRO)(const char *, unsigned short *); +typedef APIRET (REXXENTRY *PFNREXXQUERYMACRO)(const char *, unsigned short *); #define REXXQUERYMACRO RexxQueryMacro /*** RexxReorderMacro - Change a function's search-order */ /*** position */ -APIRET APIENTRY RexxReorderMacro( +APIRET REXXENTRY RexxReorderMacro( const char *, /* Name of funct change order */ size_t); /* New position for function */ -typedef APIRET (APIENTRY *PFNREXXREORDERMACRO)(const char *, size_t); +typedef APIRET (REXXENTRY *PFNREXXREORDERMACRO)(const char *, size_t); #define REXXREORDERMACRO RexxReorderMacro /*** RexxClearMacroSpace - Remove all functions from a MacroSpace */ -APIRET APIENTRY RexxClearMacroSpace( +APIRET REXXENTRY RexxClearMacroSpace( void ); /* No Arguments. */ -typedef APIRET (APIENTRY *PFNREXXCLEARMACROSPACE)(void); +typedef APIRET (REXXENTRY *PFNREXXCLEARMACROSPACE)(void); #define REXXCLEARMACROSPACE RexxClearMacroSpace @@ -614,45 +645,45 @@ /*** RexxCreateQueue - Create an External Data Queue */ -APIRET APIENTRY RexxCreateQueue ( +APIRET REXXENTRY RexxCreateQueue ( char *, /* Name of queue created */ size_t, /* Size of buf for ret name */ const char *, /* Requested name for queue */ size_t *); /* Duplicate name flag. */ -typedef APIRET (APIENTRY *PFNREXXCREATEQUEUE)(char *, size_t, const char *, size_t); +typedef APIRET (REXXENTRY *PFNREXXCREATEQUEUE)(char *, size_t, const char *, size_t); /*** RexxDeleteQueue - Delete an External Data Queue */ -APIRET APIENTRY RexxDeleteQueue ( +APIRET REXXENTRY RexxDeleteQueue ( const char * ); /* Name of queue to be deleted */ -typedef APIRET (APIENTRY *PFNREXXDELETEQUEUE)(const char *); +typedef APIRET (REXXENTRY *PFNREXXDELETEQUEUE)(const char *); /*** RexxQueryQueue - Query an External Data Queue for number of */ /*** entries */ -APIRET APIENTRY RexxQueryQueue ( +APIRET REXXENTRY RexxQueryQueue ( const char *, /* Name of queue to query */ size_t *); /* Place to put element count */ -typedef APIRET (APIENTRY *PFNREXXQUERYQUEUE)(const char *, size_t *); +typedef APIRET (REXXENTRY *PFNREXXQUERYQUEUE)(const char *, size_t *); /*** RexxAddQueue - Add an entry to an External Data Queue */ -APIRET APIENTRY RexxAddQueue ( +APIRET REXXENTRY RexxAddQueue ( const char *, /* Name of queue to add to */ PCONSTRXSTRING, /* Data string to add */ size_t); /* Queue type (FIFO|LIFO) */ -typedef APIRET (APIENTRY *PFNREXXADDQUEUE)(const char *, PCONSTRXSTRING, size_t); +typedef APIRET (REXXENTRY *PFNREXXADDQUEUE)(const char *, PCONSTRXSTRING, size_t); #include "rexxplatformapis.h" -APIRET APIENTRY RexxShutDownAPI(void); +APIRET REXXENTRY RexxShutDownAPI(void); -typedef APIRET (APIENTRY *PFNREXXSHUTDOWNAPI)(void); +typedef APIRET (REXXENTRY *PFNREXXSHUTDOWNAPI)(void); #define REXXSHUTDOWNAPI RexxShutDownAPI @@ -662,31 +693,19 @@ /*** RexxAllocateMemory */ -void *APIENTRY RexxAllocateMemory( +void *REXXENTRY RexxAllocateMemory( size_t); /* number of bytes to allocate */ -typedef void *(APIENTRY *PFNREXXALLOCATEMEMORY)(size_t ); +typedef void *(REXXENTRY *PFNREXXALLOCATEMEMORY)(size_t ); /*** RexxFreeMemory */ -APIRET APIENTRY RexxFreeMemory( +APIRET REXXENTRY RexxFreeMemory( void *); /* pointer to the memory returned by */ /* RexxAllocateMemory */ -typedef APIRET (APIENTRY *PFNREXXFREEMEMORY)(void *); +typedef APIRET (REXXENTRY *PFNREXXFREEMEMORY)(void *); -int APIENTRY RexxResolveExit(const char *, REXXPFN *); -APIRET APIENTRY RexxCallFunction ( - const char *, /* Name of function to call */ - size_t, /* Number of arguments */ - PCONSTRXSTRING, /* Array of argument strings */ - int *, /* RC from function called */ - PRXSTRING, /* Storage for returned data */ - const char *); /* Name of active data queue */ - -/*** Uppercase Entry Point Name */ -#define REXXCALLFUNCTION RexxCallFunction - #ifdef __cplusplus } #endif Modified: interpreter-3.x/trunk/kernel/RexxClasses/CoreClasses.orx =================================================================== --- interpreter-3.x/trunk/kernel/RexxClasses/CoreClasses.orx 2008-01-26 21:45:08 UTC (rev 2312) +++ interpreter-3.x/trunk/kernel/RexxClasses/CoreClasses.orx 2008-01-26 22:13:52 UTC (rev 2313) @@ -97,10 +97,6 @@ server_mdict = .table~new server_mdict~put(.methods~server_init, 'INIT') -server_mdict~put(kernel_methods['RUN_PROGRAM'], 'RUN_PROGRAM') -server_mdict~put(kernel_methods['CALL_PROGRAM'], 'CALL_PROGRAM') -server_mdict~put(kernel_methods['CALL_STRING'], 'CALL_STRING') -server_mdict~put(.methods~server_save_result, 'SAVE_RESULT') server~!define_methods(server_mdict) server~!rexxdefined /* Mark as unchangeable */ @@ -401,24 +397,12 @@ raise syntax 93.948 array(1, "Collection") - - - - -::METHOD server_save_result - /* anchor a passed out result */ - expose savedResults - use arg resultObj - savedResults[resultObj] = resultObj - - ::METHOD server_init /* initialize a server */ - expose localenv savedResults + expose localenv .local~objectname = "The Local Directory" -- give the local environment a nicer descriptive name. - savedResults = .table~new .local~setentry('LOCALSERVER', self) /* set system objects in the local environment */ Modified: interpreter-3.x/trunk/kernel/classes/BufferClass.hpp =================================================================== --- interpreter-3.x/trunk/kernel/classes/BufferClass.hpp 2008-01-26 21:45:08 UTC (rev 2312) +++ interpreter-3.x/trunk/kernel/classes/BufferClass.hpp 2008-01-26 22:13:52 UTC (rev 2313) @@ -59,6 +59,7 @@ inline size_t getLength(void) { return this->size; }; inline char *address(void) {return this->data; } inline void copyData(size_t offset, const char *string, size_t length) { memcpy(this->data + offset, string, length); } + inline void copyData(CONSTRXSTRING &r) { copyData(0, r.strptr, r.strlength); } inline void openGap(size_t offset, size_t _size, size_t tailSize) { memmove(address() + offset + _size, address() + offset, tailSize); @@ -84,4 +85,12 @@ }; inline RexxBuffer *new_buffer(size_t s) { return new (s) RexxBuffer; } + inline RexxBuffer *new_buffer(CONSTRXSTRING &r) + { + RexxBuffer *b = new_buffer(r.strlength); + b->copyData(r); + return b; + } + + #endif Modified: interpreter-3.x/trunk/kernel/classes/ClassClass.cpp =================================================================== --- interpreter-3.x/trunk/kernel/classes/ClassClass.cpp 2008-01-26 21:45:08 UTC (rev 2312) +++ interpreter-3.x/trunk/kernel/classes/ClassClass.cpp 2008-01-26 22:13:52 UTC (rev 2313) @@ -176,20 +176,22 @@ /* Function: Compare two class objects as a strict compare (==) */ /******************************************************************************/ { - /* If a non-copied (Primitive) */ - /*behaviour Then we can directly */ - /*call primitive method */ - if (this->behaviour->isPrimitive()) - /* can compare at primitive level */ - return this->equal(other) == TheTrueObject; - else - { - ProtectedObject r; - /* other wise giveuser version a */ - /*chance */ - this->sendMessage(OREF_STRICT_EQUAL, other, r); - return ((RexxObject *)r)->truthValue(Error_Logical_value_method); - } + /* If a non-copied (Primitive) */ + /*behaviour Then we can directly */ + /*call primitive method */ + if (this->behaviour->isPrimitive()) + { + /* can compare at primitive level */ + return this->equal(other) == TheTrueObject; + } + else + { + ProtectedObject r; + /* other wise giveuser version a */ + /*chance */ + this->sendMessage(OREF_STRICT_EQUAL, other, r); + return((RexxObject *)r)->truthValue(Error_Logical_value_method); + } } RexxObject *RexxClass::equal( @@ -198,16 +200,20 @@ /* Function: Compare two classes */ /******************************************************************************/ { - required_arg(other, ONE); /* must have the other argument */ - /* this is direct object equality */ + required_arg(other, ONE); /* must have the other argument */ + /* this is direct object equality */ - /* comparing string/int/numstr to */ - /* string/int/numstr? */ - if ((this == TheStringClass || this == TheIntegerClass || this == TheNumberStringClass) && - (other == (RexxObject *)TheStringClass || other == (RexxObject *)TheIntegerClass || other == (RexxObject *)TheNumberStringClass)) - return TheTrueObject; /* YES, then equal.... */ - else /* other wise, do a direct compare */ - return ((this == other) ? TheTrueObject: TheFalseObject); + /* comparing string/int/numstr to */ + /* string/int/numstr? */ + if ((this == TheStringClass || this == TheIntegerClass || this == TheNumberStringClass) && + (other == (RexxObject *)TheStringClass || other == (RexxObject *)TheIntegerClass || other == (RexxObject *)TheNumberStringClass)) + { + return TheTrueObject; /* YES, then equal.... */ + } + else /* other wise, do a direct compare */ + { + return((this == other) ? TheTrueObject: TheFalseObject); + } } RexxObject *RexxClass::notEqual( @@ -216,16 +222,20 @@ /* Function: Compare two classes */ /******************************************************************************/ { - required_arg(other, ONE); /* must have the other argument */ - /* this is direct object equality */ + required_arg(other, ONE); /* must have the other argument */ + /* this is direct object equality */ - /* comparing string/int/numstr to */ - /* string/int/numstr? */ - if ((this == TheStringClass || this == TheIntegerClass || this == TheNumberStringClass) && - (other == (RexxObject *)TheStringClass || other == (RexxObject *)TheIntegerClass || other == (RexxObject *)TheNumberStringClass)) - return TheFalseObject; /* YES, then equal.... */ - else /* other wise, do a direct compare */ - return ((this != other) ? TheTrueObject: TheFalseObject); + /* comparing string/int/numstr to */ + /* string/int/numstr? */ + if ((this == TheStringClass || this == TheIntegerClass || this == TheNumberStringClass) && + (other == (RexxObject *)TheStringClass || other == (RexxObject *)TheIntegerClass || other == (RexxObject *)TheNumberStringClass)) + { + return TheFalseObject; /* YES, then equal.... */ + } + else /* other wise, do a direct compare */ + { + return((this != other) ? TheTrueObject: TheFalseObject); + } } RexxInteger *RexxClass::queryMixinClass() @@ -268,9 +278,13 @@ /*****************************************************************************/ { if (this->isPrimitiveClass()) /* primitive class? */ - return TheClassClass; /* this is always .class */ + { + return TheClassClass; /* this is always .class */ + } else /* return first member of the list */ - return (RexxClass *)this->metaClass->get(1); + { + return (RexxClass *)this->metaClass->get(1); + } } void RexxClass::setInstanceBehaviour( @@ -333,17 +347,23 @@ /* Function: Add a table of methods to a primitive class behaviour */ /*****************************************************************************/ { - HashLink i; /* table index */ - RexxString * method_name; /* name of an added method */ + /* loop through the list of methods */ + for (HashLink i = newMethods->first(); newMethods->available(i); i = newMethods->next(i)) + { + /* get the method name */ + RexxString *method_name = (RexxString *)newMethods->index(i); + /* add this method to the classes */ + /* class behaviour */ - /* loop through the list of methods */ - for (i = newMethods->first(); newMethods->available(i); i = newMethods->next(i)) { - /* get the method name */ - method_name = (RexxString *)newMethods->index(i); - /* add this method to the classes */ - /* class behaviour */ - this->behaviour->define(method_name, (RexxMethod *)newMethods->value(i)); - } + // if this is the Nil object, that's an override. Make it OREF_NULL. + RexxObject *method = (RexxMethod *)newMethods->value(i); + if (method == TheNilObject) + { + method = OREF_NULL; + } + + this->behaviour->define(method_name, OREF_NULL); + } } RexxString *RexxClass::defaultName() @@ -366,15 +386,17 @@ /* Function: Return the instance behaviour's method dictionary */ /*****************************************************************************/ { - RexxTable *methodTable; /* returned method dictioanry */ - - /* get the method dictionary */ - methodTable = this->instanceBehaviour->getMethodDictionary(); - if (methodTable == OREF_NULL) /* no methods defined yet? */ - return new_table(); /* create a new method table */ - else - /* just copy the method dictionary */ - return (RexxTable *)methodTable->copy(); + /* get the method dictionary */ + RexxTable *methodTable = this->instanceBehaviour->getMethodDictionary(); + if (methodTable == OREF_NULL) /* no methods defined yet? */ + { + return new_table(); /* create a new method table */ + } + else + { + /* just copy the method dictionary */ + return(RexxTable *)methodTable->copy(); + } } RexxTable *RexxClass::getBehaviourDictionary() @@ -382,15 +404,17 @@ /* Function: Return the class behaviour's method dictionary */ /*****************************************************************************/ { - RexxTable *methodTable; /* returned method dictioanry */ - - /* get the method dictionary */ - methodTable = this->behaviour->getMethodDictionary(); - if (methodTable == OREF_NULL) /* no methods defined yet? */ - return new_table(); /* create a new method table */ - else - /* just copy the method dictionary */ - return (RexxTable *)methodTable->copy(); + /* get the method dictionary */ + RexxTable *methodTable = this->behaviour->getMethodDictionary(); + if (methodTable == OREF_NULL) /* no methods defined yet? */ + { + return new_table(); /* create a new method table */ + } + else + { + /* just copy the method dictionary */ + return(RexxTable *)methodTable->copy(); + } } /** @@ -404,110 +428,122 @@ */ void RexxClass::subClassable(bool restricted) { - /* get a copy of the class instance */ - /* behaviour mdict before the merge */ - /* with OBJECT. This unmerged mdict */ - /* is kept in this class's */ - /* class_instance_mdict field. */ - OrefSet(this, this->instanceMethodDictionary, this->getInstanceBehaviourDictionary()); - /* Add OBJECT to the behaviour scope */ - /* table */ - this->instanceBehaviour->addScope(TheObjectClass); - if (this != TheObjectClass) { /* if this isn't the OBJECT class */ - /* Add OBJECT to the behaviour scope */ - /* table */ + /* get a copy of the class instance */ + /* behaviour mdict before the merge */ + /* with OBJECT. This unmerged mdict */ + /* is kept in this class's */ + /* class_instance_mdict field. */ + OrefSet(this, this->instanceMethodDictionary, this->getInstanceBehaviourDictionary()); + /* Add OBJECT to the behaviour scope */ + /* table */ this->instanceBehaviour->addScope(TheObjectClass); - /* and merge this class's instance */ - /* behaviour with that of OBJECT's */ - this->instanceBehaviour->merge(TheObjectBehaviour); - } - /* add self to the scope table */ - this->instanceBehaviour->addScope(this); - /* get a copy of the class behaviour */ - /* mdict before the merge with the */ - /* CLASS instance behaviour. This */ - /* unmerged mdict is kept in the */ - /* class_mdict field */ - OrefSet(this, this->classMethodDictionary, this->getBehaviourDictionary()); - /* The merge of the mdict's is order */ - /* specific. By processing OBJECT */ - /* first then CLASS and then the */ - /* rest of the subclassable classes */ - /* the mdict's will be set up */ - /* correctly. */ - /* In this way merging the CLASS */ - /* behaviour will only be the CLASS */ - /* instance methods when OBJECT is */ - /* processed, but will be CLASS's */ - /* and OBJECT's after CLASS is */ - /* processed */ - this->behaviour->merge(TheClassBehaviour); - /* now add the scope levels to this */ - /* class behaviour */ - /* If this isn't OBJECT put OBJECT */ - /* in first */ - if (this != TheObjectClass) - this->behaviour->addScope(TheObjectClass); - /* if this is OBJECT - merge the */ - /* object instance methods with the */ - /* object class methods */ - else { - this->behaviour->merge(TheObjectBehaviour); - /* and put them into the class mdict */ - /* so all the classes will inherit */ + if (this != TheObjectClass) /* if this isn't the OBJECT class */ + { + /* Add OBJECT to the behaviour scope */ + /* table */ + this->instanceBehaviour->addScope(TheObjectClass); + /* and merge this class's instance */ + /* behaviour with that of OBJECT's */ + this->instanceBehaviour->merge(TheObjectBehaviour); + } + /* add self to the scope table */ + this->instanceBehaviour->addScope(this); + /* get a copy of the class behaviour */ + /* mdict before the merge with the */ + /* CLASS instance behaviour. This */ + /* unmerged mdict is kept in the */ + /* class_mdict field */ OrefSet(this, this->classMethodDictionary, this->getBehaviourDictionary()); - } - /* if this isn't CLASS put CLASS in */ - /* next */ - if (this != TheClassClass) - this->behaviour->addScope(TheClassClass); - this->behaviour->addScope(this); /* put self into the scope table */ - /* That finishes the class behaviour */ - /* initialization. */ - /* Now fill in the state data */ + /* The merge of the mdict's is order */ + /* specific. By processing OBJECT */ + /* first then CLASS and then the */ + /* rest of the subclassable classes */ + /* the mdict's will be set up */ + /* correctly. */ + /* In this way merging the CLASS */ + /* behaviour will only be the CLASS */ + /* instance methods when OBJECT is */ + /* processed, but will be CLASS's */ + /* and OBJECT's after CLASS is */ + /* processed */ + this->behaviour->merge(TheClassBehaviour); + /* now add the scope levels to this */ + /* class behaviour */ + /* If this isn't OBJECT put OBJECT */ + /* in first */ + if (this != TheObjectClass) + { + this->behaviour->addScope(TheObjectClass); + } + /* if this is OBJECT - merge the */ + /* object instance methods with the */ + /* object class methods */ + else + { + this->behaviour->merge(TheObjectBehaviour); + /* and put them into the class mdict */ + /* so all the classes will inherit */ + OrefSet(this, this->classMethodDictionary, this->getBehaviourDictionary()); + } + /* if this isn't CLASS put CLASS in */ + /* next */ + if (this != TheClassClass) + { + this->behaviour->addScope(TheClassClass); + } + this->behaviour->addScope(this); /* put self into the scope table */ + /* That finishes the class behaviour */ + /* initialization. */ + /* Now fill in the state data */ - if (TheObjectClass != this ) { - /* set up the new metaclass list */ - OrefSet(this, this->metaClass, new_array(TheClassClass)); - /* the metaclass mdict list */ - OrefSet(this, this->metaClassMethodDictionary, new_array(TheClassClass->instanceMethodDictionary->copy())); - ... [truncated message content] |