I saw I'm just in a place without internet right now :) Stef On May 2, 2012, at 4:59 PM, Mariano Martinez Peck wrote:
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 <stephane.ducasse@inria.fr> wrote:
Begin forwarded message:
From: pharo-project-owner@lists.gforge.inria.fr Subject: Fwd: [squeak-dev] The Trunk: Kernel-eem.684.mcz Date: April 30, 2012 6:48:24 PM GMT+02:00 To: stephane.ducasse@gmail.com
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:00 To: Pharo Development <Pharo-project@lists.gforge.inria.fr>
Begin forwarded message:
From: commits@source.squeak.org Subject: [squeak-dev] The Trunk: Kernel-eem.684.mcz Date: April 26, 2012 6:07:56 PM GMT+02:00 To: squeak-dev@lists.squeakfoundation.org, packages@lists.squeakfoundation.org Reply-To: squeak-dev@lists.squeakfoundation.org
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