Hi stef. Eliot send us (me and marcus) a private email about these changes and a suggestion for Fuel.
Marcus has already integrates all of these new methods ;)
Begin forwarded message:Subject: Fwd: [squeak-dev] The Trunk: Kernel-eem.684.mcz
Date: April 30, 2012 6:48:24 PM GMT+02:00
You are not allowed to post to this mailing list, and your message has
been automatically rejected. �If you think that your messages are
being rejected in error, contact the mailing list owner at
pharo-project-owner@lists.gforge.inria.fr.From: stephane ducasse <stephane.ducasse@gmail.com>
Subject: Fwd: [squeak-dev] The Trunk: Kernel-eem.684.mcz
Date: April 30, 2012 6:46:40 PM GMT+02:00To: Pharo Development <Pharo-project@lists.gforge.inria.fr>
Begin forwarded message:From: commits@source.squeak.orgSubject: [squeak-dev] The Trunk: Kernel-eem.684.mcz
Date: April 26, 2012 6:07:56 PM GMT+02:00To: squeak-dev@lists.squeakfoundation.org, packages@lists.squeakfoundation.org
Reply-To: squeak-dev@lists.squeakfoundation.orgEliot 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: eemTime: 26 April 2012, 11:07:37.737 amUUID: e838a325-27ec-4a62-a907-d4059451a046Ancestors: Kernel-nice.683Implement endPC numArgs and numTemps for closuresand 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]!