Skip to content
Commits on Source (8)
# SPDX-License-Identifier: MIT OR LGPL-2.0-or-later
# SPDX-FileCopyrightText: 2017 Claudio André <claudioandre.br@gmail.com>
---
include:
- remote: 'https://gitlab.freedesktop.org/freedesktop/ci-templates/-/raw/7ea696055e322cc7aa4bcbe5422b56a198c4bdff/templates/alpine.yml'
stages:
- prepare
- source_check
- test
- thorough_tests
- manual
- deploy
.gjs-alpine:
variables:
FDO_DISTRIBUTION_TAG: '2021-08-18.0'
FDO_UPSTREAM_REPO: GNOME/gjs
build-alpine-image:
extends:
- .fdo.container-build@alpine@x86_64
- .gjs-alpine
stage: prepare
variables:
FDO_DISTRIBUTION_PACKAGES: cppcheck git python3 yarn bash grep
FDO_DISTRIBUTION_EXEC: |
python3 -m ensurepip &&
rm -r /usr/lib/python*/ensurepip &&
pip3 install --no-cache --upgrade cpplint reuse codespell &&
mkdir -p /cwd
.coverage: &coverage
image: registry.gitlab.gnome.org/gnome/gjs:fedora.mozjs78-debug
variables:
TASK_ID: "coverage"
coverage: '/^ lines.*(\d+\.\d+\%)/'
script:
- export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig
- export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
- 'export DISPLAY="${DISPLAY:-:0}"'
# This script runs the build inside its own build tree and generates the
# coverage report
- xvfb-run -a tools/run_coverage.sh
artifacts:
name: log_coverage
when: always
paths:
- _coverage/html
- _coverage_build/meson-logs/*log*.txt
.build: &build
when: on_success
artifacts:
name: log
when: always
paths:
- _build/compile_commands.json
- _build/meson-logs/*log*.txt
- scripts.log
script:
- test/test-ci.sh SETUP
- test/test-ci.sh BUILD
#############################################
# Regular tests #
#############################################
# Test despite any changes in the Docker image
# SpiderMonkey has been configured with --enable-debug
build_recommended:
<<: *build
stage: source_check
image: registry.gitlab.gnome.org/gnome/gjs:job-1005801_fedora.mozjs78-debug # pinned on purpose
variables:
TASK_ID: "fedora-x86_64-gcc-debug-default-check"
TEST_OPTS: --verbose --no-stdsplit --print-errorlogs
except:
- schedules
sanitizer_gcc:
<<: *build
stage: test
tags:
- asan # LSAN needs CAP_SYS_PTRACE
image: registry.gitlab.gnome.org/gnome/gjs:fedora.mozjs78-debug
variables:
TASK_ID: "fedora-x86_64-gcc-default-ubsan_asan-check"
CONFIG_OPTS: -Db_sanitize=address,undefined
TEST_OPTS: --timeout-multiplier=3
except:
- schedules
sanitizer_thread_gcc:
<<: *build
stage: test
tags:
- asan # TSAN needs CAP_SYS_PTRACE
image: registry.gitlab.gnome.org/gnome/gjs:fedora.mozjs78-debug
variables:
TASK_ID: "fedora-x86_64-gcc-default-tsan-check"
CONFIG_OPTS: -Db_sanitize=thread
TEST_OPTS: --timeout-multiplier=3 --suite=thread-safe
except:
- schedules
# There are a lot of debug log statements that are ifdef'd out in normal usage.
# These sometimes get invalid expressions in them, leading to annoyance the
# next time you try to use debug logging.
build_maximal:
<<: *build
stage: test
image: registry.gitlab.gnome.org/gnome/gjs:fedora.mozjs78-debug
variables:
TASK_ID: "fedora-x86_64-clang-default-maximal-check"
CC: clang
CXX: clang++
CONFIG_OPTS: -Ddtrace=true -Dsystemtap=true -Dverbose_logs=true
ENABLE_GTK: "yes"
except:
- schedules
script:
- test/test-ci.sh SETUP
- test/test-ci.sh BUILD
- test/test-ci.sh SH_CHECKS
build_minimal:
<<: *build
stage: test
image: registry.gitlab.gnome.org/gnome/gjs:fedora.mozjs78
variables:
TASK_ID: "ubuntu-x86_64-gcc-default-minimal-check"
CONFIG_OPTS: >-
-Dbuildtype=release
-Dcairo=disabled -Dreadline=disabled -Dprofiler=disabled
except:
- schedules
build_unity:
<<: *build
stage: test
image: registry.gitlab.gnome.org/gnome/gjs:fedora.mozjs78
variables:
TASK_ID: "fedora-x86_64-gcc-default-unity-check"
# unity-size here is forced to use an high number to check whether we can
# join all the sources together, but should not be used in real world to
# not to break multi-jobs compilation
CONFIG_OPTS: >-
-Dprofiler=disabled
--unity on --unity-size=10000
except:
- schedules
# Generates
# The Code Coverage Report
coverage-automatic:
<<: *coverage
when: on_success
stage: source_check
except:
- schedules
only:
refs:
- master@GNOME/gjs
# Publishes
# The code coverage report
pages:
stage: deploy
dependencies:
- coverage-automatic
script:
- mv $(pwd)/_coverage/html/ public/ || true
artifacts:
paths:
- public
only:
refs:
- master@GNOME/gjs
except:
variables:
- $CRON_TASK == "BUILD_CI_IMAGES"
#############################################
# Static Analyzers #
#############################################
cppcheck:
when: on_success
extends:
- .fdo.distribution-image@alpine
- .gjs-alpine
stage: source_check
script:
- cppcheck --version
- cppcheck . -v -f -q -UHAVE_PRINTF_ALTERNATIVE_INT --error-exitcode=1 --inline-suppr --library=gtk,tools/cppcheck.cfg --enable=warning,performance,portability
except:
refs:
- schedules
- tags
variables:
- $CI_COMMIT_MESSAGE =~ /\[skip cppcheck\]/
cpplint:
when: on_success
stage: source_check
extends:
- .fdo.distribution-image@alpine
- .gjs-alpine
variables:
TASK_ID: "cpplint"
script:
- cpplint --version
- test/test-ci.sh CPPLINT
except:
refs:
- schedules
- tags
variables:
- $CI_COMMIT_MESSAGE =~ /\[skip cpplint\]/
eslint:
when: on_success
extends:
- .fdo.distribution-image@alpine
- .gjs-alpine
stage: source_check
script:
- ./tools/run_eslint.sh --version
- ./tools/run_eslint.sh
except:
refs:
- schedules
- tags
variables:
- $CI_COMMIT_MESSAGE =~ /\[skip eslint\]/
pch_check:
when: on_success
stage: source_check
extends:
- .fdo.distribution-image@alpine
- .gjs-alpine
script:
- env SELFTEST=1 test/check-pch.sh
- test/check-pch.sh
except:
refs:
- schedules
- tags
variables:
- $CI_COMMIT_MESSAGE =~ /\[skip pch_check\]/
iwyu:
when: on_success
stage: source_check
image: registry.gitlab.gnome.org/gnome/gjs:fedora.mozjs78-debug
script:
- test/test-ci.sh UPSTREAM_BASE
- meson setup _build -Db_pch=false
- include-what-you-use --version
- ./tools/run_iwyu.sh ci-upstream-base
only:
refs:
- branches
except:
- schedules
- /^gnome-\d+-\d+$/
codespell:
when: on_success
extends:
- .fdo.distribution-image@alpine
- .gjs-alpine
stage: source_check
script:
- codespell --version
- codespell -S "*.png,*.po,*.jpg,*.wrap,.git,LICENSES" -f --builtin "code,usage,clear" --skip="./installed-tests/js/jasmine.js,./README.md,./build/flatpak/*.json" --ignore-words-list="afterall,befores,files',filetest,gir,inout,stdio,uint,upto,xdescribe"
except:
- schedules
license-check:
when: on_success
stage: source_check
extends:
- .fdo.distribution-image@alpine
- .gjs-alpine
script:
- reuse --version
- reuse lint
except:
- schedules
#############################################
# Manual Jobs #
#############################################
# Planned as daily
coverage:
<<: *coverage
stage: manual
when: manual
except:
- schedules
iwyu-full:
when: manual
stage: manual
image: registry.gitlab.gnome.org/gnome/gjs:fedora.mozjs78-debug
script:
- meson setup _build
- ./tools/run_iwyu.sh
except:
- schedules
sanitizer_clang:
<<: *build
stage: manual
tags:
- asan # LSAN needs CAP_SYS_PTRACE
image: registry.gitlab.gnome.org/gnome/gjs:fedora.mozjs78-debug
variables:
TASK_ID: "fedora-x86_64-clang_ubsan_asan-default-default-check"
CC: clang
CXX: clang++
CONFIG_OPTS: -Db_sanitize=address,undefined -Db_lundef=false
TEST_OPTS: --timeout-multiplier=3
when: manual
except:
- schedules
installed_tests:
<<: *build
stage: manual
image: registry.gitlab.gnome.org/gnome/gjs:fedora.mozjs78-debug
variables:
TASK_ID: "fedora-x86_64-gcc-default-default-installed_tests"
CONFIG_OPTS: -Dinstalled_tests=true -Dprefix=/usr
TEST: skip
when: manual
except:
- schedules
script:
- test/test-ci.sh SETUP
- test/test-ci.sh BUILD
- sudo ninja -C _build install
- xvfb-run -a dbus-run-session -- gnome-desktop-testing-runner gjs
valgrind:
<<: *build
stage: manual
image: registry.gitlab.gnome.org/gnome/gjs:fedora.mozjs78-debug
variables:
TASK_ID: "fedora-x86_64-gcc-default-default-valgrind_check"
TEST_OPTS: --setup=valgrind
allow_failure: true
when: manual
except:
- schedules
# SpiderMonkey GC Tests (weekly)
zeal_2:
<<: *build
stage: manual
image: registry.gitlab.gnome.org/gnome/gjs:fedora.mozjs78-debug
variables:
TASK_ID: "fedora-x86_64-gcc-debug-default-check_zeal2"
TEST_OPTS: --setup=extra_gc
when: manual
except:
- schedules
zeal_4:
<<: *build
stage: manual
image: registry.gitlab.gnome.org/gnome/gjs:fedora.mozjs78-debug
variables:
TASK_ID: "fedora-x86_64-gcc-debug-default-check_zeal4"
TEST_OPTS: --setup=pre_verify
when: manual
except:
- schedules
zeal_11:
<<: *build
stage: manual
image: registry.gitlab.gnome.org/gnome/gjs:fedora.mozjs78-debug
variables:
TASK_ID: "fedora-x86_64-gcc-debug-default-check_zeal11"
TEST_OPTS: --setup=post_verify
when: manual
except:
- schedules
#############################################
# Create CI Docker Images #
#############################################
.Docker image template: &create_docker_image
image: registry.freedesktop.org/freedesktop/ci-templates/x86_64/buildah:2020-10-30.1
stage: deploy
only:
variables:
- $CRON_TASK == "BUILD_CI_IMAGES"
script:
# Newer versions of podman/buildah try to set overlayfs mount options when
# using the vfs driver, and this causes errors.
- sed -i '/^mountopt =.*/d' /etc/containers/storage.conf
# Where the real magic happens
- buildah bud -f $DOCKERFILE -t "$CI_REGISTRY_IMAGE:$CI_JOB_NAME" $ARGS
# Prepare to publish
- buildah tag "$CI_REGISTRY_IMAGE:$CI_JOB_NAME" "$CI_REGISTRY_IMAGE:job-${CI_JOB_ID}_$CI_JOB_NAME"
- buildah images
- buildah login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
# Publish (if running on a schedule)
- |
if [[ "$CI_PIPELINE_SOURCE" == "schedule" ]]; then
buildah push "$CI_REGISTRY_IMAGE:$CI_JOB_NAME"
buildah push "$CI_REGISTRY_IMAGE:job-${CI_JOB_ID}_$CI_JOB_NAME"
fi
.Docker variables: &docker_variables
STORAGE_DRIVER: vfs
BUILDAH_FORMAT: docker
BUILDAH_ISOLATION: chroot
fedora.mozjs78:
<<: *create_docker_image
variables:
<<: *docker_variables
DOCKERFILE: test/extra/Dockerfile
fedora.mozjs78-debug:
<<: *create_docker_image
variables:
<<: *docker_variables
DOCKERFILE: test/extra/Dockerfile.debug
# System information #
What is your operating system and version? _(e.g. "Linux, Fedora 29" or "macOS 10.13")_
What is your version of GJS? _(e.g. "1.54.1-fc29.1" or "commit 4ab70ef")_
If the bug is related to GNOME Shell, what is your version of GNOME Shell? _(e.g. "3.30.1-2ubuntu1" or "commit b405ed64")_
# Bug information #
## Steps to reproduce ##
- Step by step, how can you make the problem appear?
- List those steps here.
- If the problem doesn't happen every time, note that as well.
Even better, if the problem can be observed by executing a standalone JS
file, paste that here instead of the steps.
Use code blocks (```js) to format it.
## Current behaviour ##
What happened that made it evident there was a problem?
Copy and paste the exact text of any error messages.
Use code blocks (```) to format them.
If the problem was with GNOME Shell, you may be able to find error
messages in the system journal (`sudo journalctl -xb`).
If GJS or GNOME Shell crashed, please include a stack trace.
For information on how to get a stack trace,
[read this wiki page](https://wiki.gnome.org/Community/GettingInTouch/Bugzilla/GettingTraces/Details).
## Expected behaviour ##
What did you expect to see instead?
/label ~"1. Bug"
# Description #
Explain why this feature should be added.
Specific use cases are best.
# Prior Art #
List any comparable features in other JavaScript environments that you
are aware of.
/label ~"1. Feature"
Version 1.70.1
--------------
- Build and crash fixes backported from the development branch.
- Closed bugs and merge requests:
* Handle optional out parameters in callbacks [#439, !681, Evan Welsh]
* Link fails on Debian armel|mipsel|powerpc: needs more -latomic [#442, !686,
Simon McVittie]
* gjs/jsapi-util.cpp: fix build on gcc-12 [!697, Sergei Trofimovich]
Version 1.70.0
--------------
......
......@@ -1706,7 +1706,7 @@ bool gjs_value_to_g_argument(JSContext* context, JS::HandleValue value,
case GI_TYPE_TAG_ARRAY: {
GjsAutoPointer<void> data;
gsize length;
size_t length;
GIArrayType array_type = g_type_info_get_array_type(type_info);
/* First, let's handle the case where we're passed an instance
......@@ -1861,17 +1861,31 @@ void gjs_gi_argument_init_default(GITypeInfo* type_info, GIArgument* arg) {
}
}
bool
gjs_value_to_arg(JSContext *context,
JS::HandleValue value,
GIArgInfo *arg_info,
GIArgument *arg)
{
bool gjs_value_to_callback_out_arg(JSContext* context, JS::HandleValue value,
GIArgInfo* arg_info, GIArgument* arg) {
GIDirection direction [[maybe_unused]] = g_arg_info_get_direction(arg_info);
g_assert(
(direction == GI_DIRECTION_OUT || direction == GI_DIRECTION_INOUT) &&
"gjs_value_to_callback_out_arg does not handle in arguments.");
GjsArgumentFlags flags = GjsArgumentFlags::NONE;
GITypeInfo type_info;
g_arg_info_load_type(arg_info, &type_info);
// If the argument is optional and we're passed nullptr,
// ignore the GJS value.
if (g_arg_info_is_optional(arg_info) && !arg)
return true;
// Otherwise, throw an error to prevent a segfault.
if (!arg) {
gjs_throw(context,
"Return value %s is not optional but was passed NULL",
g_base_info_get_name(arg_info));
return false;
}
if (g_arg_info_may_be_null(arg_info))
flags |= GjsArgumentFlags::MAY_BE_NULL;
if (g_arg_info_is_caller_allocates(arg_info))
......
......@@ -44,10 +44,8 @@ enum class GjsArgumentFlags : uint8_t {
GjsArgumentType arg_type);
GJS_JSAPI_RETURN_CONVENTION
bool gjs_value_to_arg(JSContext *context,
JS::HandleValue value,
GIArgInfo *arg_info,
GIArgument *arg);
bool gjs_value_to_callback_out_arg(JSContext* context, JS::HandleValue value,
GIArgInfo* arg_info, GIArgument* arg);
GJS_JSAPI_RETURN_CONVENTION
bool gjs_array_to_explicit_array(JSContext* cx, JS::HandleValue value,
......
......@@ -532,9 +532,10 @@ bool GjsCallbackTrampoline::callback_closure_inner(
if (g_arg_info_get_direction(&arg_info) == GI_DIRECTION_IN)
continue;
if (!gjs_value_to_arg(context, rval, &arg_info,
get_argument_for_arg_info(&arg_info, args,
i + c_args_offset)))
if (!gjs_value_to_callback_out_arg(
context, rval, &arg_info,
get_argument_for_arg_info(&arg_info, args,
i + c_args_offset)))
return false;
break;
......@@ -587,9 +588,10 @@ bool GjsCallbackTrampoline::callback_closure_inner(
if (!JS_GetElement(context, out_array, elem_idx, &elem))
return false;
if (!gjs_value_to_arg(context, elem, &arg_info,
get_argument_for_arg_info(&arg_info, args,
i + c_args_offset)))
if (!gjs_value_to_callback_out_arg(
context, elem, &arg_info,
get_argument_for_arg_info(&arg_info, args,
i + c_args_offset)))
return false;
elem_idx++;
......
......@@ -270,7 +270,7 @@ JSObject* gjs_define_string_array(JSContext* context,
const char *remainder, *invalid;
int remaining_bytes, valid_bytes;
g_return_val_if_fail (name != NULL, NULL);
g_return_val_if_fail (name != NULL, "");
remainder = name;
remaining_bytes = strlen (name);
......
......@@ -234,7 +234,8 @@ gdbus_test_description = configure_file(
install_dir: installed_tests_metadir)
if get_option('installed_tests')
install_data('testGDBus.js', install_dir: installed_js_tests_dir)
install_data('matchers.js', 'testGDBus.js',
install_dir: installed_js_tests_dir)
endif
# tests using ES modules are also separate because they need an extra
......
......@@ -2,7 +2,7 @@
# SPDX-FileCopyrightText: 2019 Philip Chimento <philip.chimento@gmail.com>
# SPDX-FileCopyrightText: 2019 Chun-wei Fan <fanchunwei@src.gnome.org>
project('gjs', 'cpp', 'c', version: '1.70.0', license: ['MIT', 'LGPL2+'],
project('gjs', 'cpp', 'c', version: '1.70.1', license: ['MIT', 'LGPL2+'],
meson_version: '>= 0.52.0',
default_options: ['cpp_std=c++17', 'cpp_rtti=false', 'c_std=c99',
'warning_level=2', 'b_pch=true' ])
......@@ -109,6 +109,8 @@ endif
### Check for required libraries ###############################################
null_dep = dependency('', required : false)
# Note: Notify GNOME release team when adding or updating dependencies
glib_required_version = '>= 2.66.0'
glib = dependency('glib-2.0', version: glib_required_version,
......@@ -180,6 +182,20 @@ features.''')
endif
endif
if cxx.links('''
#include <atomic>
int main(void)
{
std::atomic_int64_t value = ATOMIC_VAR_INIT(0);
return value.load();
}
''', name: '64-bit atomics built-in')
libatomic = null_dep
else
libatomic = cc.find_library('atomic', required: false)
endif
build_profiler = sysprof_capture.found() and not get_option('profiler').disabled()
profiler_deps = [sysprof_capture]
if build_profiler and not cxx.has_function('timer_settime')
......@@ -458,7 +474,7 @@ module_resource_srcs = gnome.compile_resources('js-resources',
c_name: 'js_resources')
libgjs_dependencies = [glib, gobject, gthread, gio, gi, ffi, spidermonkey,
readline]
readline, libatomic]
pkg_dependencies = [glib, gobject, gthread, gio, gi, ffi, spidermonkey]
libraries_private = []
......