(func $main/test (type $t1) (param $p0 i32) (param $p1 i32)
...)
(func $main/test|trampoline (export "test") (type $t1) (param $p0 i32) (param $p1 i32)
block $B0
block $B1
block $B2
get_global $g25
i32.const 1
i32.sub
br_table $B1 $B0 $B2
end
unreachable
end
i32.const 0
set_local $p1
end
get_local $p0
get_local $p1
call $main/test)
(func $~setargc (export "_setargc") (type $t2) (param $p0 i32)
get_local $p0
set_global $g25)
Le trampoline est généré si une fonction avec des arguments facultatifs est appelée avec des arguments omis. Il enveloppe essentiellement les initialiseurs d'arguments facultatifs dans un contexte approprié et appelle la fonction d'origine avec eux. Si vous appelez toujours des fonctions avec des arguments facultatifs avec tous les arguments fournis, aucun trampoline ne doit être généré.
Cela me rappelle que quelques optimisations pourraient y être effectuées. L'une est que si les valeurs par défaut des arguments omis sont de toute façon zéro, une autre est que les valeurs par défaut sont des constantes qui peuvent être intégrées dans l'appel.
Clôturant ce problème pour l'instant car il n'a reçu aucune réponse récemment, je suppose donc que les optimisations implémentées ci-dessus le résolvent suffisamment. N'hésitez pas à rouvrir si besoin !
Commentaire le plus utile
Cela me rappelle que quelques optimisations pourraient y être effectuées. L'une est que si les valeurs par défaut des arguments omis sont de toute façon zéro, une autre est que les valeurs par défaut sont des constantes qui peuvent être intégrées dans l'appel.