[Vm-dev] [commit][3508] Implement full help and version information for the Cocoa VM .

commits at squeakvm.org commits at squeakvm.org
Mon Nov 30 20:14:13 UTC 2015


Revision: 3508
Author:   eliot
Date:     2015-11-30 12:14:11 -0800 (Mon, 30 Nov 2015)
Log Message:
-----------
Implement full help and version information for the Cocoa VM.
Copy rather than move the build .app when composing the VM .app (as yet 32-bit
Spur build only).

Modified Paths:
--------------
    branches/Cog/build.macos32x86/squeak.cog.spur/SqueakCogSpur32x86.xcodeproj/project.pbxproj
    branches/Cog/build.macos32x86/squeak.cog.spur/makeiosvm
    branches/Cog/platforms/Mac OS/vm/sqMacUnixCommandLineInterface.c
    branches/Cog/platforms/iOS/vm/Common/Classes/sqSqueakMainApp.m
    branches/Cog/platforms/iOS/vm/Common/main.m
    branches/Cog/platforms/iOS/vm/OSX/sqSqueakOSXApplication+attributes.m
    branches/Cog/platforms/iOS/vm/OSX/sqSqueakOSXApplication.h
    branches/Cog/platforms/iOS/vm/OSX/sqSqueakOSXApplication.m
    branches/Cog/platforms/unix/vm/sqUnixMain.c

Added Paths:
-----------
    branches/Cog/platforms/iOS/vm/Common/version.c

Property Changed:
----------------
    branches/Cog/platforms/Cross/vm/sqSCCSVersion.h

Modified: branches/Cog/build.macos32x86/squeak.cog.spur/SqueakCogSpur32x86.xcodeproj/project.pbxproj
===================================================================
--- branches/Cog/build.macos32x86/squeak.cog.spur/SqueakCogSpur32x86.xcodeproj/project.pbxproj	2015-11-26 21:16:03 UTC (rev 3507)
+++ branches/Cog/build.macos32x86/squeak.cog.spur/SqueakCogSpur32x86.xcodeproj/project.pbxproj	2015-11-30 20:14:11 UTC (rev 3508)
@@ -7,6 +7,7 @@
 	objects = {
 
 /* Begin PBXBuildFile section */
+		731F205E1C0CDE2300A27A22 /* version.c in Sources */ = {isa = PBXBuildFile; fileRef = 731F205D1C0CDE2300A27A22 /* version.c */; };
 		9402DD6010CE0C16005C2102 /* SqViewBitmapConversion.m in Sources */ = {isa = PBXBuildFile; fileRef = 9402DD5F10CE0C16005C2102 /* SqViewBitmapConversion.m */; };
 		9402DD7010CE0E91005C2102 /* SqViewClut.m in Sources */ = {isa = PBXBuildFile; fileRef = 9402DD6F10CE0E91005C2102 /* SqViewClut.m */; };
 		9422C3B51AFFFAC500448DC0 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 9422C3B31AFFFAC500448DC0 /* Localizable.strings */; };
