Title: [242542] releases/WebKitGTK/webkit-2.24
Revision
242542
Author
[email protected]
Date
2019-03-06 05:30:35 -0800 (Wed, 06 Mar 2019)

Log Message

Merge r242349 - [GLib] Returning G_TYPE_OBJECT from a constructor does not work
https://bugs.webkit.org/show_bug.cgi?id=195206

Reviewed by Žan Doberšek.

Source/_javascript_Core:

We are freeing the newly created object before returning from the constructor.

* API/glib/JSCCallbackFunction.cpp:
(JSC::JSCCallbackFunction::construct):

Tools:

Add a new test case.

* TestWebKitAPI/Tests/_javascript_Core/glib/TestJSC.cpp:
(testJSCClass):

Modified Paths

Diff

Modified: releases/WebKitGTK/webkit-2.24/Source/_javascript_Core/API/glib/JSCCallbackFunction.cpp (242541 => 242542)


--- releases/WebKitGTK/webkit-2.24/Source/_javascript_Core/API/glib/JSCCallbackFunction.cpp	2019-03-06 13:30:30 UTC (rev 242541)
+++ releases/WebKitGTK/webkit-2.24/Source/_javascript_Core/API/glib/JSCCallbackFunction.cpp	2019-03-06 13:30:35 UTC (rev 242542)
@@ -205,11 +205,8 @@
     switch (g_type_fundamental(G_VALUE_TYPE(&returnValue))) {
     case G_TYPE_POINTER:
     case G_TYPE_OBJECT:
-        if (auto* ptr = returnValue.data[0].v_pointer) {
-            auto* retval = jscClassGetOrCreateJSWrapper(m_class.get(), ptr);
-            g_value_unset(&returnValue);
-            return toRef(retval);
-        }
+        if (auto* ptr = returnValue.data[0].v_pointer)
+            return toRef(jscClassGetOrCreateJSWrapper(m_class.get(), ptr));
         *exception = toRef(JSC::createTypeError(toJS(jsContext), "constructor returned null"_s));
         break;
     default:
@@ -216,6 +213,7 @@
         *exception = toRef(JSC::createTypeError(toJS(jsContext), makeString("invalid type ", g_type_name(G_VALUE_TYPE(&returnValue)), " returned by constructor")));
         break;
     }
+    g_value_unset(&returnValue);
     return nullptr;
 }
 

Modified: releases/WebKitGTK/webkit-2.24/Source/_javascript_Core/ChangeLog (242541 => 242542)


--- releases/WebKitGTK/webkit-2.24/Source/_javascript_Core/ChangeLog	2019-03-06 13:30:30 UTC (rev 242541)
+++ releases/WebKitGTK/webkit-2.24/Source/_javascript_Core/ChangeLog	2019-03-06 13:30:35 UTC (rev 242542)
@@ -1,3 +1,15 @@
+2019-03-04  Carlos Garcia Campos  <[email protected]>
+
+        [GLib] Returning G_TYPE_OBJECT from a constructor does not work
+        https://bugs.webkit.org/show_bug.cgi?id=195206
+
+        Reviewed by Žan Doberšek.
+
+        We are freeing the newly created object before returning from the constructor.
+
+        * API/glib/JSCCallbackFunction.cpp:
+        (JSC::JSCCallbackFunction::construct):
+
 2019-03-02  Darin Adler  <[email protected]>
 
         Retire legacy dtoa function and DecimalNumber class

Modified: releases/WebKitGTK/webkit-2.24/Tools/ChangeLog (242541 => 242542)


--- releases/WebKitGTK/webkit-2.24/Tools/ChangeLog	2019-03-06 13:30:30 UTC (rev 242541)
+++ releases/WebKitGTK/webkit-2.24/Tools/ChangeLog	2019-03-06 13:30:35 UTC (rev 242542)
@@ -1,3 +1,15 @@
+2019-03-04  Carlos Garcia Campos  <[email protected]>
+
+        [GLib] Returning G_TYPE_OBJECT from a constructor does not work
+        https://bugs.webkit.org/show_bug.cgi?id=195206
+
+        Reviewed by Žan Doberšek.
+
+        Add a new test case.
+
+        * TestWebKitAPI/Tests/_javascript_Core/glib/TestJSC.cpp:
+        (testJSCClass):
+
 2019-03-01  Darin Adler  <[email protected]>
 
         Finish removing String::format

