OverviewFilesCommitsIssuesDocsReleasesPeers

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

55 lines · c ref:
#include <assert.h>
#include <bare.h>
#include <js.h>
#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>
#include <stdlib.h>
#include <utf.h>
#include <uv.h>

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

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

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

  assert(argc == 2);

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

  utf8_t *expr = malloc(expr_len + 1);
  err = js_get_value_string_utf8(env, argv[0], expr, expr_len + 1, NULL);
  assert(err == 0);

  js_value_t *script;
  err = js_create_string_utf8(env, expr, -1, &script);
  assert(err == 0);

  free(expr);

  js_value_t *result;
  err = js_run_script(env, "<repl>", -1, 0, script, &result);

  return err == 0 ? result : NULL;
}

static js_value_t *
bare_repl_exports (js_env_t *env, js_value_t *exports) {
  {
    js_value_t *fn;
    js_create_function(env, "eval", -1, bare_repl_eval, NULL, &fn);
    js_set_named_property(env, exports, "eval", fn);
  }

  return exports;
}

BARE_MODULE(bare_repl, bare_repl_exports);