/c_src/erlv8_get.cc

http://github.com/beamjs/erlv8 · C++ · 91 lines · 79 code · 12 blank · 0 comment · 9 complexity · 673c19d8c9959b15029ec5651ebb9e98 MD5 · raw file

  1. #include "erlv8.hh"
  2. TickHandler(GetTickHandler) {
  3. val_res_t *obj_res;
  4. if (enif_get_resource(vm->env,array[1],val_resource,(void **)(&obj_res))) {
  5. LHCS(vm->isolate, obj_res->ctx);
  6. v8::Local<v8::Value> get_result = obj_res->val->ToObject()->Get(term_to_js(obj_res->ctx,vm->isolate, vm->env,array[2]));
  7. SEND(vm->server,
  8. enif_make_tuple3(env,
  9. enif_make_atom(env,"result"),
  10. enif_make_copy(env,tick_ref),
  11. js_to_term(obj_res->ctx, vm->isolate, env,get_result)));
  12. }
  13. TickHandlerResolution result;
  14. result.type = DONE;
  15. return result;
  16. }
  17. TickHandler(GetProtoTickHandler) {
  18. val_res_t *obj_res;
  19. if (enif_get_resource(vm->env,array[1],val_resource,(void **)(&obj_res))) {
  20. LHCS(vm->isolate, obj_res->ctx);
  21. v8::Local<v8::Value> get_result = obj_res->val->ToObject()->GetPrototype();
  22. SEND(vm->server,
  23. enif_make_tuple3(env,
  24. enif_make_atom(env,"result"),
  25. enif_make_copy(env,tick_ref),
  26. js_to_term(obj_res->ctx, vm->isolate, env,get_result)));
  27. }
  28. TickHandlerResolution result;
  29. result.type = DONE;
  30. return result;
  31. }
  32. TickHandler(GetHiddenTickHandler) {
  33. val_res_t *obj_res;
  34. if (enif_get_resource(vm->env,array[1],val_resource,(void **)(&obj_res))) {
  35. LHCS(vm->isolate, obj_res->ctx);
  36. v8::Local<v8::Value> get_result = obj_res->val->ToObject()->GetHiddenValue(term_to_js(obj_res->ctx,vm->isolate,vm->env,array[2])->ToString());
  37. SEND(vm->server,
  38. enif_make_tuple3(env,
  39. enif_make_atom(env,"result"),
  40. enif_make_copy(env,tick_ref),
  41. js_to_term(obj_res->ctx, vm->isolate, env,get_result)));
  42. }
  43. TickHandlerResolution result;
  44. result.type = DONE;
  45. return result;
  46. }
  47. TickHandler(GetInternalTickHandler) {
  48. val_res_t *obj_res;
  49. if (enif_get_resource(vm->env,array[1],val_resource,(void **)(&obj_res))) {
  50. LHCS(vm->isolate, obj_res->ctx);
  51. int index;
  52. enif_get_int(vm->env, array[2], &index);
  53. if (index < 0 || (index + 1 > obj_res->val->ToObject()->InternalFieldCount())) {
  54. SEND(vm->server,
  55. enif_make_tuple3(env,
  56. enif_make_atom(env,"result"),
  57. enif_make_copy(env,tick_ref),
  58. enif_make_atom(env,"error")));
  59. } else {
  60. v8::Local<v8::Value> get_result = obj_res->val->ToObject()->GetInternalField(index);
  61. if (get_result->IsExternal()) {
  62. SEND(vm->server,
  63. enif_make_tuple3(env,
  64. enif_make_atom(env,"result"),
  65. enif_make_copy(env,tick_ref),
  66. external_to_term(get_result)));
  67. } else {
  68. SEND(vm->server,
  69. enif_make_tuple3(env,
  70. enif_make_atom(env,"result"),
  71. enif_make_copy(env,tick_ref),
  72. js_to_term(obj_res->ctx, vm->isolate, env,get_result)));
  73. }
  74. }
  75. }
  76. TickHandlerResolution result;
  77. result.type = DONE;
  78. return result;
  79. }