OverviewFilesCommitsIssuesDocsReleasesPeers

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

120 lines · c ref:
#include <bare.h>
#include <uv.h>

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

  js_heap_statistics_t stats = {
    .version = 1,

    // Since 0
    .total_heap_size = -1,
    .used_heap_size = -1,

    // Since 1
    .external_memory = -1,
  };

  err = js_get_heap_statistics(env, &stats);
  assert(err == 0);

  js_value_t *result;
  err = js_create_object(env, &result);
  assert(err == 0);

#define V(name, property) \
  { \
    if (stats.property != (size_t) -1) { \
      js_value_t *value; \
      err = js_create_int64(env, stats.property, &value); \
      assert(err == 0); \
\
      err = js_set_named_property(env, result, name, value); \
      assert(err == 0); \
    } \
  }

  V("heapTotal", total_heap_size)
  V("heapUsed", used_heap_size)
  V("external", external_memory)
#undef V

  return result;
}

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

  size_t len;
  err = js_get_heap_space_statistics(env, NULL, 0, 0, &len);
  assert(err == 0);

  js_heap_space_statistics_t *statistics = calloc(len, sizeof(js_heap_space_statistics_t));
  err = js_get_heap_space_statistics(env, statistics, len, 0, NULL);
  assert(err == 0);

  js_value_t *result;
  err = js_create_array_with_length(env, len, &result);
  assert(err == 0);

  for (size_t i = 0, n = len; i < n; i++) {
    js_heap_space_statistics_t stats = statistics[i];

    js_value_t *item;
    err = js_create_object(env, &item);
    assert(err == 0);

    err = js_set_element(env, result, i, item);
    assert(err == 0);

    js_value_t *name;
    err = js_create_string_utf8(env, (utf8_t *) stats.space_name, -1, &name);
    assert(err == 0);

    err = js_set_named_property(env, item, "space_name", name);
    assert(err == 0);

#define V(name) \
  { \
    js_value_t *val; \
    err = js_create_int64(env, stats.name, &val); \
    assert(err == 0); \
    err = js_set_named_property(env, item, #name, val); \
    assert(err == 0); \
  }

    V(space_size)
    V(space_used_size)
    V(space_available_size)
#undef V
  }

  free(statistics);

  return result;
}

static js_value_t *
bare_v8_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("heapStatistics", bare_v8_heap_statistics)
  V("heapSpaceStatistics", bare_v8_heap_space_statistics)
#undef V

  return exports;
}

BARE_MODULE(bare_v8, bare_v8_exports)