[squeak-dev] The Trunk: Kernel-eem.684.mcz

commits at source.squeak.org commits at source.squeak.org
Thu Apr 26 18:08:26 UTC 2012


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

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

Name: Kernel-eem.684
Author: eem
Time: 26 April 2012, 11:07:37.737 am
UUID: e838a325-27ec-4a62-a907-d4059451a046
Ancestors: Kernel-nice.683

Implement endPC numArgs and numTemps for closures
and contexts (both block and method activations).
Provide CompiledMethod>abstractBytecodeMessagesDo:
et al.
Implement BlockClosure>isClean to identify self-contained blocks.

=============== Diff against Kernel-nice.683 ===============

Item was added:
+ ----- Method: BlockClosure>>abstractBytecodeMessagesDo: (in category 'scanning') -----
+ abstractBytecodeMessagesDo: aBlock
+ 	"Evaluate aBlock with the sequence of abstract bytecodes in the receiver."
+ 	self method
+ 		abstractBytecodeMessagesFrom: startpc
+ 		to: self endPC
+ 		do: aBlock
+ 
+ 	"| msgs |
+ 	 msgs := OrderedCollection new.
+ 	 (SortedCollection sortBlock: [:a :b| a compare: b caseSensitive: false]) sortBlock
+ 		abstractBytecodeMessagesDo: [:msg| msgs add: msg selector].
+ 	 msgs"!

Item was added:
+ ----- Method: BlockClosure>>blockCreationBytecodeMessage (in category 'scanning') -----
+ blockCreationBytecodeMessage
+ 	"Answer the abstract bytecode message that created the receiver."
+ 	| blockCreationBytecodeSize |
+ 	^self method abstractBytecodeMessageAt: startpc - (blockCreationBytecodeSize := 4)
+ 
+ 	"(SortedCollection sortBlock: [:a :b| a compare: b caseSensitive: false]) sortBlock blockCreationBytecodeMessage"!

Item was added:
+ ----- Method: BlockClosure>>endPC (in category 'accessing') -----
+ endPC
+ 	^self blockCreationBytecodeMessage arguments last + startpc - 1!

Item was changed:
  ----- Method: BlockClosure>>hasMethodReturn (in category 'testing') -----
  hasMethodReturn
  	"Answer whether the receiver has a method-return ('^') in its code."
+ 	| scanner endpc |
+ 	scanner := InstructionStream new method: outerContext method pc: startpc.
+ 	endpc := self endPC.
+ 	scanner scanFor: [:byte | (byte between: 120 and: 124) or: [scanner pc > endpc]].
+ 	^scanner pc <= endpc!
- 	| myMethod scanner preceedingBytecodeMessage end |
- 	"Determine end of block from the instruction preceding it.
- 	 Find the instruction by using an MNU handler to capture
- 	 the instruction message sent by the scanner."
- 	myMethod := outerContext method.
- 	scanner := InstructionStream new method: myMethod pc: myMethod initialPC.
- 	[scanner pc < startpc] whileTrue:
- 		[[scanner interpretNextInstructionFor: nil]
- 			on: MessageNotUnderstood
- 			do: [:ex| preceedingBytecodeMessage := ex message]].
- 	end := preceedingBytecodeMessage arguments last + startpc - 1.
- 	scanner method: myMethod pc: startpc.
- 	scanner scanFor: [:byte | (byte between: 120 and: 124) or: [scanner pc > end]].
- 	^scanner pc <= end!

Item was added:
+ ----- Method: BlockClosure>>isClean (in category 'testing') -----
+ isClean
+ 	"Answer if the receiver does not close-over any variables other than globals, and does
+ 	 not ^-return (does not close over the home context).  Clean blocks are amenable to
+ 	 being created at compile-time."
+ 	self numCopiedValues > 0 ifTrue:
+ 		[^false].
+ 	self abstractBytecodeMessagesDo:
+ 		[:msg|
+ 		(#(	pushReceiver
+ 			pushReceiverVariable: popIntoReceiverVariable: storeIntoReceiverVariable:
+ 			methodReturnConstant: methodReturnReceiver methodReturnTop)
+ 				includes: msg selector) ifTrue:
+ 					[^false]].
+ 	^true
+ 
+ 	"clean:"
+ 		"[] isClean"
+ 		"[:a :b| a < b] isClean"
+ 	"unclean"
+ 		"[^nil] isClean"
+ 		"[self class] isClean"
+ 		"| v | v := 0.
+ 		 [v class] isClean"!

