The Trunk: System-nice.776.mcz

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

The Trunk: System-nice.776.mcz

commits-2
Nicolas Cellier uploaded a new version of System to project The Trunk:
http://source.squeak.org/trunk/System-nice.776.mcz

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

Name: System-nice.776
Author: nice
Time: 31 October 2015, 11:35:30.653 pm
UUID: d178a6bb-8b9a-47ed-9eff-8544ba286894
Ancestors: System-topa.775

Fix SmartRefStream for 64bits spur VM.

The scenario is this one: a SmallInteger smaller than 32 bits VM minSmallInteger is being replaced with a fake LargeNegativeInteger.

But the fake LargeNegativeInteger is not stored in references IdentityDictionary; consequently the class is NOT properly registered into the structures, and this creates an Error at materialization time...

So let's reference the fake...

=============== Diff against System-topa.775 ===============

Item was changed:
  ----- Method: DataStream>>nextPut: (in category 'write and read') -----
  nextPut: anObject
  "Write anObject to the receiver stream. Answer anObject."
  | typeID selector objectToStore |
 
  typeID := self typeIDFor: anObject.
  (self tryToPutReference: anObject typeID: typeID)
  ifTrue: [^ anObject].
 
  objectToStore := (self objectIfBlocked: anObject) objectForDataStream: self.
+ objectToStore == anObject
+ ifFalse:
+ [typeID := self typeIDFor: objectToStore.
+ (self tryToPutReference: objectToStore typeID: typeID)
+ ifTrue: [^ anObject]].
- objectToStore == anObject ifFalse: [typeID := self typeIDFor: objectToStore].
 
  byteStream nextPut: typeID.
  selector := #(writeNil: writeTrue: writeFalse: writeInteger:
  writeStringOld: writeSymbol: writeByteArray:
  writeArray: writeInstance: errorWriteReference: writeBitmap:
  writeClass: writeUser: writeFloat: writeRectangle: == "<-16 short inst"
  writeString: writeBitmap: writeBitmap: writeWordLike:
  writeInstance: "CompiledMethod") at: typeID.
  self perform: selector with: objectToStore.
 
  ^ anObject
 
 
  "NOTE: If anObject is a reference type (one that we write cross-references to) but its externalized form (result of objectForDataStream:) isn't (e.g. CompiledMethod and ViewState), then we should remember its externalized form
   but not add to 'references'. Putting that object again should just put its
   external form again. That's more compact and avoids seeks when reading.
   But we just do the simple thing here, allowing backward-references for
   non-reference types like nil. So objectAt: has to compensate. Objects that
   externalize nicely won't contain the likes of ViewStates, so this shouldn't
   hurt much.
  writeReference: -> errorWriteReference:."!