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;
  size_t 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;
 
     |