/c_src/erlv8_extern.cc

http://github.com/beamjs/erlv8 · C++ · 89 lines · 74 code · 15 blank · 0 comment · 18 complexity · f3b0115473ce79e7e8523af03927aa28 MD5 · raw file

  1. #include "erlv8.hh"
  2. v8::Handle<v8::Object> extern_name_to_proto(VM * vm, char *name) {
  3. v8::Handle<v8::Object> proto;
  4. if (!strcmp(name,"num")) {
  5. proto = vm->external_proto_num;
  6. } else if (!strcmp(name,"atom")) {
  7. proto = vm->external_proto_atom;
  8. } else if (!strcmp(name,"bin")) {
  9. proto = vm->external_proto_bin;
  10. } else if (!strcmp(name,"ref")) {
  11. proto = vm->external_proto_ref;
  12. } else if (!strcmp(name,"fun")) {
  13. proto = vm->external_proto_fun;
  14. } else if (!strcmp(name,"port")) {
  15. proto = vm->external_proto_port;
  16. } else if (!strcmp(name,"pid")) {
  17. proto = vm->external_proto_pid;
  18. } else if (!strcmp(name,"tuple")) {
  19. proto = vm->external_proto_tuple;
  20. } else if (!strcmp(name,"list")) {
  21. proto = vm->external_proto_list;
  22. } else {
  23. proto = v8::Object::New();
  24. }
  25. return proto;
  26. }
  27. TickHandler(ExternProtoTickHandler) {
  28. ErlNifEnv *ref_env = enif_alloc_env();
  29. ERL_NIF_TERM extern_proto_ref = enif_make_copy(ref_env, tick_ref);
  30. char name[MAX_ATOM_LEN];
  31. unsigned len;
  32. enif_get_atom_length(vm->env, array[1], &len, ERL_NIF_LATIN1);
  33. enif_get_atom(vm->env,array[1],(char *)&name,len + 1, ERL_NIF_LATIN1);
  34. v8::Handle<v8::Object> proto = extern_name_to_proto(vm, name);
  35. SEND(vm->server,
  36. enif_make_tuple3(env,
  37. enif_make_atom(env,"result"),
  38. enif_make_copy(env,extern_proto_ref),
  39. js_to_term(vm->context, vm->isolate, env, proto)));
  40. enif_free_env(ref_env);
  41. TickHandlerResolution result;
  42. result.type = DONE;
  43. return result;
  44. }
  45. TickHandler(ExternalizeTickHandler) {
  46. ErlNifEnv *ref_env = enif_alloc_env();
  47. ERL_NIF_TERM extern_ref = enif_make_copy(ref_env, tick_ref);
  48. char name[MAX_ATOM_LEN];
  49. unsigned len;
  50. enif_get_atom_length(vm->env, array[1], &len, ERL_NIF_LATIN1);
  51. enif_get_atom(vm->env,array[1],(char *)&name,len + 1, ERL_NIF_LATIN1);
  52. v8::Handle<v8::Object> proto = extern_name_to_proto(vm, name);
  53. v8::Handle<v8::Object> obj = externalize_term(vm->extern_map, proto, array[2]);
  54. ERL_NIF_TERM resource_term;
  55. val_res_t *ptr;
  56. ptr = (val_res_t *)enif_alloc_resource(val_resource, sizeof(val_res_t));
  57. ptr->val = v8::Persistent<v8::Object>::New(v8::Handle<v8::Object>::Cast(obj));
  58. ptr->ctx = v8::Persistent<v8::Context>::New(v8::Context::GetCurrent());
  59. resource_term = enif_make_resource(vm->env, ptr);
  60. enif_release_resource(ptr);
  61. SEND(vm->server,
  62. enif_make_tuple3(env,
  63. enif_make_atom(env,"result"),
  64. enif_make_copy(env,extern_ref),
  65. enif_make_tuple3(env,
  66. enif_make_atom(env, "erlv8_object"),
  67. enif_make_copy(env, resource_term),
  68. enif_make_pid(env, vm->server)
  69. )));
  70. enif_free_env(ref_env);
  71. TickHandlerResolution result;
  72. result.type = DONE;
  73. return result;
  74. }