Serene Runtime 1.0.0
C runtime for the Serene programming language
Loading...
Searching...
No Matches
abi.c
Go to the documentation of this file.
1/* -*- C -*-
2 * Serene programming language
3 * Copyright (C) 2019-2026 Sameer Rahmani <[email protected]>
4 *
5 * This library is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU Lesser General Public License as published by
7 * the Free Software Foundation, either version 3 of the License, or
8 * (at your option) any later version.
9 *
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU Lesser General Public License for more details.
14 *
15 * You should have received a copy of the GNU Lesser General Public License
16 * along with this library. If not, see <https://www.gnu.org/licenses/>.
17 */
18
19#include "serene/rt/abi.h"
20
21#include "serene/rt/closures.h"
22#include "serene/rt/context.h"
23#include "serene/rt/core.h"
24#include "serene/utils.h"
25
26srn_value_t *srn_apply_c(srn_context_t *ctx, srn_value_t *fn, srn_value_t *argv, uint32_t argc) {
27 if (IS_A(fn, VClosure)) {
28 PANIC_WITH_CTX(ctx, "apply: not a function");
29 }
30 srn_closure_t *cl = AS_CLOSURE(fn);
31 if (cl == nullptr) {
32 PANIC_WITH_CTX(ctx, "Not a closure value");
33 }
34 srn_fnptr_t fnptr = cl->fn;
35 // Internal fn type is (srn_context_t*, srn_value_t**, u32) -> srn_value_t*
36 // using fastcc in IR, but here it's just a plain function pointer; call
37 // through.
38 return fnptr(ctx, argv, argc);
39}
40
42 uint32_t argc) {
43 return f(ctx, argv, argc);
44}
45
47 return srn_apply_c(ctx, fun, nullptr, 0);
48}
50 srn_value_t *argv[1] = {a0};
51 return srn_apply_c(ctx, fun, (srn_value_t *)argv, 1);
52}
54 srn_value_t *argv[2] = {a0, a1};
55 return srn_apply_c(ctx, fun, (srn_value_t *)argv, 2);
56}
srn_value_t * srn_call_cprimitive(srn_context_t *ctx, srn_cprim_fn_t f, srn_value_t *argv, uint32_t argc)
Definition abi.c:41
srn_value_t * srn_call1(srn_context_t *ctx, srn_value_t *fun, srn_value_t *a0)
Definition abi.c:49
srn_value_t * srn_apply_c(srn_context_t *ctx, srn_value_t *fn, srn_value_t *argv, uint32_t argc)
Call Serene (lisp level) functions via C.
Definition abi.c:26
srn_value_t * srn_call2(srn_context_t *ctx, srn_value_t *fun, srn_value_t *a0, srn_value_t *a1)
Definition abi.c:53
srn_value_t * srn_call0(srn_context_t *ctx, srn_value_t *fun)
Definition abi.c:46
srn_value_t *(* srn_cprim_fn_t)(srn_context_t *, srn_value_t *, uint32_t)
Call a C-ABI primitive from Serene (argv shape is uniform):
Definition abi.h:32
@ VClosure
Definition core.h:121
#define IS_A(value_ref, field)
Definition core.h:162
srn_value_t *(* srn_fnptr_t)(srn_context_t *ctx, srn_value_t *argv, uint32_t argc)
Definition core.h:46
#define AS_CLOSURE(value_ref)
Definition core.h:169
srn_fnptr_t fn
Entry point on the closure, duh!
Definition closures.h:29
#define PANIC_WITH_CTX(ctx, msg)
Definition utils.h:53