/c_src/erlv8_script.cc

http://github.com/beamjs/erlv8 · C++ · 76 lines · 61 code · 15 blank · 0 comment · 5 complexity · 6ffccf53c5a6079d011a7424db852d2c MD5 · raw file

  1. #include "erlv8.hh"
  2. TickHandler(ScriptTickHandler) {
  3. ErlNifEnv *ref_env = enif_alloc_env();
  4. ERL_NIF_TERM script_ref = enif_make_copy(ref_env, tick_ref);
  5. unsigned len;
  6. enif_get_list_length(vm->env, array[2], &len);
  7. char * buf = (char *) malloc(len + 1);
  8. enif_get_string(vm->env,array[2],buf,len + 1, ERL_NIF_LATIN1);
  9. ctx_res_t *res;
  10. if (enif_get_resource(vm->env,array[1],ctx_resource,(void **)(&res))) {
  11. TRACE("(%p) script - 1\n", vm->isolate);
  12. v8::Isolate::Scope iscope(vm->isolate);
  13. TRACE("(%p) script - 2\n", vm->isolate);
  14. v8::Context::Scope context_scope(res->ctx);
  15. TRACE("(%p) script - 3\n", vm->isolate);
  16. v8::HandleScope handle_scope;
  17. TRACE("(%p) script - 4\n", vm->isolate);
  18. v8::TryCatch try_catch;
  19. TRACE("(%p) script - 4a\n", vm->isolate);
  20. v8::ScriptOrigin * origin = new v8::ScriptOrigin(term_to_js(res->ctx,vm->isolate,vm->env,array[3])->ToString(),
  21. term_to_js(res->ctx,vm->isolate,vm->env,array[4])->ToInteger(),
  22. term_to_js(res->ctx,vm->isolate,vm->env,array[5])->ToInteger());
  23. TRACE("(%p) script - 5\n", vm->isolate);
  24. v8::Handle<v8::String> script = v8::String::New(buf, len);
  25. v8::Handle<v8::Script> compiled = v8::Script::Compile(script,origin);
  26. TRACE("(%p) script - 6\n", vm->isolate);
  27. delete origin;
  28. if (compiled.IsEmpty()) {
  29. SEND(vm->server,
  30. enif_make_tuple3(env,
  31. enif_make_atom(env,"result"),
  32. enif_make_copy(env, script_ref),
  33. enif_make_tuple2(env,
  34. enif_make_atom(env,"throw"),
  35. js_to_term(res->ctx,vm->isolate,env,try_catch.Exception()))));
  36. } else {
  37. TRACE("(%p) script - 7\n", vm->isolate);
  38. v8::Handle<v8::Value> value = compiled->Run();
  39. TRACE("(%p) script - 8\n", vm->isolate);
  40. if (value.IsEmpty()) {
  41. SEND(vm->server,enif_make_tuple3(env,
  42. enif_make_atom(env,"result"),
  43. enif_make_copy(env, script_ref),
  44. enif_make_tuple2(env,
  45. enif_make_atom(env,"throw"),
  46. js_to_term(res->ctx,vm->isolate,env,try_catch.Exception()))));
  47. } else {
  48. SEND(vm->server,enif_make_tuple3(env,
  49. enif_make_atom(env,"result"),
  50. enif_make_copy(env, script_ref),
  51. enif_make_tuple2(env, enif_make_atom(env,"ok"),
  52. js_to_term(res->ctx,vm->isolate,env,value))));
  53. }
  54. }
  55. }
  56. enif_free_env(ref_env);
  57. free(buf);
  58. TickHandlerResolution result;
  59. result.type = DONE;
  60. return result;
  61. }