76a3bbc3d0edbc2e83943af67fc4d30be5d2c2a0
1 # This file is part of NIT ( http://www.nitlanguage.org ).
3 # Copyright 2009 Jean Privat <jean@pryen.org>
5 # Licensed under the Apache License, Version 2.0 (the "License");
6 # you may not use this file except in compliance with the License.
7 # You may obtain a copy of the License at
9 # http://www.apache.org/licenses/LICENSE-2.0
11 # Unless required by applicable law or agreed to in writing, software
12 # distributed under the License is distributed on an "AS IS" BASIS,
13 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 # See the License for the specific language governing permissions and
15 # limitations under the License.
17 # Detect inlinable methods and inline them
18 package inline_methods
22 private class InlineMethodVisitor
25 var _icb
: ICodeBuilder
27 var _current_inlining
: Array[IRoutine]
29 redef fun visit_icode
(ic
)
34 if ir
!= null and ic
.is_inlinable
then
35 if _current_inlining
.has
(ir
) then
37 # So, at least transform the call to a static one
39 var icall
= new IStaticCall(ic
.property
, ic
.exprs
)
40 icall
.closure_defs
= ic
.closure_defs
41 icall
.result
= ic
.result
42 current_icode
.insert_before
(icall
)
46 _current_inlining
.push
(ir
)
50 current_icode
.insert_before
(seq
)
51 var e
= icb
.inline_routine
(ir
, ic
.exprs
, ic
.closure_defs
)
55 current_icode
.insert_before
(new IMove(r
, e
))
67 init(m
: MMModule, r
: IRoutine)
69 _current_inlining
= [r
]
70 _icb
= new ICodeBuilder(m
, r
)
75 fun is_inlinable
: Bool
79 var cn
= m
.local_class
.name
80 return (m
.is_intern
and cn
!= once
("Object".to_symbol
)) or
81 (cn
== (once
("Array".to_symbol
)) and (mn
== (once
("length".to_symbol
)) or mn
== (once
("[]".to_symbol
)) or mn
== (once
("iterate".to_symbol
)))) or
82 (cn
== (once
("AbstractArrayRead".to_symbol
)) and (mn
== (once
("length".to_symbol
)) or mn
== (once
("[]".to_symbol
)))) or
83 (m
.global
.intro
.local_class
.name
== (once
("Inline__".to_symbol
)))
88 fun inline_methods
(m
: MMModule)
90 var v
= new InlineMethodVisitor(m
, self)
91 v
.visit_iroutine
(self)