compiler/PPCMethod.st
author Jan Vrany <jan.vrany@fit.cvut.cz>
Sun, 26 Oct 2014 01:03:31 +0000
changeset 391 553a5456963b
child 392 9b297f0d949c
permissions -rw-r--r--
Ported PetitCompiler-(Tests). Name: PetitCompiler-JanKurs.41 Author: JanKurs Time: 25-10-2014, 03:30:28 AM UUID: 105186d1-1187-4ca6-8d66-3d2d47def4d3 Repository: http://smalltalkhub.com/mc/JanKurs/PetitParser/main Name: PetitCompiler-Tests-JanKurs.4 Author: JanKurs Time: 25-10-2014, 03:30:58 AM UUID: 3e798fad-d5f6-4881-a583-f0bbffe27869 Repository: http://smalltalkhub.com/mc/JanKurs/PetitParser/main In addition, fixed some problems to make it compilable under Smalltalk/X: * Fixed PPCTokenNode>>initialize - there's no children instvar, it's initialization removed. * Fixed PPCContextMemento>>propertyAt:ifAbsent: - removed return-in-return, not compilable under Smalltalk/X (C issues) * Fixed PPCContextMemento>>hash - there's no stream instvar, access to it removed. * Fixed PPCAbstractCharacterNode>>compileWith:effect:id: - removed dot after method selector (stc does not like it)

"{ Package: 'stx:goodies/petitparser/compiler' }"

Object subclass:#PPCMethod
	instanceVariableNames:'buffer variables indentation id profile canInline'
	classVariableNames:''
	poolDictionaries:''
	category:'PetitCompiler-Core'
!

PPCMethod comment:''
!

!PPCMethod methodsFor:'as yet unclassified'!

add: string
	self nl.
	indentation timesRepeat: [ buffer nextPutAll: '  ' ].
	self addOnLine: string.
!

addOnLine: string
	buffer nextPutAll: string.
!

addVariable: name
	variables add: name.
!

allowInline
	canInline := true
!

body
	^ buffer contents
!

bridge
	^ PPCBridge on: self methodName.
!

call
	^ 'self ', self methodName, '.'.
!

code
	^ self methodName, String cr,  
		self variables, String cr,
		self profilingBegin, String cr,
		self body, String cr
"		self profilingEnd"
!

dedent
	indentation := indentation - 1
!

id: value
	id := value
!

indent 
	indentation := indentation + 1
!

isMethod
	^ true
!

methodName
	^ id
!

nl
	^ buffer nextPut: Character cr
!

profile
	^ profile
!

profile: aBoolean
	profile := aBoolean 
!

profilingBegin
	self profile ifTrue: [ 
 		^ '  context methodInvoked: #', id, '.'	
	].
	^ ''
!

profilingEnd
	self profile ifTrue: [ 
 		^ '  context methodFinished: #', id, '.'	
	].
	^ ''
!

variables
	^ '  | ', (variables inject: '' into: [ :s :e | s, ' ', e]), ' |'
! !

!PPCMethod methodsFor:'initialization'!

initialize
	buffer := WriteStream on: ''.
	indentation := 1.
	variables := OrderedCollection new.
	canInline := false
! !