ligo/gitlab-pages/docs/advanced/inline.md
2020-03-31 14:11:22 +02:00

1.6 KiB

id title
inline Inlining

import Syntax from '@theme/Syntax';

When compiling a contract in LIGO some functions get inlined in the place where they are used and some are not. Inlining a function often results in larger contracts and is therefore not aggressively done.

In some cases you might want to override the default behaviour of LIGO and force inlining.

Inline attribute

To force inlining you can use the inline attribute.

function fst(const p : nat * nat) : nat is p.0; attributes ["inline"] ;

function main(const p : nat * nat; const s : nat * nat) : list(operation) * (nat * nat) is
  ((list end : list(operation)), (fst(p.0,p.1), fst(s.1,s.0)))
let fst (p: (nat * nat)) : nat = p.0 [@@inline]

let main (p : (nat * nat)) (s : (nat * nat)) : (operation list * (nat * nat)) =
    (([]: operation list), (fst (p.0, p.1), fst (s.1, s.0)))
[@inline]
let fst = (p: (nat, nat)) : nat => p[0] 

let main = (p : (nat, nat), s : (nat, nat)) : (list(operation), (nat, nat)) =>
    (([]: list(operation)), (fst((p[0], p[1])), fst((s[1], s[0]))))

Now if we measure the difference between inlining and without inlining, using ligo measure-contract name_of_contract.ligo <entrypoint>, we see the following results:

With inlining66 bytes
Without inlining170 bytes

:::info Note that these results can change due to ongoing work to optimize output of the LIGO compiler. :::