1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
|
/*****
* policy.h
* Andy Hammerlindl 2011/09/03
*
* Defines a low-level C interface for interacting with the interpreter and
* its datatypes.
*****/
// TODO: Wrap in namespace.
typedef long long int_typ;
typedef struct {} handle_base_typ;
typedef handle_base_typ *handle_typ;
typedef struct {} arguments_base_typ;
typedef arguments_base_typ *arguments_typ;
typedef struct {} state_base_typ;
typedef state_base_typ *state_typ;
typedef void (*function_typ)(state_typ, void *);
typedef struct {
const char *buf;
int_typ length;
} string_typ;
typedef void (*error_callback_typ)(string_typ);
typedef long arg_rest_option;
#define NORMAL_ARG 45000
#define REST_ARG 45001
typedef struct {
int_typ version;
handle_typ (*copyHandle)(handle_typ handle);
void (*releaseHandle)();
handle_typ (*handleFromInt)(int_typ x);
// For bool, O is false, 1 is true, and no other value is allowed.
handle_typ (*handleFromBool)(int_typ x);
handle_typ (*handleFromDouble)(double x);
handle_typ (*handleFromString)(string_typ x);
handle_typ (*handleFromFunction)(const char *signature,
function_typ f, void *data);
int_typ (*IntFromHandle)(handle_typ handle);
int_typ (*boolFromHandle)(handle_typ handle);
double (*doubleFromHandle)(handle_typ handle);
// TODO: Note that a pointer and length are returned, but the pointer is
// valid for a limited time only.
string_typ (*stringFromHandle)(handle_typ handle);
#if 0
bool (*handleIsOverloaded)(handle_typ handle);
handle_typ (*signatureless)(handle_typ handle);
#endif
handle_typ (*getField)(handle_typ handle, const char *name);
handle_typ (*getCell)(handle_typ handle, handle_typ index);
// Adds a field to a datum (possibly a module) and sets it to an initial
// value.
// TODO: Change name to sig.
void (*addField)(handle_typ handle,
const char *name, handle_typ init);
arguments_typ (*newArguments)();
void (*releaseArguments)(arguments_typ args);
void (*addArgument)(arguments_typ args, const char *name, handle_typ handle,
arg_rest_option at);
handle_typ (*call)(handle_typ callee, arguments_typ args);
handle_typ (*globals)(state_typ state);
int_typ (*numParams)(state_typ state);
handle_typ (*getParam)(state_typ state, int_typ index);
void (*setReturnValue)(state_typ state, handle_typ handle);
// Allows the user sets an error callback, which is called on any error.
void (*setErrorCallback)(error_callback_typ callback);
} policy_typ;
|