80f0aacac3ce5c554ad56f4a9a784be68862ea12
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
26 redef fun visit_icode
(ic
)
30 if m
.iroutine
!= null and ic
.is_inlinable
then
31 var ir
= m
.iroutine
.as(not null)
33 current_icode
.insert_before
(seq
)
34 var e
= ir
.inline_in_seq
(seq
, ic
.exprs
)
38 current_icode
.insert_before
(new IMove(r
, e
))
49 fun is_inlinable
: Bool
53 var cn
= m
.local_class
.name
54 return (m
.is_intern
and cn
!= once
("Object".to_symbol
)) or
55 (cn
== (once
("Array".to_symbol
)) and (mn
== (once
("length".to_symbol
)) or mn
== (once
("[]".to_symbol
)))) or
56 (cn
== (once
("AbstractArrayRead".to_symbol
)) and (mn
== (once
("length".to_symbol
)) or mn
== (once
("[]".to_symbol
))))
63 var v
= new InlineMethodVisitor
64 v
.visit_iroutine
(self)