Alistair Grant uploaded a new version of VMMaker to project VM Maker: http://source.squeak.org/VMMaker/VMMaker.oscog-AlistairGrant.2456.mcz ==================== Summary ==================== Name: VMMaker.oscog-AlistairGrant.2456 Author: AlistairGrant Time: 14 October 2018, 9:25:11.249348 pm UUID: 47b0319d-df10-4ece-84fc-324d0d35fe1d Ancestors: VMMaker.oscog-AlistairGrant.2455 FakeStdinStream and FilePluginSimulator do double duty with the #atEnd flag to allow #sqFile:Read:Into:At: to break out of its loop. This is brittle as a additional calls to #atEnd breaks the simulation - which is what Pharo does. Instead of doing double duty with #atEnd, do the same as the actual plugin (sqFileReadIntoAt() in sqFilePluginBasicPrims.c) and ignore the number of bytes to read when input is from stdin (FakeStdinStream) and only ever read a single byte (fixes the problem and is closer to the real plugin behaviour). =============== Diff against VMMaker.oscog-AlistairGrant.2455 =============== Item was changed: ----- Method: FakeStdinStream>>next (in category 'accessing') ----- next "Answer the next object in the Stream represented by the receiver. If there are no more elements in the stream fill up the buffer by prompting for input" | sem threadIndex inputLine next | position >= readLimit ifTrue: [simulator isThreadedVM ifTrue: ["(simulator cogit singleStep not and: [UIManager confirm: 'Single step?']) ifTrue: [simulator cogit singleStep: true]." threadIndex := simulator disownVM: DisownVMLockOutFullGC. simulator forceInterruptCheckFromHeartbeat. sem := Semaphore new. WorldState addDeferredUIMessage: [inputLine := UIManager default request: 'Input please!!'. sem signal]. sem wait] ifFalse: "simulate line-oriented input" [inputLine := ((Smalltalk classNamed: #FillInTheBlankMorph) ifNotNil: "Squeak" [:fITBM| fITBM request: 'Input please!!' initialAnswer: '' centerAt: ActiveHand cursorPoint inWorld: ActiveWorld onCancelReturn: nil acceptOnCR: true] ifNil: "Pharo; onCancelReturn: nil is the default here" [UIManager default request: 'Input please!!' initialAnswer: '']). inputLine ifNil: [self atEnd: true. ^nil]]. collection size <= inputLine size ifTrue: [collection := collection species new: inputLine size + 1]. collection replaceFrom: 1 to: inputLine size with: inputLine startingAt: 1; at: (readLimit := inputLine size + 1) put: Character lf. position := 0. simulator isThreadedVM ifTrue: [simulator ownVM: threadIndex]]. next := collection at: (position := position + 1). - "This is set temporarily to allow (FilePluginSimulator>>#sqFile:Read:Into:At: - to brwak out of its loop. sqFile:Read:Into:At: resets it on the way out." - atEnd := position >= readLimit. ^next " This does it with workspaces: | ws r s | s := Semaphore new. ws := Workspace new contents: ''. ws acceptAction: [:t| r := t asString. s signal]. [ws openLabel: 'Yo!!'; shouldStyle: false. (ws dependents detect: [:dep | dep isKindOf: PluggableTextMorph] ifNone: [nil]) ifNotNil: [:textMorph| textMorph acceptOnCR: true; hasUnacceptedEdits: true]] fork. Processor activeProcess == Project uiProcess ifTrue: [[r isNil] whileTrue: [World doOneCycle]] ifFalse: [s wait]. ws topView delete. s wait. s signal. r"! Item was changed: ----- Method: FilePluginSimulator>>sqFile:Read:Into:At: (in category 'simulation') ----- + sqFile: file Read: countArg Into: byteArrayIndexArg At: startIndex + | byteArrayIndex count | + count := file isFakeStdinStream + ifTrue: [1] + ifFalse: [countArg]. - sqFile: file Read: count Into: byteArrayIndexArg At: startIndex - | byteArrayIndex | byteArrayIndex := byteArrayIndexArg asInteger. "Coerces CArray et al correctly" [[startIndex to: startIndex + count - 1 do: [ :i | + file atEnd ifTrue: [^i - startIndex]. - file atEnd ifTrue: - [file isFakeStdinStream ifTrue: [file atEnd: false]. - ^i - startIndex]. interpreterProxy byteAt: byteArrayIndex + i put: (file next ifNil: [file isFakeStdinStream ifTrue: [^0]] ifNotNil: [:c| c asInteger])]] on: Error do: [:ex| (file isStream and: [file isTranscriptStream]) ifFalse: [ex pass]. ^0]] ensure: [self recordStateOf: file]. ^count! |
Free forum by Nabble | Edit this page |