[Vm-dev] [commit] r2492 - In the Newspeak VM,
don't cd to the image's directory on win32. Fix off-by-one
commits at squeakvm.org
commits at squeakvm.org
Fri Sep 9 22:36:04 UTC 2011
Author: eliot
Date: 2011-09-09 15:36:04 -0700 (Fri, 09 Sep 2011)
New Revision: 2492
Modified:
branches/Cog/nscogsrc/plugins/Win32OSProcessPlugin/Win32OSProcessPlugin.c
branches/Cog/platforms/Cross/vm/sqSCCSVersion.h
branches/Cog/platforms/win32/vm/sqWin32Intel.c
branches/Cog/src/plugins/Win32OSProcessPlugin/Win32OSProcessPlugin.c
Log:
In the Newspeak VM, don't cd to the image's directory on win32. Fix off-by-one
error in Win32OSProcessPlugin>primitiveGetCurrentWorkingDirectory so it doesn't
include an erroneous trailing null.
Modified: branches/Cog/nscogsrc/plugins/Win32OSProcessPlugin/Win32OSProcessPlugin.c
===================================================================
--- branches/Cog/nscogsrc/plugins/Win32OSProcessPlugin/Win32OSProcessPlugin.c 2011-09-06 23:44:23 UTC (rev 2491)
+++ branches/Cog/nscogsrc/plugins/Win32OSProcessPlugin/Win32OSProcessPlugin.c 2011-09-09 22:36:04 UTC (rev 2492)
@@ -1,9 +1,9 @@
/* Automatically generated by
- VMPluginCodeGenerator VMMaker.oscog-eem.105 uuid: 79234f80-ee6a-404c-9e5c-2134e3b76463
+ VMPluginCodeGenerator * VMMaker.oscog-eem.123 uuid: 9c524903-b0c7-46a8-a37a-5dfda6fcd1f3
from
- Win32OSProcessPlugin VMConstruction-Plugins-OSProcessPlugin.oscog-eem.31 uuid: b7c551ed-5e67-4774-9285-3f4a291fccb9
+ Win32OSProcessPlugin VMConstruction-Plugins-OSProcessPlugin.oscog-eem.32 uuid: 7395e1c3-1315-4e31-ba5d-cced5f3f9565
*/
-static char __buildInfo[] = "Win32OSProcessPlugin VMConstruction-Plugins-OSProcessPlugin.oscog-eem.31 uuid: b7c551ed-5e67-4774-9285-3f4a291fccb9 " __DATE__ ;
+static char __buildInfo[] = "Win32OSProcessPlugin VMConstruction-Plugins-OSProcessPlugin.oscog-eem.32 uuid: 7395e1c3-1315-4e31-ba5d-cced5f3f9565 " __DATE__ ;
@@ -158,9 +158,9 @@
struct VirtualMachine* interpreterProxy;
static const char *moduleName =
#ifdef SQUEAK_BUILTIN_PLUGIN
- "Win32OSProcessPlugin VMConstruction-Plugins-OSProcessPlugin.oscog-eem.31 (i)"
+ "Win32OSProcessPlugin VMConstruction-Plugins-OSProcessPlugin.oscog-eem.32 (i)"
#else
- "Win32OSProcessPlugin VMConstruction-Plugins-OSProcessPlugin.oscog-eem.31 (e)"
+ "Win32OSProcessPlugin VMConstruction-Plugins-OSProcessPlugin.oscog-eem.32 (e)"
#endif
;
static int osprocessSandboxSecurity;
@@ -298,7 +298,7 @@
ptr = ((char **) flattenedArrayOfStrings);
idx = 0;
while (idx < count) {
- ptr[idx] = (flattenedArrayOfStrings + (((offsetArray[idx]) >> 1)));
+ ptr[idx] = (flattenedArrayOfStrings + (interpreterProxy->integerValueOf(offsetArray[idx])));
idx += 1;
}
}
@@ -939,7 +939,7 @@
ptr = ((char **) flattenedArrayOfStrings);
idx = 0;
while (idx < count) {
- ptr[idx] = (flattenedArrayOfStrings + (((offsets[idx]) >> 1)));
+ ptr[idx] = (flattenedArrayOfStrings + (interpreterProxy->integerValueOf(offsets[idx])));
idx += 1;
}
interpreterProxy->pop(4);
@@ -973,32 +973,25 @@
DWORD requiredLen;
- /* Allocate a dummy buffer buffer with no space (force a failure to GetCurrentDirectory) */
+ /* Determine required size of result buffer (this form counts the terminating null) */
charSize = sizeof(TCHAR);
- cwdString = interpreterProxy->instantiateClassindexableSize(interpreterProxy->classString(), 0);
-
- /* Determine required size of result buffer */
-
- buffer = interpreterProxy->arrayValueOf(cwdString);
- requiredLen = GetCurrentDirectory(0, buffer);
+ requiredLen = GetCurrentDirectory(0, 0);
if (requiredLen == 0) {
return interpreterProxy->primitiveFail();
}
- cwdString = interpreterProxy->instantiateClassindexableSize(interpreterProxy->classString(), requiredLen * charSize);
- /* Call GetCurrentDirectory() again to get the actual result */
+ /* Call GetCurrentDirectory() again to get the actual result (which does not count the terminating null (!!)) */
- buffer = interpreterProxy->arrayValueOf(cwdString);
+ buffer = alloca(requiredLen * charSize);
cwdLen = GetCurrentDirectory(requiredLen, buffer);
- if (cwdLen == 0) {
+ if ((cwdLen == 0)
+ || (cwdLen > requiredLen)) {
return interpreterProxy->primitiveFail();
}
- if (cwdLen > requiredLen) {
- return interpreterProxy->primitiveFail();
- }
- interpreterProxy->pop(1);
- interpreterProxy->push(cwdString);
+ cwdString = interpreterProxy->instantiateClassindexableSize(interpreterProxy->classString(), cwdLen * charSize);
+ strncpy(interpreterProxy->arrayValueOf(cwdString), buffer, cwdLen * charSize);
+ interpreterProxy->popthenPush(1, cwdString);
}
@@ -1316,11 +1309,11 @@
result = interpreterProxy->nilObject();
}
else {
- result = (((readCharBufferArray[index]) << 1) | 1);
+ result = interpreterProxy->integerObjectOf(readCharBufferArray[index]);
}
}
else {
- result = ((-1 << 1) | 1);
+ result = interpreterProxy->integerObjectOf(-1);
}
interpreterProxy->popthenPush(2, result);
}
@@ -1348,18 +1341,18 @@
index = interpreterProxy->stackIntegerValue(1);
resultArray = interpreterProxy->stackValue(0);
interpreterProxy->stObjectatput(resultArray, 1, interpreterProxy->positive32BitIntegerFor(readCharStatusArray[index]));
- interpreterProxy->stObjectatput(resultArray, 2, (((readCharBufferArray[index]) << 1) | 1));
- interpreterProxy->stObjectatput(resultArray, 3, (((readCharCountArray[index]) << 1) | 1));
+ interpreterProxy->stObjectatput(resultArray, 2, interpreterProxy->integerObjectOf(readCharBufferArray[index]));
+ interpreterProxy->stObjectatput(resultArray, 3, interpreterProxy->integerObjectOf(readCharCountArray[index]));
if (readCharStatusArray[index]) {
if ((readCharCountArray[index]) < 1) {
result = interpreterProxy->nilObject();
}
else {
- result = (((readCharBufferArray[index]) << 1) | 1);
+ result = interpreterProxy->integerObjectOf(readCharBufferArray[index]);
}
}
else {
- result = ((-1 << 1) | 1);
+ result = interpreterProxy->integerObjectOf(-1);
}
interpreterProxy->popthenPush(3, result);
}
Property changes on: branches/Cog/platforms/Cross/vm/sqSCCSVersion.h
___________________________________________________________________
Modified: checkindate
- Tue Sep 6 16:43:59 PDT 2011
+ Fri Sep 9 15:34:39 PDT 2011
Modified: branches/Cog/platforms/win32/vm/sqWin32Intel.c
===================================================================
--- branches/Cog/platforms/win32/vm/sqWin32Intel.c 2011-09-06 23:44:23 UTC (rev 2491)
+++ branches/Cog/platforms/win32/vm/sqWin32Intel.c 2011-09-09 22:36:04 UTC (rev 2492)
@@ -916,7 +916,9 @@
MessageBox(stWindow,crashInfo,TEXT("Fatal VM error"),
MB_OK | MB_APPLMODAL | MB_ICONSTOP);
+#if !NewspeakVM
SetCurrentDirectoryW(vmLogDirW);
+#endif
/* print the above information */
f = fopen_for_append("crash.dmp");
if(f){
@@ -1002,7 +1004,9 @@
MessageBox(stWindow,crashInfo,TEXT("Fatal VM error"),
MB_OK | MB_APPLMODAL | MB_ICONSTOP);
+#if !NewspeakVM
SetCurrentDirectoryW(vmLogDirW);
+#endif
/* print the above information */
f = fopen_for_append("crash.dmp");
if(f){
@@ -1399,6 +1403,8 @@
__try {
# endif
#endif /* !NO_FIRST_LEVEL_EXCEPTION_HANDLER */
+
+#if !NewspeakVM
/* set the CWD to the image location */
if(*imageName) {
char path[MAX_PATH+1], *ptr;
@@ -1409,6 +1415,7 @@
SetCurrentDirectory(path);
}
}
+#endif /* !NewspeakVM */
/* display the splash screen */
ShowSplashScreen();
Modified: branches/Cog/src/plugins/Win32OSProcessPlugin/Win32OSProcessPlugin.c
===================================================================
--- branches/Cog/src/plugins/Win32OSProcessPlugin/Win32OSProcessPlugin.c 2011-09-06 23:44:23 UTC (rev 2491)
+++ branches/Cog/src/plugins/Win32OSProcessPlugin/Win32OSProcessPlugin.c 2011-09-09 22:36:04 UTC (rev 2492)
@@ -1,9 +1,9 @@
/* Automatically generated by
- VMPluginCodeGenerator VMMaker.oscog-eem.97 uuid: e5a88d4c-b638-4228-8a1d-39d5af02c8d8
+ VMPluginCodeGenerator * VMMaker.oscog-eem.123 uuid: 9c524903-b0c7-46a8-a37a-5dfda6fcd1f3
from
- Win32OSProcessPlugin VMConstruction-Plugins-OSProcessPlugin.oscog-eem.31 uuid: b7c551ed-5e67-4774-9285-3f4a291fccb9
+ Win32OSProcessPlugin VMConstruction-Plugins-OSProcessPlugin.oscog-eem.32 uuid: 7395e1c3-1315-4e31-ba5d-cced5f3f9565
*/
-static char __buildInfo[] = "Win32OSProcessPlugin VMConstruction-Plugins-OSProcessPlugin.oscog-eem.31 uuid: b7c551ed-5e67-4774-9285-3f4a291fccb9 " __DATE__ ;
+static char __buildInfo[] = "Win32OSProcessPlugin VMConstruction-Plugins-OSProcessPlugin.oscog-eem.32 uuid: 7395e1c3-1315-4e31-ba5d-cced5f3f9565 " __DATE__ ;
@@ -158,9 +158,9 @@
struct VirtualMachine* interpreterProxy;
static const char *moduleName =
#ifdef SQUEAK_BUILTIN_PLUGIN
- "Win32OSProcessPlugin VMConstruction-Plugins-OSProcessPlugin.oscog-eem.31 (i)"
+ "Win32OSProcessPlugin VMConstruction-Plugins-OSProcessPlugin.oscog-eem.32 (i)"
#else
- "Win32OSProcessPlugin VMConstruction-Plugins-OSProcessPlugin.oscog-eem.31 (e)"
+ "Win32OSProcessPlugin VMConstruction-Plugins-OSProcessPlugin.oscog-eem.32 (e)"
#endif
;
static int osprocessSandboxSecurity;
@@ -298,7 +298,7 @@
ptr = ((char **) flattenedArrayOfStrings);
idx = 0;
while (idx < count) {
- ptr[idx] = (flattenedArrayOfStrings + (((offsetArray[idx]) >> 1)));
+ ptr[idx] = (flattenedArrayOfStrings + (interpreterProxy->integerValueOf(offsetArray[idx])));
idx += 1;
}
}
@@ -939,7 +939,7 @@
ptr = ((char **) flattenedArrayOfStrings);
idx = 0;
while (idx < count) {
- ptr[idx] = (flattenedArrayOfStrings + (((offsets[idx]) >> 1)));
+ ptr[idx] = (flattenedArrayOfStrings + (interpreterProxy->integerValueOf(offsets[idx])));
idx += 1;
}
interpreterProxy->pop(4);
@@ -973,32 +973,25 @@
DWORD requiredLen;
- /* Allocate a dummy buffer buffer with no space (force a failure to GetCurrentDirectory) */
+ /* Determine required size of result buffer (this form counts the terminating null) */
charSize = sizeof(TCHAR);
- cwdString = interpreterProxy->instantiateClassindexableSize(interpreterProxy->classString(), 0);
-
- /* Determine required size of result buffer */
-
- buffer = interpreterProxy->arrayValueOf(cwdString);
- requiredLen = GetCurrentDirectory(0, buffer);
+ requiredLen = GetCurrentDirectory(0, 0);
if (requiredLen == 0) {
return interpreterProxy->primitiveFail();
}
- cwdString = interpreterProxy->instantiateClassindexableSize(interpreterProxy->classString(), requiredLen * charSize);
- /* Call GetCurrentDirectory() again to get the actual result */
+ /* Call GetCurrentDirectory() again to get the actual result (which does not count the terminating null (!!)) */
- buffer = interpreterProxy->arrayValueOf(cwdString);
+ buffer = alloca(requiredLen * charSize);
cwdLen = GetCurrentDirectory(requiredLen, buffer);
- if (cwdLen == 0) {
+ if ((cwdLen == 0)
+ || (cwdLen > requiredLen)) {
return interpreterProxy->primitiveFail();
}
- if (cwdLen > requiredLen) {
- return interpreterProxy->primitiveFail();
- }
- interpreterProxy->pop(1);
- interpreterProxy->push(cwdString);
+ cwdString = interpreterProxy->instantiateClassindexableSize(interpreterProxy->classString(), cwdLen * charSize);
+ strncpy(interpreterProxy->arrayValueOf(cwdString), buffer, cwdLen * charSize);
+ interpreterProxy->popthenPush(1, cwdString);
}
@@ -1316,11 +1309,11 @@
result = interpreterProxy->nilObject();
}
else {
- result = (((readCharBufferArray[index]) << 1) | 1);
+ result = interpreterProxy->integerObjectOf(readCharBufferArray[index]);
}
}
else {
- result = ((-1 << 1) | 1);
+ result = interpreterProxy->integerObjectOf(-1);
}
interpreterProxy->popthenPush(2, result);
}
@@ -1348,18 +1341,18 @@
index = interpreterProxy->stackIntegerValue(1);
resultArray = interpreterProxy->stackValue(0);
interpreterProxy->stObjectatput(resultArray, 1, interpreterProxy->positive32BitIntegerFor(readCharStatusArray[index]));
- interpreterProxy->stObjectatput(resultArray, 2, (((readCharBufferArray[index]) << 1) | 1));
- interpreterProxy->stObjectatput(resultArray, 3, (((readCharCountArray[index]) << 1) | 1));
+ interpreterProxy->stObjectatput(resultArray, 2, interpreterProxy->integerObjectOf(readCharBufferArray[index]));
+ interpreterProxy->stObjectatput(resultArray, 3, interpreterProxy->integerObjectOf(readCharCountArray[index]));
if (readCharStatusArray[index]) {
if ((readCharCountArray[index]) < 1) {
result = interpreterProxy->nilObject();
}
else {
- result = (((readCharBufferArray[index]) << 1) | 1);
+ result = interpreterProxy->integerObjectOf(readCharBufferArray[index]);
}
}
else {
- result = ((-1 << 1) | 1);
+ result = interpreterProxy->integerObjectOf(-1);
}
interpreterProxy->popthenPush(3, result);
}
More information about the Vm-dev
mailing list