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
> 


Reply via email to