'From Squeak3.9 of 7 November 2006 [latest update: #7067] on 21 July 2008 at 11:16:48 am'! !TraitBehavior methodsFor: 'compiling' stamp: 'al 7/30/2004 22:03'! recompile: selector from: oldClass "Compile the method associated with selector in the receiver's method dictionary." "ar 7/10/1999: Use oldClass compiledMethodAt: not self compiledMethodAt:" | method trailer methodNode | method _ oldClass compiledMethodAt: selector. trailer _ method trailer. methodNode _ self compilerClass new compile: (oldClass sourceCodeAt: selector) in: self notifying: nil ifFail: [^ self]. "Assume OK after proceed from SyntaxError" selector == methodNode selector ifFalse: [self error: 'selector changed!!']. self basicAddSelector: selector withMethod: (methodNode generate: trailer). ! ! !Trait methodsFor: 'compiling' stamp: 'eem 7/18/2008 18:05'! variablesAndOffsetsDo: aBinaryBlock "This is the interface between the compiler and a class's instance or field names. The class should enumerate aBinaryBlock with the field definitions (with nil offsets) followed by the instance variable name strings and their integer offsets (1-relative). The order is important; names evaluated later will override the same names occurring earlier." "Since Traits don't confer state there is nothing to do here."! ! !Parser methodsFor: 'expression types' stamp: 'eem 7/18/2008 15:57'! method: doit context: ctxt encoder: encoderToUse " pattern [ | temporaries ] block => MethodNode." | sap blk prim temps messageComment methodNode | properties := MethodProperties new. encoder := encoderToUse. sap := self pattern: doit inContext: ctxt. "sap={selector, arguments, precedence}" properties selector: (sap at: 1). encoder selector: (sap at: 1). (sap at: 2) do: [:argNode | argNode isArg: true]. doit ifFalse: [ self pragmaSequence ]. temps := self temporaries. messageComment := currentComment. currentComment := nil. doit ifFalse: [ self pragmaSequence ]. prim := self pragmaPrimitives. self statements: #() innerBlock: doit. blk := parseNode. doit ifTrue: [blk returnLast] ifFalse: [blk returnSelfIfNoOther: encoder]. hereType == #doIt ifFalse: [^self expected: 'Nothing more']. self interactive ifTrue: [self removeUnusedTemps]. methodNode := self newMethodNode comment: messageComment. ^ methodNode selector: (sap at: 1) arguments: (sap at: 2) precedence: (sap at: 3) temporaries: temps block: blk encoder: encoder primitive: prim properties: properties! ! !MethodNode methodsFor: 'printing' stamp: 'eem 7/18/2008 17:31'! printPropertiesOn: aStream properties ifNil: [^self]. properties pragmas do: [ :each | "Don't decompile basic primitives that return self, i-vars, etc." each keyword = #primitive: ifFalse: [ aStream crtab: 1. each printOn: aStream ] ifTrue: [ ((each argumentAt: 1) between: 255 and: 519) ifFalse: [ aStream crtab: 1. self printPrimitiveOn: aStream ] ] ]! ! !LiteralVariableNode methodsFor: 'code generation' stamp: 'ar 8/14/2003 02:01'! emitForValue: stack on: strm super emitForValue: stack on: strm. readNode ifNotNil:[readNode emit: stack args: 0 on: strm super: false].! ! !LiteralVariableNode methodsFor: 'code generation' stamp: 'ar 8/14/2003 01:59'! emitLoad: stack on: strm writeNode ifNil:[^super emitLoad: stack on: strm]. code < 256 ifTrue: [strm nextPut: code] ifFalse: [self emitLong: LoadLong on: strm]. stack push: 1.! ! !LiteralVariableNode methodsFor: 'code generation' stamp: 'ar 8/14/2003 02:00'! emitStore: stack on: strm writeNode ifNil:[^super emitStore: stack on: strm]. writeNode emit: stack args: 1 on: strm super: false.! ! !LiteralVariableNode methodsFor: 'code generation' stamp: 'ar 8/14/2003 02:00'! emitStorePop: stack on: strm writeNode ifNil:[^super emitStorePop: stack on: strm]. self emitStore: stack on: strm. strm nextPut: Pop. stack pop: 1.! ! !LiteralVariableNode methodsFor: 'code generation' stamp: 'ar 8/14/2003 02:00'! sizeForStore: encoder | index | (key isVariableBinding and:[key isSpecialWriteBinding]) ifFalse:[^super sizeForStore: encoder]. code < 0 ifTrue:[ index := self index. code := self code: index type: LdLitType]. writeNode := encoder encodeSelector: #value:. ^(writeNode size: encoder args: 1 super: false) + (super sizeForValue: encoder)! ! !LiteralVariableNode methodsFor: 'code generation' stamp: 'ar 8/14/2003 02:00'! sizeForStorePop: encoder | index | (key isVariableBinding and:[key isSpecialWriteBinding]) ifFalse:[^super sizeForStorePop: encoder]. code < 0 ifTrue:[ index := self index. code := self code: index type: LdLitType]. writeNode := encoder encodeSelector: #value:. ^(writeNode size: encoder args: 1 super: false) + (super sizeForValue: encoder) + 1! ! !LiteralVariableNode methodsFor: 'code generation' stamp: 'ar 8/14/2003 02:02'! sizeForValue: encoder | index | (key isVariableBinding and:[key isSpecialReadBinding]) ifFalse:[^super sizeForValue: encoder]. code < 0 ifTrue:[ index := self index. code := self code: index type: LdLitType]. readNode := encoder encodeSelector: #value. ^(readNode size: encoder args: 0 super: false) + (super sizeForValue: encoder)! !