Version: 0.28.0

Inlining

When compiling a contract in LIGO, declarations will get inlined if they are only used once and pure. Inlining often results in larger contracts and is therefore not aggressively done.

A pure declaration is one that doesn't cause side effects like causing a failure or operation.

In some cases you might want to override the default behaviour of LIGO and force inlining. The declaration still needs to be pure though.

Inline attribute#

To force inlining you can use the inline attribute.

// @inline
let fst = (p: [nat, nat]): nat => p[0];
let main = (p: [nat, nat], s: [nat, nat]) : [list<operation>, [nat, nat]] =>
[list([]) as 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 info measure-contract name_of_contract.ligo --entry-point <entrypoint>, we see the following results:

With inlining66 bytes
Without inlining170 bytes
info

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