VM Maker: VMMaker.oscog-AlistairGrant.2427.mcz

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

VM Maker: VMMaker.oscog-AlistairGrant.2427.mcz

commits-2
 
Alistair Grant uploaded a new version of VMMaker to project VM Maker:
http://source.squeak.org/VMMaker/VMMaker.oscog-AlistairGrant.2427.mcz

==================== Summary ====================

Name: VMMaker.oscog-AlistairGrant.2427
Author: AlistairGrant
Time: 13 August 2018, 9:46:56.59943 pm
UUID: 36e9946a-6f6e-461b-89e8-f290e50dd097
Ancestors: VMMaker.oscog-AlistairGrant.2426

274: Update primitiveFileStdioHandles error handling.

Previously validMask = -1 was considered an error.  Now validMask < 0 is considered an error and the value is returned to the image with primitiveFailForOSError().

This is more robust against word length in the VM and provides a general mechanism for the plugin to provide error information back to the image.

=============== Diff against VMMaker.oscog-AlistairGrant.2426 ===============

Item was changed:
  ----- Method: FilePlugin>>primitiveFileStdioHandles (in category 'file primitives') -----
  primitiveFileStdioHandles
  "Answer an Array of file handles for standard in, standard out and standard error,
  with nil in entries that are unvailable, e.g. because the platform does not provide
+ standard error, etc.  Fail if an error occurs determining the stdio handles,
- standard error, etc.  Fail if there are no standard i/o facilities on the platform or
  if the security plugin denies access or if memory runs out."
  | fileRecords result validMask |
  <export: true>
  <var: 'fileRecords' declareC: 'SQFile fileRecords[3]'>
  sHFAfn ~= 0 ifTrue:
  [(self cCode: ' ((sqInt (*)(void))sHFAfn)()' inSmalltalk: [true]) ifFalse:
  [^interpreterProxy primitiveFailFor: PrimErrUnsupported]].
  self cCode: '' inSmalltalk: [fileRecords := Array new: 3].
  validMask := self sqFileStdioHandlesInto: fileRecords.
+ validMask < 0 ifTrue:
+ [^interpreterProxy primitiveFailForOSError: validMask].
- validMask = -1 ifTrue:
- [^interpreterProxy primitiveFail].
  result := interpreterProxy instantiateClass: interpreterProxy classArray indexableSize: 3.
  result = nil ifTrue:
  [^interpreterProxy primitiveFailFor: PrimErrNoMemory].
  interpreterProxy pushRemappableOop: result.
  0 to: 2 do:
  [:index|
  (validMask bitAnd: (1 << index)) ~= 0 ifTrue:
  [result := interpreterProxy instantiateClass: interpreterProxy classByteArray indexableSize: self fileRecordSize.
  result = nil ifTrue:
  [interpreterProxy popRemappableOop.
  ^interpreterProxy primitiveFailFor: PrimErrNoMemory].
  interpreterProxy storePointer: index ofObject: interpreterProxy topRemappableOop withValue: result.
  self
  cCode:
  [self mem: (interpreterProxy firstIndexableField: result)
  cp: (self addressOf: (fileRecords at: index))
  y: self fileRecordSize]
  inSmalltalk:
  [(interpreterProxy firstIndexableField: result)
  unitSize: interpreterProxy wordSize;
  at: 0 put: (fileRecords at: index + 1)]]].
  "In the non-Spur threaded VM ensure the handles are old, so that sqFileReadIntoAt is unaffected
   by incremental GCs.  See platforms/Cross/plugins/FilePlugin/sqFilePluginBasicPrims.c.  The Spur
   VM uses pinning, so it doesn't need the GC."
  self cppIf: COGMTVM
  ifTrue: [self cppIf: SPURVM
  ifTrue: []
  ifFalse: [interpreterProxy fullGC]].
  result := interpreterProxy popRemappableOop.
  interpreterProxy methodReturnValue: result!