Author: renodr
Date: Wed Sep 30 07:46:31 2020
New Revision: 4194

Log:
Add gjs upstream fixes patch

Added:
   trunk/gjs/
   trunk/gjs/gjs-1.66.0-upstream_fixes-1.patch

Added: trunk/gjs/gjs-1.66.0-upstream_fixes-1.patch
==============================================================================
--- /dev/null   00:00:00 1970   (empty, because file is newly added)
+++ trunk/gjs/gjs-1.66.0-upstream_fixes-1.patch Wed Sep 30 07:46:31 2020        
(r4194)
@@ -0,0 +1,235 @@
+Submitted By:            Douglas R. Reno <renodr at linuxfromscratch dot org>
+Date:                    2020-09-30
+Initial Package Version: 1.66.0
+Origin:                  Upstream
+Upstream Status:         Applied
+Description:             Fixes a regression caused by an incomplete fix for a 
bug
+                         that caused gnome-shell to crash.
+
+diff -Naurp gjs-1.66.0.orig/gi/arg-cache.cpp gjs-1.66.0/gi/arg-cache.cpp
+--- gjs-1.66.0.orig/gi/arg-cache.cpp   2020-09-12 14:34:36.543117000 -0500
++++ gjs-1.66.0/gi/arg-cache.cpp        2020-09-29 17:22:54.481798835 -0500
+@@ -1576,8 +1576,15 @@ bool gjs_arg_cache_build_arg(JSContext*
+     *inc_counter_out = true;
+ 
+     GITypeTag type_tag = g_type_info_get_tag(&self->type_info);
+-    if (direction == GI_DIRECTION_OUT && type_tag == GI_TYPE_TAG_INTERFACE &&
+-        g_arg_info_is_caller_allocates(arg)) {
++    if (direction == GI_DIRECTION_OUT && g_arg_info_is_caller_allocates(arg)) 
{
++        if (type_tag != GI_TYPE_TAG_INTERFACE) {
++            gjs_throw(cx,
++                      "Unsupported type %s for argument %s with (out "
++                      "caller-allocates)",
++                      g_type_tag_to_string(type_tag), self->arg_name);
++            return false;
++        }
++
+         GjsAutoBaseInfo interface_info =
+             g_type_info_get_interface(&self->type_info);
+         g_assert(interface_info);
+diff -Naurp gjs-1.66.0.orig/gi/arg-inl.h gjs-1.66.0/gi/arg-inl.h
+--- gjs-1.66.0.orig/gi/arg-inl.h       2020-09-12 14:34:36.543117000 -0500
++++ gjs-1.66.0/gi/arg-inl.h    2020-09-29 18:45:28.782623898 -0500
+@@ -167,13 +167,13 @@ inline void gjs_arg_unset(GIArgument* ar
+ 
+ template <typename BigT>
+ [[nodiscard]] inline constexpr BigT max_safe_big_number() {
+-    return BigT(1) << std::numeric_limits<double>::digits;
++    return (BigT(1) << std::numeric_limits<double>::digits) - 1;
+ }
+ 
+ template <typename BigT>
+ [[nodiscard]] inline constexpr BigT min_safe_big_number() {
+     if constexpr (std::is_signed_v<BigT>)
+-        return -(max_safe_big_number<BigT>()) + 1;
++        return -(max_safe_big_number<BigT>());
+ 
+     return std::numeric_limits<BigT>::lowest();
+ }
+diff -Naurp gjs-1.66.0.orig/gi/function.cpp gjs-1.66.0/gi/function.cpp
+--- gjs-1.66.0.orig/gi/function.cpp    2020-09-12 14:34:36.545117100 -0500
++++ gjs-1.66.0/gi/function.cpp 2020-09-29 18:54:09.767605502 -0500
+@@ -1060,14 +1060,22 @@ GJS_NATIVE_CONSTRUCTOR_DEFINE_ABSTRACT(f
+ static void
+ uninit_cached_function_data (Function *function)
+ {
+-    g_assert(function->info && "Don't know how to free cache without GI 
info");
+-
+     if (function->arguments) {
++        g_assert(function->info &&
++                 "Don't know how to free cache without GI info");
++
+         // Careful! function->arguments is offset by one or two elements 
inside
+         // the allocated space, so we have to free index -1 or -2.
+         int start_index = g_callable_info_is_method(function->info) ? -2 : -1;
+-        int gi_argc = g_callable_info_get_n_args(function->info);
+-        for (int ix = start_index; ix < gi_argc; ix++) {
++        int gi_argc = MIN(g_callable_info_get_n_args(function->info),
++                          function->js_in_argc + function->js_out_argc);
++        
++        for (int i = 0; i > gi_argc; i++) {
++            int ix = start_index + i;
++
++            if (!function->arguments[ix].marshallers)
++               break;
++
+             if (function->arguments[ix].marshallers->free)
+                 function->arguments[ix].marshallers->free(
+                     &function->arguments[ix]);
+@@ -1076,9 +1084,8 @@ uninit_cached_function_data (Function *f
+         g_free(&function->arguments[start_index]);
+         function->arguments = nullptr;
+     }
+-
+-    g_base_info_unref(function->info);
+-
++    
++    g_clear_pointer(&function->info, g_base_info_unref);
+     g_function_invoker_destroy(&function->invoker);
+ }
+ 
+@@ -1222,6 +1229,7 @@ init_cached_function_data (JSContext
+ 
+             gjs_throw(context, "Virtual function not implemented: %s",
+                       error->message);
++            g_clear_error(&error);
+             return false;
+         }
+ 
+@@ -1242,6 +1250,11 @@ init_cached_function_data (JSContext
+     GjsArgumentCache* arguments =
+         g_new0(GjsArgumentCache, n_args + offset) + offset;
+ 
++    function->arguments = arguments;
++    function->info = g_base_info_ref(info);
++    function->js_in_argc = 0;
++    function->js_out_argc = 0;
++
+     if (is_method &&
+         !gjs_arg_cache_build_instance(context, &arguments[-2], info))
+         return false;
+@@ -1251,8 +1264,7 @@ init_cached_function_data (JSContext
+                                     &inc_counter))
+         return false;
+ 
+-    int out_argc = inc_counter ? 1 : 0;
+-    int in_argc = 0;
++    function->js_out_argc = inc_counter ? 1 : 0;
+ 
+     for (i = 0; i < n_args; i++) {
+         GIDirection direction;
+@@ -1271,13 +1283,13 @@ init_cached_function_data (JSContext
+         if (inc_counter) {
+             switch (direction) {
+                 case GI_DIRECTION_INOUT:
+-                    out_argc++;
++                    function->js_out_argc++;
+                     [[fallthrough]];
+                 case GI_DIRECTION_IN:
+-                    in_argc++;
++                    function->js_in_argc++;
+                     break;
+                 case GI_DIRECTION_OUT:
+-                    out_argc++;
++                    function->js_out_argc++;
+                     break;
+                 default:
+                     g_assert_not_reached();
+@@ -1285,14 +1297,6 @@ init_cached_function_data (JSContext
+         }
+     }
+ 
+-    function->arguments = arguments;
+-
+-    function->js_in_argc = in_argc;
+-    function->js_out_argc = out_argc;
+-    function->info = info;
+-
+-    g_base_info_ref((GIBaseInfo*) function->info);
+-
+     return true;
+ }
+ 
+diff -Naurp gjs-1.66.0.orig/installed-tests/js/testGIMarshalling.js 
gjs-1.66.0/installed-tests/js/testGIMarshalling.js
+--- gjs-1.66.0.orig/installed-tests/js/testGIMarshalling.js    2020-09-12 
14:34:36.568117400 -0500
++++ gjs-1.66.0/installed-tests/js/testGIMarshalling.js 2020-09-29 
18:44:19.998626327 -0500
+@@ -525,6 +525,15 @@ describe('GArray', function () {
+             expect(GIMarshallingTests.garray_utf8_full_out_caller_allocated())
+                 .toEqual(['0', '1', '2']);
+         }).pend('https://gitlab.gnome.org/GNOME/gjs/issues/106');
++
++
++         // https://gitlab.gnome.org/GNOME/gjs/-/issues/344
++         // the test should be replaced with the one above when issue
++         // https://gitlab.gnome.org/GNOME/gjs/-/issues/106 is fixed.
++         if('marshals as a transfer-full caller-allocated out parameter 
throws errors', function () {
++            expect(() => 
GIMarshallingTests.garray_utf8_full_out_caller_allocated())
++               .toThrowError(/Unsupported type array.*\(out 
caller-allocates\)/);
++         });
+     });
+ 
+     it('marshals boxed structs as a transfer-full return value', function () {
+diff -Naurp gjs-1.66.0.orig/test/gjs-tests.cpp gjs-1.66.0/test/gjs-tests.cpp
+--- gjs-1.66.0.orig/test/gjs-tests.cpp 2020-09-12 14:34:36.577117400 -0500
++++ gjs-1.66.0/test/gjs-tests.cpp      2020-09-29 18:57:32.010598360 -0500
+@@ -23,6 +23,7 @@
+ 
+ #include <config.h>
+ 
++#include <stdint.h>
+ #include <string.h>  // for size_t, strlen
+ 
+ #include <string>  // for u16string, u32string
+@@ -39,7 +40,9 @@
+ #include <js/Value.h>
+ #include <js/ValueArray.h>
+ #include <jsapi.h>
++#include <jspubtd.h> // for JSProto_Number
+ 
++#include "gi/arg-inl.h"
+ #include "gjs/context.h"
+ #include "gjs/error-types.h"
+ #include "gjs/jsapi-util.h"
+@@ -398,6 +401,30 @@ gjstest_test_profiler_start_stop(void)
+         g_message("Temp profiler file not deleted");
+ }
+ 
++static void gjstest_test_safe_integer_max(GjsUnitTestFixture* fx, const 
void*) {
++   JS::RootedObject number_class_object(fx->cx);
++   JS::RootedValue safe_value(fx->cx);
++
++   g_assert_true(
++         JS_GetClassObject(fx->cx, JSProto_Number, &number_class_object));
++   g_assert_true(JS_GetProperty(fx->cx, number_class_object,
++                                "MAX_SAFE_INTEGER", &safe_value));
++
++   g_assert_cmpint(safe_value.toNumber(), ==, max_safe_big_number<int64_t>());
++}
++
++static void gjstest_test_safe_integer_min(GjsUnitTestFixture* fx, const 
void*) {
++   JS::RootedObject number_class_object(fx->cx);
++   JS::RootedValue safe_value(fx->cx);
++
++   g_assert_true(
++       JS_GetClassObject(fx->cx, JSProto_Number, &number_class_object));
++   g_assert_true(JS_GetProperty(fx->cx, number_class_object, 
++                                "MIN_SAFE_INTEGER", &safe_value));
++
++   g_assert_cmpint(safe_value.toNumber(), ==, min_safe_big_number<int64_t>());
++}
++
+ int
+ main(int    argc,
+      char **argv)
+@@ -444,6 +471,11 @@ main(int    argc,
+     ADD_JSAPI_UTIL_TEST("debug_string/object-with-complicated-to-string",
+                         
test_jsapi_util_debug_string_object_with_complicated_to_string);
+ 
++    ADD_JSAPI_UTIL_TEST("gi/args/safe-integer/max",
++                        gjstest_test_safe_integer_max);
++    ADD_JSAPI_UTIL_TEST("gi/args/safe-integer/min",
++                        gjstest_test_safe_integer_min);
++
+ #undef ADD_JSAPI_UTIL_TEST
+ 
+     gjs_test_add_tests_for_coverage ();
-- 
http://lists.linuxfromscratch.org/listinfo/patches
FAQ: http://www.linuxfromscratch.org/blfs/faq.html
Unsubscribe: See the above information page

Reply via email to