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]! |
Free forum by Nabble | Edit this page |