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 redef fun visit_icode
(ic
)
32 if ir
!= null and ic
.is_inlinable
then
34 if icb
.iroutine
== ir
then
36 # So, at least transform the call to a static one
38 var icall
= new IStaticCall(ic
.property
, ic
.exprs
)
39 icall
.closure_defs
= ic
.closure_defs
40 icall
.result
= ic
.result
41 current_icode
.insert_before
(icall
)
47 current_icode
.insert_before
(seq
)
48 var e
= icb
.inline_routine
(ir
, ic
.exprs
, ic
.closure_defs
)
52 current_icode
.insert_before
(new IMove(r
, e
))
63 init(m
: MMModule, r
: IRoutine)
65 _icb
= new ICodeBuilder(m
, r
)
70 fun is_inlinable
: Bool
74 var cn
= m
.local_class
.name
75 return (m
.is_intern
and cn
!= once
("Object".to_symbol
)) or
76 (cn
== (once
("Int".to_symbol
)) and (mn
== (once
("enumerate_to".to_symbol
)) or mn
== (once
("enumerate_before".to_symbol
)))) or
77 (cn
== (once
("Array".to_symbol
)) and (mn
== (once
("length".to_symbol
)) or mn
== (once
("[]".to_symbol
)) or mn
== (once
("iterate".to_symbol
)))) or
78 (cn
== (once
("AbstractArrayRead".to_symbol
)) and (mn
== (once
("length".to_symbol
)) or mn
== (once
("[]".to_symbol
)))) or
79 (m
.global
.intro
.local_class
.name
== (once
("Inline__".to_symbol
)))
84 fun inline_methods
(m
: MMModule)
86 var v
= new InlineMethodVisitor(m
, self)
87 v
.visit_iroutine
(self)