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 ;)

On Wed, May 2, 2012 at 4:45 PM, Stéphane Ducasse
<[email protected]>wrote:

>
>
> Begin forwarded message:
>
> *From: *[email protected]
> *Subject: **Fwd: [squeak-dev] The Trunk: Kernel-eem.684.mcz*
> *Date: *April 30, 2012 6:48:24 PM GMT+02:00
> *To: *[email protected]
>
> 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
> [email protected].
>
>
> *From: *stephane ducasse <[email protected]>
> *Subject: **Fwd: [squeak-dev] The Trunk: Kernel-eem.684.mcz*
> *Date: *April 30, 2012 6:46:40 PM GMT+02:00
> *To: *Pharo Development <[email protected]>
>
>
>
>
> Begin forwarded message:
>
> From: [email protected]
>
> Subject: [squeak-dev] The Trunk: Kernel-eem.684.mcz
>
> Date: April 26, 2012 6:07:56 PM GMT+02:00
>
> To: [email protected],
> [email protected]
>
> Reply-To: [email protected]
>
>
> 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]!
>
>
>
>
>
>
>
>
>


-- 
Mariano
http://marianopeck.wordpress.com

Reply via email to