The Trunk: Kernel-eem.684.mcz

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

The Trunk: Kernel-eem.684.mcz

commits-2
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]!