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