[squeak-dev] The Trunk: Compiler-eem.258.mcz

commits at source.squeak.org commits at source.squeak.org
Wed Apr 3 20:07:48 UTC 2013


Eliot Miranda uploaded a new version of Compiler to project The Trunk:
http://source.squeak.org/trunk/Compiler-eem.258.mcz

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

Name: Compiler-eem.258
Author: eem
Time: 3 April 2013, 12:59:36.409 pm
UUID: 7721a43f-63e6-4524-bb6d-48eddc955654
Ancestors: Compiler-eem.257

Fix store of special bindings.  Exsting code dropped the
value assigned from the stack, so v := binding := expr would
leave v holding binding, not expr.  New code generates
	push expr
	push binding
	duplicate expr (by pushTemp: of expr's stack index)
	send value:
	pop

=============== Diff against Compiler-eem.257 ===============

Item was changed:
  ----- Method: AssignmentNode>>emitCodeForEffect:encoder: (in category 'code generation') -----
  emitCodeForEffect: stack encoder: encoder
  
+ 	variable emitCodeForLoad: stack forValue: false encoder: encoder.
- 	variable emitCodeForLoad: stack encoder: encoder.
  	value emitCodeForValue: stack encoder: encoder.
  	pc := encoder methodStreamPosition + 1. "debug pc is first byte of the store, i.e. the next byte".
  	variable emitCodeForStorePop: stack encoder: encoder!

Item was changed:
  ----- Method: AssignmentNode>>emitCodeForValue:encoder: (in category 'code generation') -----
  emitCodeForValue: stack encoder: encoder
  
+ 	variable emitCodeForLoad: stack forValue: true encoder: encoder.
- 	variable emitCodeForLoad: stack encoder: encoder.
  	value emitCodeForValue: stack encoder: encoder.
  	pc := encoder methodStreamPosition + 1. "debug pc is first byte of the store, i.e. the next byte".
  	variable emitCodeForStore: stack encoder: encoder!

Item was changed:
  ----- Method: AssignmentNode>>sizeCodeForEffect: (in category 'code generation') -----
  sizeCodeForEffect: encoder
  
+ 	^(variable sizeCodeForLoad: encoder forValue: false)
- 	^(variable sizeCodeForLoad: encoder)
  	+ (value sizeCodeForValue: encoder)
  	+ (variable sizeCodeForStorePop: encoder)!

Item was changed:
  ----- Method: AssignmentNode>>sizeCodeForValue: (in category 'code generation') -----
  sizeCodeForValue: encoder
  
+ 	^(variable sizeCodeForLoad: encoder forValue: true)
- 	^(variable sizeCodeForLoad: encoder)
  	+ (value sizeCodeForValue: encoder)
  	+ (variable sizeCodeForStore: encoder)!

Item was added:
+ ----- Method: BytecodeEncoder>>sizePushTempLong: (in category 'opcode sizing') -----
+ sizePushTempLong: tempIndex
+ 	^self sizeOpcodeSelector: #genPushTempLong: withArguments: {tempIndex}!

Item was added:
+ ----- Method: EncoderForV3>>genPushTempLong: (in category 'bytecode generation') -----
+ genPushTempLong: tempIndex
+ 	"See BlueBook page 596"
+ 	(tempIndex >= 0 and: [tempIndex < 64]) ifTrue: 
+ 		["128 	10000000 jjkkkkkk 	Push (Receiver Variable, Temporary Location, Literal Constant, Literal Variable) [jj] #kkkkkk"
+ 		 stream
+ 			nextPut: 128;
+ 			nextPut: 64 + tempIndex.
+ 		 ^self].
+ 	^self outOfRangeError: 'index' index: tempIndex range: 0 to: 63!

Item was removed:
- ----- Method: FieldNode>>emitCodeForLoad:encoder: (in category 'code generation') -----
- emitCodeForLoad: stack encoder: encoder
- 	rcvrNode emitCodeForValue: stack encoder: encoder.
- 	fieldDef accessKey ifNotNil:[
- 		super emitCodeForValue: stack encoder: encoder.
- 	].!

Item was added:
+ ----- Method: FieldNode>>emitCodeForLoad:forValue:encoder: (in category 'code generation') -----
+ emitCodeForLoad: stack forValue: forValue encoder: encoder
+ 	rcvrNode emitCodeForValue: stack encoder: encoder.
+ 	fieldDef accessKey ifNotNil:
+ 		[super emitCodeForValue: stack encoder: encoder]!

Item was removed:
- ----- Method: LeafNode>>emitCodeForLoad:encoder: (in category 'code generation') -----
- emitCodeForLoad: stack encoder: encoder
- 	"Default is to do nothing.
- 	 Subclasses may need to override."!

Item was added:
+ ----- Method: LeafNode>>emitCodeForLoad:forValue:encoder: (in category 'code generation') -----
+ emitCodeForLoad: stack forValue: forValue encoder: encoder
+ 	"Default is to do nothing.
+ 	 Subclasses may need to override."!

Item was removed:
- ----- Method: LeafNode>>sizeCodeForLoad: (in category 'code generation') -----
- sizeCodeForLoad: encoder
- 	"Default is to do nothing.
- 	 Subclasses may need to override."
- 	^0!

Item was added:
+ ----- Method: LeafNode>>sizeCodeForLoad:forValue: (in category 'code generation') -----
+ sizeCodeForLoad: encoder forValue: forValue
+ 	"Default is to do nothing.
+ 	 Subclasses may need to override."
+ 	^0!

Item was removed:
- ----- Method: LiteralVariableNode>>emitCodeForLoad:encoder: (in category 'code generation') -----
- emitCodeForLoad: stack encoder: encoder
- 	writeNode ifNotNil:
- 		[encoder genPushLiteral: index.
- 		 stack push: 1]!

Item was added:
+ ----- Method: LiteralVariableNode>>emitCodeForLoad:forValue:encoder: (in category 'code generation') -----
+ emitCodeForLoad: stack forValue: forValue encoder: encoder
+ 	"If a normal literal variable (not sending value:), do nothing.
+ 	 If for value (e.g. v := Binding := expr) do nothing; the work will be done in emitCodeForStore:encoder:.
+ 	 If not for value then indeed load.  The rest of the work will be done in  emitCodeForStorePop:encoder:."
+ 	(writeNode isNil or: [forValue]) ifTrue: [^self].
+ 	encoder genPushLiteral: index.
+ 	stack push: 1!

Item was changed:
  ----- Method: LiteralVariableNode>>emitCodeForStore:encoder: (in category 'code generation') -----
  emitCodeForStore: stack encoder: encoder
+ 	| exprOffset |
  	writeNode ifNil: [^encoder genStoreLiteralVar: index].
+ 	"On entry the stack has only the expression.  Push the binding,
+ 	 duplicate the expression, send #value: and pop."
+ 	exprOffset := stack position - 1.
+ 	encoder genPushLiteral: index.
+ 	stack push: 1.
+ 	encoder genPushTempLong: exprOffset.
+ 	stack push: 1.
- 	"THIS IS WRONG!!!! THE VALUE IS LOST FROM THE STACK!!!!
- 	 The various value: methods on Association ReadOnlyVariableBinding
- 	 etc _do not_ return the value assigned; they return the receiver."
- 	"Should generate something more like
- 		push expr
- 		push lit
- 		push temp (index of expr)
- 		send value:
- 		pop
- 	or use e.g. valueForStore:"
- 	self flag: #bogus.
  	writeNode
  		emitCode: stack
  		args: 1
  		encoder: encoder
+ 		super: false.
+ 	stack pop: 1.
+ 	encoder genPop!
- 		super: false!

Item was removed:
- ----- Method: LiteralVariableNode>>sizeCodeForLoad: (in category 'code generation') -----
- sizeCodeForLoad: encoder
- 	self reserve: encoder.
- 	^(key isVariableBinding and: [key isSpecialWriteBinding])
- 		ifTrue: [encoder sizePushLiteral: index]
- 		ifFalse: [0]!

Item was added:
+ ----- Method: LiteralVariableNode>>sizeCodeForLoad:forValue: (in category 'code generation') -----
+ sizeCodeForLoad: encoder forValue: forValue
+ 	self reserve: encoder.
+ 	^(key isVariableBinding and: [key isSpecialWriteBinding and: [forValue not]])
+ 		ifTrue: [encoder sizePushLiteral: index]
+ 		ifFalse: [0]!

Item was changed:
  ----- Method: LiteralVariableNode>>sizeCodeForStore: (in category 'code generation') -----
  sizeCodeForStore: encoder
  	self reserve: encoder.
  	(key isVariableBinding and: [key isSpecialWriteBinding]) ifFalse:
  		[^encoder sizeStoreLiteralVar: index].
  	code < 0 ifTrue:
  		[self flag: #dubious.
  		 self code: (self code: self index type: LdLitType)].
- 	"THIS IS WRONG!!!! THE VALUE IS LOST FROM THE STACK!!!!
- 	 The various value: methods on Association ReadOnlyVariableBinding
- 	 etc _do not_ return the value assigned; they return the receiver."
- 	"Should generate something more like
- 		push expr
- 		push lit
- 		push temp (index of expr)
- 		send value:
- 		pop"
- 	self flag: #bogus.
  	writeNode := encoder encodeSelector: #value:.
+ 	"On entry the stack has only the expression.  Push the binding,
+ 	 duplicate the expression, send #value: and pop."
+ 	^(encoder sizePushLiteral: index)
+ 	  + (encoder sizePushTempLong: 0) "we don't know yet, hence long, sigh..."
+ 	  + (writeNode sizeCode: encoder args: 1 super: false)
+ 	  + encoder sizePop!
- 	^writeNode sizeCode: encoder args: 1 super: false!

Item was removed:
- ----- Method: TempVariableNode>>emitCodeForLoad:encoder: (in category 'code generation') -----
- emitCodeForLoad: stack encoder: encoder
- 	remoteNode ~~ nil ifTrue:
- 		[remoteNode emitCodeForLoadFor: self stack: stack encoder: encoder]!

Item was added:
+ ----- Method: TempVariableNode>>emitCodeForLoad:forValue:encoder: (in category 'code generation') -----
+ emitCodeForLoad: stack forValue: forValue encoder: encoder
+ 	remoteNode ~~ nil ifTrue:
+ 		[remoteNode emitCodeForLoadFor: self stack: stack encoder: encoder]!

Item was removed:
- ----- Method: TempVariableNode>>sizeCodeForLoad: (in category 'code generation') -----
- sizeCodeForLoad: encoder
- 	^remoteNode
- 		ifNil: [0]
- 		ifNotNil: [remoteNode sizeCodeForLoadFor: self encoder: encoder]!

Item was added:
+ ----- Method: TempVariableNode>>sizeCodeForLoad:forValue: (in category 'code generation') -----
+ sizeCodeForLoad: encoder forValue: forValue
+ 	^remoteNode
+ 		ifNil: [0]
+ 		ifNotNil: [remoteNode sizeCodeForLoadFor: self encoder: encoder]!

Item was removed:
- ----- Method: VariableNode>>emitCodeForLoad:encoder: (in category 'code generation') -----
- emitCodeForLoad: stack encoder: encoder
- 	"Do nothing"!

Item was added:
+ ----- Method: VariableNode>>emitCodeForLoad:forValue:encoder: (in category 'code generation') -----
+ emitCodeForLoad: stack forValue: forValue encoder: encoder
+ 	"Do nothing"!



More information about the Squeak-dev mailing list