@@ -210,6 +211,7 @@
 		1D3623250D0F684500981E51 /* SqueakNoOGLIPhoneAppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SqueakNoOGLIPhoneAppDelegate.m; sourceTree = "<group>"; };
 		1D3623EB0D0F72F000981E51 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; };
 		29B97316FDCFA39411CA2CEA /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = vm/Common/main.m; sourceTree = "<group>"; };
+		731F205D1C0CDE2300A27A22 /* version.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = version.c; path = vm/Common/version.c; sourceTree = "<group>"; };
 		9400325B0DEF3936002FA1C4 /* sqDummyaio.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sqDummyaio.h; sourceTree = "<group>"; };
 		9400325C0DEF3936002FA1C4 /* sqDummyaio.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = sqDummyaio.c; sourceTree = "<group>"; };
 		9402DD5E10CE0C16005C2102 /* SqViewBitmapConversion.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SqViewBitmapConversion.h; path = vm/OSX/SqViewBitmapConversion.h; sourceTree = "<group>"; };
@@ -773,6 +775,7 @@
 		9452D5EF0E044AC2000AD792 /* Common */ = {
 			isa = PBXGroup;
 			children = (
+				731F205D1C0CDE2300A27A22 /* version.c */,
 				29B97316FDCFA39411CA2CEA /* main.m */,
 				9478E0220EC8D957007096A7 /* plugins */,
 				9452D5F00E044AD1000AD792 /* Classes */,
@@ -1759,6 +1762,7 @@
 				9463C1D71AEE1693009C5CE5 /* study.c in Sources */,
 				94584FDB10F02378001401E7 /* sqMacExtendedClipboard.m in Sources */,
 				943B9CA11235C5120056205E /* sqMacHostWindow.m in Sources */,
+				731F205E1C0CDE2300A27A22 /* version.c in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};

Modified: branches/Cog/build.macos32x86/squeak.cog.spur/makeiosvm
===================================================================
--- branches/Cog/build.macos32x86/squeak.cog.spur/makeiosvm	2015-11-26 21:16:03 UTC (rev 3507)
+++ branches/Cog/build.macos32x86/squeak.cog.spur/makeiosvm	2015-11-30 20:14:11 UTC (rev 3508)
@@ -62,9 +62,9 @@
 export TZ="`date +%Z`"
 xcodebuild -project $VMXCP.xcodeproj -configuration $BUILD_CONFIGURATION
 if [ -d "$DEST" ]; then
-	mv build/$BUILD_CONFIGURATION/$APP/* "$DEST"
+	cp -Rp build/$BUILD_CONFIGURATION/$APP/* "$DEST"
 else
-	mv build/$BUILD_CONFIGURATION/$APP "$DEST"
+	cp -Rp build/$BUILD_CONFIGURATION/$APP "$DEST"
 fi
 ../../scripts/versionInfoPlist ../../platforms CoreVM.plist "$DEST/Contents/Info.plist"
 


Property changes on: branches/Cog/platforms/Cross/vm/sqSCCSVersion.h
___________________________________________________________________
Modified: checkindate
   - Tue Nov 24 15:09:27 PST 2015
   + Mon Nov 30 12:12:08 PST 2015

Modified: branches/Cog/platforms/Mac OS/vm/sqMacUnixCommandLineInterface.c
===================================================================
--- branches/Cog/platforms/Mac OS/vm/sqMacUnixCommandLineInterface.c	2015-11-26 21:16:03 UTC (rev 3507)
+++ branches/Cog/platforms/Mac OS/vm/sqMacUnixCommandLineInterface.c	2015-11-30 20:14:11 UTC (rev 3508)
@@ -355,7 +355,11 @@
 
 static void printUsageNotes(void)
 {
-  printf("  If `-memory' is not specified then the heap will grow dynamically.\n");
+#if SPURVM
+	printf("  If `-memory' or '-maxoldspace' are not specified then the heap will grow dynamically.\n");
+#else
+	printf("  If `-memory' is not specified then the heap will grow dynamically.\n");
+#endif
   printf("  <argument>s are ignored, but are processed by the " IMAGE_DIALECT_NAME " image.\n");
   printf("  The first <argument> normally names a " IMAGE_DIALECT_NAME " `script' to execute.\n");
   printf("  Precede <arguments> by `--' to use default image.\n");

Modified: branches/Cog/platforms/iOS/vm/Common/Classes/sqSqueakMainApp.m
===================================================================
--- branches/Cog/platforms/iOS/vm/Common/Classes/sqSqueakMainApp.m	2015-11-26 21:16:03 UTC (rev 3507)
+++ branches/Cog/platforms/iOS/vm/Common/Classes/sqSqueakMainApp.m	2015-11-30 20:14:11 UTC (rev 3508)
@@ -21,10 +21,10 @@
  copies of the Software, and to permit persons to whom the
  Software is furnished to do so, subject to the following
  conditions:
- 
+
  The above copyright notice and this permission notice shall be
  included in all copies or substantial portions of the Software.
- 
+
  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
  OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
@@ -48,7 +48,7 @@
 #import <limits.h>
 #import "sqPlatformSpecific.h"
 
-#if COGVM
+#if STACKVM || COGVM
 #import "sqSCCSVersion.h"
 #else
 #import "sqMacV2Memory.h"
@@ -60,25 +60,34 @@
 #endif
 
 
-#warning what about these guyes?
+#ifdef BUILD_FOR_OSX
 /*** Variables -- globals for access from pluggable primitives ***/
 EXPORT(int)		argCnt= 0;
 EXPORT(char**)	argVec= 0;
 EXPORT(char**)	envVec= 0;
+#endif
 
 extern sqSqueakAppDelegate *gDelegateApp;
 
 BOOL			gQuitNowRightNow=NO;
 BOOL            gSqueakHeadless=NO;
+BOOL            gNoSignalHandlers=NO;
 int				gSqueakUseFileMappedMMAP=0;
 char            gSqueakUntrustedDirectoryName[PATH_MAX];
 char            gSqueakTrustedDirectoryName[PATH_MAX];
+int				blockOnError=0;
 
 extern sqInt printAllStacks(void);
 extern sqInt printCallStack(void);
 extern void dumpPrimTraceLog(void);
 extern BOOL NSApplicationLoad(void);
+extern void pushOutputFile(char *);
+extern void popOutputFile(void);
 
+static void reportStackState(char *, char *, int, ucontext_t *);
+static void block();
+static void *printRegisterState(ucontext_t *);
+
 /* Print an error message, possibly a stack trace, and exit. */
 /* Disable Intel compiler inlining of error which is used for breakpoints */
 #pragma auto_inline off
@@ -86,33 +95,26 @@
 void
 error(char *msg)
 {
-	/* flag prevents recursive error when trying to print a broken stack */
-	static sqInt printingStack = false;
-	
-	printf("\n%s\n\n", msg);
-	
-	if (ioOSThreadsEqual(ioCurrentOSThread(),getVMOSThread())) {
-		if (!printingStack) {
-			printingStack = true;
-			printf("\n\nSmalltalk stack dump:\n");
-			printCallStack();
-		}
-	}
-	else
-		printf("\nCan't dump Smalltalk stack. Not in VM thread\n");
-	printf("\nMost recent primitives\n");
-# if COGVM
-    dumpPrimTraceLog();
-# endif
+	reportStackState(msg,0,0,0);
+	if (blockOnError) block();
 	abort();
 }
 #pragma auto_inline on
 
-/*
- * Signal handlers
- *
- */
+static void
+block()
+{ struct timespec while_away_the_hours;
+  char pwd[PATH_MAX+1];
 
+	printf("blocking e.g. to allow attaching debugger\n");
+	printf("pid: %d pwd: %s vm:%s\n",
+			(int)getpid(), getcwd(pwd,PATH_MAX+1), argVec[0]);
+	while (1) {
+		while_away_the_hours.tv_sec = 3600;
+		nanosleep(&while_away_the_hours, 0);
+	}
+}
+
 /* Print an error message, possibly a stack trace, do /not/ exit.
  * Allows e.g. writing to a log file and stderr.
  */
@@ -125,28 +127,43 @@
 # endif
 	/* flag prevents recursive error when trying to print a broken stack */
 	static sqInt printingStack = false;
-    
+
 	printf("\n%s%s%s\n\n", msg, date ? " " : "", date ? date : "");
 # if COGVM
     printf("%s\n\n", sourceVersionString('\n'));
 # endif
-    
+
 # if !defined(NOEXECINFO)
-	printf("C stack backtrace:\n");
+	printf("C stack backtrace & registers:\n");
+	if (uap) {
+		addrs[0] = printRegisterState(uap);
+		depth = 1 + backtrace(addrs + 1, BACKTRACE_DEPTH);
+	}
+	else
+		depth = backtrace(addrs, BACKTRACE_DEPTH);
+#	if 1 /* Mac OS's backtrace_symbols_fd prints NULL byte droppings each line */
 	fflush(stdout); /* backtrace_symbols_fd uses unbuffered i/o */
-	depth = backtrace(addrs, BACKTRACE_DEPTH);
 	backtrace_symbols_fd(addrs, depth, fileno(stdout));
+#	else
+	{ int i; char **strings;
+	  strings = backtrace_symbols(addrs, depth);
+	  printf("(%s)\n", strings[0]);
+	  for (i = 1; i < depth; i++)
+		printf("%s\n", strings[i]);
+	}
+#	endif
 # endif
-    
+
 	if (ioOSThreadsEqual(ioCurrentOSThread(),getVMOSThread())) {
 		if (!printingStack) {
 # if COGVM
-			/* If we're in generated machine code then the only way the stack
-			 * dump machinery has of giving us an accurate report is if we set
-			 * stackPointer & framePointer to the native stack & frame pointers.
-			 */
+		/* If we're in generated machine code then the only way the stack
+		 * dump machinery has of giving us an accurate report is if we set
+		 * stackPointer & framePointer to the native stack & frame pointers.
+		 */
+		extern void ifValidWriteBackStackPointersSaveTo(void*,void*,char**,char**);
 # if __APPLE__ && __MACH__ && __i386__
-            /* see sys/ucontext.h; two different namings */
+	/* see sys/ucontext.h; two different namings */
 #	if __GNUC__ && !__INTEL_COMPILER /* icc pretends to be gcc */
 			void *fp = (void *)(uap ? uap->uc_mcontext->__ss.__ebp: 0);
 			void *sp = (void *)(uap ? uap->uc_mcontext->__ss.__esp: 0);
@@ -161,10 +178,10 @@
 #	error need to implement extracting pc from a ucontext_t on this system
 # endif
 			char *savedSP, *savedFP;
-            
+
 			ifValidWriteBackStackPointersSaveTo(fp,sp,&savedFP,&savedSP);
 # endif
-            
+
 			printingStack = true;
 			if (printAll) {
 				printf("\n\nAll Smalltalk process stacks (active first):\n");
@@ -186,21 +203,57 @@
 # if STACKVM
 	printf("\nMost recent primitives\n");
 	dumpPrimTraceLog();
+#	if COGVM
+	printf("\n");
+	reportMinimumUnusedHeadroom();
+#	endif
 # endif
 	printf("\n\t(%s)\n", msg);
 	fflush(stdout);
 }
 
+/* Attempt to dump the registers to stdout.  Only do so if we know how. */
+static void *
+printRegisterState(ucontext_t *uap)
+{
+#if __DARWIN_UNIX03 && __APPLE__ && __MACH__ && __i386__
+	_STRUCT_X86_THREAD_STATE32 *regs = &uap->uc_mcontext->__ss;
+	printf(	"\teax 0x%08x ebx 0x%08x ecx 0x%08x edx 0x%08x\n"
+			"\tedi 0x%08x esi 0x%08x ebp 0x%08x esp 0x%08x\n"
+			"\teip 0x%08x\n",
+			regs->__eax, regs->__ebx, regs->__ecx, regs->__edx,
+			regs->__edi, regs->__edi, regs->__ebp, regs->__esp,
+			regs->__eip);
+	return (void *)(regs->__eip);
+#elif __APPLE__ && __MACH__ && __i386__
+	_STRUCT_X86_THREAD_STATE32 *regs = &uap->uc_mcontext->ss;
+	printf(	"\teax 0x%08x ebx 0x%08x ecx 0x%08x edx 0x%08x\n"
+			"\tedi 0x%08x esi 0x%08x ebp 0x%08x esp 0x%08x\n"
+			"\teip 0x%08x\n",
+			regs->eax, regs->ebx, regs->ecx, regs->edx,
+			regs->edi, regs->edi, regs->ebp, regs->esp,
+			regs->eip);
+	return (void *)(regs->eip);
+#else
+	printf("don't know how to derive register state from a ucontext_t on this platform\n");
+	return 0;
+#endif
+}
 static void
 getCrashDumpFilenameInto(char *buf)
 {
     char *slash;
-    
+
     strcpy(buf,imageName);
     slash = strrchr(buf,'/');
     strcpy(slash ? slash + 1 : buf, "crash.dmp");
 }
 
+/*
+ * Signal handlers
+ *
+ */
+
 void
 sigusr1(int sig, siginfo_t *info, void *uap)
 {
@@ -208,21 +261,20 @@
 	time_t now = time(NULL);
 	char ctimebuf[32];
 	char crashdump[imageNameSize()+1];
-	unsigned long pc;
-    
+
 	if (!ioOSThreadsEqual(ioCurrentOSThread(),getVMOSThread())) {
 		pthread_kill(getVMOSThread(),sig);
 		errno = saved_errno;
 		return;
 	}
-    
+
 	getCrashDumpFilenameInto(crashdump);
 	ctime_r(&now,ctimebuf);
 	pushOutputFile(crashdump);
 	reportStackState("SIGUSR1", ctimebuf, 1, uap);
 	popOutputFile();
 	reportStackState("SIGUSR1", ctimebuf, 1, uap);
-    
+
 	errno = saved_errno;
 }
 
@@ -232,7 +284,7 @@
 	time_t now = time(NULL);
 	char ctimebuf[32];
 	char crashdump[imageNameSize()+1];
-    
+
 	getCrashDumpFilenameInto(crashdump);
 	ctime_r(&now,ctimebuf);
 	pushOutputFile(crashdump);
@@ -245,10 +297,10 @@
 void
 sigsegv(int sig, siginfo_t *info, void *uap)
 {
-    
+
     /* error("Segmentation fault"); */
     static int printingStack= 0;
-    
+
     printf("\nSegmentation fault\n\ns");
     if (!printingStack) {
         printingStack= 1;
@@ -267,12 +319,14 @@
 attachToSignals() {
 #if COGVM
 	struct sigaction sigusr1_handler_action, sigsegv_handler_action;
-        
+
+	if (gNoSignalHandlers) return;
+
     sigsegv_handler_action.sa_sigaction = sigsegv;
     sigsegv_handler_action.sa_flags = SA_NODEFER | SA_SIGINFO;
     sigemptyset(&sigsegv_handler_action.sa_mask);
     (void)sigaction(SIGSEGV, &sigsegv_handler_action, 0);
-        
+
     sigusr1_handler_action.sa_sigaction = sigusr1;
     sigusr1_handler_action.sa_flags = SA_NODEFER | SA_SIGINFO;
     sigemptyset(&sigusr1_handler_action.sa_mask);
@@ -306,7 +360,7 @@
  * a) Answer whether the C frame pointer is in use, for capture of the C stack
  *    pointers.
  */
-# if defined(i386) || defined(__i386) || defined(__i386__)
+
 /*
  * Cog has already captured CStackPointer  before calling this routine.  Record
  * the original value, capture the pointers again and determine if CFramePointer
@@ -320,13 +374,12 @@
 	extern unsigned long CStackPointer, CFramePointer;
 	extern void (*ceCaptureCStackPointers)(void);
 	unsigned long currentCSP = CStackPointer;
-	
+
 	currentCSP = CStackPointer;
 	ceCaptureCStackPointers();
 	assert(CStackPointer < currentCSP);
 	return CFramePointer >= CStackPointer && CFramePointer <= currentCSP;
 }
-# endif /* defined(i386) || defined(__i386) || defined(__i386__) */
 
 
 /* Answer an approximation of the size of the redzone (if any).  Do so by
@@ -341,7 +394,7 @@
 static char *p = 0;
 
 static void
-sighandler(int sig) { p = (char *)&sig; }
+sighandler(int sig, siginfo_t *info, void *uap) { p = (char *)&sig; }
 
 static int
 getRedzoneSize()

Modified: branches/Cog/platforms/iOS/vm/Common/main.m
===================================================================
--- branches/Cog/platforms/iOS/vm/Common/main.m	2015-11-26 21:16:03 UTC (rev 3507)
+++ branches/Cog/platforms/iOS/vm/Common/main.m	2015-11-30 20:14:11 UTC (rev 3508)
@@ -46,7 +46,7 @@
 	extern char **envVec;
 	
 	argCnt = argc;
-	argVec= argv;
+	argVec = argv;
 	envVec = envp;
 	
     return NSApplicationMain(argc,  (const char **) argv);

Copied: branches/Cog/platforms/iOS/vm/Common/version.c (from rev 3503, branches/Cog/platforms/Mac OS/vm/version.c)
===================================================================
--- branches/Cog/platforms/iOS/vm/Common/version.c	                        (rev 0)
+++ branches/Cog/platforms/iOS/vm/Common/version.c	2015-11-30 20:14:11 UTC (rev 3508)
@@ -0,0 +1,15 @@
+#if !defined __VERSION__
+#	define __VERSION__ "Unknown"
+#endif
+
+#if !defined(TZ)
+# define TZ ""
+# define SPACER ""
+#else
+# define SPACER " "
+#endif
+
+char vmBuildString[] = \
+	"Mac OS X built on " \
+	__DATE__" "__TIME__ SPACER TZ \
+	" Compiler: " __VERSION__;

Modified: branches/Cog/platforms/iOS/vm/OSX/sqSqueakOSXApplication+attributes.m
===================================================================
--- branches/Cog/platforms/iOS/vm/OSX/sqSqueakOSXApplication+attributes.m	2015-11-26 21:16:03 UTC (rev 3507)
+++ branches/Cog/platforms/iOS/vm/OSX/sqSqueakOSXApplication+attributes.m	2015-11-30 20:14:11 UTC (rev 3508)
@@ -15,10 +15,10 @@
  copies of the Software, and to permit persons to whom the
  Software is furnished to do so, subject to the following
  conditions:
- 
+
  The above copyright notice and this permission notice shall be
  included in all copies or substantial portions of the Software.
- 
+
  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
  OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
@@ -27,7 +27,7 @@
  WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
  OTHER DEALINGS IN THE SOFTWARE.
- 
+
  The end-user documentation included with the redistribution, if any, must include the following acknowledgment: 
  "This product includes software developed by Corporate Smalltalk Consulting Ltd (http://www.smalltalkconsulting.com) 
  and its contributors", in the same place and form as other third-party acknowledgments. 
@@ -48,107 +48,73 @@
 	//indexNumber is a postive/negative number
 #warning to test
 	switch (indexNumber) {
-        case 1001: /* OS type: "unix", "win32", "mac", ... */
-			return "Mac OS";
-			 
-		case 1002:  { /* OS name: "solaris2.5" on unix, "win95" on win32, ... */
-			SInt32 myattr;
-			static char data[32];
-			
-			Gestalt(gestaltSystemVersion, &myattr);
-			sprintf(data,"%X",(unsigned int) myattr);
-			return data;
+	case 1001: /* OS type: "unix", "win32", "mac", ... */
+		return "Mac OS";
+
+	case 1002:  { /* OS name: "solaris2.5" on unix, "win95" on win32, ... */
+		SInt32 myattr;
+		static char data[32];
+
+		Gestalt(gestaltSystemVersion, &myattr);
+		sprintf(data,"%X",(unsigned int) myattr);
+		return data;
+	}
+	case 1003: { /* processor architecture: "68k", "x86", "PowerPC", ...  */
+		SInt32 myattr;
+
+		Gestalt(gestaltSysArchitecture, &myattr);
+		if (myattr == gestalt68k) 
+			return "68K";
+		if (myattr == gestaltPowerPC) 
+			return "powerpc";
+		if (myattr == gestaltIntel) 
+			return "intel";
+
+		return "unknown";
+	}
+
+#if 0 /* see iOS/vm/Common/Classes/sqSqueakMainApplication+attributes.m */
+   if (id == 1004) {
+		CFBundleRef mainBundle;
+		CFStringRef versionString;
+		static char data[255];
+		mainBundle = CFBundleGetMainBundle ();
+		versionString = CFBundleGetValueForInfoDictionaryKey(mainBundle, CFSTR("CFBundleShortVersionString"));
+		bzero(data,255);
+		strcat(data,interpreterVersion);
+		if (versionString) {
+			strcat(data," ");
+			CFStringGetCString (versionString, data+strlen(data), 255-strlen(data), gCurrentVMEncoding);
 		}
-		case 1003: { /* processor architecture: "68k", "x86", "PowerPC", ...  */
-			SInt32 myattr;
-			
-			Gestalt(gestaltSysArchitecture, &myattr);
-			if (myattr == gestalt68k) 
-				return "68K";
-			if (myattr == gestaltPowerPC) 
-				return "powerpc";
-			if (myattr == gestaltIntel) 
-				return "intel";
-			
-			return "unknown";
-		}
-			
-		case 1005: {
-			return "Aqua";
-		}
-			
-			
-		case 1006:  {/* vm build string also info.plist */
-#if (SQ_VI_BYTES_PER_WORD == 4)
-			
-#if STACKVM
-			
-			return "Mac Cocoa Cog 5.8b12 21-Sep-10 >1B0534FA-246C-47C5-AB29-7A76C81CCDCB<";
-//			return "Mac Cocoa Cog 5.8b11 12-Sep-10 >9BFC792A-F173-4C65-AD2A-FFFB1D52DAC2<";
-//			return "Mac Cocoa Cog 5.8b10 07-Sep-10 >8AD3A516-DBAC-4CD4-BC89-8F21317DF7E1<";
-//			return "Mac Cocoa Cog 5.8b9 06-Sep-10 >01641B99-1842-4422-A99D-43153BEDEFFA<";
-//			return "Mac Cocoa Cog 5.8b8 04-Sep-10 >8A66B7E0-B578-4E5F-97B4-6195547A35F5<";
-//			return "Mac Cocoa Cog 5.8b7 02-Sep-10 >4EBF00E3-453E-4010-9AC8-6B64C292984B<";
-//			return "Mac Cocoa Cog 5.8b6 31-Aug-10 >DFB49E57-40FB-44B9-97D3-B7CA51608429<";
-//			return "Mac Cocoa Cog 5.8b5 30-Aug-10 >0A92B82A-9AC1-4B0E-9DEE-440C3FFAE568<";
-//			return "Mac Cocoa Cog 5.8b4 27-Aug-10 >5954D562-FB39-4195-9D19-EBB49FAECCF7<";
-//			return "Mac Cocoa Cog 5.8b3 21-Aug-10 >5954D562-FB39-4195-9D19-EBB49FAECCF7<";
-//			return "Mac Cocoa Cog 5.8b2 08-Jul-10 >7BCAB029-A835-4D12-946D-4AB7083D2955<";
-//			return "Mac Cocoa Cog 5.8b1 07-Jul-10 >529F6B5A-DC81-4C1F-81B6-3D99741B954A<";
-#else
-			return "Mac Cocoa 5.7b3 27-Aug-10 >7BCAB029-A835-4D12-946D-4AB7083D2955<";
-//			return "Mac Cocoa 5.7b2 08-Jul-10 >7BCAB029-A835-4D12-946D-4AB7083D2955<";
-//			return "Mac Cocoa 5.7b1 15-Jun-10 >34286DE5-3BD3-40D8-9700-4C41C772B16B<";
+		return data;            
+	}
 #endif
-//			return "Mac Cocoa 5.7b1 15-Jun-10 >34286DE5-3BD3-40D8-9700-4C41C772B16B<";
-//			return "Mac Cocoa 5.6b1 02-Mar-10 >9E99B1C2-0B6B-4944-8B6F-74030D14F3C6<";
-//			return "Mac Cocoa 5.5b1 16-Feb-10 >2EE2964B-462A-4F66-92AF-C810216EF798<";
-//			return "Mac Cocoa 5.4b2 24-Jan-10 >2EE2964B-462A-4F66-92AF-C810216EF798<";
-//			return "Mac Cocoa 5.4b1 20-Jan-10 >F0EB07E3-7805-4C09-8419-D8316F7ADC21<";
-//			return "Mac Cocoa 5.3b1 06-Jan-10 >0DADC752-8E86-48FC-8D6B-CC97482C6851<";
-//			return "Mac Cocoa 5.2b3 05-Jan-10 >1618879A-3D07-427F-A8CB-5B3DF73ED840<";
-//			return "Mac Cocoa 5.2b2 04-Jan-10 >94E27C49-8575-4604-A2C4-0A5C659CC734<";
-//			return "Mac Cocoa 5.2b1 02-Jan-10 >D94A0034-7415-4AA1-AA7C-B35BBCDBA0D4<";
-//			return "Mac Cocoa 5.1b1 25-Dec-09 >C0908D0B-4D97-47CA-9FAB-479AFC6BA978<";
-//			return "Mac Cocoa 5.0b9 02-Dec-09 >C8598ABA-DA73-4A71-836C-62C4369D5A0F<";
-#else
-			return "Mac Cocoa 5.7b2 64/64 bits 08-Jul-10 >7BCAB029-A835-4D12-946D-4AB7083D2955<";
-//			return "Mac Cocoa 5.7b1 64/64 bits 15-Jun-10 >34286DE5-3BD3-40D8-9700-4C41C772B16B<";
-//			return "Mac Cocoa 5.6b1 64/64 bits 02-Mar-10 >9E99B1C2-0B6B-4944-8B6F-74030D14F3C6<";
-//			return "Mac Cocoa 5.5b1 64/64 bits 16-Feb-10 >70984CDA-9482-4E7F-BCF0-08C635E0A7BF<";
-//			return "Mac Cocoa 5.4b2 64/64 bits 24-Jan-10 >70984CDA-9482-4E7F-BCF0-08C635E0A7BF<";
-//			return "Mac Cocoa 5.4b1 64/64 bits 20-Jan-10 >E27846BC-15A7-4BE8-B467-B645E9D37163<";
-//			return "Mac Cocoa 5.3b1 64/64 bits 06-Jan-10 >0DADC752-8E86-48FC-8D6B-CC97482C6851<";
-//			return "Mac Cocoa 5.2b3 64/64 bits 05-Jan-10 >1618879A-3D07-427F-A8CB-5B3DF73ED840<";
-//			return "Mac Cocoa 5.2b2 64/64 bits 04-Jan-10 >94E27C49-8575-4604-A2C4-0A5C659CC734<";
-//			return "Mac Cocoa 5.2b1 64/64 bits 02-Jan-10 >D94A0034-7415-4AA1-AA7C-B35BBCDBA0D4<";
-//			return "Mac Cocoa 5.1b1 64/64 bits 25-Dec-09 >C0908D0B-4D97-47CA-9FAB-479AFC6BA978<";
-//			return "Mac Cocoa 5.0b9 64/64 bits 02-Dec-09 >C8598ABA-DA73-4A71-836C-62C4369D5A0F<";
-//			return "Mac Cocoa 5.0b8 01-Dec-09 >2329A610-327B-403D-960E-EEF3C369D032<";
-//			return "Mac Cocoa 5.0b7 29-Nov-09 >1215B15B-9463-4D53-BA13-AA989DAB5C01<";
-//			return "Mac Cocoa 5.0b6 27-Nov-09 >CF087523-A432-4427-9AD3-4ACF26336A08<";
-//			return "Mac Cocoa 5.0b5 26-Nov-09 >9C6EF973-CECF-4E38-B5E0-BB9986A03D5D<";
-//			return "Mac Cocoa 5.0b4 26-Nov-09 >DA33132E-D7E6-48C4-8363-EB7408E3124B<";
-//			return "Mac Cocoa 5.0.0b1 11-Nov-09 >40BF8061-CC65-4E5E-9841-6BB5E809A688<";
-#endif
-		}
-		case 1007: { /* vm build string also info.plist */
+
+	case 1005: {
+		return "Aqua";
+	}
+
+	case 1006:  {/* vm build string also info.plist */
+		extern char vmBuildString[];
+		return vmBuildString;
+	}
+	case 1007: { /* vm build string also info.plist */
 #if STACKVM
-			extern char *__interpBuildInfo;
-			return __interpBuildInfo;
+		extern char *__interpBuildInfo;
+		return __interpBuildInfo;
 #endif
-			break;
-		}
-		case 1008: { /* vm build string also info.plist */
+		break;
+	}
+	case 1008: { /* vm build string also info.plist */
 # if COGVM
-			extern char *__cogitBuildInfo;
-			return __cogitBuildInfo;
+		extern char *__cogitBuildInfo;
+		return __cogitBuildInfo;
 #endif
-			break;
-		}
-		default: 
-			break;
+		break;
 	}
+	default: 
+		break;
+	}
 	return (char *) [super getAttribute: indexNumber];
 }
 @end

Modified: branches/Cog/platforms/iOS/vm/OSX/sqSqueakOSXApplication.h
===================================================================
--- branches/Cog/platforms/iOS/vm/OSX/sqSqueakOSXApplication.h	2015-11-26 21:16:03 UTC (rev 3507)
+++ branches/Cog/platforms/iOS/vm/OSX/sqSqueakOSXApplication.h	2015-11-30 20:14:11 UTC (rev 3508)
@@ -47,7 +47,7 @@
 @property (nonatomic,strong) NSCursor	*squeakCursor;
 @property (nonatomic,assign) BOOL		squeakHasCursor;
 
-- (NSInteger) parseArgument: (NSString *) argData peek: (NSString *) peek;
+- (NSInteger) parseArgument: (NSString *) argData peek: (char *) peek;
 - (void) parseArgs: (NSArray *) args;
 - (void) parseEnv: (NSDictionary *) env;
 - (long long) strtobkm: (const char *) chr;

Modified: branches/Cog/platforms/iOS/vm/OSX/sqSqueakOSXApplication.m
===================================================================
--- branches/Cog/platforms/iOS/vm/OSX/sqSqueakOSXApplication.m	2015-11-26 21:16:03 UTC (rev 3507)
+++ branches/Cog/platforms/iOS/vm/OSX/sqSqueakOSXApplication.m	2015-11-30 20:14:11 UTC (rev 3508)
@@ -36,6 +36,7 @@
  */
 //
 
+#include "sqSCCSVersion.h"
 
 #import "sqSqueakOSXApplication.h"
 #import "sqSqueakOSXFileDirectoryInterface.h"
@@ -43,6 +44,7 @@
 #import "sqSqueakOSXSoundCoreAudio.h"
 #import "sqSqueakSoundCoreAudioAPI.h"
 #import "sqSqueakOSXApplication+imageReadWrite.h"
+#import "sqSqueakOSXApplication+attributes.h"
 
 #if !defined(IMAGE_DIALECT_NAME)
 # if NewspeakVM
@@ -56,7 +58,7 @@
 # endif
 #endif
 
-usqInt gMaxHeapSize=(512*1024*1024)+(4*1024*1024); //Last part are "eden bytes" needed in the new startup
+usqInt gMaxHeapSize = 512*1024*1024;
 
 #if defined(__GNUC__) && ( defined(i386) || defined(__i386) || defined(__i386__)  \
 || defined(i486) || defined(__i486) || defined (__i486__) \
@@ -83,6 +85,7 @@
 # define mtfsfi(fpscr)
 #endif
 
+static char *getVersionInfo(int verbose);
 
 @implementation sqSqueakOSXApplication 
 @synthesize squeakHasCursor,squeakCursor;
@@ -130,9 +133,9 @@
  	[(sqSqueakOSXSoundCoreAudio *) self.soundInterfaceLogic soundInitOverride];
 
 	snd_Start(2644, 22050, 1, 0);
-	char slience[10576];
-	bzero(&slience, sizeof(slience));
-	snd_PlaySamplesFromAtLength(2644,(usqInt * ) &slience,0);
+	char silence[10576];
+	bzero(&silence, sizeof(silence));
+	snd_PlaySamplesFromAtLength(2644,(usqInt * ) &silence,0);
 	[self.soundInterfaceLogic snd_Stop_Force];
 }
 
@@ -142,67 +145,217 @@
 	[self parseEnv: [p environment]];
 }
 
-- (void) attachToSignals {
-    if (![self noHandlers]) {
-        attachToSignals();
-    }
-}
+- (int) parseArgument: (NSString *) argData peek: (char *) peek
+{
 
-- (NSInteger) parseArgument: (NSString *) argData peek: (NSString *) peek {
-	
 	if ([argData isEqualToString: @"--"]) {
 		return 1;
 	}
 
+	/* Options with no arguments */
+
 	NS_DURING;
 		if ([argData compare:  @"-psn_" options: NSLiteralSearch range: NSMakeRange(0,5)] == NSOrderedSame) {
 			return 1;
 		}
 	NS_HANDLER;
 	NS_ENDHANDLER;
-	
+
 	if ([argData isEqualToString: @"-help"]) {
 		[self usage];
 		exit(0);
 		return 1;
 	}
+	if ([argData isEqualToString: @"-version"]) {
+		printf("%s\n", getVersionInfo(0));
+		exit(0);
+		return 1;
+	}
+	if ([argData isEqualToString: @"-blockonerror"]) {
+		extern int blockOnError;
+		blockOnError = true;
+		return 1;
+	}
+	if ([argData isEqualToString: @"-blockonwarn"]) {
+		extern int blockOnError;
+		extern sqInt erroronwarn;
+		erroronwarn = blockOnError = true;
+		return 1;
+	}
+	if ([argData isEqualToString: @"-exitonwarn"]) {
+		extern sqInt erroronwarn;
+		erroronwarn = true;
+		return 1;
+	}
 	if ([argData isEqualToString: @"-headless"]) {
 		extern BOOL gSqueakHeadless;
 		gSqueakHeadless = YES;
 		return 1;
 	}
-
-    if ([argData compare: @"--nohandlers"] == NSOrderedSame){
-        [self setNoHandlers: YES];
+	if ([argData isEqualToString: @"-headfull"]) {
+		extern BOOL gSqueakHeadless;
+		gSqueakHeadless = NO;
+		return 1;
+	}
+    if ([argData isEqualToString: @"-nohandlers"]) {
+		extern BOOL gNoSignalHandlers;
+        gNoSignalHandlers = YES;
         return 1;
     }
+	if ([argData isEqualToString: @"-timephases"]) {
+		extern void printPhaseTime(int);
+		printPhaseTime(1);
+		return 1;
+	}
+#if COGVM
+	if ([argData compare:  @"-trace" options: NSLiteralSearch range: NSMakeRange(0,6)] == NSOrderedSame) {
+		extern int traceFlags;
 
+		if ([argData length] == 6) {
+			traceFlags = 1;
+			return 1;
+		}
+		if ([argData length] <= 7
+		 || [argData characterAtIndex: 6] != '='
+		 || !isdigit([argData characterAtIndex: 7]))
+			return 0;
+
+		traceFlags = atoi([argData UTF8String] + 7);
+		return 1;
+	}
+	if ([argData isEqualToString: @"-tracestores"]) { 
+		extern sqInt traceStores;
+		traceStores = 1;
+		return 1;
+	}
+#endif
+#if STACKVM
+	if ([argData isEqualToString: @"-checkpluginwrites"]) { 
+		extern sqInt checkAllocFiller;
+		checkAllocFiller = 1;
+		return 1;
+	}
+	if ([argData isEqualToString: @"-noheartbeat"]) { 
+		extern sqInt suppressHeartbeatFlag;
+		suppressHeartbeatFlag = 1;
+		return 1;
+	}
+	if ([argData isEqualToString: @"-warnpid"]) { 
+		extern sqInt warnpid;
+		warnpid = getpid();
+		return 1;
+	}
+	if ([argData isEqualToString: @"-reportheadroom"]
+	 || [argData isEqualToString: @"-rh"]) { 
+		extern sqInt reportStackHeadroom;
+		reportStackHeadroom = 1;
+		return 1;
+	}
+#endif
+
+	/* Options with arguments */
+	if (!peek)
+		return 0;
+
 	if ([argData isEqualToString: @"-memory"]) {
-		gMaxHeapSize = (usqInt) [self strtobkm: [peek UTF8String]];
+		gMaxHeapSize = (usqInt) [self strtobkm: peek];
 		return 2;
 	}
     
     if ([argData isEqualToString: @"-NSDocumentRevisionsDebugMode"]) {
         return 2;
     }
-    
+
+#if STACKVM || NewspeakVM
+	if ([argData isEqualToString: @"-breaksel"]) { 
+		extern void setBreakSelector(char *);
+		setBreakSelector(peek);
+		return 2;
+	}
+#endif
+#if STACKVM
+	if ([argData isEqualToString: @"-breakmnu"]) { 
+		extern void setBreakMNUSelector(char *);
+		setBreakMNUSelector(peek);
+		return 2;
+	}
+	if ([argData isEqualToString: @"-eden"]) { 
+		extern sqInt desiredEdenBytes;
+		desiredEdenBytes = [self strtobkm: peek]; 
+		return 2;
+	}
+	if ([argData isEqualToString: @"-leakcheck"]) { 
+		extern sqInt checkForLeaks;
+		checkForLeaks = atoi(peek);		 
+		return 2;
+	}
+	if ([argData isEqualToString: @"-stackpages"]) { 
+		extern sqInt desiredNumStackPages;
+		desiredNumStackPages = atoi(peek);		 
+		return 2;
+	}
+	if ([argData isEqualToString: @"-numextsems"]) { 
+		ioSetMaxExtSemTableSize(atoi(peek));
+		return 2;
+	}
+	if ([argData isEqualToString: @"-pollpip"]) { 
+		extern sqInt pollpip;
+		pollpip = atoi(peek);		 
+		return 2;
+	}
+#endif /* STACKVM */
+#if COGVM
+	if ([argData isEqualToString: @"-codesize"]) { 
+		extern sqInt desiredCogCodeSize;
+		desiredCogCodeSize = [self strtobkm: peek];		 
+		return 2;
+	}
+	if ([argData isEqualToString: @"-dpcso"]) { 
+		extern unsigned long debugPrimCallStackOffset;
+		debugPrimCallStackOffset = (unsigned long)[self strtobkm: peek];		 
+		return 2;
+	}
+	if ([argData isEqualToString: @"-cogmaxlits"]) { 
+		extern sqInt maxLiteralCountForCompile;
+		maxLiteralCountForCompile = [self strtobkm: peek];		 
+		return 2;
+	}
+	if ([argData isEqualToString: @"-cogminjumps"]) { 
+		extern sqInt minBackwardJumpCountForCompile;
+		minBackwardJumpCountForCompile = [self strtobkm: peek];		 
+		return 2;
+	}
+#endif /* COGVM */
+#if SPURVM
+	if ([argData isEqualToString: @"-maxoldspace"]) { 
+		extern unsigned long maxOldSpaceSize;
+		maxOldSpaceSize = (unsigned long)[self strtobkm: peek];		 
+		return 2;
+	}
+#endif
+#if 0 /* Not sure if encoding is an issue with the Cocoa VM. eem 2015-11-30 */
+	if ([argData isEqualToString: @"-pathenc"]) { 
+		setEncodingType(peek);
+		return 2;
+	}
+#endif
 	return 0;
 }
 
+
 - (void) parseArgs: (NSArray *) args {
 	commandLineArguments = [args copyWithZone:null];
 	argsArguments = [[NSMutableArray alloc] initWithCapacity: [args count]];
-	
+
 	if ([args count] < 2) 
 		return;
 	NSMutableArray *revisedArgs = AUTORELEASEOBJ([args mutableCopyWithZone: NULL]);
 	[revisedArgs removeObjectAtIndex:0];
-	
-	NSUInteger i,result;
+
+	int i;
 	BOOL optionsCompleted = NO;
-	for (i=0; i<[revisedArgs count]; i++) {
+	for (i = 0; i < [revisedArgs count]; i++) {
 		NSString *argData = revisedArgs[i];
-		NSString *peek = (i == ([revisedArgs count] - 1)) ? @"" : revisedArgs[i+1];
 		if ([argData isEqualToString: @"--"]) {
 			optionsCompleted = YES;
 			continue;
@@ -210,26 +363,27 @@
 		if (!optionsCompleted && ![[argData substringToIndex: 1] isEqualToString: @"-"]) {
 			optionsCompleted = YES;
 			//guessing first parameter as image name
-			if ([argData compare: @"--"] != NSOrderedSame) {
+			if ([argData compare: @"--"] != NSOrderedSame)
                 [self setImageNamePathIfItWasReadable:argData];
-			} else {
+			else
 				continue;
-			}
 			continue;
 		}
-		if (optionsCompleted) {
+		if (optionsCompleted)
 			[self.argsArguments addObject: argData];
-		} else {
-			result = [self parseArgument: argData peek: peek];
-			if (result == 0)			/* option not recognised */ {
+		else {
+			int result = [self parseArgument: argData
+								peek: (char *)(i >= ([revisedArgs count] - 1)
+										? 0
+										: [revisedArgs[i+1] UTF8String])];
+			if (result == 0) {	/* option not recognised */
 				fprintf(stderr, "unknown option: %s\n", [argData UTF8String]);
 				[self usage];
 				exit(1);
 			}
-			if (result == 2)
-				i++;
+			if (result > 1)
+				i += result - 1;
 		}
-		
 	}
 }
 
@@ -259,27 +413,76 @@
 		gMaxHeapSize = (usqInt) [self strtobkm: [memoryString UTF8String]];
 	}
 }
-   
+
 - (void) usage {
-	printf("Usage: [<option>...] [<imageName> [<argument>...]]\n");
-	printf("       [<option>...] -- [<argument>...]\n");
+	extern char **argVec;
+	printf("Usage: %s [<option>...] [<imageName> [<argument>...]]\n", argVec[0]);
+	printf("       %s [<option>...] -- [<argument>...]\n", argVec[0]);
 	[self printUsage];
 	printf("\nNotes:\n");
-	printf("  <imageName> defaults to `%s'.\n", DEFAULT_IMAGE_NAME);
+	//printf("  <imageName> defaults to `%s'.\n", DEFAULT_IMAGE_NAME);
+	printf("  <imageName> defaults to `" DEFAULT_IMAGE_NAME "'.\n");
 	[self printUsageNotes];
+	// exit(1);
 }
 
 - (void) printUsage {
 	printf("\nCommon <option>s:\n");
-	printf("  --help                 print this help message, then exit\n");
-	printf("  --memory <size>[mk]    use fixed heap size (added to image size)\n");
-	printf("  --headless             run in headless (no window) mode (default: false)\n");
-    printf("  --nohandlers           disable sigsegv & sigusr1 handlers\n");
+	printf("  -help                 print this help message, then exit\n");
+	printf("  -memory <size>[mk]    use fixed heap size (added to image size)\n");
+    printf("  -nohandlers           disable sigsegv & sigusr1 handlers\n");
+	printf("  -timephases           print start load and run times\n");
+#if STACKVM || NewspeakVM
+	printf("  -breaksel selector    set breakpoint on send of selector\n");
+#endif
+#if STACKVM
+	printf("  -breakmnu selector    set breakpoint on MNU of selector\n");
+	printf("  -eden <size>[mk]      set eden memory to bytes\n");
+	printf("  -leakcheck num        check for leaks in the heap\n");
+	printf("  -stackpages num       use n stack pages\n");
+	printf("  -numextsems num       make the external semaphore table num in size\n");
+	printf("  -noheartbeat          disable the heartbeat for VM debugging. disables input\n");
+	printf("  -pollpip              output . on each poll for input\n");
+	printf("  -checkpluginwrites    check for writes past end of object in plugins\n");
+#endif
+#if STACKVM || NewspeakVM
+# if COGVM
+	printf("  -trace[=num]          enable tracing (optionally to a specific value)\n");
+# else
+	printf("  -sendtrace            enable send tracing\n");
+# endif
+	printf("  -warnpid              print pid in warnings\n");
+#endif
+#if COGVM
+	printf("  -codesize <size>[mk]  set machine code memory to bytes\n");
+	printf("  -tracestores          enable store tracing (assert check stores)\n");
+	printf("  -cogmaxlits <n>       set max number of literals for methods to be compiled to machine code\n");
+	printf("  -cogminjumps <n>      set min number of backward jumps for interpreted methods to be considered for compilation to machine code\n");
+	printf("  -reportheadroom       report unused stack headroom on exit\n");
+#endif
+#if SPURVM
+	printf("  -maxoldspace <size>[mk]      set max size of old space memory to bytes\n");
+#endif
+#if 0 /* Not sure if encoding is an issue with the Cocoa VM. eem 2015-11-30 */
+	printf("  -pathenc <enc>        set encoding for pathnames (default: %s)\n",
+		getEncodingType([self currentVMEncoding]));
+#endif
+	printf("  -headless             run in headless (no window) mode (default: false)\n");
+	printf("  -headfull             run in headful (window) mode (default: true)\n");
+	printf("  -version              print version information, then exit\n");
+
+	printf("  -blockonerror         on error or segv block, not exit.  useful for attaching gdb\n");
+	printf("  -blockonwarn          on warning block, don't warn.  useful for attaching gdb\n");
+	printf("  -exitonwarn           treat warnings as errors, exiting on warn\n");
 }
 
 - (void) printUsageNotes
 {
+#if SPURVM
+	printf("  If `-memory' or '-maxoldspace' are not specified then the heap will grow dynamically.\n");
+#else
 	printf("  If `-memory' is not specified then the heap will grow dynamically.\n");
+#endif
 	printf("  <argument>s are ignored, but are processed by the Squeak image.\n");
 	printf("  The first <argument> normally names a Squeak `script' to execute.\n");
 	printf("  Precede <arguments> by `--' to use default image.\n");
@@ -289,21 +492,81 @@
 {
  	NSFileManager *dfm = [NSFileManager defaultManager];
 	BOOL isDirectory;
-	
+
 	[dfm fileExistsAtPath: filePath isDirectory: &isDirectory];
 
 	if (isDirectory) 
 		return NO;
 
 	BOOL fileIsReadable = [[NSFileManager defaultManager] isReadableFileAtPath: filePath];
-	
+
 	if (fileIsReadable == NO)
 		return NO;
 
 	if ([[[filePath lastPathComponent] pathExtension] compare: @"image" options: NSCaseInsensitiveSearch] ==   NSOrderedSame)
 		return YES;
-	
+
 	return NO;
 }
 
 @end
+
+static char *
+getVersionInfo(int verbose)
+{
+#if STACKVM
+  extern char *__interpBuildInfo;
+# define INTERP_BUILD __interpBuildInfo
+# if COGVM
+  extern char *__cogitBuildInfo;
+# endif
+#else
+# define INTERP_BUILD interpreterVersion
+#endif
+  extern char vmBuildString[];
+  CFStringRef versionString;
+  char *info= (char *)malloc(4096);
+  info[0]= '\0';
+
+#if SPURVM
+# if BytesPerOop == 8
+#	define ObjectMemory " Spur 64-bit"
+# else
+#	define ObjectMemory " Spur"
+# endif
+#else
+# define ObjectMemory
+#endif
+#if defined(NDEBUG)
+# define BuildVariant "Production" ObjectMemory
+#elif DEBUGVM
+# define BuildVariant "Debug" ObjectMemory
+# else
+# define BuildVariant "Assert" ObjectMemory
+#endif
+
+  if (verbose)
+    sprintf(info+strlen(info), IMAGE_DIALECT_NAME " VM version: ");
+  sprintf(info+strlen(info), "%s ", VM_VERSION);
+  if ((versionString = CFBundleGetValueForInfoDictionaryKey(
+						CFBundleGetMainBundle(),
+						CFSTR("CFBundleVersion"))))
+#if 0 /* Not sure if encoding is an issue with the Cocoa VM. eem 2015-11-30 */
+    CFStringGetCString(versionString, info+strlen(info), 4095-strlen(info), gCurrentVMEncoding);
+#else
+    CFStringGetCString(versionString, info+strlen(info), 4095-strlen(info), kCFStringEncodingUTF8);
+#endif
+  sprintf(info+strlen(info), " %s [" BuildVariant " VM]\n", vmBuildString);
+  if (verbose)
+    sprintf(info+strlen(info), "Built from: ");
+  sprintf(info+strlen(info), "%s\n", INTERP_BUILD);
+#if COGVM
+  if (verbose)
+    sprintf(info+strlen(info), "With: ");
+  sprintf(info+strlen(info), "%s\n", __cogitBuildInfo); /* __cogitBuildInfo */
+#endif
+  if (verbose)
+    sprintf(info+strlen(info), "Revision: ");
+  sprintf(info+strlen(info), "%s\n", sourceVersionString('\n'));
+  return info;
+}

Modified: branches/Cog/platforms/unix/vm/sqUnixMain.c
===================================================================
--- branches/Cog/platforms/unix/vm/sqUnixMain.c	2015-11-26 21:16:03 UTC (rev 3507)
+++ branches/Cog/platforms/unix/vm/sqUnixMain.c	2015-11-30 20:14:11 UTC (rev 3508)
@@ -1585,7 +1585,11 @@
 
 static void vm_printUsageNotes(void)
 {
-  printf("  If `-memory' is not specified then the heap will grow dynamically.\n");
+#if SPURVM
+	printf("  If `-memory' or '-maxoldspace' are not specified then the heap will grow dynamically.\n");
+#else
+	printf("  If `-memory' is not specified then the heap will grow dynamically.\n");
+#endif
   printf("  <argument>s are ignored, but are processed by the " IMAGE_DIALECT_NAME " image.\n");
   printf("  The first <argument> normally names a " IMAGE_DIALECT_NAME " `script' to execute.\n");
   printf("  Precede <arguments> by `--' to use default image.\n");
@@ -2111,7 +2115,7 @@
  * b) answer the amount of stack room to ensure in a Cog stack page, including
  *    the size of the redzone, if any.
  */
-# if defined(i386) || defined(__i386) || defined(__i386__)
+
 /*
  * Cog has already captured CStackPointer  before calling this routine.  Record
  * the original value, capture the pointers again and determine if CFramePointer
@@ -2131,22 +2135,7 @@
 	assert(CStackPointer < currentCSP);
 	return CFramePointer >= CStackPointer && CFramePointer <= currentCSP;
 }
-# endif /* defined(i386) || defined(__i386) || defined(__i386__) */
-# if defined(__arm__) || defined(__arm32__) || defined(ARM32)
-/* Currently pretty sure fp is used but prepared to be shown wrong */
- int
-isCFramePointerInUse()
-{
-	extern unsigned long CStackPointer, CFramePointer;
-	extern void (*ceCaptureCStackPointers)(void);
-	unsigned long currentCSP = CStackPointer;
 
-	currentCSP = CStackPointer;
-	ceCaptureCStackPointers();
-	assert(CStackPointer < currentCSP);
-	return CFramePointer >= CStackPointer && CFramePointer <= currentCSP;
-}
-#endif /* defined(__arm__) || defined(__arm32__) || defined(ARM32) */
 /* Answer an approximation of the size of the redzone (if any).  Do so by
  * sending a signal to the process and computing the difference between the
  * stack pointer in the signal handler and that in the caller. Assumes stacks
@@ -2159,7 +2148,7 @@
 static char * volatile p = 0;
 
 static void
-sighandler(int sig) { p = (char *)&sig; }
+sighandler(int sig, siginfo_t *info, void *uap) { p = (char *)&sig; }
 
 static int
 getRedzoneSize()



More information about the Vm-dev mailing list