Class { #name : 'PPCMethod', #superclass : 'Object', #instVars : [ 'selector', 'source', 'category', 'variableForReturn' ], #category : 'PetitCompiler-Compiler-Codegen' } { #category : 'as yet unclassified' } PPCMethod class >> new [ "return an initialized instance" ^ self basicNew initialize. ] { #category : 'as yet unclassified' } PPCMethod >> add: string [ source add: string "Modified: / 01-06-2015 / 21:09:06 / Jan Vrany " ] { #category : 'as yet unclassified' } PPCMethod >> addOnLine: string [ source addOnLine: string "Modified: / 01-06-2015 / 21:09:20 / Jan Vrany " ] { #category : 'code generation - variables' } PPCMethod >> allocateReturnVariable [ ^ variableForReturn isNil ifTrue:[ variableForReturn := self allocateTemporaryVariableNamed: 'retval' ] ifFalse:[ variableForReturn ]. "Created: / 23-04-2015 / 18:03:40 / Jan Vrany " ] { #category : 'code generation - variables' } PPCMethod >> allocateReturnVariableNamed: name [ "Allocate temporary variable used for storing a parser's return value (the parsed object)" variableForReturn notNil ifTrue:[ self error: 'Return variable already allocated!'. ^ self. ]. variableForReturn := self allocateTemporaryVariableNamed: name. ^ variableForReturn "Created: / 15-06-2015 / 17:52:14 / Jan Vrany " ] { #category : 'code generation - variables' } PPCMethod >> allocateTemporaryVariableNamed:preferredName [ "Allocate a new variable with (preferably) given name. Returns a real variable name that should be used." ^ source allocateTemporaryVariableNamed: preferredName "Created: / 23-04-2015 / 17:37:55 / Jan Vrany " "Modified: / 01-06-2015 / 21:04:02 / Jan Vrany " ] { #category : 'accessing' } PPCMethod >> bridge [ ^ PPCBridge on: self methodName. ] { #category : 'as yet unclassified' } PPCMethod >> call [ ^ 'self ', self methodName, '.'. ] { #category : 'as yet unclassified' } PPCMethod >> callOn: receiver [ ^ receiver, ' ', self methodName. ] { #category : 'accessing' } PPCMethod >> category [ ^ category isNil ifTrue: [ category := 'generated' ] ifFalse: [ category ] ] { #category : 'accessing' } PPCMethod >> category: value [ category := value ] { #category : 'accessing' } PPCMethod >> code [ ^ String streamContents: [ :s | s nextPutAll: self methodName; cr. source codeOn: s. ] "Modified: / 01-06-2015 / 21:24:47 / Jan Vrany " ] { #category : 'code generation' } PPCMethod >> code: aStringOrBlockOrRBParseNode [ source code: aStringOrBlockOrRBParseNode. "Created: / 01-06-2015 / 22:31:16 / Jan Vrany " "Modified (format): / 01-06-2015 / 23:50:26 / Jan Vrany " ] { #category : 'code generation' } PPCMethod >> codeBlock: contents [ | outerBlock innerBlock | outerBlock := source. innerBlock := PPCCodeBlock new. innerBlock indentationLevel: outerBlock indentationLevel + 1. [ outerBlock addOnLine: '['. source := innerBlock. self codeOnLine: contents. ] ensure:[ outerBlock codeOnLine: (String streamContents:[:s | innerBlock sourceOn:s]); add: ']'. source := outerBlock. ] "Created: / 01-06-2015 / 22:33:21 / Jan Vrany " "Modified: / 03-06-2015 / 06:11:32 / Jan Vrany " ] { #category : 'code generation' } PPCMethod >> codeOnLine: aStringOrBlockOrRBParseNode [ source codeOnLine: aStringOrBlockOrRBParseNode. "Created: / 01-06-2015 / 22:31:16 / Jan Vrany " "Modified (format): / 01-06-2015 / 23:50:26 / Jan Vrany " ] { #category : 'code generation - indenting' } PPCMethod >> dedent [ source dedent "Created: / 01-06-2015 / 21:32:28 / Jan Vrany " ] { #category : 'accessing' } PPCMethod >> id: value [ selector := value ] { #category : 'code generation - indenting' } PPCMethod >> indent [ source indent "Created: / 01-06-2015 / 21:32:22 / Jan Vrany " ] { #category : 'accessing' } PPCMethod >> indentationLevel [ ^ source indentationLevel "Created: / 01-06-2015 / 21:38:31 / Jan Vrany " ] { #category : 'accessing' } PPCMethod >> indentationLevel: anInteger [ source indentationLevel: anInteger "Created: / 01-06-2015 / 21:38:58 / Jan Vrany " ] { #category : 'initialization' } PPCMethod >> initialize [ source := PPCCodeBlock new. "Modified: / 01-06-2015 / 21:33:36 / Jan Vrany " ] { #category : 'testing' } PPCMethod >> isInline [ ^ false ] { #category : 'testing' } PPCMethod >> isMethod [ ^ true ] { #category : 'accessing' } PPCMethod >> methodName [ ^ selector ] { #category : 'code generation - indenting' } PPCMethod >> nl [ source nl "Created: / 01-06-2015 / 21:52:31 / Jan Vrany " ] { #category : 'printing' } PPCMethod >> printOn:aStream [ "append a printed representation if the receiver to the argument, aStream" super printOn:aStream. aStream nextPutAll:' id: '. selector printOn:aStream. "Modified: / 23-04-2015 / 12:32:30 / Jan Vrany " ] { #category : 'as yet unclassified' } PPCMethod >> profilingBegin [ self profile ifTrue: [ ^ ' context methodInvoked: #', selector, '.' ]. ^ '' ] { #category : 'as yet unclassified' } PPCMethod >> profilingEnd [ self profile ifTrue: [ ^ ' context methodFinished: #', selector, '.' ]. ^ '' ] { #category : 'code generation - variables' } PPCMethod >> returnVariable [ ^ variableForReturn "Created: / 23-04-2015 / 20:50:50 / Jan Vrany " "Modified (format): / 15-06-2015 / 18:12:28 / Jan Vrany " ] { #category : 'code generation - variables' } PPCMethod >> returnVariable: aString [ (variableForReturn notNil and:[variableForReturn ~= aString]) ifTrue:[ self error: 'Return variable already allocated with different name (''', variableForReturn , ''' vs ''', aString,''')'. ]. variableForReturn := aString "Created: / 23-04-2015 / 18:23:47 / Jan Vrany " "Modified: / 15-06-2015 / 18:14:02 / Jan Vrany " ] { #category : 'accessing' } PPCMethod >> selector [ ^ selector ] { #category : 'accessing' } PPCMethod >> source [ ^ source isString ifTrue:[ source ] ifFalse:[ String streamContents: [ :s | s nextPutAll: self methodName; cr. source sourceOn:s. ] ]. "Created: / 24-07-2015 / 19:46:09 / Jan Vrany " ] { #category : 'accessing' } PPCMethod >> source: aString [ source := aString "Created: / 24-07-2015 / 19:48:05 / Jan Vrany " ]