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 {