Eliot Miranda uploaded a new version of Compiler to project The Trunk:
http://source.squeak.org/trunk/Compiler-eem.363.mcz
==================== Summary ====================
Name: Compiler-eem.363
Author: eem
Time: 5 January 2018, 12:23:47.49447 pm
UUID: e6e0f44c-156f-4ba2-a96b-044cc09da7e2
Ancestors: Compiler-eem.362
Use the blockReturnNilToCaller bytecode in full blocks. Add a postscript to remove empty categories in ParseNode and subclasses (to get rid of the obsolte and empty code generation (closures) protocols).
=============== Diff against Compiler-eem.362 ===============
Item was changed:
+ ----- Method: BlockNode>>createBlockLiteral: (in category 'code generation') -----
- ----- Method: BlockNode>>createBlockLiteral: (in category 'code generation (closures)') -----
createBlockLiteral: encoder
^self
reindexingLocalsDo:
[encoder reindexingLiteralsDo:
[encoder copyWithNewLiterals
generateBlockMethodOfClass: CompiledBlock
trailer: CompiledMethodTrailer empty
from: self]]
encoder: encoder!
Item was changed:
----- Method: BlockNode>>emitCodeForEvaluatedFullClosureValue:encoder: (in category 'code generation') -----
emitCodeForEvaluatedFullClosureValue: stack encoder: encoder
| position |
position := stack position.
self emitCodeExceptLast: stack encoder: encoder.
+ (statements last == NodeNil
+ and: [self returns not])
+ ifTrue:
+ [stack push: 1.
+ encoder genReturnNilToCaller.
+ pc := encoder methodStreamPosition]
+ ifFalse:
+ [statements last emitCodeForBlockValue: stack encoder: encoder.
+ self returns ifFalse:
+ [encoder genReturnTopToCaller.
+ pc := encoder methodStreamPosition]].
- statements last emitCodeForBlockValue: stack encoder: encoder.
- self returns ifFalse:
- [encoder genReturnTopToCaller.
- pc := encoder methodStreamPosition].
self assert: stack position - 1 = position!
Item was changed:
+ ----- Method: BlockNode>>emitCodeForFullBlockValue:encoder: (in category 'code generation') -----
- ----- Method: BlockNode>>emitCodeForFullBlockValue:encoder: (in category 'code generation (closures)') -----
emitCodeForFullBlockValue: stack encoder: encoder
copiedValues do:
[:copiedValue| copiedValue emitCodeForValue: stack encoder: encoder].
encoder
genPushFullClosure: closureCreationNode index
numCopied: copiedValues size.
stack
pop: copiedValues size;
push: 1!
Item was changed:
----- Method: BlockNode>>sizeCodeForEvaluatedFullClosureValue: (in category 'code generation') -----
sizeCodeForEvaluatedFullClosureValue: encoder
"The closure value primitives push the arguments and the copied values.
The compiler guarantees that any copied values come before all local temps.
So on full closure activation we need do nothing."
+ (statements last == NodeNil
+ and: [self returns not]) ifTrue:
+ [^encoder sizeReturnNilToCaller].
^(self sizeCodeForEvaluatedValue: encoder)
+ (self returns ifTrue: [0] ifFalse: [encoder sizeReturnTopToCaller])!
Item was added:
+ ----- Method: BytecodeEncoder>>sizeReturnNilToCaller (in category 'opcode sizing') -----
+ sizeReturnNilToCaller
+ ^self sizeOpcodeSelector: #genReturnNilToCaller withArguments: #()!
Item was added:
+ ----- Method: EncoderForSistaV1>>genReturnNilToCaller (in category 'bytecode generation') -----
+ genReturnNilToCaller
+ "93 01011101 BlockReturn nil [* return from enclosing block N, ExtA]"
+ "If extended, the least significant bit of the extension determines if we return to the caller or not
+ and the most significant bits determine how many levels of the static chain to return from.
+ ExtA = iiiiiiij
+ iiiiiii=0,j=0 => return to caller
+ iiiiiii=0,j=1 => illegal
+ iiiiiii=1,j=0 => return to outerContext
+ iiiiiii=1,j=1 => return to outerContext sender/return from outerContext
+ iiiiiii=2,j=0 => return to outerContext outerContext
+ iiiiiii=2,j=1 => return to outerContext outerContext sender/return from outerContext outerContext
+ etc"
+
+ stream nextPut: 93!
Item was changed:
(PackageInfo named: 'Compiler') postscript: '"below, add code to be run after the loading of this package"
+ "Make sure that all those ``code generation (closures)'''' categoies disappear"
+ ParseNode withAllSubclasses do:
+ [:pnc| pnc organization removeEmptyCategories]'!
- "Make sure all methods using to:do: and to:by:do: are recompiled"
- UIManager default
- informUser: ''Recompiling methods sending to:do: and to:by:do:''
- during:
- [(self systemNavigation allMethodsSelect:
- [:m|
- #(to:do: to:by:do:) anySatisfy: [:l| m refersToLiteral: l]]) do:
- [:mr| mr actualClass recompile: mr selector]]'!
Eliot Miranda uploaded a new version of Compiler to project The Trunk:
http://source.squeak.org/trunk/Compiler-eem.362.mcz
==================== Summary ====================
Name: Compiler-eem.362
Author: eem
Time: 5 January 2018, 10:30:42.489732 am
UUID: 6024b2f1-3e38-4625-a934-dd3f7cb29484
Ancestors: Compiler-eem.361
Implement super sends in full blocks. Since CompiledBlock uses the last literal to refer to the outer CompiledCode, it can't hold the class association used in conventional super sends. Hence within a block a super send must use the directed super send form.
=============== Diff against Compiler-eem.361 ===============
Item was added:
+ ----- Method: BytecodeEncoder>>generatingFullBlock (in category 'testing') -----
+ generatingFullBlock
+ "Answer if the encoder is currently generating a FullBlock, embedded in some method."
+
+ "When generating a FullBlock a copy of the encoder for the home emthod (rootNode)
+ is used, and hence the following is true."
+ ^rootNode encoder ~~ self!
Item was added:
+ ----- Method: Decompiler>>directedSuperSend:numArgs: (in category 'instruction decoding') -----
+ directedSuperSend: selector numArgs: numArgs
+ stack removeLast. "Discard the pushed class."
+ ^self send: selector super: true numArgs: numArgs!
Item was changed:
----- Method: SelectorNode>>emitCode:args:encoder:super: (in category 'code generation') -----
emitCode: stack args: nArgs encoder: encoder super: supered
stack pop: nArgs.
^supered
ifTrue:
+ [(encoder supportsFullBlocks
+ and: [encoder generatingFullBlock])
+ ifTrue:
+ [encoder genPushLiteral: (encoder sharableLitIndex: encoder classEncoding).
+ encoder genSendDirectedSuper: index numArgs: nArgs]
+ ifFalse: [encoder genSendSuper: index numArgs: nArgs]]
- [encoder genSendSuper: index numArgs: nArgs]
ifFalse:
[encoder
genSend: (code < Send ifTrue: [code negated] ifFalse: [index])
numArgs: nArgs]!
Item was changed:
----- Method: SelectorNode>>sizeCode:args:super: (in category 'code generation') -----
sizeCode: encoder args: nArgs super: supered
self reserve: encoder.
^supered
ifTrue:
[code < Send "i.e. its a special selector" ifTrue:
[code := self code: (index := encoder sharableLitIndex: key) type: 5].
+ (encoder supportsFullBlocks
+ and: [encoder generatingFullBlock])
+ ifTrue: [(encoder sizePushLiteral: (encoder sharableLitIndex: encoder classEncoding))
+ + (encoder sizeSendDirectedSuper: index numArgs: nArgs)]
+ ifFalse: [encoder sizeSendSuper: index numArgs: nArgs]]
- encoder sizeSendSuper: index numArgs: nArgs]
ifFalse:
[self flag: #yuck. "special selector sends cause this problem"
encoder
sizeSend: (code < Send ifTrue: [code negated] ifFalse: [index])
numArgs: nArgs]!
Marcel Taeumel uploaded a new version of Morphic to project The Trunk:
http://source.squeak.org/trunk/Morphic-mt.1387.mcz
==================== Summary ====================
Name: Morphic-mt.1387
Author: mt
Time: 3 January 2018, 9:57:39.385816 am
UUID: 431484b1-a71b-0c42-8973-37b110485d1d
Ancestors: Morphic-mt.1386
Fixes a bug that I introduced in the last commit.
=============== Diff against Morphic-mt.1386 ===============
Item was changed:
----- Method: TextMorphForEditView>>acceptDroppingMorph:event: (in category 'dropping/grabbing') -----
acceptDroppingMorph: aTransferMorph event: evt
"Accept a text to be inserted at the event/cursor position. Either remove or keep the source text depending on the transfer morph's copy state."
| sourceEditor |
sourceEditor := (aTransferMorph source respondsTo: #editor)
ifTrue: [aTransferMorph source editor]
ifFalse: [nil].
self
handleInteraction: [
"1) Delete selection if it is a move operation."
(aTransferMorph shouldCopy or: [sourceEditor isNil]) ifFalse: [
sourceEditor destructiveBackWord.
+ sourceEditor history previous isCompositeRedo: sourceEditor == self editor].
- sourceEditor == self editor
- ifTrue: [self editor history previous isCompositeRedo: true]].
"2) Insert selection at new place."
self editor addText: aTransferMorph passenger asText event: evt.
+ self editor history previous
+ isCompositeUndo: (sourceEditor == self editor and: [aTransferMorph shouldCopy not])]
- sourceEditor == self editor
- ifTrue: [self editor history previous isCompositeUndo: true]]
fromEvent: evt.
evt hand newKeyboardFocus: self.!
Marcel Taeumel uploaded a new version of Morphic to project The Trunk:
http://source.squeak.org/trunk/Morphic-mt.1386.mcz
==================== Summary ====================
Name: Morphic-mt.1386
Author: mt
Time: 3 January 2018, 9:48:33.350816 am
UUID: f9d1c8e8-849f-9d4b-8529-c1b163677c65
Ancestors: Morphic-eem.1385
Text drag/drop: Creates a composite undo/redo if source and target are the same morph/editor.
Note that drag-dropping text between text morphs (i.e. windows or panes) is not affected. You have to focus and undo/redo separately.
Do-it the following example to drop text from a source that does not use the TextMorph/TextEditor mechanism:
ActiveHand grabMorph: (TransferMorph withPassenger: 'Hello, World!' asText from: nil).
=============== Diff against Morphic-eem.1385 ===============
Item was changed:
----- Method: TextMorphForEditView>>acceptDroppingMorph:event: (in category 'dropping/grabbing') -----
acceptDroppingMorph: aTransferMorph event: evt
"Accept a text to be inserted at the event/cursor position. Either remove or keep the source text depending on the transfer morph's copy state."
+ | sourceEditor |
+ sourceEditor := (aTransferMorph source respondsTo: #editor)
+ ifTrue: [aTransferMorph source editor]
+ ifFalse: [nil].
+
self
handleInteraction: [
+
+ "1) Delete selection if it is a move operation."
+ (aTransferMorph shouldCopy or: [sourceEditor isNil]) ifFalse: [
+ sourceEditor destructiveBackWord.
+ sourceEditor == self editor
+ ifTrue: [self editor history previous isCompositeRedo: true]].
+
+ "2) Insert selection at new place."
+ self editor addText: aTransferMorph passenger asText event: evt.
+ sourceEditor == self editor
+ ifTrue: [self editor history previous isCompositeUndo: true]]
+
- aTransferMorph shouldCopy
- ifFalse: [(aTransferMorph source respondsTo: #editor)
- ifTrue: [aTransferMorph source editor destructiveBackWord]].
- self editor addText: aTransferMorph passenger asText event: evt]
fromEvent: evt.
evt hand newKeyboardFocus: self.!
Eliot Miranda uploaded a new version of Tools to project The Trunk:
http://source.squeak.org/trunk/Tools-eem.786.mcz
==================== Summary ====================
Name: Tools-eem.786
Author: eem
Time: 2 January 2018, 5:19:05.94314 pm
UUID: 1d9a2ff4-457b-4a66-9a76-6d24d776aa57
Ancestors: Tools-eem.785
Integrate CompiledBlock with the inspectors and with the MNU template generator.
=============== Diff against Tools-eem.785 ===============
Item was added:
+ ----- Method: CompiledBlock>>canonicalArgumentName (in category '*Tools-Debugger') -----
+ canonicalArgumentName
+ ^ 'CompiledBlock'!
Item was added:
+ ----- Method: CompiledCode>>inspectorClass (in category '*Tools-Inspector') -----
+ inspectorClass
+ "Answer the class of the inspector to be used on the receiver. Called by inspect;
+ use basicInspect to get a normal (less useful) type of inspector."
+
+ ^ CompiledMethodInspector!
Eliot Miranda uploaded a new version of Kernel to project The Trunk:
http://source.squeak.org/trunk/Kernel-eem.1133.mcz
==================== Summary ====================
Name: Kernel-eem.1133
Author: eem
Time: 2 January 2018, 5:12:57.488977 pm
UUID: a8d2d18d-bbe6-4c69-91bc-5767ec8c3076
Ancestors: Kernel-tpr.1132
Several minor refactorings for CompiledBlock. Move CompiledMethod>>(hasBreakpoint,longPrintOn:,symbolic,symbolicLinesDo:) up to CompiledCode. Provide CompiledBlock>>(isQuick,methodClass,primitive) to suppor tthe printing/exploring methods.
Provide an instance creation method for FuillBlockClosure, shuttong off the inheritance of the one for normal closures.
Provide InstructionPrinter support for the full closure creation bytecode.
Modify the postscript to ensure FullBlockClosure's identityHash/class index is 38 as expected by the VM.
=============== Diff against Kernel-tpr.1132 ===============
Item was added:
+ ----- Method: CompiledBlock>>encoderClass (in category 'accessing') -----
+ encoderClass
+ "Answer the encoder class that encoded the bytecodes in this method.
+ The sign flag bit is used by the VM to select a bytecode set. This formulation
+ may seem odd but this has to be fast, so no property probe unless needed."
+
+ ^self header >= 0
+ ifTrue:
+ [PrimaryBytecodeSetEncoderClass]
+ ifFalse:
+ [PrimaryBytecodeSetEncoderClass == SecondaryBytecodeSetEncoderClass
+ ifTrue: "Support for testing prior to installing another set"
+ [(self outerCode propertyValueAt: #encoderClass) ifNil: [SecondaryBytecodeSetEncoderClass]]
+ ifFalse:
+ [SecondaryBytecodeSetEncoderClass]]!
Item was added:
+ ----- Method: CompiledBlock>>headerDescription (in category 'printing') -----
+ headerDescription
+ "Answer a description containing the information about the form of the
+ receiver and the form of the context needed to run the receiver."
+
+ ^(ByteString new: 128) writeStream
+ print: self header; cr;
+ nextPutAll: '"block full'; cr;
+ nextPutAll: ' numArgs: '; print: self numArgs; cr;
+ nextPutAll: ' numTemps: '; print: self numTemps; cr;
+ nextPutAll: ' numLiterals: '; print: self numLiterals; cr;
+ nextPutAll: ' frameSize: '; print: self frameSize; cr;
+ nextPutAll: ' bytecodeSet: '; nextPutAll: self bytecodeSetName;
+ nextPut: $"; cr;
+ contents!
Item was added:
+ ----- Method: CompiledBlock>>isQuick (in category 'testing') -----
+ isQuick
+ ^false!
Item was added:
+ ----- Method: CompiledBlock>>longPrintOn:indent: (in category 'printing') -----
+ longPrintOn: aStream indent: tabs
+ "List of all the byte codes in a method with a short description of each"
+ (InstructionPrinter on: self) indent: tabs; printInstructionsOn: aStream!
Item was changed:
----- Method: CompiledBlock>>methodClass (in category 'accessing') -----
methodClass
+ "Answer the class that I am installed in."
+ | outerCodeOrMethodClassAssoc |
+ outerCodeOrMethodClassAssoc := self outerCode.
+ outerCodeOrMethodClassAssoc isVariableBinding ifTrue:
+ [self assert: outerCodeOrMethodClassAssoc value isBehavior.
+ ^outerCodeOrMethodClassAssoc value].
+ ^outerCodeOrMethodClassAssoc methodClass!
- "answer the compiled method that I am installed in, or nil if none."
- ^self outerCode methodClass!
Item was added:
+ ----- Method: CompiledBlock>>primitive (in category 'accessing') -----
+ primitive
+ ^0!
Item was added:
+ ----- Method: CompiledBlock>>printReferenceOn: (in category 'printing') -----
+ printReferenceOn: aStream
+ "Override to indicate that this is a block, and to print a null reference when
+ the CompiledBlock is only partially initialized, as it is during compilation."
+ aStream nextPutAll: '[] in '.
+ self outerCode isVariableBinding
+ ifTrue: [aStream nextPutAll: ' (as yet unbound)']
+ ifFalse: [super printReferenceOn: aStream]!
Item was added:
+ ----- Method: CompiledCode>>hasBreakpoint (in category '*Kernel-tool support') -----
+ hasBreakpoint
+ ^ self class environment
+ at: #BreakpointManager
+ ifPresent: [:bpm | bpm methodHasBreakpoint: self]
+ ifAbsent: [false]!
Item was added:
+ ----- Method: CompiledCode>>headerDescription (in category 'printing') -----
+ headerDescription
+ "Answer a description containing the information about the form of the
+ receiver and the form of the context needed to run the receiver."
+
+ self subclassResponsibility!
Item was added:
+ ----- Method: CompiledCode>>longPrintOn: (in category 'printing') -----
+ longPrintOn: aStream
+ "List of all the byte codes in a method with a short description of each"
+
+ self longPrintOn: aStream indent: 0!
Item was changed:
----- Method: CompiledCode>>methodClass (in category 'accessing') -----
methodClass
+ "Answer the class that I am installed in."
^self subclassResponsibility!
Item was added:
+ ----- Method: CompiledCode>>symbolic (in category 'printing') -----
+ symbolic
+ "Answer a String that contains a list of all the byte codes in a method
+ with a short description of each."
+
+ | aStream |
+ aStream := WriteStream on: (String new: 1000).
+ self longPrintOn: aStream.
+ ^aStream contents!
Item was added:
+ ----- Method: CompiledCode>>symbolicLinesDo: (in category 'printing') -----
+ symbolicLinesDo: aBlock
+ "Evaluate aBlock with each of the lines in the symbolic output."
+
+ | aStream pc |
+ aStream := (String new: 64) writeStream.
+ self isQuick ifTrue:
+ [self longPrintOn: aStream.
+ aBlock value: 0 value: aStream contents.
+ ^self].
+
+ self primitive ~= 0 ifTrue:
+ [self printPrimitiveOn: aStream.
+ aBlock value: 1 value: aStream contents.
+ aStream resetContents].
+
+ pc := self initialPC.
+ (InstructionPrinter on: self)
+ indent: 0;
+ printPC: false; "explorer provides pc anyway"
+ printInstructionsOn: aStream
+ do: [:printer :scanner :stream| | line index |
+ line := stream contents allButLast.
+ (line includes: Character cr) ifTrue:
+ [line := (line copyUpTo: Character cr), '...'' (continues)'].
+ (index := line indexOf: $>) > 0 ifTrue:
+ [[(line at: index + 1) isSeparator] whileTrue: [index := index + 1].
+ line := ((line copyFrom: 1 to: index) copyReplaceAll: (String with: Character tab) with: (String new: 8 withAll: Character space)),
+ (line copyFrom: index + 1 to: line size)].
+ aBlock value: pc value: line.
+ pc := scanner pc.
+ stream resetContents]!
Item was removed:
- ----- Method: CompiledMethod>>hasBreakpoint (in category '*Kernel-tool support') -----
- hasBreakpoint
- ^ self class environment
- at: #BreakpointManager
- ifPresent: [:bpm | bpm methodHasBreakpoint: self]
- ifAbsent: [false]!
Item was changed:
+ ----- Method: CompiledMethod>>headerDescription (in category 'printing') -----
- ----- Method: CompiledMethod>>headerDescription (in category 'literals') -----
headerDescription
"Answer a description containing the information about the form of the
receiver and the form of the context needed to run the receiver."
^(ByteString new: 128) writeStream
print: self header; cr;
nextPutAll: '"primitive: '; print: self primitive; cr;
nextPutAll: ' numArgs: '; print: self numArgs; cr;
nextPutAll: ' numTemps: '; print: self numTemps; cr;
nextPutAll: ' numLiterals: '; print: self numLiterals; cr;
nextPutAll: ' frameSize: '; print: self frameSize; cr;
nextPutAll: ' bytecodeSet: '; nextPutAll: self bytecodeSetName;
nextPut: $"; cr;
contents!
Item was removed:
- ----- Method: CompiledMethod>>longPrintOn: (in category 'printing') -----
- longPrintOn: aStream
- "List of all the byte codes in a method with a short description of each"
-
- self longPrintOn: aStream indent: 0!
Item was removed:
- ----- Method: CompiledMethod>>symbolic (in category 'printing') -----
- symbolic
- "Answer a String that contains a list of all the byte codes in a method
- with a short description of each."
-
- | aStream |
- aStream := WriteStream on: (String new: 1000).
- self longPrintOn: aStream.
- ^aStream contents!
Item was removed:
- ----- Method: CompiledMethod>>symbolicLinesDo: (in category 'printing') -----
- symbolicLinesDo: aBlock
- "Evaluate aBlock with each of the lines in the symbolic output."
-
- | aStream pc |
- aStream := (String new: 64) writeStream.
- self isQuick ifTrue:
- [self longPrintOn: aStream.
- aBlock value: 0 value: aStream contents.
- ^self].
-
- self primitive ~= 0 ifTrue:
- [self printPrimitiveOn: aStream.
- aBlock value: 1 value: aStream contents.
- aStream resetContents].
-
- pc := self initialPC.
- (InstructionPrinter on: self)
- indent: 0;
- printPC: false; "explorer provides pc anyway"
- printInstructionsOn: aStream
- do: [:printer :scanner :stream| | line index |
- line := stream contents allButLast.
- (line includes: Character cr) ifTrue:
- [line := (line copyUpTo: Character cr), '...'' (continues)'].
- (index := line indexOf: $>) > 0 ifTrue:
- [[(line at: index + 1) isSeparator] whileTrue: [index := index + 1].
- line := ((line copyFrom: 1 to: index) copyReplaceAll: (String with: Character tab) with: (String new: 8 withAll: Character space)),
- (line copyFrom: index + 1 to: line size)].
- aBlock value: pc value: line.
- pc := scanner pc.
- stream resetContents]!
Item was added:
+ ----- Method: FullBlockClosure class>>receiver:outerContext:method:copiedValues: (in category 'instance creation') -----
+ receiver: aReceiver outerContext: aContextOrNil method: aCompiledBlock copiedValues: anArrayOrNil
+ ^(self new: anArrayOrNil basicSize)
+ receiver: aReceiver
+ outerContext: aContextOrNil
+ method: aCompiledBlock
+ copiedValues: anArrayOrNil!
Item was added:
+ ----- Method: FullBlockClosure>>outerContext:startpc:numArgs:copiedValues: (in category 'initialize-release') -----
+ outerContext: aContext startpc: aStartpc numArgs: argCount copiedValues: anArrayOrNil
+ self shouldNotImplement!
Item was added:
+ ----- Method: FullBlockClosure>>receiver:outerContext:method:copiedValues: (in category 'initialize-release') -----
+ receiver: aReceiver outerContext: aContextOrNil method: aCompiledBlock copiedValues: anArrayOrNil
+ receiver := aReceiver.
+ outerContext := aContextOrNil.
+ startpc := aCompiledBlock.
+ numArgs := aCompiledBlock numArgs.
+ 1 to: self numCopiedValues do:
+ [:i|
+ self at: i put: (anArrayOrNil at: i)]!
Item was added:
+ ----- Method: InstructionPrinter>>pushFullClosure:numCopied: (in category 'printing') -----
+ pushFullClosure: aCompiledBlock numCopied: numCopied
+ self print: 'closureNumCopied: ', numCopied printString
+ , ' numArgs: ', aCompiledBlock numArgs printString!
Item was changed:
+ (PackageInfo named: 'Kernel') postscript: '"below, add code to be run after the loading of this package"
+ ((ByteArray subclasses includes: CompiledMethod)
+ and: [CompiledMethod superclass ~= ByteArray]) ifTrue:
+ [ByteArray removeSubclass: CompiledMethod].
+ (Smalltalk classNamed: #FullBlockClosure) ifNotNil:
+ [:fbc|
+ (fbc identityHash ~= 38) ifTrue:
+ [fbc tryPrimitive: 161 withArgs: #(38 true)]]'!
- (PackageInfo named: 'Kernel') postscript: '((ByteArray subclasses includes: CompiledMethod) and: [CompiledMethod superclass ~= ByteArray]) ifTrue: [ByteArray removeSubclass: CompiledMethod]'!