⚠ Archived content — this site is no longer maintained.   Current WebKit documentation is at docs.webkit.org.

Changeset 242349 in webkit


Ignore:
Timestamp:
Mar 4, 2019, 2:34:04 AM (7 years ago)
Author:
Carlos Garcia Campos
Message:

[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/JavaScriptCore:

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/JavaScriptCore/glib/TestJSC.cpp:

(testJSCClass):

Location:
trunk
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/API/glib/JSCCallbackFunction.cpp

    r239427 r242349  
    206206    case G_TYPE_POINTER:
    207207    case G_TYPE_OBJECT:
    208         if (auto* ptr = returnValue.data[0].v_pointer) {
    209             auto* retval = jscClassGetOrCreateJSWrapper(m_class.get(), ptr);
    210             g_value_unset(&returnValue);
    211             return toRef(retval);
    212         }
     208        if (auto* ptr = returnValue.data[0].v_pointer)
     209            return toRef(jscClassGetOrCreateJSWrapper(m_class.get(), ptr));
    213210        *exception = toRef(JSC::createTypeError(toJS(jsContext), "constructor returned null"_s));
    214211        break;
     
    217214        break;
    218215    }
     216    g_value_unset(&returnValue);
    219217    return nullptr;
    220218}
  • trunk/Source/JavaScriptCore/ChangeLog

    r242330 r242349  
     12019-03-04  Carlos Garcia Campos  <cgarcia@igalia.com>
     2
     3        [GLib] Returning G_TYPE_OBJECT from a constructor does not work
     4        https://bugs.webkit.org/show_bug.cgi?id=195206
     5
     6        Reviewed by Žan Doberšek.
     7
     8        We are freeing the newly created object before returning from the constructor.
     9
     10        * API/glib/JSCCallbackFunction.cpp:
     11        (JSC::JSCCallbackFunction::construct):
     12
    1132019-03-02  Darin Adler  <darin@apple.com>
    214
  • trunk/Tools/ChangeLog

    r242344 r242349  
     12019-03-04  Carlos Garcia Campos  <cgarcia@igalia.com>
     2
     3        [GLib] Returning G_TYPE_OBJECT from a constructor does not work
     4        https://bugs.webkit.org/show_bug.cgi?id=195206
     5
     6        Reviewed by Žan Doberšek.
     7
     8        Add a new test case.
     9
     10        * TestWebKitAPI/Tests/JavaScriptCore/glib/TestJSC.cpp:
     11        (testJSCClass):
     12
    1132019-03-04  Charlie Turner  <cturner@igalia.com>
    214
  • trunk/Tools/TestWebKitAPI/Tests/JavaScriptCore/glib/TestJSC.cpp

    r240431 r242349  
    15901590};
    15911591
     1592static GFile* createGFile(const char* path)
     1593{
     1594    GFile* file = g_file_new_for_path(path);
     1595    auto* checker = static_cast<LeakChecker*>(g_object_get_data(G_OBJECT(jsc_context_get_current()), "leak-checker"));
     1596    checker->watch(file);
     1597    return file;
     1598}
     1599
    15921600static void testJSCClass()
    15931601{
     
    22482256        g_assert_did_throw(exceptionHandler, didThrow);
    22492257        g_assert_true(jsc_context_get_exception(context.get()) == previousException.get());
     2258    }
     2259
     2260    {
     2261        LeakChecker checker;
     2262        GRefPtr<JSCContext> context = adoptGRef(jsc_context_new());
     2263        checker.watch(context.get());
     2264        g_object_set_data(G_OBJECT(context.get()), "leak-checker", &checker);
     2265        ExceptionHandler exceptionHandler(context.get());
     2266
     2267        JSCClass* jscClass = jsc_context_register_class(context.get(), "GFile", nullptr, nullptr, reinterpret_cast<GDestroyNotify>(g_object_unref));
     2268        checker.watch(jscClass);
     2269
     2270        GRefPtr<JSCValue> constructor = adoptGRef(jsc_class_add_constructor(jscClass, nullptr, G_CALLBACK(createGFile), nullptr, nullptr, G_TYPE_OBJECT, 1, G_TYPE_STRING));
     2271        checker.watch(constructor.get());
     2272        g_assert_true(jsc_value_is_constructor(constructor.get()));
     2273        jsc_class_add_method(jscClass, "getPath", G_CALLBACK(g_file_get_path), nullptr, nullptr, G_TYPE_STRING, 0, G_TYPE_NONE);
     2274
     2275        jsc_context_set_value(context.get(), jsc_class_get_name(jscClass), constructor.get());
     2276
     2277        GRefPtr<JSCValue> file = adoptGRef(jsc_context_evaluate(context.get(), "f = new GFile('.');", -1));
     2278        checker.watch(file.get());
     2279        g_assert_true(jsc_value_is_object(file.get()));
     2280        g_assert_true(jsc_value_object_is_instance_of(file.get(), jsc_class_get_name(jscClass)));
     2281        GRefPtr<JSCValue> result = adoptGRef(jsc_context_evaluate(context.get(), "f instanceof GFile;", -1));
     2282        checker.watch(result.get());
     2283        g_assert_true(jsc_value_is_boolean(result.get()));
     2284        g_assert_true(jsc_value_to_boolean(result.get()));
     2285
     2286        g_assert_true(jsc_value_object_has_property(file.get(), "getPath"));
     2287        GRefPtr<JSCValue> value = adoptGRef(jsc_value_object_invoke_method(file.get(), "getPath", G_TYPE_NONE));
     2288        checker.watch(value.get());
     2289        g_assert_true(jsc_value_is_string(value.get()));
     2290        GUniquePtr<char> resultString(jsc_value_to_string(value.get()));
     2291        GUniquePtr<char> currentDirectory(g_get_current_dir());
     2292        g_assert_cmpstr(resultString.get(), ==, currentDirectory.get());
     2293
     2294        GRefPtr<JSCValue> value2 = adoptGRef(jsc_context_evaluate(context.get(), "f.getPath('.');", -1));
     2295        checker.watch(value2.get());
     2296        g_assert_true(jsc_value_is_string(value2.get()));
     2297        resultString.reset(jsc_value_to_string(value2.get()));
     2298        g_assert_cmpstr(resultString.get(), ==, currentDirectory.get());
    22502299    }
    22512300}
Note: See TracChangeset for help on using the changeset viewer.