1b06b0dbb0725b8ef47c35079f7643b5129f274b
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 # FIXME: what we want is a static call
40 _current_inlining
.push
(ir
)
44 current_icode
.insert_before
(seq
)
45 var e
= icb
.inline_routine
(ir
, ic
.exprs
, ic
.closure_defs
)
49 current_icode
.insert_before
(new IMove(r
, e
))
61 init(m
: MMModule, r
: IRoutine)
63 _current_inlining
= [r
]
64 _icb
= new ICodeBuilder(m
, r
)
69 fun is_inlinable
: Bool
73 var cn
= m
.local_class
.name
74 return (m
.is_intern
and cn
!= once
("Object".to_symbol
)) or
75 (cn
== (once
("Array".to_symbol
)) and (mn
== (once
("length".to_symbol
)) or mn
== (once
("[]".to_symbol
)))) or
76 (cn
== (once
("AbstractArrayRead".to_symbol
)) and (mn
== (once
("length".to_symbol
)) or mn
== (once
("[]".to_symbol
)))) or
77 (m
.global
.intro
.local_class
.name
== (once
("Inline__".to_symbol
)))
82 fun inline_methods
(m
: MMModule)
84 var v
= new InlineMethodVisitor(m
, self)
85 v
.visit_iroutine
(self)