a661452c6d078fe8282e194f06e4b2e3b9401aa6
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
)
31 if m
.iroutine
!= null and ic
.is_inlinable
then
33 var ir
= m
.iroutine
.as(not null)
37 current_icode
.insert_before
(seq
)
38 var e
= icb
.inline_routine
(ir
, ic
.exprs
)
42 current_icode
.insert_before
(new IMove(r
, e
))
52 init(m
: MMModule, r
: IRoutine)
54 _icb
= new ICodeBuilder(m
, r
)
59 fun is_inlinable
: Bool
63 var cn
= m
.local_class
.name
64 return (m
.is_intern
and cn
!= once
("Object".to_symbol
)) or
65 (cn
== (once
("Array".to_symbol
)) and (mn
== (once
("length".to_symbol
)) or mn
== (once
("[]".to_symbol
)))) or
66 (cn
== (once
("AbstractArrayRead".to_symbol
)) and (mn
== (once
("length".to_symbol
)) or mn
== (once
("[]".to_symbol
)))) or
67 (m
.global
.intro
.local_class
.name
== (once
("Inline__".to_symbol
)))
72 fun inline_methods
(m
: MMModule)
74 var v
= new InlineMethodVisitor(m
, self)
75 v
.visit_iroutine
(self)