summary refs log tree commit diff
path: root/all.h
diff options
context:
space:
mode:
authorQuentin Carbonneaux <quentin.carbonneaux@yale.edu>2017-02-15 20:17:13 -0500
committerQuentin Carbonneaux <quentin.carbonneaux@yale.edu>2017-02-15 20:17:13 -0500
commita9d81338b19f21f7220e340a1c50870b40587120 (patch)
tree509f8ec05d8b8da88b90630031cff5b52b2e5c54 /all.h
parent249af91ff9d9ffbd8962efcad999de442e609658 (diff)
downloadroux-a9d81338b19f21f7220e340a1c50870b40587120.tar.gz
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.
Diffstat (limited to 'all.h')
-rw-r--r--all.h4
1 files changed, 4 insertions, 0 deletions
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,