Item was added:
+ ----- Method: BlockClosure>>numTemps (in category 'accessing') -----
+ numTemps
+ 	"Answer the number of temporaries for the receiver; this includes
+ 	 the number of arguments and the number of copied values."
+ 	| blockCreationBytecodeSize |
+ 	^self numCopiedValues
+ 	 + self numArgs
+ 	 + (BlockLocalTempCounter
+ 			tempCountForBlockAt: startpc - (blockCreationBytecodeSize := 4)
+ 			in: self method)!

Item was added:
+ ----- Method: CompiledMethod>>abstractBytecodeMessageAt: (in category 'scanning') -----
+ abstractBytecodeMessageAt: pc
+ 	"Answer the abstract bytecode message at pc in the receiver."
+ 	^[(InstructionStream new method: self pc: pc) interpretNextInstructionFor: nil]
+ 		on: MessageNotUnderstood
+ 		do: [:ex| ex message]!

Item was added:
+ ----- Method: CompiledMethod>>abstractBytecodeMessagesDo: (in category 'scanning') -----
+ abstractBytecodeMessagesDo: aBlock
+ 	"Evaluate aBlock with the sequence of abstract bytecodes in the receiver"
+ 	self abstractBytecodeMessagesFrom: self initialPC
+ 		to: self endPC
+ 		do: aBlock
+ 
+ 	"| msgs |
+ 	 msgs := OrderedCollection new.
+ 	 CompiledMethod >> #abstractBytecodeMessagesFrom:to: abstractBytecodeMessagesDo:
+ 		[:msg| msgs add: msg selector].
+ 	 msgs"!

Item was added:
+ ----- Method: CompiledMethod>>abstractBytecodeMessagesFrom:to:do: (in category 'scanning') -----
+ abstractBytecodeMessagesFrom: startpc to: endpc do: aBlock
+ 	"Evaluate aBlock with the sequence of abstract bytecodes from startpc through endpc in the receiver"
+ 	| scanner |
+ 	scanner := InstructionStream new method: self pc: startpc.
+ 	[scanner pc <= endpc] whileTrue:
+ 		[[scanner interpretNextInstructionFor: nil]
+ 			on: MessageNotUnderstood
+ 			do: [:ex| aBlock value: ex message]]
+ 
+ 	"| m msgs |
+ 	 msgs := OrderedCollection new.
+ 	 (m := CompiledMethod >> #abstractBytecodeMessagesFrom:to:)
+ 		abstractBytecodeMessagesFrom: m initialPC
+ 		to: m endPC
+ 		do: [:msg| msgs add: msg selector].
+ 	 msgs"!

Item was added:
+ ----- Method: MethodContext>>endPC (in category 'private') -----
+ endPC
+ 	^closureOrNil
+ 		ifNil:	[self method endPC]
+ 		ifNotNil: [closureOrNil endPC]!

Item was added:
+ ----- Method: MethodContext>>numArgs (in category 'accessing') -----
+ numArgs
+ 	"Answer the number of arguments for this activation."
+ 	^closureOrNil
+ 		ifNil: [method numArgs]
+ 		ifNotNil: [closureOrNil numArgs]!

Item was added:
+ ----- Method: MethodContext>>numTemps (in category 'accessing') -----
+ numTemps
+ 	"Answer the number of temporaries for this activation; this includes
+ 	 the number of arguments, and for blocks, the number of copied values."
+ 	^closureOrNil
+ 		ifNil: [method numTemps]
+ 		ifNotNil: [closureOrNil numTemps]!



More information about the Squeak-dev mailing list