[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