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
