OverviewFilesCommitsIssuesDocsReleasesPeers

hyper-booking / node_modules / bare-realm / binding.c

100 lines · c ref:
#include <assert.h>
#include <bare.h>
#include <js.h>
#include <stdint.h>
#include <stdlib.h>

typedef js_context_t bare_realm_t;

static void
bare_realm__on_finalize (js_env_t *env, void *data, void *finalize_hint) {
  bare_realm_t *realm = (bare_realm_t *) data;

  int err = js_destroy_context(env, realm);
  assert(err == 0);
}

static js_value_t *
bare_realm_create (js_env_t *env, js_callback_info_t *info) {
  int err;

  bare_realm_t *realm;
  err = js_create_context(env, &realm);
  if (err < 0) return NULL;

  js_value_t *handle;
  err = js_create_external(env, (void *) realm, bare_realm__on_finalize, NULL, &handle);
  assert(err == 0);

  return handle;
}

static js_value_t *
bare_realm_evaluate (js_env_t *env, js_callback_info_t *info) {
  int err;

  size_t argc = 4;
  js_value_t *argv[4];

  err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
  assert(err == 0);

  assert(argc == 4);

  bare_realm_t *realm;
  err = js_get_value_external(env, argv[0], (void **) &realm);
  assert(err == 0);

  js_value_t *source = argv[1];

  size_t len;
  err = js_get_value_string_utf8(env, argv[2], NULL, 0, &len);
  assert(err == 0);

  len += 1 /* NULL */;

  utf8_t *file = malloc(len);
  err = js_get_value_string_utf8(env, argv[2], file, len, NULL);
  assert(err == 0);

  int32_t offset;
  err = js_get_value_int32(env, argv[3], &offset);
  assert(err == 0);

  err = js_enter_context(env, realm);
  assert(err == 0);

  js_value_t *result;
  err = js_run_script(env, (char *) file, len, offset, source, &result);
  (void) err;

  free(file);

  err = js_exit_context(env, realm);
  assert(err == 0);

  return result;
}

static js_value_t *
bare_realm_exports (js_env_t *env, js_value_t *exports) {
  int err;

#define V(name, fn) \
  { \
    js_value_t *val; \
    err = js_create_function(env, name, -1, fn, NULL, &val); \
    assert(err == 0); \
    err = js_set_named_property(env, exports, name, val); \
    assert(err == 0); \
  }

  V("create", bare_realm_create)
  V("evaluate", bare_realm_evaluate)
#undef V

  return exports;
}

BARE_MODULE(bare_realm, bare_realm_exports)