[squeak-dev] The Trunk: Kernel-mt.1244.mcz

Eliot Miranda eliot.miranda at gmail.com
Mon Sep 13 05:32:43 UTC 2021


Hi Marcel, Hi All,

  please review Kernel-eem.1411 and Compiler-eem.460 in inbox as proposed
solutions for the self flag: #todo issue in CompiledCode>>#allLiteralsDo:
et al.

On Fri, Jul 12, 2019 at 12:59 AM <commits at source.squeak.org> wrote:

> Marcel Taeumel uploaded a new version of Kernel to project The Trunk:
> http://source.squeak.org/trunk/Kernel-mt.1244.mcz
>
> ==================== Summary ====================
>
> Name: Kernel-mt.1244
> Author: mt
> Time: 12 July 2019, 9:59:41.866568 am
> UUID: d585f898-09cc-094b-98ed-a74204c82019
> Ancestors: Kernel-mt.1243
>
> Refactoring of #literalsDo: - Step 2 of 3.
>
> For more information, see
> http://forum.world.st/Please-Review-Refactoring-for-literalsDo-etc-tp5099756p5100896.html
> .
>
> =============== Diff against Kernel-mt.1243 ===============
>
> Item was removed:
> - ----- Method: AdditionalMethodState>>hasLiteralSuchThat: (in category
> 'testing') -----
> - hasLiteralSuchThat: aBlock
> -       "Answer true if litBlock returns true for any literal in this
> array, even if embedded in further array structure.
> -        This method is only intended for private use by CompiledMethod
> hasLiteralSuchThat:"
> -       1 to: self basicSize do: [:i |
> -               | propertyOrPragma "<Association|Pragma>" |
> -               propertyOrPragma := self basicAt: i.
> -               (propertyOrPragma isVariableBinding
> -                       ifTrue: [(aBlock value: propertyOrPragma key)
> -                                       or: [(aBlock value:
> propertyOrPragma value)
> -                                       or: [propertyOrPragma value isArray
> -                                               and: [propertyOrPragma
> value hasLiteralSuchThat: aBlock]]]]
> -                       ifFalse: [propertyOrPragma hasLiteralSuchThat:
> aBlock]) ifTrue:
> -                       [^true]].
> -       ^false!
>
> Item was removed:
> - ----- Method: CompiledBlock>>allLiterals (in category 'literals') -----
> - allLiterals
> -       ^self homeMethod allLiterals!
>
> Item was removed:
> - ----- Method: CompiledBlock>>allSubLiterals (in category 'literals')
> -----
> - allSubLiterals
> -       | literalsExceptOuter unfoldedSubLiterals |
> -       literalsExceptOuter := self literals allButLast.
> -       unfoldedSubLiterals := literalsExceptOuter
> -                                                               select:
> [:lit| lit isCompiledCode]
> -
>  thenCollect: [:blockMethod| blockMethod allSubLiterals].
> -       unfoldedSubLiterals ifEmpty:
> -               [^literalsExceptOuter].
> -       ^literalsExceptOuter, (unfoldedSubLiterals fold: [:a :b| a, b])!
>
> Item was added:
> + ----- Method: CompiledBlock>>codeLiteralsDo: (in category 'literals')
> -----
> + codeLiteralsDo: aBlock
> +       "Overwritten to not cause infinite loop."
> +
> +       aBlock value: self.
> +
> +       self literalsDo: [:literal |
> +               (literal isCompiledCode and: [literal ~~ self outerCode])
> ifTrue: [
> +                       literal codeLiteralsDo: aBlock]].!
>
> Item was removed:
> - ----- Method: CompiledBlock>>hasLiteral: (in category 'literals') -----
> - hasLiteral: literal
> -       "Answer whether the receiver references the argument, literal."
> -       2 to: self numLiterals do: "exclude outerCode"
> -               [:index | | lit |
> -               lit := self objectAt: index.
> -               (lit literalEqual: literal) ifTrue:
> -                       [^true].
> -               (lit isCompiledCode and: [lit hasLiteral: literal]) ifTrue:
> -                       [^true]].
> -       ^false!
>
> Item was removed:
> - ----- Method: CompiledBlock>>hasLiteralSuchThat: (in category
> 'literals') -----
> - hasLiteralSuchThat: litBlock
> -       "Answer true if litBlock returns true for any literal in this
> method, even if embedded in array structure."
> -       2 to: self numLiterals do: "exclude outerCode"
> -               [:index | | lit |
> -               lit := self objectAt: index.
> -               ((litBlock value: lit)
> -               or: [(lit isArray or: [lit isCompiledCode]) and: [lit
> hasLiteralSuchThat: litBlock]]) ifTrue:
> -                       [^true]].
> -       ^false!
>
> Item was changed:
>   ----- Method: CompiledCode>>allLiterals (in category 'literals') -----
>   allLiterals
> +       "Skip compiled-code objects. Keep literal arrays, bindings, etc."
> +
> +       ^ Array streamContents: [:result |
> +               self allLiteralsDo: [:literal | result nextPut: literal]]!
> -       self subclassResponsibility!
>
> Item was added:
> + ----- Method: CompiledCode>>allLiteralsDo: (in category 'literals') -----
> + allLiteralsDo: aBlock
> +       "Enumerate all literals thoroughly. Follow nested instances of
> CompiledCode. Do not treat compiled code as literals here."
> +
> +       self codeLiteralsDo: [:compiledCode | compiledCode literalsDo:
> [:literal |
> +               literal isCompiledCode ifFalse: [literal allLiteralsDo:
> aBlock] ]].
> +
> +       "Enumerate special selectors."
> +       self flag: #todo.
> +
> +       "Enumerate special literals such as true and false."
> +       self flag: #todo.!
>
> Item was added:
> + ----- Method: CompiledCode>>codeLiterals (in category 'literals') -----
> + codeLiterals
> +
> +       ^ Array streamContents: [:stream |
> +               self codeLiteralsDo: [:compiledCode | stream nextPut:
> compiledCode]]!
>
> Item was added:
> + ----- Method: CompiledCode>>codeLiteralsDo: (in category 'literals')
> -----
> + codeLiteralsDo: aBlock
> +       "Enumerate all literals that represent instances of CompiledCode.
> This is especially required for SistaV1."
> +
> +       aBlock value: self.
> +
> +       self literalsDo: [:literal | literal isCompiledCode ifTrue: [
> +               literal codeLiteralsDo: aBlock]].!
>
> Item was added:
> + ----- Method: CompiledCode>>hasLiteral: (in category 'literals') -----
> + hasLiteral: aLiteral
> +       "Since we cannot enumerate this code's special literals, we have
> to overwrite this method to invoke the encoder scanner explicitely."
> +
> +       | scanBlock |
> +       (super hasLiteral: aLiteral) ifTrue: [^ true].
> +
> +       scanBlock := self class
> +               scanBlocksForLiteral: aLiteral
> +               do: [:primaryScanner :secondaryScanner |
> +                       "E.g., scanner for SistaV1 or scanner for
> V3PlusClosures"
> +                       self signFlag ifTrue: [secondaryScanner] ifFalse:
> [primaryScanner]].
> +
> +       self codeLiteralsDo: [:compiledCode |
> +               (compiledCode scanFor: scanBlock) ifTrue: [^ true]].
> +
> +       ^ false!
>
> Item was added:
> + ----- Method: CompiledCode>>hasMethodReturn (in category 'testing') -----
> + hasMethodReturn
> +       "Answer whether the receiver has a method-return ('^') in its
> code."
> +
> +       | scanner |
> +       self codeLiteralsDo: [:compiledCode |
> +               scanner := InstructionStream on: compiledCode.
> +               (scanner scanFor: [:x | (scanner willReturn
> +                               and: [scanner willBlockReturn not])
> +                               "and: [scanner willReturnTopFromMethod
> not]" "-> Not supported in EncoderForSistaV1"])
> +                       ifTrue: [^ true]].
> +       ^ false!
>
> Item was added:
> + ----- Method: CompiledCode>>isQuick (in category 'testing') -----
> + isQuick
> +
> +       self subclassResponsibility.!
>
> Item was changed:
>   ----- Method: CompiledCode>>literals (in category 'literals') -----
>   literals
> +
> +       ^ Array streamContents: [:result |
> +               self literalsDo: [:lit | result nextPut: lit]]!
> -       "Answer an Array of the literals referenced by the receiver."
> -       | literals numberLiterals |
> -       literals := Array new: (numberLiterals := self numLiterals).
> -       1 to: numberLiterals do:
> -               [:index |
> -               literals at: index put: (self objectAt: index + 1)].
> -       ^literals!
>
> Item was added:
> + ----- Method: CompiledCode>>literalsDo: (in category 'literals') -----
> + literalsDo: aBlock
> +       "Evaluate aBlock for each of the literals referenced by the
> receiver. Note that this (raw) enumeration addresses *all* objects stored
> *after* the method header and *before* the first byte code. If you require
> a deep and meaningful enumeration of literals use #allLiteralsDo: or
> #codeLiteralsDo:."
> +
> +       1 to: self numLiterals do: [:index |
> +               aBlock value: (self literalAt: index)].!
>
> Item was changed:
>   ----- Method: CompiledCode>>messages (in category 'scanning') -----
>   messages
>         "Answer a Set of all the message selectors sent by this method."
>
> +       | result |
> +       result := Set new.
> +       self messagesDo: [:selector | result add: selector].
> +       ^ result!
> -       | encoderClass scanner aSet |
> -       encoderClass := self encoderClass.
> -       aSet := Set new.
> -       scanner := InstructionStream on: self.
> -       scanner scanFor: [ :x |
> -               | selector |
> -               (selector := encoderClass selectorToSendOrItselfFor:
> scanner in: self at: scanner pc) == scanner
> -                       ifFalse:
> -                               [aSet add: selector]
> -                       ifTrue:
> -                               [(encoderClass blockMethodOrNilFor:
> scanner in: self at: scanner pc) ifNotNil:
> -                                       [:blockMethod| aSet addAll:
> blockMethod messages]].
> -               false "keep scanning" ].
> -       ^aSet!
>
> Item was added:
> + ----- Method: CompiledCode>>messagesDo: (in category 'scanning') -----
> + messagesDo: workBlock
> +       "Evaluate aBlock with all the message selectors sent by me.
> Duplicate sends possible."
> +
> +       | scanner selector  |
> +       self isQuick ifTrue: [^ self].
> +
> +       self codeLiteralsDo: [:compiledCode |
> +               scanner := InstructionStream on: compiledCode.
> +               scanner scanFor: [ :x |
> +                       (selector := scanner selectorToSendOrSelf) ==
> scanner
> +                               ifFalse: [workBlock value: selector].
> +                       false "keep scanning" ] ].!
>
> Item was removed:
> - ----- Method: CompiledCode>>messagesDo:encoderClass:visitedSet: (in
> category 'private') -----
> - messagesDo: aBlock encoderClass: encoderClass visitedSet: visitedSet
> -       "The inner engine for messagesDo:"
> -
> -       | scanner |
> -       scanner := InstructionStream on: self.
> -       scanner scanFor: [ :x |
> -               | selector |
> -               (selector := encoderClass selectorToSendOrItselfFor:
> scanner in: self at: scanner pc) == scanner
> -                       ifFalse:
> -                               [(visitedSet ifAbsentAdd: selector) ifTrue:
> -                                       [aBlock value: selector]]
> -                       ifTrue:
> -                               [(encoderClass blockMethodOrNilFor:
> scanner in: self at: scanner pc) ifNotNil:
> -                                       [:blockMethod|
> -                                        blockMethod messagesDo: aBlock
> encoderClass: encoderClass visitedSet: visitedSet]].
> -               false "keep scanning" ]!
>
> Item was removed:
> - ----- Method: CompiledCode>>refersTo:bytecodeScanner:thorough: (in
> category 'literals') -----
> - refersTo: literal bytecodeScanner: scanBlockOrNil thorough: thorough
> -       "Answer if the receiver refers to the literal.  If the scan block
> is non-nil, then
> -        use it to find the literal in bytecode.  If thorough is true,
> dive down into
> -        literal arrays and method properties to locate references to the
> literal there-in."
> -       2 to: (self isCompiledBlock
> -                       ifTrue: [self numLiterals] "exclude outerCode or
> methodClass"
> -                       ifFalse: [self numLiterals - 1]) "exclude
> selector/properties and methodClass"
> -          do: [:i| | lit |
> -               lit := self objectAt: i.
> -               (literal == lit or: [literal literalEqual: lit]) ifTrue:
> [^true]. "== for Float bindingOf: #NaN since NaN ~= NaN"
> -               lit isCompiledCode
> -                       ifTrue:
> -                               [(lit refersTo: literal bytecodeScanner:
> scanBlockOrNil thorough: thorough) ifTrue:
> -                                       [^true]]
> -                       ifFalse:
> -                               [thorough ifTrue:
> -                                       [lit isVariableBinding
> -                                               ifTrue:
> -                                                       [literal == lit
> key ifTrue: [^true]]
> -                                               ifFalse:
> -                                                       [(lit isArray
> -                                                          and: [(lit
> hasLiteral: literal)
> -                                                               or:
> [literal isVariableBinding
> -
>  and: [literal key isSymbol
> -
>  and: [lit hasLiteral: literal key]]]]) ifTrue:
> -
>  [^true]]]]].
> -       scanBlockOrNil ifNotNil:
> -               [(self scanFor: scanBlockOrNil) ifTrue:
> -                       [^true]].
> -       ^false!
>
> Item was removed:
> - ----- Method:
> CompiledCode>>refersTo:primaryBytecodeScanner:secondaryBytecodeScanner:thorough:
> (in category 'literals') -----
> - refersTo: literal primaryBytecodeScanner: primaryScanBlockOrNil
> secondaryBytecodeScanner: secondaryScanBlockOrNil thorough: thorough
> -       "Answer if the receiver refers to the literal.  If the scan blocks
> are non-nil, then
> -        use them to find the literal in bytecode.  If thorough is true,
> dive down into
> -        literal arrays and method properties to locate references to the
> literal there-in."
> -       ^self
> -               refersTo: literal
> -               bytecodeScanner: (self signFlag
> -                                                       ifTrue:
> [secondaryScanBlockOrNil]
> -                                                       ifFalse:
> [primaryScanBlockOrNil])
> -               thorough: thorough!
>
> Item was changed:
>   ----- Method: CompiledCode>>scanFor: (in category 'scanning') -----
>   scanFor: byteOrClosure
>         "Answer whether the receiver contains the argument as a bytecode,
> if it is a number,
>          or evaluates to true if a block.  If a block it can take from one
> to four bytes."
>         | s end |
>         ^(s := InstructionStream on: self)
>                 scanFor: (byteOrClosure isBlock
>                                         ifTrue: [byteOrClosure numArgs
> caseOf: {
>                                                         [1] ->
> [byteOrClosure].
>                                                         [2] -> [[:byte|
> byteOrClosure value: byte value: s secondByte]].
>                                                         [3] -> [end :=
> self endPC - 2.
>
> [:byte|
>                                                                         s
> pc <= end
>
> and: [byteOrClosure
>
>               value: byte
>
>               value: s secondByte
>
>               value: s thirdByte]]].
>                                                         [4] -> [end :=
> self endPC - 3.
>
> [:byte|
>                                                                         s
> pc <= end
>
> and: [byteOrClosure
>
>               value: byte
>
>               value: s secondByte
>
>               value: s thirdByte
>
>               value: s fourthByte]]] }]
>                                         ifFalse: [[:instr | instr =
> byteOrClosure]])
>   "
> + SystemNavigation default browseAllSelect: [:m | m scanFor: 134]
> - Smalltalk browseAllSelect: [:m | m scanFor: 134]
>   "!
>
> Item was added:
> + ----- Method: CompiledCode>>sendsMessage: (in category 'testing') -----
> + sendsMessage: aSelector
> +
> +       self messagesDo: [:selector |
> +               selector = aSelector ifTrue: [^ true]].
> +       ^ false!
>
> Item was added:
> + ----- Method: CompiledCode>>sendsSelector: (in category 'testing') -----
> + sendsSelector: aSelector
> +
> +       self flag: #todo. "mt: Deprecate? AST/Refactoring project needs
> it..."
> +       ^ self sendsMessage: aSelector!
>
> Item was added:
> + ----- Method: CompiledCode>>sendsToSuper (in category 'testing') -----
> + sendsToSuper
> +       "Answer whether the receiver sends any message to super."
> +
> +       | scanner |
> +       self codeLiteralsDo: [:compiledCode |
> +               scanner := InstructionStream on: compiledCode.
> +               (scanner scanFor: (self encoderClass
> superSendScanBlockUsing: scanner))
> +                       ifTrue: [^ true]].
> +       ^ false!
>
> Item was removed:
> - ----- Method: CompiledMethod>>allLiterals (in category 'literals') -----
> - allLiterals
> -       | literals unfoldedSubLiterals |
> -       literals := self literals.
> -       unfoldedSubLiterals := literals
> -                                                               select:
> [:lit| lit isCompiledCode]
> -
>  thenCollect: [:blockMethod| blockMethod allSubLiterals].
> -       unfoldedSubLiterals ifEmpty:
> -               [^literals].
> -       ^literals, (unfoldedSubLiterals fold: [:a :b| a, b])!
>
> Item was added:
> + ----- Method: CompiledMethod>>allLiteralsDo: (in category 'literals')
> -----
> + allLiteralsDo: aBlock
> +       "Overwritten to skip certain (raw) literals."
> +
> +       " Exclude method selector (or properties) and the method's class."
> +       1 to: self numLiterals - 2 do: [:index |
> +               (self literalAt: index) allLiteralsDo: aBlock].
> +
> +       "Enumerate method selector only through additional method state."
> +       self penultimateLiteral isMethodProperties
> +               ifTrue: [self penultimateLiteral allLiteralsDo: aBlock].
> +
> +       "Enumerate special selectors."
> +       self flag: #todo.
> +
> +       "Enumerate special literals such as true and false."
> +       self flag: #todo.!
>
> Item was removed:
> - ----- Method: CompiledMethod>>hasLiteral: (in category 'literals') -----
> - hasLiteral: literal
> -       "Answer whether the receiver references the argument, literal."
> -       2 to: self numLiterals - 1 do: "exclude selector/properties &
> methodClass"
> -               [:index | | lit |
> -               lit := self objectAt: index.
> -               (lit literalEqual: literal) ifTrue:
> -                       [^true].
> -               (lit isCompiledCode and: [lit hasLiteral: literal]) ifTrue:
> -                       [^true]].
> -       ^false!
>
> Item was removed:
> - ----- Method: CompiledMethod>>hasLiteralSuchThat: (in category
> 'literals') -----
> - hasLiteralSuchThat: litBlock
> -       "Answer true if litBlock returns true for any literal in this
> method, even if embedded in array structure."
> -       (self penultimateLiteral isMethodProperties
> -        and: [self penultimateLiteral hasLiteralSuchThat: litBlock])
> ifTrue:
> -               [^true].
> -       2 to: self numLiterals + 1 do:
> -               [:index | | lit |
> -               lit := self objectAt: index.
> -               ((litBlock value: lit)
> -               or: [(lit isArray or: [lit isCompiledCode]) and: [lit
> hasLiteralSuchThat: litBlock]]) ifTrue:
> -                       [^true]].
> -       ^false!
>
> Item was removed:
> - ----- Method: CompiledMethod>>hasLiteralThorough: (in category
> 'literals') -----
> - hasLiteralThorough: literal
> -       "Answer true if any literal in this method is literal,
> -       even if embedded in array structure."
> -
> -       (self penultimateLiteral isMethodProperties
> -        and: [self penultimateLiteral hasLiteralThorough: literal])
> ifTrue:[^true].
> -       2 to: self numLiterals - 1 "exclude superclass +
> selector/properties"
> -          do:[:index | | lit |
> -               (((lit := self objectAt: index) literalEqual: literal)
> -                or: [(lit isVariableBinding and: [lit key == literal])
> -                or: [lit isArray and: [lit hasLiteral: literal]]]) ifTrue:
> -                       [^ true]].
> -       ^ false !
>
> Item was removed:
> - ----- Method: CompiledMethod>>literalsDo: (in category 'literals') -----
> - literalsDo: aBlock
> -       "Evaluate aBlock for each of the literals referenced by the
> receiver."
> -       1 to: self numLiterals do:
> -               [:index |
> -               aBlock value: (self objectAt: index + 1)]!
>
> Item was removed:
> - ----- Method: CompiledMethod>>messages (in category 'scanning') -----
> - messages
> -       "Answer a Set of all the message selectors sent by this method."
> -
> -       | scanner aSet |
> -       aSet := Set new.
> -       scanner := InstructionStream on: self.
> -       scanner scanFor: [ :x |
> -               | selector |
> -               (selector := scanner selectorToSendOrSelf) == scanner
> ifFalse: [
> -                       aSet add: selector ].
> -               false "keep scanning" ].
> -       ^aSet!
>
> Item was removed:
> - ----- Method: CompiledMethod>>messagesDo: (in category 'scanning') -----
> - messagesDo: aBlock
> -       "Evaluate aBlock exactly once with all the message selectors sent
> by me."
> -
> -       self isQuick ifFalse:
> -               [self messagesDo: aBlock
> -                       encoderClass: self encoderClass
> -                       visitedSet: IdentitySet new]!
>
> Item was changed:
>   ----- Method: CompiledMethod>>messagesSequence (in category 'scanning')
> -----
>   messagesSequence
> -       "Answer a Set of all the message selectors sent by this method."
>
> +       self flag: #todo. "mt: Better change #messages to return an array
> instead of a set?"
> +       ^ self messages asArray!
> -       ^Array streamContents:
> -               [:str| | scanner |
> -               scanner := InstructionStream on: self.
> -               scanner scanFor:
> -                       [:x | | selectorOrSelf |
> -                       (selectorOrSelf := scanner selectorToSendOrSelf)
> == scanner ifFalse:
> -                               [str nextPut: selectorOrSelf].
> -                       false   "keep scanning"]]!
>
> Item was changed:
>   ----- Method: CompiledMethod>>objectForDataStream: (in category 'file
> in/out') -----
>   objectForDataStream: refStrm
> +       "Reconfigure pragma. Example: #(#FFTPlugin
> #primitiveFFTTransformData 0 0). See FFT >> #pluginTransformData:."
> +
> +       self primitive = 117 ifTrue: [(self literalAt: 1) at: 4 put: 0].!
> -
> -       self primitive = 117 ifTrue: [self literals first at: 4 put: 0].
> - !
>
> Item was changed:
>   ----- Method: CompiledMethod>>readsField: (in category 'scanning') -----
>   readsField: varIndex
> +       "Answer whether the receiver loads the instance variable indexed
> by the argument."
> +
> -       "Answer whether the receiver loads the instance variable indexed
> by the  argument."
>         | varIndexCode scanner |
>         varIndexCode := varIndex - 1.
> +       self isQuick ifTrue: [^ self isReturnField and: [self returnField
> = varIndexCode]].
> +
> +       self codeLiteralsDo: [:compiledCode |
> +               scanner := InstructionStream on: compiledCode.
> +               (scanner scanFor: (self encoderClass
> instVarReadScanBlockFor: varIndexCode using: scanner))
> +                       ifTrue: [^ true]].
> +
> +       ^ false!
> -       self isQuick ifTrue:
> -               [^self isReturnField and: [self returnField =
> varIndexCode]].
> -       scanner := InstructionStream on: self.
> -       ^scanner scanFor:(self encoderClass instVarReadScanBlockFor:
> varIndexCode using: scanner)!
>
> Item was changed:
>   ----- Method: CompiledMethod>>readsRef: (in category 'scanning') -----
>   readsRef: variableBinding
>         "Answer whether the receiver reads the value of the argument."
>         "eem 5/24/2008 Rewritten to no longer assume the compler uses the
>          most compact encoding available (for EncoderForLongFormV3
> support)."
> +
>         | litIndex scanner |
> +       (litIndex := self indexOfLiteral: variableBinding) = 0
> +               ifTrue: [^false].
> +
> +       self codeLiteralsDo: [:compiledCode |
> +               scanner := InstructionStream on: compiledCode.
> +               (scanner scanFor: (self encoderClass
> bindingReadScanBlockFor: litIndex - 1 using: scanner))
> +                       ifTrue: [^ true]].
> +
> +       ^ false!
> -       (litIndex := self indexOfLiteral: variableBinding) = 0 ifTrue:
> -               [^false].
> -       scanner := InstructionStream on: self.
> -       ^scanner scanFor: (self encoderClass bindingReadScanBlockFor:
> litIndex - 1 using: scanner)!
>
> Item was removed:
> - ----- Method: CompiledMethod>>refersToLiteral: (in category 'literals')
> -----
> - refersToLiteral:aLiteral
> -
> -       ^self hasLiteral: aLiteral.!
>
> Item was removed:
> - ----- Method: CompiledMethod>>sendsSelector: (in category 'literals')
> -----
> - sendsSelector: aSelector
> -       | scanner |
> -       scanner := InstructionStream on: self.
> -       scanner scanFor:
> -               [:x |
> -                scanner selectorToSendOrSelf == aSelector ifTrue:
> -                       [^true].
> -                false  "keep scanning"].
> -       ^false!
>
> Item was removed:
> - ----- Method: CompiledMethod>>sendsToSuper (in category 'scanning') -----
> - sendsToSuper
> -       "Answer whether the receiver sends any message to super."
> -       | scanner |
> -       scanner := InstructionStream on: self.
> -       ^scanner scanFor: (self encoderClass superSendScanBlockUsing:
> scanner)!
>
> Item was changed:
>   ----- Method: CompiledMethod>>writesField: (in category 'scanning') -----
>   writesField: varIndex
> +       "Answer whether the receiver stores into the instance variable
> indexed by the argument."
> -       "Answer whether the receiver stores into the instance variable
> indexed
> -        by the argument."
>
> +       | varIndexCode scanner |
> +       self isQuick ifTrue: [^ false].
> +       varIndexCode := varIndex - 1.
> +
> +       self codeLiteralsDo: [:compiledCode |
> +               scanner := InstructionStream on: compiledCode.
> +               (scanner scanFor: (self encoderClass
> instVarWriteScanBlockFor: varIndex - 1 using: scanner))
> +                       ifTrue: [^ true]].
> +
> +       ^ false!
> -       | scanner |
> -       self isQuick ifTrue: [^false].
> -       scanner := InstructionStream on: self.
> -       ^scanner scanFor: (self encoderClass instVarWriteScanBlockFor:
> varIndex - 1 using: scanner)!
>
> Item was changed:
>   ----- Method: CompiledMethod>>writesRef: (in category 'scanning') -----
>   writesRef: variableBinding
>         "Answer whether the receiver writes the value of the argument."
>         "eem 5/24/2008 Rewritten to no longer assume the compler uses the
>          most compact encoding available (for EncoderForLongFormV3
> support)."
> +
>         | litIndex scanner |
> +       (litIndex := self indexOfLiteral: variableBinding) = 0
> +               ifTrue: [^ false].
> +
> +       self codeLiteralsDo: [:compiledCode |
> +               scanner := InstructionStream on: compiledCode.
> +               (scanner scanFor: (self encoderClass
> bindingWriteScanBlockFor: litIndex - 1 using: scanner))
> +                       ifTrue: [^ true]].
> +
> +       ^ false!
> -       (litIndex := self indexOfLiteral: variableBinding) = 0 ifTrue:
> -               [^false].
> -       scanner := InstructionStream on: self.
> -       ^scanner scanFor: (self encoderClass bindingWriteScanBlockFor:
> litIndex - 1 using: scanner)!
>
> Item was removed:
> - ----- Method: Pragma>>hasLiteralSuchThat: (in category 'testing') -----
> - hasLiteralSuchThat: aBlock
> -       "Answer true if litBlock returns true for any literal in the
> receiver, even if embedded in further array structure.
> -        This method is only intended for private use by CompiledMethod
> hasLiteralSuchThat:"
> -       ^(aBlock value: keyword)
> -          or: [arguments hasLiteralSuchThat: aBlock]!
>
>
>

-- 
_,,,^..^,,,_
best, Eliot
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20210912/3a145429/attachment-0001.html>


More information about the Squeak-dev mailing list