Modified: releases/WebKitGTK/webkit-2.24/Tools/TestWebKitAPI/Tests/_javascript_Core/glib/TestJSC.cpp (242541 => 242542)


--- releases/WebKitGTK/webkit-2.24/Tools/TestWebKitAPI/Tests/_javascript_Core/glib/TestJSC.cpp	2019-03-06 13:30:30 UTC (rev 242541)
+++ releases/WebKitGTK/webkit-2.24/Tools/TestWebKitAPI/Tests/_javascript_Core/glib/TestJSC.cpp	2019-03-06 13:30:35 UTC (rev 242542)
@@ -1589,6 +1589,14 @@
     nullptr, nullptr, nullptr, nullptr
 };
 
+static GFile* createGFile(const char* path)
+{
+    GFile* file = g_file_new_for_path(path);
+    auto* checker = static_cast<LeakChecker*>(g_object_get_data(G_OBJECT(jsc_context_get_current()), "leak-checker"));
+    checker->watch(file);
+    return file;
+}
+
 static void testJSCClass()
 {
     {
@@ -2248,6 +2256,47 @@
         g_assert_did_throw(exceptionHandler, didThrow);
         g_assert_true(jsc_context_get_exception(context.get()) == previousException.get());
     }
+
+    {
+        LeakChecker checker;
+        GRefPtr<JSCContext> context = adoptGRef(jsc_context_new());
+        checker.watch(context.get());
+        g_object_set_data(G_OBJECT(context.get()), "leak-checker", &checker);
+        ExceptionHandler exceptionHandler(context.get());
+
+        JSCClass* jscClass = jsc_context_register_class(context.get(), "GFile", nullptr, nullptr, reinterpret_cast<GDestroyNotify>(g_object_unref));
+        checker.watch(jscClass);
+
+        GRefPtr<JSCValue> constructor = adoptGRef(jsc_class_add_constructor(jscClass, nullptr, G_CALLBACK(createGFile), nullptr, nullptr, G_TYPE_OBJECT, 1, G_TYPE_STRING));
+        checker.watch(constructor.get());
+        g_assert_true(jsc_value_is_constructor(constructor.get()));
+        jsc_class_add_method(jscClass, "getPath", G_CALLBACK(g_file_get_path), nullptr, nullptr, G_TYPE_STRING, 0, G_TYPE_NONE);
+
+        jsc_context_set_value(context.get(), jsc_class_get_name(jscClass), constructor.get());
+
+        GRefPtr<JSCValue> file = adoptGRef(jsc_context_evaluate(context.get(), "f = new GFile('.');", -1));
+        checker.watch(file.get());
+        g_assert_true(jsc_value_is_object(file.get()));
+        g_assert_true(jsc_value_object_is_instance_of(file.get(), jsc_class_get_name(jscClass)));
+        GRefPtr<JSCValue> result = adoptGRef(jsc_context_evaluate(context.get(), "f instanceof GFile;", -1));
+        checker.watch(result.get());
+        g_assert_true(jsc_value_is_boolean(result.get()));
+        g_assert_true(jsc_value_to_boolean(result.get()));
+
+        g_assert_true(jsc_value_object_has_property(file.get(), "getPath"));
+        GRefPtr<JSCValue> value = adoptGRef(jsc_value_object_invoke_method(file.get(), "getPath", G_TYPE_NONE));
+        checker.watch(value.get());
+        g_assert_true(jsc_value_is_string(value.get()));
+        GUniquePtr<char> resultString(jsc_value_to_string(value.get()));
+        GUniquePtr<char> currentDirectory(g_get_current_dir());
+        g_assert_cmpstr(resultString.get(), ==, currentDirectory.get());
+
+        GRefPtr<JSCValue> value2 = adoptGRef(jsc_context_evaluate(context.get(), "f.getPath('.');", -1));
+        checker.watch(value2.get());
+        g_assert_true(jsc_value_is_string(value2.get()));
+        resultString.reset(jsc_value_to_string(value2.get()));
+        g_assert_cmpstr(resultString.get(), ==, currentDirectory.get());
+    }
 }
 
 typedef struct {
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to