Bert Freudenberg uploaded a new version of Kernel to project The Trunk: http://source.squeak.org/trunk/Kernel-bf.744.mcz
==================== Summary ====================
Name: Kernel-bf.744 Author: bf Time: 4 March 2013, 3:25:12.024 pm UUID: e3c35ac4-6571-4bcc-86d4-ccb613a8e631 Ancestors: Kernel-nice.743
Sanitize Time class>>readFrom: to not read beyond the time. Use that to sanitize DateAndTime class>>readFrom:, too, avoiding the only known use of PositionableStream>>last. Time tests are still green.
=============== Diff against Kernel-nice.743 ===============
Item was changed: ----- Method: DateAndTime class>>readFrom: (in category 'squeak protocol') ----- readFrom: aStream
| offset date time ch |
date := Date readFrom: aStream. [aStream peek isDigit] whileFalse: [aStream next]. time := Time readFrom: aStream. + (aStream atEnd or: [('+-Z' includes: aStream peek) not]) + ifTrue: [offset := self localOffset] + ifFalse: [(aStream peekFor: $Z) + ifTrue: [offset := Duration zero] + ifFalse: [ + ch := aStream next. + ch = $+ ifTrue: [ch := Character space]. + offset := Duration fromString: ch asString, '0:', aStream upToEnd, ':0']]. - aStream atEnd - ifTrue: [ (aStream last = $Z) ifTrue: [offset := Duration zero] ifFalse: [ offset := self localOffset ]] - ifFalse: [ - ch := aStream next. - ch = $+ ifTrue: [ch := Character space]. - offset := Duration fromString: ch asString, '0:', aStream upToEnd, ':0']. - ^ self year: date year month: date monthIndex day: date dayOfMonth hour: time hour minute: time minute second: time second nanoSecond: time nanoSecond offset: offset
" '-1199-01-05T20:33:14.321-05:00' asDateAndTime ' 2002-05-16T17:20:45.1+01:01' asDateAndTime
' 2002-05-16T17:20:45.02+01:01' asDateAndTime
' 2002-05-16T17:20:45.003+01:01' asDateAndTime
' 2002-05-16T17:20:45.0004+01:01' asDateAndTime ' 2002-05-16T17:20:45.00005' asDateAndTime ' 2002-05-16T17:20:45.000006+01:01' asDateAndTime
' 2002-05-16T17:20:45.0000007+01:01' asDateAndTime ' 2002-05-16T17:20:45.00000008-01:01' asDateAndTime ' 2002-05-16T17:20:45.000000009+01:01' asDateAndTime ' 2002-05-16T17:20:45.0000000001+01:01' asDateAndTime
' 2002-05-16T17:20' asDateAndTime ' 2002-05-16T17:20:45' asDateAndTime ' 2002-05-16T17:20:45+01:57' asDateAndTime ' 2002-05-16T17:20:45-02:34' asDateAndTime ' 2002-05-16T17:20:45+00:00' asDateAndTime ' 1997-04-26T01:02:03+01:02:3' asDateAndTime "!
Item was changed: ----- Method: Time class>>readFrom: (in category 'smalltalk-80') ----- readFrom: aStream "Read a Time from the stream in the form: <hour>:<minute>:<second> <am/pm>
<minute>, <second> or <am/pm> may be omitted. e.g. 1:59:30 pm; 8AM; 15:30"
| hour minute second ampm nanos nanosBuffer | hour := Integer readFrom: aStream. minute := 0. second := 0. nanosBuffer := '000000000' copy. nanos := WriteStream on: nanosBuffer. (aStream peekFor: $:) ifTrue: [ minute := Integer readFrom: aStream. (aStream peekFor: $:) ifTrue: [ + second := Integer readFrom: aStream. - second := Integer readFrom: aStream]. (aStream peekFor: $.) ifTrue: [ [aStream atEnd not and: [aStream peek isDigit]] + whileTrue: [nanos nextPut: aStream next]]]]. - whileTrue: [nanos nextPut: aStream next]]]. aStream skipSeparators. + (aStream atEnd not and: ['PApa' includes: aStream peek]) ifTrue: - (aStream atEnd not and: [aStream peek isLetter]) ifTrue: [ampm := aStream next asLowercase. + (ampm = $p and: [hour < 12]) ifTrue: [hour := hour + 12]. - - (ampm = $p and: [hour < 12]) ifTrue: [hour := hour + 12]. (ampm = $a and: [hour = 12]) ifTrue: [hour := 0]. + (aStream peekFor: $m) ifFalse: [aStream peekFor: $M ]]. - - (aStream peekFor: $m) ifFalse: [aStream peekFor: $M ]]. ^ self hour: hour minute: minute second: second nanoSecond: nanosBuffer asInteger
"Time readFrom: (ReadStream on: '2:23:09 pm')"!
squeak-dev@lists.squeakfoundation.org