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 <[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 >
