X-Git-Url: http://git.lukelau.me/?p=scheme.git;a=blobdiff_plain;f=abi.md;h=0dbbcc4942b21515229a11ad8f1945f1c22163a6;hp=28f81c4152683ee00ae2a3c77daa166fd6f92959;hb=HEAD;hpb=f605bff88ce12e5f4384ab308c036350bfa86cb5 diff --git a/abi.md b/abi.md index 28f81c4..0dbbcc4 100644 --- a/abi.md +++ b/abi.md @@ -35,6 +35,19 @@ lambda code 1st 2nd 3rd address captive captive captive ... ``` +## note on recursive closures + +The following example shows a recursive lambda, that results in a +closure that captures itself. +``` +(let ([f (closure lambda0 (f))]) + (f 42)) +``` +When this happens, `codegen-let` will insert `(f . 'self-captive)` +into the environment when codegen'ing the closure. `codegen-closure` +will then pick this up, and use it to insert its own heap address into +its inner environment. + # lambdas lambdas use the system v amd64 calling convention. @@ -49,3 +62,8 @@ e.g. * param 0: pointer to the value of `x` * param 1: the value of`y` + +# inter-function and stack values + +ints, bools and closures are passed around within functions in `%rax`. +adts are passed on the stack, at whatever stack index the code generation was called with. \ No newline at end of file