From a9d81338b19f21f7220e340a1c50870b40587120 Mon Sep 17 00:00:00 2001 From: Quentin Carbonneaux Date: Wed, 15 Feb 2017 20:17:13 -0500 Subject: add support for closure calls Compiling languages with closures often requires passing an extra environment parameter to the called function. One solution is to use a convention, and reserve, say, the first argument for that purpose. However, that makes binding to C a little less smooth. Alternatively, QBE now provides a way to remain fully ABI compatible with C by having a "hidden" environment argument (marked with the keyword 'env'). Calling a function expecting an environment from C will make the contents of the environment undefined, but the normal arguments will be passed without alteration. Conversely, calling a C function like it is a closure by passing it an environemnt will work smoothly. --- all.h | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'all.h') diff --git a/all.h b/all.h index a038612..887d680 100644 --- a/all.h +++ b/all.h @@ -264,8 +264,12 @@ enum Op { /* function instructions */ Opar = NPubOp, Oparc, + Opare, +#define ispar(o) (Opar <= o && o <= Opare) Oarg, Oargc, + Oarge, +#define isarg(o) (Oarg <= o && o <= Oarge) Ocall, Ovacall, -- cgit 1.4.1