compiler/PPCInliningVisitor.st
author Jan Vrany <jan.vrany@fit.cvut.cz>
Thu, 21 May 2015 14:12:22 +0100
changeset 464 f6d77fee9811
parent 459 4751c407bb40
child 465 f729f6cd3c76
child 502 1e45d3c96ec5
permissions -rw-r--r--
Updated to PetitCompiler-JanKurs.118, PetitCompiler-Tests-JanKurs.46, PetitCompiler-Extras-Tests-JanKurs.11, and PetitCompiler-Benchmarks-JanKurs.11 Name: PetitCompiler-JanKurs.118 Author: JanKurs Time: 13-05-2015, 03:59:01.292 PM UUID: 4a8ccd94-3131-4cc7-9098-528f8e5ea0b5 Name: PetitCompiler-Tests-JanKurs.46 Author: JanKurs Time: 04-05-2015, 04:25:06.162 PM UUID: 9f4cf8b7-876e-4a13-9579-b833f016db66 Name: PetitCompiler-Extras-Tests-JanKurs.11 Author: JanKurs Time: 13-05-2015, 04:27:27.940 PM UUID: e9f30c31-fbd0-4e96-ad2a-868f88d20ea8 Name: PetitCompiler-Benchmarks-JanKurs.11 Author: JanKurs Time: 13-05-2015, 02:21:49.932 PM UUID: 6a23fd1e-a86f-46db-8221-cc41b778d32c

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

"{ NameSpace: Smalltalk }"

PPCNodeVisitor subclass:#PPCInliningVisitor
	instanceVariableNames:'canInline acceptedNodes'
	classVariableNames:''
	poolDictionaries:''
	category:'PetitCompiler-Visitors'
!

!PPCInliningVisitor methodsFor:'initialization'!

initialize
    super 	initialize.
        
    acceptedNodes := 0
! !

!PPCInliningVisitor methodsFor:'testing'!

canInline
    ^ acceptedNodes > 1
! !

!PPCInliningVisitor methodsFor:'visiting'!

beforeAccept: node
    acceptedNodes := acceptedNodes + 1.
    super beforeAccept: node
!

markForInline: node
    self canInline ifTrue: [ 
        node markForInline.
    ].
    ^ node
!

visitCharSetPredicateNode: node
    ^ self markForInline: node
!

visitCharacterNode: node
    ^ self markForInline: node
!

visitLiteralNode: node
    ^ self markForInline: node
!

visitMessagePredicateNode: node
    ^ self markForInline: node
!

visitNilNode: node
    ^ self markForInline: node
!

visitNotCharSetPredicateNode: node
    ^ self markForInline: node
!

visitNotLiteralNode: node
    ^ self markForInline: node
!

visitNotMessagePredicateNode: node
    ^ self markForInline: node
!

visitPluggableNode: node
    "Sadly, on Smalltalk/X blocks cannot be inlined because
     the VM does not provide enough information to map
     it back to source code. Very bad indeed!!"
    ((Smalltalk respondsTo:#isSmalltalkX) and:[ Smalltalk isSmalltalkX ]) ifFalse:[
			self markForInline: node
    ].
    ^ super visitPluggableNode: node.

    "Modified: / 23-04-2015 / 12:15:49 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

visitStarCharSetPredicateNode: node
    ^ self markForInline: node
!

visitStarMessagePredicateNode: node
    ^ self markForInline: node
!

visitTokenConsumeNode: node
    super visitTokenConsumeNode: node.
    node name isNil ifTrue: [ 
        self markForInline: node
    ].
    ^ node
!

visitTokenStarMessagePredicateNode: node
    ^ self markForInline: node
!

visitTokenStarSeparatorNode: node
    ^ self markForInline: node
!

visitTokenWhitespaceNode: node
    super visitTokenWhitespaceNode: node.
    self markForInline: node.
    ^ node
!

visitTokenizingParserNode: node
    self visit: node tokenizer.
    self visit: node parser.
    ^ node
! !