felipealmeida pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=26f62542250d026269522787a61f807e5e4a1d8a

commit 26f62542250d026269522787a61f807e5e4a1d8a
Author: Lauro Moura <lauromo...@expertisesolutions.com.br>
Date:   Wed Dec 7 18:00:36 2016 -0300

    js: Raise exception to js instead of crashing
---
 src/bindings/js/eina_js/eina_js_compatibility.hh   |  2 +-
 .../js/eina_js/eina_js_get_value_from_c.hh         | 63 ++++++++++++++++------
 2 files changed, 48 insertions(+), 17 deletions(-)

diff --git a/src/bindings/js/eina_js/eina_js_compatibility.hh 
b/src/bindings/js/eina_js/eina_js_compatibility.hh
index 37a9457..a568995 100644
--- a/src/bindings/js/eina_js/eina_js_compatibility.hh
+++ b/src/bindings/js/eina_js/eina_js_compatibility.hh
@@ -890,7 +890,7 @@ inline v8::Handle<v8::Function> 
get_class_constructor(std::string const& class_n
 {
   auto it = constructors_map_.find(class_name);
   if (it == constructors_map_.end())
-    throw std::runtime_error("Class not found");
+    throw std::runtime_error("Class not found: " + class_name);
   return it->second;
 }
 
diff --git a/src/bindings/js/eina_js/eina_js_get_value_from_c.hh 
b/src/bindings/js/eina_js/eina_js_get_value_from_c.hh
index 7e6499b..581c69c 100644
--- a/src/bindings/js/eina_js/eina_js_get_value_from_c.hh
+++ b/src/bindings/js/eina_js/eina_js_get_value_from_c.hh
@@ -142,34 +142,65 @@ get_value_from_c(T object, v8::Isolate* isolate, const 
char* class_name
 inline v8::Local<v8::Value>
 get_value_from_c(Eo* v, v8::Isolate* isolate, const char* class_name)
 {
-  auto ctor = ::efl::eina::js::get_class_constructor(class_name);
-  auto obj = new_v8_external_instance(ctor, ::efl_ref(v), isolate);
-  efl::eina::js::make_weak(isolate, obj, [v]{ ::efl_unref(v); });
-  return obj;
+  try
+    {
+       auto ctor = ::efl::eina::js::get_class_constructor(class_name);
+       auto obj = new_v8_external_instance(ctor, ::efl_ref(v), isolate);
+       efl::eina::js::make_weak(isolate, obj, [v]{ ::efl_unref(v); });
+       return obj;
+    }
+  catch (std::runtime_error const& error)
+    {
+       eina::js::compatibility_throw
+            (isolate, v8::Exception::TypeError
+             (eina::js::compatibility_new<v8::String>(isolate, error.what())));
+      return v8::Null(isolate);
+    }
 }
 
 inline v8::Local<v8::Value>
 get_value_from_c(const Eo* v, v8::Isolate* isolate, const char* class_name)
 {
   // TODO: implement const objects?
-  auto ctor = ::efl::eina::js::get_class_constructor(class_name);
-  auto obj = new_v8_external_instance(ctor, ::efl_ref(v), isolate);
-  efl::eina::js::make_weak(isolate, obj, [v]{ ::efl_unref(v); });
-  return obj;
+  try
+    {
+       auto ctor = ::efl::eina::js::get_class_constructor(class_name);
+       auto obj = new_v8_external_instance(ctor, ::efl_ref(v), isolate);
+       efl::eina::js::make_weak(isolate, obj, [v]{ ::efl_unref(v); });
+       return obj;
+    }
+  catch (std::runtime_error const& error)
+    {
+       eina::js::compatibility_throw
+            (isolate, v8::Exception::TypeError
+             (eina::js::compatibility_new<v8::String>(isolate, error.what())));
+      return v8::Null(isolate);
+    }
 }
 
 template <typename T>
 inline v8::Local<v8::Value>
 get_value_from_c(struct_ptr_tag<T*> v, v8::Isolate* isolate, const char* 
class_name)
 {
-  using nonconst_type = typename std::remove_const<T>::type;
-  bool own = false; // TODO: handle ownership
-  auto ptr = const_cast<nonconst_type*>(v.value);
-  auto ctor = ::efl::eina::js::get_class_constructor(class_name);
-  auto obj = new_v8_external_instance(ctor, ptr, isolate);
-  if (own)
-    efl::eina::js::make_weak(isolate, obj, [ptr]{ free(ptr); });
-  return obj;
+  try
+    {
+       using nonconst_type = typename std::remove_const<T>::type;
+       bool own = false; // TODO: handle ownership
+       auto ptr = const_cast<nonconst_type*>(v.value);
+       auto ctor = ::efl::eina::js::get_class_constructor(class_name);
+       auto obj = new_v8_external_instance(ctor, ptr, isolate);
+       if (own)
+          efl::eina::js::make_weak(isolate, obj, [ptr]{ free(ptr); });
+       return obj;
+    }
+  catch (std::runtime_error const& error)
+    {
+       eina::js::compatibility_throw
+            (isolate, v8::Exception::TypeError
+             (eina::js::compatibility_new<v8::String>(isolate, error.what())));
+      return v8::Null(isolate);
+    }
+
 }
 
 template <typename T>

-- 


Reply via email to