From c26b74a7c537158c30bbd7eafbcc0147cba8ade7 Mon Sep 17 00:00:00 2001 From: AlistairGrant Date: Sat, 3 Mar 2018 19:06:44 +0100 Subject: [PATCH 1/4] Include FilePlugin>>primitiveFileOpenUseFileDescriptor & primitiveFileOpenUseFile on all platforms (not just PharoVM) --- .../Cross/plugins/FilePlugin/FilePlugin.h | 2 - .../FilePlugin/sqFilePluginBasicPrims.c | 3 +- .../plugins/FilePlugin/sqWin32FilePrims.c | 2 - src/plugins/FilePlugin/FilePlugin.c | 50 +++++++------------ 4 files changed, 18 insertions(+), 39 deletions(-) diff --git a/platforms/Cross/plugins/FilePlugin/FilePlugin.h b/platforms/Cross/plugins/FilePlugin/FilePlugin.h index 705d1230c7..8aa429a9a7 100644 --- a/platforms/Cross/plugins/FilePlugin/FilePlugin.h +++ b/platforms/Cross/plugins/FilePlugin/FilePlugin.h @@ -53,10 +53,8 @@ sqInt sqFileInit(void); sqInt sqFileShutdown(void); sqInt sqFileOpen(SQFile *f, char *sqFileName, sqInt sqFileNameSize, sqInt writeFlag); sqInt sqFileOpenNew(SQFile *f, char *sqFileName, sqInt sqFileNameSize, sqInt *exists); -#if PharoVM sqInt sqFileFdOpen(SQFile *f, int fd, sqInt writeFlag); sqInt sqFileFileOpen(SQFile *f, FILE *inFile, sqInt writeFlag); -#endif size_t sqFileReadIntoAt(SQFile *f, size_t count, char *byteArrayIndex, size_t startIndex); sqInt sqFileRenameOldSizeNewSize(char *sqOldName, sqInt sqOldNameSize, char *sqNewName, sqInt sqNewNameSize); sqInt sqFileSetPosition(SQFile *f, squeakFileOffsetType position); diff --git a/platforms/Cross/plugins/FilePlugin/sqFilePluginBasicPrims.c b/platforms/Cross/plugins/FilePlugin/sqFilePluginBasicPrims.c index b6d3a9054e..c3293573e8 100755 --- a/platforms/Cross/plugins/FilePlugin/sqFilePluginBasicPrims.c +++ b/platforms/Cross/plugins/FilePlugin/sqFilePluginBasicPrims.c @@ -9,6 +9,7 @@ * RCSID: $Id$ * * NOTES: See change log below. +* 2018-03-01 AKG Add sqFileFdOpen & sqFileFileOpen * 2005-03-26 IKP fix unaligned accesses to file[Size] members * 2004-06-10 IKP 64-bit cleanliness * 1/28/02 Tim remove non-ansi stuff @@ -475,7 +476,6 @@ sqFileOpenNew(SQFile *f, char *sqFileName, sqInt sqFileNameSize, sqInt *exists) return interpreterProxy->success(false); } -#if PharoVM sqInt sqFileFdOpen(SQFile *sqFile, int fd, sqInt writeFlag) { @@ -508,7 +508,6 @@ sqFileFileOpen(SQFile *sqFile, FILE *file, sqInt writeFlag) sqFile->writable = writeFlag; return 1; } -#endif /* * Fill-in files with 3 handles for stdin, stdout and stderr as available and diff --git a/platforms/win32/plugins/FilePlugin/sqWin32FilePrims.c b/platforms/win32/plugins/FilePlugin/sqWin32FilePrims.c index fe2a91c33a..604522d43c 100644 --- a/platforms/win32/plugins/FilePlugin/sqWin32FilePrims.c +++ b/platforms/win32/plugins/FilePlugin/sqWin32FilePrims.c @@ -250,7 +250,6 @@ sqInt sqFileOpenNew(SQFile *f, char* fileNameIndex, sqInt fileNameSize, sqInt* e return 1; } -#if PharoVM sqInt sqFileFdOpen(SQFile *sqFile, int fd, sqInt writeFlag) { @@ -279,7 +278,6 @@ sqFileFileOpen(SQFile *sqFile, FILE *file, sqInt writeFlag) */ return interpreterProxy->success(false); } -#endif diff --git a/src/plugins/FilePlugin/FilePlugin.c b/src/plugins/FilePlugin/FilePlugin.c index 776517fccb..1d0bb3805b 100644 --- a/src/plugins/FilePlugin/FilePlugin.c +++ b/src/plugins/FilePlugin/FilePlugin.c @@ -1,9 +1,9 @@ /* Automatically generated by - VMPluginCodeGenerator * VMMaker.oscog-eem.2339 uuid: 1f823336-4229-4929-8a75-545797124625 + VMPluginCodeGenerator * VMMaker.oscog-akg.2340 uuid: 27e21eb5-be74-4672-a779-32c073498b95 from - FilePlugin * VMMaker.oscog-eem.2339 uuid: 1f823336-4229-4929-8a75-545797124625 + FilePlugin * VMMaker.oscog-akg.2340 uuid: 27e21eb5-be74-4672-a779-32c073498b95 */ -static char __buildInfo[] = "FilePlugin * VMMaker.oscog-eem.2339 uuid: 1f823336-4229-4929-8a75-545797124625 " __DATE__ ; +static char __buildInfo[] = "FilePlugin * VMMaker.oscog-akg.2340 uuid: 27e21eb5-be74-4672-a779-32c073498b95 " __DATE__ ; @@ -56,12 +56,8 @@ static char __buildInfo[] = "FilePlugin * VMMaker.oscog-eem.2339 uuid: 1f823336- /*** Function Prototypes ***/ static sqInt asciiDirectoryDelimiter(void); -#if PharoVM EXPORT(sqInt) fileOpenFdwrite(int fd, sqInt writeFlag); -#endif /* PharoVM */ -#if PharoVM EXPORT(sqInt) fileOpenFilewrite(FILE *cfile, sqInt writeFlag); -#endif /* PharoVM */ EXPORT(sqInt) fileOpenNamesizewritesecure(char *nameIndex, sqInt nameSize, sqInt writeFlag, sqInt secureFlag); EXPORT(sqInt) fileOpenNewNamesizesecure(char *nameIndex, sqInt nameSize, sqInt secureFlag); extern usqIntptr_t fileRecordSize(void); @@ -89,12 +85,8 @@ EXPORT(sqInt) primitiveFileFlush(void); EXPORT(sqInt) primitiveFileGetPosition(void); EXPORT(sqInt) primitiveFileOpen(void); EXPORT(sqInt) primitiveFileOpenNew(void); -#if PharoVM EXPORT(sqInt) primitiveFileOpenUseFile(void); -#endif /* PharoVM */ -#if PharoVM EXPORT(sqInt) primitiveFileOpenUseFileDescriptor(void); -#endif /* PharoVM */ EXPORT(sqInt) primitiveFileRead(void); static sqInt primitiveFileReadWithoutPinning(void); static sqInt primitiveFileReadWithPinning(void); @@ -208,9 +200,9 @@ extern struct VirtualMachine* interpreterProxy; static const char *moduleName = #ifdef SQUEAK_BUILTIN_PLUGIN - "FilePlugin * VMMaker.oscog-eem.2339 (i)" + "FilePlugin * VMMaker.oscog-akg.2340 (i)" #else - "FilePlugin * VMMaker.oscog-eem.2339 (e)" + "FilePlugin * VMMaker.oscog-akg.2340 (e)" #endif ; static void * sCCPfn; @@ -237,7 +229,6 @@ asciiDirectoryDelimiter(void) /* Open the fd as file. Answer the file oop. */ /* FilePlugin>>#fileOpenFd:write: */ -#if PharoVM EXPORT(sqInt) fileOpenFdwrite(int fd, sqInt writeFlag) { @@ -259,13 +250,11 @@ fileOpenFdwrite(int fd, sqInt writeFlag) } return fileOop; } -#endif /* PharoVM */ /* Open the FILE* as file. Answer the file oop. */ /* FilePlugin>>#fileOpenFile:write: */ -#if PharoVM EXPORT(sqInt) fileOpenFilewrite(FILE *cfile, sqInt writeFlag) { @@ -287,7 +276,6 @@ fileOpenFilewrite(FILE *cfile, sqInt writeFlag) } return fileOop; } -#endif /* PharoVM */ /* Open the named file, possibly checking security. Answer the file oop. */ @@ -1115,8 +1103,14 @@ primitiveFileOpenNew(void) return 0; } + +/* Open the file with the supplied FILE* and writeFlag. + FILE* must be supplied in a byte object (ByteArray) with the platform + address size. + writeFlag must be a boolean. + */ + /* FilePlugin>>#primitiveFileOpenUseFile */ -#if PharoVM EXPORT(sqInt) primitiveFileOpenUseFile(void) { @@ -1141,10 +1135,13 @@ primitiveFileOpenUseFile(void) } return primitiveFail(); } -#endif /* PharoVM */ + + +/* Open the file with the supplied file descriptor and writeFlag. + fileDescriptor must be an integer. + writeFlag must be a boolean. */ /* FilePlugin>>#primitiveFileOpenUseFileDescriptor */ -#if PharoVM EXPORT(sqInt) primitiveFileOpenUseFileDescriptor(void) { @@ -1165,7 +1162,6 @@ primitiveFileOpenUseFileDescriptor(void) } return primitiveFail(); } -#endif /* PharoVM */ /* FilePlugin>>#primitiveFileRead */ EXPORT(sqInt) @@ -1744,12 +1740,8 @@ shutdownModule(void) static char _m[] = "FilePlugin"; void* FilePlugin_exports[][3] = { -#if PharoVM {(void*)_m, "fileOpenFdwrite", (void*)fileOpenFdwrite}, -#endif /* PharoVM */ -#if PharoVM {(void*)_m, "fileOpenFilewrite", (void*)fileOpenFilewrite}, -#endif /* PharoVM */ {(void*)_m, "fileOpenNamesizewritesecure", (void*)fileOpenNamesizewritesecure}, {(void*)_m, "fileOpenNewNamesizesecure", (void*)fileOpenNewNamesizesecure}, {(void*)_m, "getModuleName", (void*)getModuleName}, @@ -1771,12 +1763,8 @@ void* FilePlugin_exports[][3] = { {(void*)_m, "primitiveFileGetPosition\000\001", (void*)primitiveFileGetPosition}, {(void*)_m, "primitiveFileOpen\000\002", (void*)primitiveFileOpen}, {(void*)_m, "primitiveFileOpenNew\000\002", (void*)primitiveFileOpenNew}, -#if PharoVM {(void*)_m, "primitiveFileOpenUseFile\000\002", (void*)primitiveFileOpenUseFile}, -#endif /* PharoVM */ -#if PharoVM {(void*)_m, "primitiveFileOpenUseFileDescriptor\000\000", (void*)primitiveFileOpenUseFileDescriptor}, -#endif /* PharoVM */ {(void*)_m, "primitiveFileRead\000\001", (void*)primitiveFileRead}, {(void*)_m, "primitiveFileRename\000\001", (void*)primitiveFileRename}, {(void*)_m, "primitiveFileSetPosition\000\001", (void*)primitiveFileSetPosition}, @@ -1807,12 +1795,8 @@ signed char primitiveFileFlushAccessorDepth = 1; signed char primitiveFileGetPositionAccessorDepth = 1; signed char primitiveFileOpenAccessorDepth = 2; signed char primitiveFileOpenNewAccessorDepth = 2; -#if PharoVM signed char primitiveFileOpenUseFileAccessorDepth = 2; -#endif /* PharoVM */ -#if PharoVM signed char primitiveFileOpenUseFileDescriptorAccessorDepth = 0; -#endif /* PharoVM */ signed char primitiveFileReadAccessorDepth = 1; signed char primitiveFileRenameAccessorDepth = 1; signed char primitiveFileSetPositionAccessorDepth = 1; From 23269657f697f868e48094391946f190dc598b38 Mon Sep 17 00:00:00 2001 From: AlistairGrant Date: Tue, 6 Mar 2018 06:11:48 +0100 Subject: [PATCH 2/4] Rename fd and file open primitives, add Windows support --- .../Cross/plugins/FilePlugin/FilePlugin.h | 8 +- .../FilePlugin/sqFilePluginBasicPrims.c | 14 +- .../plugins/FilePlugin/sqWin32FilePrims.c | 26 ++- src/plugins/FilePlugin/FilePlugin.c | 171 +++++++++--------- 4 files changed, 117 insertions(+), 102 deletions(-) diff --git a/platforms/Cross/plugins/FilePlugin/FilePlugin.h b/platforms/Cross/plugins/FilePlugin/FilePlugin.h index 8aa429a9a7..2ad0220386 100644 --- a/platforms/Cross/plugins/FilePlugin/FilePlugin.h +++ b/platforms/Cross/plugins/FilePlugin/FilePlugin.h @@ -8,7 +8,9 @@ * EMAIL: * RCSID: $Id$ * -* 2018-03-01 AKG add SqFileFileOpen() & sqFileFdOpen() +* 2018-03-06 AKG Rename sqFileFileOpen() & sqFileFdOpen() to +* sqConnectToFile() and sqConnectToFileDescriptor() +* 2018-03-01 AKG add sqFileFileOpen() & sqFileFdOpen() * 2009-05-15 EEM add stdio flag; reorder SQFile to make it more compact * 2005-03-26 IKP fix unaligned accesses to file member * 2004-06-10 IKP 64-bit cleanliness @@ -53,8 +55,8 @@ sqInt sqFileInit(void); sqInt sqFileShutdown(void); sqInt sqFileOpen(SQFile *f, char *sqFileName, sqInt sqFileNameSize, sqInt writeFlag); sqInt sqFileOpenNew(SQFile *f, char *sqFileName, sqInt sqFileNameSize, sqInt *exists); -sqInt sqFileFdOpen(SQFile *f, int fd, sqInt writeFlag); -sqInt sqFileFileOpen(SQFile *f, FILE *inFile, sqInt writeFlag); +sqInt sqConnectToFileDescriptor(SQFile *f, int fd, sqInt writeFlag); +sqInt sqConnectToFile(SQFile *f, FILE *inFile, sqInt writeFlag); size_t sqFileReadIntoAt(SQFile *f, size_t count, char *byteArrayIndex, size_t startIndex); sqInt sqFileRenameOldSizeNewSize(char *sqOldName, sqInt sqOldNameSize, char *sqNewName, sqInt sqNewNameSize); sqInt sqFileSetPosition(SQFile *f, squeakFileOffsetType position); diff --git a/platforms/Cross/plugins/FilePlugin/sqFilePluginBasicPrims.c b/platforms/Cross/plugins/FilePlugin/sqFilePluginBasicPrims.c index c3293573e8..d8154d8b10 100755 --- a/platforms/Cross/plugins/FilePlugin/sqFilePluginBasicPrims.c +++ b/platforms/Cross/plugins/FilePlugin/sqFilePluginBasicPrims.c @@ -477,29 +477,31 @@ sqFileOpenNew(SQFile *f, char *sqFileName, sqInt sqFileNameSize, sqInt *exists) } sqInt -sqFileFdOpen(SQFile *sqFile, int fd, sqInt writeFlag) +sqConnectToFileDescriptor(SQFile *sqFile, int fd, sqInt writeFlag) { /* * Open the file with the supplied file descriptor in binary mode. * - * writeFlag determines whether the file is read-only or writable. + * writeFlag determines whether the file is read-only or writable + * and must be compatible with the existing access. * sqFile is populated with the file information. * Smalltalk is reponsible for handling character encoding and * line ends. */ - FILE *file = fdopen(fd, writeFlag ? "wb" : "rb"); + FILE *file = openFileDescriptor(fd, writeFlag ? "wb" : "rb"); if (!file) return interpreterProxy->success(false); - return sqFileFileOpen(sqFile, file, writeFlag); + return sqConnectToFile(sqFile, file, writeFlag); } sqInt -sqFileFileOpen(SQFile *sqFile, FILE *file, sqInt writeFlag) +sqConnectToFile(SQFile *sqFile, FILE *file, sqInt writeFlag) { /* * Populate the supplied SQFile structure with the supplied FILE. * - * writeFlag indicates whether the file is read-only or writable. + * writeFlag indicates whether the file is read-only or writable + * and must be compatible with the existing access. */ setFile(sqFile, file); setSize(sqFile, 0); diff --git a/platforms/win32/plugins/FilePlugin/sqWin32FilePrims.c b/platforms/win32/plugins/FilePlugin/sqWin32FilePrims.c index 604522d43c..632b7183d0 100644 --- a/platforms/win32/plugins/FilePlugin/sqWin32FilePrims.c +++ b/platforms/win32/plugins/FilePlugin/sqWin32FilePrims.c @@ -251,32 +251,38 @@ sqInt sqFileOpenNew(SQFile *f, char* fileNameIndex, sqInt fileNameSize, sqInt* e } sqInt -sqFileFdOpen(SQFile *sqFile, int fd, sqInt writeFlag) +sqConnectToFileDescriptor(SQFile *sqFile, int fd, sqInt writeFlag) { /* * Open the file with the supplied file descriptor in binary mode. * - * writeFlag determines whether the file is read-only or writable. + * writeFlag determines whether the file is read-only or writable + * and must be compatible with the existing access. * sqFile is populated with the file information. * Smalltalk is reponsible for handling character encoding and * line ends. - * - * Not supported on Windows */ - return interpreterProxy->success(false); + FILE *file = _fdopen(fd, writeFlag ? "wb" : "rb"); + if (!file) + return interpreterProxy->success(false); + return sqConnectToFile(sqFile, file, writeFlag); } sqInt -sqFileFileOpen(SQFile *sqFile, FILE *file, sqInt writeFlag) +sqConnectToFile(SQFile *sqFile, FILE *file, sqInt writeFlag) { /* * Populate the supplied SQFile structure with the supplied FILE. * - * writeFlag indicates whether the file is read-only or writable. - * - * Not supported on Windows + * writeFlag indicates whether the file is read-only or writable + * and must be compatible with the existing access. */ - return interpreterProxy->success(false); + setFile(sqFile, file); + setSize(sqFile, 0); + sqFile->sessionID = thisSession; + sqFile->lastOp = UNCOMMITTED; + sqFile->writable = writeFlag; + return 1; } diff --git a/src/plugins/FilePlugin/FilePlugin.c b/src/plugins/FilePlugin/FilePlugin.c index 1d0bb3805b..b6475f3c15 100644 --- a/src/plugins/FilePlugin/FilePlugin.c +++ b/src/plugins/FilePlugin/FilePlugin.c @@ -1,9 +1,9 @@ /* Automatically generated by - VMPluginCodeGenerator * VMMaker.oscog-akg.2340 uuid: 27e21eb5-be74-4672-a779-32c073498b95 + VMPluginCodeGenerator * VMMaker.oscog-akg.2341 uuid: d0fa56c5-cccb-41b4-b28d-4c54c9acdccf from - FilePlugin * VMMaker.oscog-akg.2340 uuid: 27e21eb5-be74-4672-a779-32c073498b95 + FilePlugin * VMMaker.oscog-akg.2341 uuid: d0fa56c5-cccb-41b4-b28d-4c54c9acdccf */ -static char __buildInfo[] = "FilePlugin * VMMaker.oscog-akg.2340 uuid: 27e21eb5-be74-4672-a779-32c073498b95 " __DATE__ ; +static char __buildInfo[] = "FilePlugin * VMMaker.oscog-akg.2341 uuid: d0fa56c5-cccb-41b4-b28d-4c54c9acdccf " __DATE__ ; @@ -56,8 +56,8 @@ static char __buildInfo[] = "FilePlugin * VMMaker.oscog-akg.2340 uuid: 27e21eb5- /*** Function Prototypes ***/ static sqInt asciiDirectoryDelimiter(void); -EXPORT(sqInt) fileOpenFdwrite(int fd, sqInt writeFlag); -EXPORT(sqInt) fileOpenFilewrite(FILE *cfile, sqInt writeFlag); +EXPORT(sqInt) connectToFdwrite(int fd, sqInt writeFlag); +EXPORT(sqInt) connectToFilewrite(FILE *cfile, sqInt writeFlag); EXPORT(sqInt) fileOpenNamesizewritesecure(char *nameIndex, sqInt nameSize, sqInt writeFlag, sqInt secureFlag); EXPORT(sqInt) fileOpenNewNamesizesecure(char *nameIndex, sqInt nameSize, sqInt secureFlag); extern usqIntptr_t fileRecordSize(void); @@ -70,6 +70,8 @@ static sqInt makeDirEntryNamesizecreateDatemodDateisDirfileSize(char *entryName, static sqInt makeDirEntryNamesizecreateDatemodDateisDirfileSizeposixPermissionsisSymlink(char *entryName, sqInt entryNameSize, sqInt createDate, sqInt modifiedDate, sqInt dirFlag, squeakFileOffsetType fileSize, sqInt posixPermissions, sqInt symlinkFlag); #endif /* PharoVM */ EXPORT(sqInt) moduleUnloaded(char *aModuleName); +EXPORT(sqInt) primitiveConnectToFile(void); +EXPORT(sqInt) primitiveConnectToFileDescriptor(void); EXPORT(sqInt) primitiveDirectoryCreate(void); EXPORT(sqInt) primitiveDirectoryDelete(void); EXPORT(sqInt) primitiveDirectoryDelimitor(void); @@ -85,8 +87,6 @@ EXPORT(sqInt) primitiveFileFlush(void); EXPORT(sqInt) primitiveFileGetPosition(void); EXPORT(sqInt) primitiveFileOpen(void); EXPORT(sqInt) primitiveFileOpenNew(void); -EXPORT(sqInt) primitiveFileOpenUseFile(void); -EXPORT(sqInt) primitiveFileOpenUseFileDescriptor(void); EXPORT(sqInt) primitiveFileRead(void); static sqInt primitiveFileReadWithoutPinning(void); static sqInt primitiveFileReadWithPinning(void); @@ -200,9 +200,9 @@ extern struct VirtualMachine* interpreterProxy; static const char *moduleName = #ifdef SQUEAK_BUILTIN_PLUGIN - "FilePlugin * VMMaker.oscog-akg.2340 (i)" + "FilePlugin * VMMaker.oscog-akg.2341 (i)" #else - "FilePlugin * VMMaker.oscog-akg.2340 (e)" + "FilePlugin * VMMaker.oscog-akg.2341 (e)" #endif ; static void * sCCPfn; @@ -226,11 +226,13 @@ asciiDirectoryDelimiter(void) } -/* Open the fd as file. Answer the file oop. */ +/* Connect to the supplied file descriptor. Answer the file oop. + On POSIX platforms this translates to fdopen(). + writeFlag must be compatible with the existing file access. */ - /* FilePlugin>>#fileOpenFd:write: */ + /* FilePlugin>>#connectToFd:write: */ EXPORT(sqInt) -fileOpenFdwrite(int fd, sqInt writeFlag) +connectToFdwrite(int fd, sqInt writeFlag) { SQFile *file; sqInt fileOop; @@ -246,17 +248,18 @@ fileOpenFdwrite(int fd, sqInt writeFlag) file = firstIndexableField(fileOop); l1: /* end fileValueOf: */; if (!(failed())) { - sqFileFdOpen(file, fd, writeFlag); + sqConnectToFileDescriptor(file, fd, writeFlag); } return fileOop; } -/* Open the FILE* as file. Answer the file oop. */ +/* Open the FILE* as file. Answer the file oop. + writeFlag must be compatible with the existing file access. */ - /* FilePlugin>>#fileOpenFile:write: */ + /* FilePlugin>>#connectToFile:write: */ EXPORT(sqInt) -fileOpenFilewrite(FILE *cfile, sqInt writeFlag) +connectToFilewrite(FILE *cfile, sqInt writeFlag) { SQFile *file; sqInt fileOop; @@ -272,7 +275,7 @@ fileOpenFilewrite(FILE *cfile, sqInt writeFlag) file = firstIndexableField(fileOop); l1: /* end fileValueOf: */; if (!(failed())) { - sqFileFileOpen(file, cfile, writeFlag); + sqConnectToFile(file, cfile, writeFlag); } return fileOop; } @@ -563,6 +566,68 @@ moduleUnloaded(char *aModuleName) return 0; } + +/* Connect to the file with the supplied FILE* and writeFlag. + FILE* must be supplied in a byte object (ByteArray) with the platform + address size. + writeFlag must be a boolean and compatible with the existing file access. + */ + + /* FilePlugin>>#primitiveConnectToFile */ +EXPORT(sqInt) +primitiveConnectToFile(void) +{ + FILE* cfile; + sqInt cfileOop; + sqInt filePointer; + sqInt writeFlag; + + filePointer = 0; + writeFlag = booleanValueOf(stackValue(0)); + cfileOop = stackValue(1); + if (!((isBytes(cfileOop)) + && ((byteSizeOf(cfileOop)) == (sizeof(FILE*))))) { + return primitiveFailFor(PrimErrBadArgument); + } + cfile = firstIndexableField(cfileOop); + if (!(failed())) { + filePointer = connectToFilewrite(cfile, writeFlag); + } + if (!(failed())) { + return popthenPush(3, filePointer); + } + return primitiveFail(); +} + + +/* Connect to the existing file identified by fileDescriptor. + fileDescriptor must be an integer. + writeFlag is aboolean indicating whether to open in read or write mode and + must be compatible with the existing file access. + */ + + /* FilePlugin>>#primitiveConnectToFileDescriptor */ +EXPORT(sqInt) +primitiveConnectToFileDescriptor(void) +{ + int fd; + sqInt fdPointer; + sqInt filePointer; + sqInt writeFlag; + + writeFlag = booleanValueOf(stackValue(0)); + fdPointer = stackValue(1); + if (!(isIntegerObject(fdPointer))) { + return primitiveFailFor(PrimErrBadArgument); + } + fd = integerValueOf(fdPointer); + filePointer = connectToFdwrite(fd, writeFlag); + if (!(failed())) { + return popthenPush(3, filePointer); + } + return primitiveFail(); +} + /* FilePlugin>>#primitiveDirectoryCreate */ EXPORT(sqInt) primitiveDirectoryCreate(void) @@ -1103,66 +1168,6 @@ primitiveFileOpenNew(void) return 0; } - -/* Open the file with the supplied FILE* and writeFlag. - FILE* must be supplied in a byte object (ByteArray) with the platform - address size. - writeFlag must be a boolean. - */ - - /* FilePlugin>>#primitiveFileOpenUseFile */ -EXPORT(sqInt) -primitiveFileOpenUseFile(void) -{ - FILE* cfile; - sqInt cfileOop; - sqInt filePointer; - sqInt writeFlag; - - filePointer = 0; - writeFlag = booleanValueOf(stackValue(0)); - cfileOop = stackValue(1); - if (!((isBytes(cfileOop)) - && ((byteSizeOf(cfileOop)) == (sizeof(FILE*))))) { - return primitiveFailFor(PrimErrBadArgument); - } - cfile = firstIndexableField(cfileOop); - if (!(failed())) { - filePointer = fileOpenFilewrite(cfile, writeFlag); - } - if (!(failed())) { - return popthenPush(3, filePointer); - } - return primitiveFail(); -} - - -/* Open the file with the supplied file descriptor and writeFlag. - fileDescriptor must be an integer. - writeFlag must be a boolean. */ - - /* FilePlugin>>#primitiveFileOpenUseFileDescriptor */ -EXPORT(sqInt) -primitiveFileOpenUseFileDescriptor(void) -{ - int fd; - sqInt fdPointer; - sqInt filePointer; - sqInt writeFlag; - - writeFlag = booleanValueOf(stackValue(0)); - fdPointer = stackValue(1); - if (!(isIntegerObject(fdPointer))) { - return primitiveFailFor(PrimErrBadArgument); - } - fd = integerValueOf(fdPointer); - filePointer = fileOpenFdwrite(fd, writeFlag); - if (!(failed())) { - return popthenPush(3, filePointer); - } - return primitiveFail(); -} - /* FilePlugin>>#primitiveFileRead */ EXPORT(sqInt) primitiveFileRead(void) @@ -1740,14 +1745,16 @@ shutdownModule(void) static char _m[] = "FilePlugin"; void* FilePlugin_exports[][3] = { - {(void*)_m, "fileOpenFdwrite", (void*)fileOpenFdwrite}, - {(void*)_m, "fileOpenFilewrite", (void*)fileOpenFilewrite}, + {(void*)_m, "connectToFdwrite", (void*)connectToFdwrite}, + {(void*)_m, "connectToFilewrite", (void*)connectToFilewrite}, {(void*)_m, "fileOpenNamesizewritesecure", (void*)fileOpenNamesizewritesecure}, {(void*)_m, "fileOpenNewNamesizesecure", (void*)fileOpenNewNamesizesecure}, {(void*)_m, "getModuleName", (void*)getModuleName}, {(void*)_m, "getThisSession\000\377", (void*)getThisSession}, {(void*)_m, "initialiseModule", (void*)initialiseModule}, {(void*)_m, "moduleUnloaded", (void*)moduleUnloaded}, + {(void*)_m, "primitiveConnectToFile\000\002", (void*)primitiveConnectToFile}, + {(void*)_m, "primitiveConnectToFileDescriptor\000\000", (void*)primitiveConnectToFileDescriptor}, {(void*)_m, "primitiveDirectoryCreate\000\001", (void*)primitiveDirectoryCreate}, {(void*)_m, "primitiveDirectoryDelete\000\001", (void*)primitiveDirectoryDelete}, {(void*)_m, "primitiveDirectoryDelimitor\000\377", (void*)primitiveDirectoryDelimitor}, @@ -1763,8 +1770,6 @@ void* FilePlugin_exports[][3] = { {(void*)_m, "primitiveFileGetPosition\000\001", (void*)primitiveFileGetPosition}, {(void*)_m, "primitiveFileOpen\000\002", (void*)primitiveFileOpen}, {(void*)_m, "primitiveFileOpenNew\000\002", (void*)primitiveFileOpenNew}, - {(void*)_m, "primitiveFileOpenUseFile\000\002", (void*)primitiveFileOpenUseFile}, - {(void*)_m, "primitiveFileOpenUseFileDescriptor\000\000", (void*)primitiveFileOpenUseFileDescriptor}, {(void*)_m, "primitiveFileRead\000\001", (void*)primitiveFileRead}, {(void*)_m, "primitiveFileRename\000\001", (void*)primitiveFileRename}, {(void*)_m, "primitiveFileSetPosition\000\001", (void*)primitiveFileSetPosition}, @@ -1782,6 +1787,8 @@ void* FilePlugin_exports[][3] = { #else /* ifdef SQ_BUILTIN_PLUGIN */ +signed char primitiveConnectToFileAccessorDepth = 2; +signed char primitiveConnectToFileDescriptorAccessorDepth = 0; signed char primitiveDirectoryCreateAccessorDepth = 1; signed char primitiveDirectoryDeleteAccessorDepth = 1; signed char primitiveDirectoryEntryAccessorDepth = 1; @@ -1795,8 +1802,6 @@ signed char primitiveFileFlushAccessorDepth = 1; signed char primitiveFileGetPositionAccessorDepth = 1; signed char primitiveFileOpenAccessorDepth = 2; signed char primitiveFileOpenNewAccessorDepth = 2; -signed char primitiveFileOpenUseFileAccessorDepth = 2; -signed char primitiveFileOpenUseFileDescriptorAccessorDepth = 0; signed char primitiveFileReadAccessorDepth = 1; signed char primitiveFileRenameAccessorDepth = 1; signed char primitiveFileSetPositionAccessorDepth = 1; From 5aabffb202c14db3fa16134cc7020d3727d8c296 Mon Sep 17 00:00:00 2001 From: Alistair Grant Date: Tue, 6 Mar 2018 08:31:53 +0100 Subject: [PATCH 3/4] Use void* instead of FILE* for Win32 compatibility --- platforms/Cross/plugins/FilePlugin/FilePlugin.h | 2 +- .../Cross/plugins/FilePlugin/sqFilePluginBasicPrims.c | 4 ++-- platforms/win32/plugins/FilePlugin/sqWin32FilePrims.c | 11 ++++++----- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/platforms/Cross/plugins/FilePlugin/FilePlugin.h b/platforms/Cross/plugins/FilePlugin/FilePlugin.h index 2ad0220386..28a41875ec 100644 --- a/platforms/Cross/plugins/FilePlugin/FilePlugin.h +++ b/platforms/Cross/plugins/FilePlugin/FilePlugin.h @@ -56,7 +56,7 @@ sqInt sqFileShutdown(void); sqInt sqFileOpen(SQFile *f, char *sqFileName, sqInt sqFileNameSize, sqInt writeFlag); sqInt sqFileOpenNew(SQFile *f, char *sqFileName, sqInt sqFileNameSize, sqInt *exists); sqInt sqConnectToFileDescriptor(SQFile *f, int fd, sqInt writeFlag); -sqInt sqConnectToFile(SQFile *f, FILE *inFile, sqInt writeFlag); +sqInt sqConnectToFile(SQFile *f, void *file, sqInt writeFlag); size_t sqFileReadIntoAt(SQFile *f, size_t count, char *byteArrayIndex, size_t startIndex); sqInt sqFileRenameOldSizeNewSize(char *sqOldName, sqInt sqOldNameSize, char *sqNewName, sqInt sqNewNameSize); sqInt sqFileSetPosition(SQFile *f, squeakFileOffsetType position); diff --git a/platforms/Cross/plugins/FilePlugin/sqFilePluginBasicPrims.c b/platforms/Cross/plugins/FilePlugin/sqFilePluginBasicPrims.c index d8154d8b10..860e68d85e 100755 --- a/platforms/Cross/plugins/FilePlugin/sqFilePluginBasicPrims.c +++ b/platforms/Cross/plugins/FilePlugin/sqFilePluginBasicPrims.c @@ -491,11 +491,11 @@ sqConnectToFileDescriptor(SQFile *sqFile, int fd, sqInt writeFlag) FILE *file = openFileDescriptor(fd, writeFlag ? "wb" : "rb"); if (!file) return interpreterProxy->success(false); - return sqConnectToFile(sqFile, file, writeFlag); + return sqConnectToFile(sqFile, (void *)file, writeFlag); } sqInt -sqConnectToFile(SQFile *sqFile, FILE *file, sqInt writeFlag) +sqConnectToFile(SQFile *sqFile, void *file, sqInt writeFlag) { /* * Populate the supplied SQFile structure with the supplied FILE. diff --git a/platforms/win32/plugins/FilePlugin/sqWin32FilePrims.c b/platforms/win32/plugins/FilePlugin/sqWin32FilePrims.c index 632b7183d0..9be5f90eda 100644 --- a/platforms/win32/plugins/FilePlugin/sqWin32FilePrims.c +++ b/platforms/win32/plugins/FilePlugin/sqWin32FilePrims.c @@ -262,14 +262,14 @@ sqConnectToFileDescriptor(SQFile *sqFile, int fd, sqInt writeFlag) * Smalltalk is reponsible for handling character encoding and * line ends. */ - FILE *file = _fdopen(fd, writeFlag ? "wb" : "rb"); + HANDLE file = _fdopen(fd, writeFlag ? "wb" : "rb"); if (!file) return interpreterProxy->success(false); return sqConnectToFile(sqFile, file, writeFlag); } sqInt -sqConnectToFile(SQFile *sqFile, FILE *file, sqInt writeFlag) +sqConnectToFile(SQFile *sqFile, void *file, sqInt writeFlag) { /* * Populate the supplied SQFile structure with the supplied FILE. @@ -277,10 +277,11 @@ sqConnectToFile(SQFile *sqFile, FILE *file, sqInt writeFlag) * writeFlag indicates whether the file is read-only or writable * and must be compatible with the existing access. */ - setFile(sqFile, file); - setSize(sqFile, 0); + sqFile->file = (HANDLE)file; + AddHandleToTable(win32Files, file); + /* setSize(sqFile, 0); */ sqFile->sessionID = thisSession; - sqFile->lastOp = UNCOMMITTED; + sqFile->lastOp = 0; /* Unused on Win32 */ sqFile->writable = writeFlag; return 1; } From de272539aa78a3e310d219d7f12bb93c475e4ef2 Mon Sep 17 00:00:00 2001 From: AlistairGrant Date: Tue, 6 Mar 2018 23:08:27 +0100 Subject: [PATCH 4/4] FilePlugin>>primitiveConnectToFile fix address retrieval --- src/plugins/FilePlugin/FilePlugin.c | 50 +++++++++++++++++++++++------ 1 file changed, 40 insertions(+), 10 deletions(-) diff --git a/src/plugins/FilePlugin/FilePlugin.c b/src/plugins/FilePlugin/FilePlugin.c index b6475f3c15..e042bea56b 100644 --- a/src/plugins/FilePlugin/FilePlugin.c +++ b/src/plugins/FilePlugin/FilePlugin.c @@ -57,7 +57,7 @@ static char __buildInfo[] = "FilePlugin * VMMaker.oscog-akg.2341 uuid: d0fa56c5- /*** Function Prototypes ***/ static sqInt asciiDirectoryDelimiter(void); EXPORT(sqInt) connectToFdwrite(int fd, sqInt writeFlag); -EXPORT(sqInt) connectToFilewrite(FILE *cfile, sqInt writeFlag); +EXPORT(sqInt) connectToFilewrite(void *cfile, sqInt writeFlag); EXPORT(sqInt) fileOpenNamesizewritesecure(char *nameIndex, sqInt nameSize, sqInt writeFlag, sqInt secureFlag); EXPORT(sqInt) fileOpenNewNamesizesecure(char *nameIndex, sqInt nameSize, sqInt secureFlag); extern usqIntptr_t fileRecordSize(void); @@ -70,6 +70,7 @@ static sqInt makeDirEntryNamesizecreateDatemodDateisDirfileSize(char *entryName, static sqInt makeDirEntryNamesizecreateDatemodDateisDirfileSizeposixPermissionsisSymlink(char *entryName, sqInt entryNameSize, sqInt createDate, sqInt modifiedDate, sqInt dirFlag, squeakFileOffsetType fileSize, sqInt posixPermissions, sqInt symlinkFlag); #endif /* PharoVM */ EXPORT(sqInt) moduleUnloaded(char *aModuleName); +static void * pointerFrom(sqInt pointerByteArray); EXPORT(sqInt) primitiveConnectToFile(void); EXPORT(sqInt) primitiveConnectToFileDescriptor(void); EXPORT(sqInt) primitiveDirectoryCreate(void); @@ -106,6 +107,7 @@ EXPORT(sqInt) shutdownModule(void); /*** Variables ***/ #if !defined(SQUEAK_BUILTIN_PLUGIN) +static void * (*arrayValueOf)(sqInt oop); static sqInt (*booleanValueOf)(sqInt obj); static sqInt (*byteSizeOf)(sqInt oop); static sqInt (*characterObjectOf)(sqInt characterCode); @@ -122,6 +124,7 @@ static sqInt (*instantiateClassindexableSize)(sqInt classPointer, sqInt size); static sqInt (*integerObjectOf)(sqInt value); static sqInt (*integerValueOf)(sqInt oop); static void * (*ioLoadFunctionFrom)(char *functionName, char *moduleName); +static sqInt (*isKindOf)(sqInt oop, char *aString); static sqInt (*isBytes)(sqInt oop); static sqInt (*isIntegerObject)(sqInt objectPointer); static sqInt (*isWords)(sqInt oop); @@ -141,6 +144,7 @@ static sqInt (*primitiveFailureCode)(void); static sqInt (*pushBool)(sqInt trueOrFalse); static sqInt (*pushRemappableOop)(sqInt oop); static sqInt (*slotSizeOf)(sqInt oop); +static sqInt (*stSizeOf)(sqInt oop); static sqInt (*stackIntegerValue)(sqInt offset); static sqInt (*stackValue)(sqInt offset); static sqInt (*storePointerofObjectwithValue)(sqInt index, sqInt oop, sqInt valuePointer); @@ -148,6 +152,7 @@ static void (*tenuringIncrementalGC)(void); static sqInt (*topRemappableOop)(void); static sqInt (*trueObject)(void); #else /* !defined(SQUEAK_BUILTIN_PLUGIN) */ +extern void * arrayValueOf(sqInt oop); extern sqInt booleanValueOf(sqInt obj); extern sqInt byteSizeOf(sqInt oop); #if VM_PROXY_MAJOR > 1 || (VM_PROXY_MAJOR == 1 && VM_PROXY_MINOR >= 13) @@ -168,6 +173,7 @@ extern sqInt instantiateClassindexableSize(sqInt classPointer, sqInt size); extern sqInt integerObjectOf(sqInt value); extern sqInt integerValueOf(sqInt oop); extern void * ioLoadFunctionFrom(char *functionName, char *moduleName); +extern sqInt isKindOf(sqInt oop, char *aString); extern sqInt isBytes(sqInt oop); #if !defined(isIntegerObject) extern sqInt isIntegerObject(sqInt objectPointer); @@ -189,6 +195,7 @@ extern sqInt primitiveFailureCode(void); extern sqInt pushBool(sqInt trueOrFalse); extern sqInt pushRemappableOop(sqInt oop); extern sqInt slotSizeOf(sqInt oop); +extern sqInt stSizeOf(sqInt oop); extern sqInt stackIntegerValue(sqInt offset); extern sqInt stackValue(sqInt offset); extern sqInt storePointerofObjectwithValue(sqInt index, sqInt oop, sqInt valuePointer); @@ -259,7 +266,7 @@ connectToFdwrite(int fd, sqInt writeFlag) /* FilePlugin>>#connectToFile:write: */ EXPORT(sqInt) -connectToFilewrite(FILE *cfile, sqInt writeFlag) +connectToFilewrite(void *cfile, sqInt writeFlag) { SQFile *file; sqInt fileOop; @@ -567,6 +574,30 @@ moduleUnloaded(char *aModuleName) } +/* Answer the machine address contained in anExternalAddressOop. */ + + /* FilePlugin>>#pointerFrom: */ +static void * +pointerFrom(sqInt pointerByteArray) +{ + union {void *address; unsigned char bytes[sizeof(void *)];} addressUnion; + sqInt idx; + unsigned char *ptr; + + if (!((isKindOf(pointerByteArray, "ByteArray")) + && ((stSizeOf(pointerByteArray)) == (sizeof(void *))))) { + return null; + } + ptr = arrayValueOf(pointerByteArray); + idx = 0; + while (idx < (sizeof(void *))) { + addressUnion.bytes[idx] = ptr[idx]; + idx += 1; + } + return addressUnion.address; +} + + /* Connect to the file with the supplied FILE* and writeFlag. FILE* must be supplied in a byte object (ByteArray) with the platform address size. @@ -577,22 +608,18 @@ moduleUnloaded(char *aModuleName) EXPORT(sqInt) primitiveConnectToFile(void) { - FILE* cfile; + void* cfile; sqInt cfileOop; sqInt filePointer; sqInt writeFlag; - filePointer = 0; writeFlag = booleanValueOf(stackValue(0)); cfileOop = stackValue(1); - if (!((isBytes(cfileOop)) - && ((byteSizeOf(cfileOop)) == (sizeof(FILE*))))) { + cfile = pointerFrom(cfileOop); + if (!(cfile)) { return primitiveFailFor(PrimErrBadArgument); } - cfile = firstIndexableField(cfileOop); - if (!(failed())) { - filePointer = connectToFilewrite(cfile, writeFlag); - } + filePointer = connectToFilewrite(cfile, writeFlag); if (!(failed())) { return popthenPush(3, filePointer); } @@ -1669,6 +1696,7 @@ setInterpreter(struct VirtualMachine*anInterpreter) if (ok) { #if !defined(SQUEAK_BUILTIN_PLUGIN) + arrayValueOf = interpreterProxy->arrayValueOf; booleanValueOf = interpreterProxy->booleanValueOf; byteSizeOf = interpreterProxy->byteSizeOf; #if VM_PROXY_MAJOR > 1 || (VM_PROXY_MAJOR == 1 && VM_PROXY_MINOR >= 13) @@ -1691,6 +1719,7 @@ setInterpreter(struct VirtualMachine*anInterpreter) integerObjectOf = interpreterProxy->integerObjectOf; integerValueOf = interpreterProxy->integerValueOf; ioLoadFunctionFrom = interpreterProxy->ioLoadFunctionFrom; + isKindOf = interpreterProxy->isKindOf; isBytes = interpreterProxy->isBytes; isIntegerObject = interpreterProxy->isIntegerObject; isWords = interpreterProxy->isWords; @@ -1710,6 +1739,7 @@ setInterpreter(struct VirtualMachine*anInterpreter) pushBool = interpreterProxy->pushBool; pushRemappableOop = interpreterProxy->pushRemappableOop; slotSizeOf = interpreterProxy->slotSizeOf; + stSizeOf = interpreterProxy->stSizeOf; stackIntegerValue = interpreterProxy->stackIntegerValue; stackValue = interpreterProxy->stackValue; storePointerofObjectwithValue = interpreterProxy->storePointerofObjectwithValue;