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]!
>> 
>> 
> 
> 
> 
> 

Reply via email to