mirror of
https://github.com/vlang/v.git
synced 2025-09-15 07:22:27 +03:00
ci: update linux image runners from ubuntu-20.04
to ubuntu-24.04
(#23706)
This commit is contained in:
parent
7b97709449
commit
55f482bb63
46 changed files with 445 additions and 195 deletions
2
.github/workflows/bootstrapping_ci.yml
vendored
2
.github/workflows/bootstrapping_ci.yml
vendored
|
@ -24,7 +24,7 @@ on:
|
||||||
- '!**/bootstrapping_ci.yml'
|
- '!**/bootstrapping_ci.yml'
|
||||||
|
|
||||||
concurrency:
|
concurrency:
|
||||||
group: ${{ github.workflow }}-${{ github.ref == 'refs/heads/master' && github.sha || github.ref }}
|
group: bootstrapping-${{ github.workflow }}-${{ github.ref == 'refs/heads/master' && github.sha || github.ref }}
|
||||||
cancel-in-progress: true
|
cancel-in-progress: true
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
|
|
4
.github/workflows/c2v_ci.yml
vendored
4
.github/workflows/c2v_ci.yml
vendored
|
@ -23,7 +23,7 @@ on:
|
||||||
- '!cmd/tools/builders/**.v'
|
- '!cmd/tools/builders/**.v'
|
||||||
|
|
||||||
concurrency:
|
concurrency:
|
||||||
group: ${{ github.workflow }}-${{ github.ref == 'refs/heads/master' && github.sha || github.ref }}
|
group: c2v-${{ github.workflow }}-${{ github.ref == 'refs/heads/master' && github.sha || github.ref }}
|
||||||
cancel-in-progress: true
|
cancel-in-progress: true
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
|
@ -71,7 +71,7 @@ jobs:
|
||||||
WAD_FILE=~/DOOM1.WAD ~/code/doom/build_whole_project.sh
|
WAD_FILE=~/DOOM1.WAD ~/code/doom/build_whole_project.sh
|
||||||
|
|
||||||
test-regression:
|
test-regression:
|
||||||
runs-on: ubuntu-20.04
|
runs-on: ubuntu-24.04
|
||||||
timeout-minutes: 20
|
timeout-minutes: 20
|
||||||
env:
|
env:
|
||||||
VFLAGS: -cc tcc
|
VFLAGS: -cc tcc
|
||||||
|
|
20
.github/workflows/cross_ci.yml
vendored
20
.github/workflows/cross_ci.yml
vendored
|
@ -17,7 +17,7 @@ on:
|
||||||
- '!cmd/tools/builders/**.v'
|
- '!cmd/tools/builders/**.v'
|
||||||
|
|
||||||
concurrency:
|
concurrency:
|
||||||
group: ${{ github.workflow }}-${{ github.ref == 'refs/heads/master' && github.sha || github.ref }}
|
group: cross-${{ github.workflow }}-${{ github.ref == 'refs/heads/master' && github.sha || github.ref }}
|
||||||
cancel-in-progress: true
|
cancel-in-progress: true
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
|
@ -52,7 +52,7 @@ jobs:
|
||||||
./v -os windows examples/2048/2048.v
|
./v -os windows examples/2048/2048.v
|
||||||
|
|
||||||
linux-cross:
|
linux-cross:
|
||||||
runs-on: ubuntu-20.04
|
runs-on: ubuntu-24.04
|
||||||
timeout-minutes: 25
|
timeout-minutes: 25
|
||||||
env:
|
env:
|
||||||
VFLAGS: -cc tcc -no-retry-compilation
|
VFLAGS: -cc tcc -no-retry-compilation
|
||||||
|
@ -65,14 +65,12 @@ jobs:
|
||||||
|
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: |
|
run: |
|
||||||
## sudo dpkg --add-architecture i386
|
./v retry -- sudo apt install --quiet -y mingw-w64 wine wine64 winetricks libssl-dev sqlite3 libsqlite3-dev
|
||||||
./v retry -- sudo apt update
|
|
||||||
./v retry -- sudo apt install --quiet -y libssl-dev sqlite3 libsqlite3-dev
|
|
||||||
./v retry -- sudo apt install --quiet -y mingw-w64 wine-stable winetricks
|
|
||||||
## ./v retry -- sudo apt install --quiet -y wine32
|
|
||||||
|
|
||||||
- name: Turn off the wine crash dialog
|
- name: Show diagnostics for wine
|
||||||
run: winetricks nocrashdialog
|
run: |
|
||||||
|
which wine
|
||||||
|
ls -la $(realpath $(which wine))
|
||||||
|
|
||||||
- name: v.c can be compiled and run with -os cross
|
- name: v.c can be compiled and run with -os cross
|
||||||
run: |
|
run: |
|
||||||
|
@ -86,13 +84,13 @@ jobs:
|
||||||
./v -cc msvc -os windows -o /tmp/v_win.c cmd/v
|
./v -cc msvc -os windows -o /tmp/v_win.c cmd/v
|
||||||
x86_64-w64-mingw32-gcc /tmp/v_win.c -std=c99 -w -municode -o v_from_vc.exe -lws2_32
|
x86_64-w64-mingw32-gcc /tmp/v_win.c -std=c99 -w -municode -o v_from_vc.exe -lws2_32
|
||||||
ls -lart v_from_vc.exe
|
ls -lart v_from_vc.exe
|
||||||
wine64 ./v_from_vc.exe version
|
wine ./v_from_vc.exe version
|
||||||
|
|
||||||
- name: hello_world.v can be cross compiled to hello_world.exe
|
- name: hello_world.v can be cross compiled to hello_world.exe
|
||||||
run: |
|
run: |
|
||||||
./v -os windows examples/hello_world.v
|
./v -os windows examples/hello_world.v
|
||||||
ls -lart examples/hello_world.exe
|
ls -lart examples/hello_world.exe
|
||||||
wine64 examples/hello_world.exe
|
wine examples/hello_world.exe
|
||||||
|
|
||||||
- name: 2048.v can be cross compiled to 2048.exe
|
- name: 2048.v can be cross compiled to 2048.exe
|
||||||
run: |
|
run: |
|
||||||
|
|
6
.github/workflows/docker_ci.yml
vendored
6
.github/workflows/docker_ci.yml
vendored
|
@ -17,7 +17,7 @@ on:
|
||||||
- '!cmd/tools/builders/**.v'
|
- '!cmd/tools/builders/**.v'
|
||||||
|
|
||||||
concurrency:
|
concurrency:
|
||||||
group: ${{ github.workflow }}-${{ github.ref == 'refs/heads/master' && github.sha || github.ref }}
|
group: docker-${{ github.workflow }}-${{ github.ref == 'refs/heads/master' && github.sha || github.ref }}
|
||||||
cancel-in-progress: true
|
cancel-in-progress: true
|
||||||
|
|
||||||
env:
|
env:
|
||||||
|
@ -25,7 +25,7 @@ env:
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
docker-alpine-musl-gcc:
|
docker-alpine-musl-gcc:
|
||||||
runs-on: ubuntu-20.04
|
runs-on: ubuntu-24.04
|
||||||
timeout-minutes: 241
|
timeout-minutes: 241
|
||||||
container:
|
container:
|
||||||
image: thevlang/vlang:alpine-build
|
image: thevlang/vlang:alpine-build
|
||||||
|
@ -54,7 +54,7 @@ jobs:
|
||||||
run: VTEST_JUST_ESSENTIAL=1 ./v test-self
|
run: VTEST_JUST_ESSENTIAL=1 ./v test-self
|
||||||
|
|
||||||
docker-ubuntu-musl:
|
docker-ubuntu-musl:
|
||||||
runs-on: ubuntu-20.04
|
runs-on: ubuntu-24.04
|
||||||
timeout-minutes: 121
|
timeout-minutes: 121
|
||||||
container:
|
container:
|
||||||
image: thevlang/vlang:ubuntu-build
|
image: thevlang/vlang:ubuntu-build
|
||||||
|
|
10
.github/workflows/docs_ci.yml
vendored
10
.github/workflows/docs_ci.yml
vendored
|
@ -17,24 +17,26 @@ on:
|
||||||
- 'cmd/tools/vrepl.v'
|
- 'cmd/tools/vrepl.v'
|
||||||
|
|
||||||
concurrency:
|
concurrency:
|
||||||
group: ${{ github.workflow }}-${{ github.ref == 'refs/heads/master' && github.sha || github.ref }}
|
group: docs-${{ github.workflow }}-${{ github.ref == 'refs/heads/master' && github.sha || github.ref }}
|
||||||
cancel-in-progress: true
|
cancel-in-progress: true
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
check-markdown:
|
check-markdown:
|
||||||
runs-on: ubuntu-20.04
|
runs-on: ubuntu-24.04
|
||||||
timeout-minutes: 5
|
timeout-minutes: 10
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
- name: Build V
|
- name: Build V
|
||||||
run: make
|
run: make
|
||||||
|
- name: Install dependencies (some examples show how to use sqlite and the x11 clipboard)
|
||||||
|
run: ./v retry -- sudo apt install --quiet -y libx11-dev libssl-dev sqlite3 libsqlite3-dev
|
||||||
- name: Check markdown line length & code examples
|
- name: Check markdown line length & code examples
|
||||||
run: ./v check-md -hide-warnings .
|
run: ./v check-md -hide-warnings .
|
||||||
## NB: -hide-warnings is used here, so that the output is less noisy,
|
## NB: -hide-warnings is used here, so that the output is less noisy,
|
||||||
## thus real errors are easier to spot.
|
## thus real errors are easier to spot.
|
||||||
|
|
||||||
report-missing-fn-doc:
|
report-missing-fn-doc:
|
||||||
runs-on: ubuntu-20.04
|
runs-on: ubuntu-24.04
|
||||||
timeout-minutes: 5
|
timeout-minutes: 5
|
||||||
env:
|
env:
|
||||||
MOPTIONS: --diff --deprecated --relative-paths --exclude /vlib/v/ --exclude /builtin/linux_bare/ --exclude /testdata/ --exclude /tests/
|
MOPTIONS: --diff --deprecated --relative-paths --exclude /vlib/v/ --exclude /builtin/linux_bare/ --exclude /testdata/ --exclude /tests/
|
||||||
|
|
2
.github/workflows/gen_vc_ci.yml
vendored
2
.github/workflows/gen_vc_ci.yml
vendored
|
@ -24,7 +24,7 @@ on:
|
||||||
# Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued.
|
# Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued.
|
||||||
# However, do NOT cancel in-progress runs as we want to allow these production deployments to complete.
|
# However, do NOT cancel in-progress runs as we want to allow these production deployments to complete.
|
||||||
concurrency:
|
concurrency:
|
||||||
group: ${{ github.workflow }}-${{ github.ref }}
|
group: gen_vc-${{ github.workflow }}-${{ github.ref }}
|
||||||
cancel-in-progress: ${{ !contains(github.ref, 'master')}}
|
cancel-in-progress: ${{ !contains(github.ref, 'master')}}
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
|
|
4
.github/workflows/gg_regressions_ci.yml
vendored
4
.github/workflows/gg_regressions_ci.yml
vendored
|
@ -17,12 +17,12 @@ on:
|
||||||
- '!**.md'
|
- '!**.md'
|
||||||
|
|
||||||
concurrency:
|
concurrency:
|
||||||
group: ${{ github.workflow }}-${{ github.ref == 'refs/heads/master' && github.sha || github.ref }}
|
group: gg-regressions-${{ github.workflow }}-${{ github.ref == 'refs/heads/master' && github.sha || github.ref }}
|
||||||
cancel-in-progress: true
|
cancel-in-progress: true
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
gg-regressions:
|
gg-regressions:
|
||||||
runs-on: ubuntu-20.04
|
runs-on: ubuntu-24.04
|
||||||
timeout-minutes: 20
|
timeout-minutes: 20
|
||||||
env:
|
env:
|
||||||
VFLAGS: -cc tcc
|
VFLAGS: -cc tcc
|
||||||
|
|
8
.github/workflows/linux_ci.yml
vendored
8
.github/workflows/linux_ci.yml
vendored
|
@ -18,12 +18,12 @@ on:
|
||||||
- '!cmd/tools/builders/**.v'
|
- '!cmd/tools/builders/**.v'
|
||||||
|
|
||||||
concurrency:
|
concurrency:
|
||||||
group: ${{ github.workflow }}-${{ github.ref == 'refs/heads/master' && github.sha || github.ref }}
|
group: linux-${{ github.workflow }}-${{ github.ref == 'refs/heads/master' && github.sha || github.ref }}
|
||||||
cancel-in-progress: true
|
cancel-in-progress: true
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
tcc:
|
tcc:
|
||||||
runs-on: ubuntu-20.04
|
runs-on: ubuntu-24.04
|
||||||
timeout-minutes: 121
|
timeout-minutes: 121
|
||||||
env:
|
env:
|
||||||
VFLAGS: -cc tcc -no-retry-compilation
|
VFLAGS: -cc tcc -no-retry-compilation
|
||||||
|
@ -81,7 +81,7 @@ jobs:
|
||||||
run: v run ci/linux_ci.vsh test_leak_detector_not_active_tcc
|
run: v run ci/linux_ci.vsh test_leak_detector_not_active_tcc
|
||||||
|
|
||||||
gcc:
|
gcc:
|
||||||
runs-on: ubuntu-20.04
|
runs-on: ubuntu-24.04
|
||||||
timeout-minutes: 121
|
timeout-minutes: 121
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
|
@ -135,7 +135,7 @@ jobs:
|
||||||
run: v run ci/linux_ci.vsh test_vlib_skip_unused_gcc
|
run: v run ci/linux_ci.vsh test_vlib_skip_unused_gcc
|
||||||
|
|
||||||
clang:
|
clang:
|
||||||
runs-on: ubuntu-20.04
|
runs-on: ubuntu-24.04
|
||||||
timeout-minutes: 121
|
timeout-minutes: 121
|
||||||
env:
|
env:
|
||||||
VFLAGS: -cc clang
|
VFLAGS: -cc clang
|
||||||
|
|
2
.github/workflows/macos_ci.yml
vendored
2
.github/workflows/macos_ci.yml
vendored
|
@ -17,7 +17,7 @@ on:
|
||||||
- '!cmd/tools/builders/**.v'
|
- '!cmd/tools/builders/**.v'
|
||||||
|
|
||||||
concurrency:
|
concurrency:
|
||||||
group: ${{ github.workflow }}-${{ github.ref == 'refs/heads/master' && github.sha || github.ref }}
|
group: macos-${{ github.workflow }}-${{ github.ref == 'refs/heads/master' && github.sha || github.ref }}
|
||||||
cancel-in-progress: true
|
cancel-in-progress: true
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
|
|
4
.github/workflows/module_docs_ci.yml
vendored
4
.github/workflows/module_docs_ci.yml
vendored
|
@ -17,12 +17,12 @@ on:
|
||||||
# Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued.
|
# Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued.
|
||||||
# However, do NOT cancel in-progress runs as we want to allow these production deployments to complete.
|
# However, do NOT cancel in-progress runs as we want to allow these production deployments to complete.
|
||||||
concurrency:
|
concurrency:
|
||||||
group: ${{ github.workflow }}-${{ github.ref }}
|
group: module_docs-${{ github.workflow }}-${{ github.ref }}
|
||||||
cancel-in-progress: ${{ !contains(github.ref, 'master')}}
|
cancel-in-progress: ${{ !contains(github.ref, 'master')}}
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build-module-docs:
|
build-module-docs:
|
||||||
runs-on: ubuntu-20.04
|
runs-on: ubuntu-24.04
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
- name: Build V
|
- name: Build V
|
||||||
|
|
|
@ -17,7 +17,7 @@ on:
|
||||||
- 'cmd/tools/**'
|
- 'cmd/tools/**'
|
||||||
|
|
||||||
concurrency:
|
concurrency:
|
||||||
group: ${{ github.workflow }}-${{ github.ref == 'refs/heads/master' && github.sha || github.ref }}
|
group: slower_tests-${{ github.workflow }}-${{ github.ref == 'refs/heads/master' && github.sha || github.ref }}
|
||||||
cancel-in-progress: true
|
cancel-in-progress: true
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
|
|
2
.github/workflows/native_backend_ci.yml
vendored
2
.github/workflows/native_backend_ci.yml
vendored
|
@ -45,7 +45,7 @@ on:
|
||||||
- '.github/workflows/native_backend_ci.yml'
|
- '.github/workflows/native_backend_ci.yml'
|
||||||
|
|
||||||
concurrency:
|
concurrency:
|
||||||
group: ${{ github.workflow }}-${{ github.ref == 'refs/heads/master' && github.sha || github.ref }}
|
group: native_backend-${{ github.workflow }}-${{ github.ref == 'refs/heads/master' && github.sha || github.ref }}
|
||||||
cancel-in-progress: true
|
cancel-in-progress: true
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
|
|
12
.github/workflows/other_ci.yml
vendored
12
.github/workflows/other_ci.yml
vendored
|
@ -18,12 +18,12 @@ on:
|
||||||
- '!cmd/tools/builders/**.v'
|
- '!cmd/tools/builders/**.v'
|
||||||
|
|
||||||
concurrency:
|
concurrency:
|
||||||
group: ${{ github.workflow }}-${{ github.ref == 'refs/heads/master' && github.sha || github.ref }}
|
group: other-${{ github.workflow }}-${{ github.ref == 'refs/heads/master' && github.sha || github.ref }}
|
||||||
cancel-in-progress: true
|
cancel-in-progress: true
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
prevent-gpl-licenses:
|
prevent-gpl-licenses:
|
||||||
runs-on: ubuntu-20.04
|
runs-on: ubuntu-24.04
|
||||||
timeout-minutes: 15
|
timeout-minutes: 15
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout V ${{ github.head_ref }}
|
- name: Checkout V ${{ github.head_ref }}
|
||||||
|
@ -46,7 +46,7 @@ jobs:
|
||||||
diff -d -a -U 2 --color=always gpl_res_vmaster gpl_res_vnew
|
diff -d -a -U 2 --color=always gpl_res_vmaster gpl_res_vnew
|
||||||
|
|
||||||
code-formatting:
|
code-formatting:
|
||||||
runs-on: ubuntu-20.04
|
runs-on: ubuntu-24.04
|
||||||
timeout-minutes: 30
|
timeout-minutes: 30
|
||||||
env:
|
env:
|
||||||
VFLAGS: -cc gcc
|
VFLAGS: -cc gcc
|
||||||
|
@ -62,7 +62,7 @@ jobs:
|
||||||
run: ./v test-fmt
|
run: ./v test-fmt
|
||||||
|
|
||||||
performance-regressions:
|
performance-regressions:
|
||||||
runs-on: ubuntu-20.04
|
runs-on: ubuntu-24.04
|
||||||
timeout-minutes: 30
|
timeout-minutes: 30
|
||||||
env:
|
env:
|
||||||
VFLAGS: -cc gcc
|
VFLAGS: -cc gcc
|
||||||
|
@ -86,7 +86,7 @@ jobs:
|
||||||
run: ./v repeat --max_time 1731 --series 3 --runs 20 --nmins 2 --nmaxs 5 --warmup 3 --fail_percent 10 -t 'cd {T} ; ./v -o v.c cmd/v' . ./vmaster
|
run: ./v repeat --max_time 1731 --series 3 --runs 20 --nmins 2 --nmaxs 5 --warmup 3 --fail_percent 10 -t 'cd {T} ; ./v -o v.c cmd/v' . ./vmaster
|
||||||
|
|
||||||
misc-tooling:
|
misc-tooling:
|
||||||
runs-on: ubuntu-20.04
|
runs-on: ubuntu-24.04
|
||||||
timeout-minutes: 121
|
timeout-minutes: 121
|
||||||
env:
|
env:
|
||||||
VFLAGS: -cc tcc -no-retry-compilation
|
VFLAGS: -cc tcc -no-retry-compilation
|
||||||
|
@ -124,7 +124,7 @@ jobs:
|
||||||
./v should-compile-all examples/sokol/*.v examples/sokol/0?*/*.v
|
./v should-compile-all examples/sokol/*.v examples/sokol/0?*/*.v
|
||||||
|
|
||||||
parser-silent:
|
parser-silent:
|
||||||
runs-on: ubuntu-20.04
|
runs-on: ubuntu-24.04
|
||||||
timeout-minutes: 121
|
timeout-minutes: 121
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
|
|
4
.github/workflows/paths_ci.yml
vendored
4
.github/workflows/paths_ci.yml
vendored
|
@ -11,12 +11,12 @@ on:
|
||||||
- '!**/paths_ci.yml'
|
- '!**/paths_ci.yml'
|
||||||
|
|
||||||
concurrency:
|
concurrency:
|
||||||
group: ${{ github.workflow }}-${{ github.ref == 'refs/heads/master' && github.sha || github.ref }}
|
group: paths-${{ github.workflow }}-${{ github.ref == 'refs/heads/master' && github.sha || github.ref }}
|
||||||
cancel-in-progress: true
|
cancel-in-progress: true
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
space-paths-linux:
|
space-paths-linux:
|
||||||
runs-on: ubuntu-20.04
|
runs-on: ubuntu-24.04
|
||||||
timeout-minutes: 30
|
timeout-minutes: 30
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
|
|
2
.github/workflows/prebuilt.yml
vendored
2
.github/workflows/prebuilt.yml
vendored
|
@ -7,7 +7,7 @@ on:
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
ubuntu:
|
ubuntu:
|
||||||
runs-on: ubuntu-20.04
|
runs-on: ubuntu-24.04
|
||||||
timeout-minutes: 5
|
timeout-minutes: 5
|
||||||
steps:
|
steps:
|
||||||
- name: Download V
|
- name: Download V
|
||||||
|
|
6
.github/workflows/puzzle_vibes_ci.yml
vendored
6
.github/workflows/puzzle_vibes_ci.yml
vendored
|
@ -20,13 +20,13 @@ on:
|
||||||
- '!**.md'
|
- '!**.md'
|
||||||
|
|
||||||
concurrency:
|
concurrency:
|
||||||
group: ${{ github.workflow }}-${{ github.ref == 'refs/heads/master' && github.sha || github.ref }}
|
group: puzzle_vibes-${{ github.workflow }}-${{ github.ref == 'refs/heads/master' && github.sha || github.ref }}
|
||||||
cancel-in-progress: true
|
cancel-in-progress: true
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
v-compiles-puzzle-vibes:
|
v-compiles-puzzle-vibes:
|
||||||
runs-on: ubuntu-20.04
|
runs-on: ubuntu-24.04
|
||||||
timeout-minutes: 10
|
timeout-minutes: 30
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
- name: Build V
|
- name: Build V
|
||||||
|
|
2
.github/workflows/release_ci.yml
vendored
2
.github/workflows/release_ci.yml
vendored
|
@ -13,7 +13,7 @@ on:
|
||||||
- 0.**
|
- 0.**
|
||||||
|
|
||||||
concurrency:
|
concurrency:
|
||||||
group: ${{ github.workflow }}-${{ github.ref }}
|
group: release-${{ github.workflow }}-${{ github.ref }}
|
||||||
cancel-in-progress: ${{ github.ref_type != 'tag' }}
|
cancel-in-progress: ${{ github.ref_type != 'tag' }}
|
||||||
|
|
||||||
permissions:
|
permissions:
|
||||||
|
|
|
@ -1,4 +1,187 @@
|
||||||
## See https://clang.llvm.org/docs/UndefinedBehaviorSanitizer.html
|
## See https://clang.llvm.org/docs/UndefinedBehaviorSanitizer.html
|
||||||
|
## Most of the supressed functions here use asserts, that in turn use an indirection through an interface. TODO: if that is solved, most of these can be removed.
|
||||||
|
## Usually they contain a __test_ in their name, but not always (see the x.ttf ones like vlib/x/ttf/ttf_test.v ).
|
||||||
|
## TODO: extract the common part of the assertions to a VDO_ function (1 for pass and 1 for failure), so that they can be whitelisted here just once.
|
||||||
|
function:map_exists
|
||||||
|
function:map_get
|
||||||
|
function:IError_str
|
||||||
|
|
||||||
|
shift-exponent:math__bits__rotate_left_64
|
||||||
|
shift-exponent:math__bits__div_64
|
||||||
|
function:math__big__Integer_general_radix_str
|
||||||
|
function:math__big__Integer_div_mod_internal
|
||||||
|
function:math__bits__test_bits
|
||||||
|
function:math__bits__test_div_64_edge_cases
|
||||||
|
function:math__test_nan
|
||||||
|
|
||||||
|
alignment:rand__read_64
|
||||||
function:rand__internal_ulid_at_millisecond
|
function:rand__internal_ulid_at_millisecond
|
||||||
function:sync__pool__process_in_thread
|
function:rand__internal_string_from_set
|
||||||
|
function:rand__internal_uuid_v4
|
||||||
function:rand__deinit
|
function:rand__deinit
|
||||||
|
function:rand__read_internal
|
||||||
|
function:rand__read_64
|
||||||
|
function:rand__PRNG_f64
|
||||||
|
|
||||||
|
function:rand__cuid2__test_cuid2
|
||||||
|
|
||||||
|
function:sync__pool__process_in_thread
|
||||||
|
function:sync__Once_do_slow_with_param
|
||||||
|
|
||||||
|
function:v__type_resolver__TypeResolver_resolve_fn_generic_args
|
||||||
|
function:v__type_resolver__TypeResolver_unwrap_generic_expr
|
||||||
|
function:v__type_resolver__TypeResolver_get_type
|
||||||
|
|
||||||
|
## these have asserts in them, and trigger due to the used indirection; TODO: remove them, when a more general solution is found for all interfaces
|
||||||
|
function:x__ttf__TTF_File_get_glyph_offset
|
||||||
|
function:x__ttf__TTF_File_get_horizontal_metrics
|
||||||
|
function:x__ttf__TTF_File_glyph_count
|
||||||
|
function:x__ttf__TTF_File_read_glyph
|
||||||
|
function:x__ttf__TTF_File_read_simple_glyph
|
||||||
|
function:x__ttf__TTF_File_read_kern_table
|
||||||
|
function:x__ttf__TTF_File_read_hhea_table
|
||||||
|
function:x__ttf__TTF_File_read_cmap_table
|
||||||
|
function:x__ttf__TTF_File_read_name_table
|
||||||
|
function:x__ttf__TTF_File_read_head_table
|
||||||
|
function:x__ttf__TTF_File_read_offset_tables
|
||||||
|
|
||||||
|
function:net__unix__select_deadline
|
||||||
|
function:net__select_deadline
|
||||||
|
function:net__socks__test_parse_ipv4
|
||||||
|
function:net__http__download_file_with_progress
|
||||||
|
function:net__http__download_progres_cb
|
||||||
|
function:net__http__check_headers
|
||||||
|
function:net__http__test_str
|
||||||
|
function:net__http__test_int
|
||||||
|
function:net__http__test_is_valid
|
||||||
|
function:net__http__test_is_error
|
||||||
|
function:net__http__test_is_success
|
||||||
|
function:net__http__test_parse_response_with_weird_cookie
|
||||||
|
function:net__http__test_parse_response_with_cookies
|
||||||
|
function:net__http__test_parse_response
|
||||||
|
function:net__http__test_response_bytestr_1
|
||||||
|
function:net__http__test_response_bytestr_2
|
||||||
|
function:net__http__test_parse_large_body
|
||||||
|
function:net__http__test_multipart_form_body
|
||||||
|
function:net__http__test_parse_multipart_form2
|
||||||
|
function:net__http__test_parse_request_no_headers
|
||||||
|
function:net__http__test_parse_multipart_form
|
||||||
|
function:net__http__test_parse_form
|
||||||
|
function:net__http__test_parse_request_line
|
||||||
|
function:net__http__test_parse_request_body
|
||||||
|
function:net__http__test_parse_request_two_header_values
|
||||||
|
function:net__http__test_parse_request_no_headers
|
||||||
|
function:net__http__test_parse_request_two_headers
|
||||||
|
function:net__http__test_proxy_fields
|
||||||
|
function:net__http__test_proxy_headers
|
||||||
|
function:net__http__test_set_cookie
|
||||||
|
function:net__http__test_parse_headers
|
||||||
|
function:net__http__parse_headers_test
|
||||||
|
function:net__http__test_header_join
|
||||||
|
function:net__http__test_header_from_map
|
||||||
|
function:net__http__test_custom_header_from_map
|
||||||
|
function:net__http__test_render_coerce_canonicalize
|
||||||
|
function:net__http__test_render_canonicalize
|
||||||
|
function:net__http__test_render_version
|
||||||
|
function:net__http__test_coerce_canonicalize_custom
|
||||||
|
function:net__http__test_coerce_custom
|
||||||
|
function:net__http__test_coerce_canonicalize
|
||||||
|
function:net__http__test_coerce
|
||||||
|
function:net__http__test_custom_values
|
||||||
|
function:net__http__test_starting_with
|
||||||
|
function:net__http__test_get_custom
|
||||||
|
function:net__http__test_contains_custom
|
||||||
|
function:net__http__test_custom_header
|
||||||
|
function:net__http__test_delete_header
|
||||||
|
function:net__http__test_header_delete_not_existing
|
||||||
|
function:net__http__test_header_delete
|
||||||
|
function:net__http__test_header_set
|
||||||
|
function:net__http__test_header_get
|
||||||
|
function:net__http__test_header_adds_multiple
|
||||||
|
function:net__http__test_header_new
|
||||||
|
function:net__test_ip6_str
|
||||||
|
function:net__test_ip_str
|
||||||
|
function:net__test_sizes_unix
|
||||||
|
function:net__test_sizes_ipv4
|
||||||
|
function:net__test_sizes_ipv6
|
||||||
|
function:net__test_offsets_unix
|
||||||
|
function:net__test_offsets_ipv4
|
||||||
|
function:net__test_offsets_ipv6
|
||||||
|
function:net__test_sizes_unix_sun_path
|
||||||
|
function:net__test_diagnostics
|
||||||
|
function:net__test_ip_port
|
||||||
|
function:net__websocket__delete_client_cb
|
||||||
|
function:net__websocket__Server_listen
|
||||||
|
function:net__websocket__Server_serve_client
|
||||||
|
function:net__websocket__Server_parse_client_handshake
|
||||||
|
function:net__websocket__Client_listen
|
||||||
|
function:net__websocket__Client_send_message_event
|
||||||
|
function:net__websocket__Client_send_close_event
|
||||||
|
function:net__websocket__Client_debug_log
|
||||||
|
function:net__websocket__Client_connect
|
||||||
|
|
||||||
|
function:io__BufferedReader_fill_buffer
|
||||||
|
function:io__read_all
|
||||||
|
|
||||||
|
function:log__info
|
||||||
|
function:log__debug
|
||||||
|
function:log__warn
|
||||||
|
function:log__error
|
||||||
|
function:log__set_level
|
||||||
|
function:log__Log_log_stream
|
||||||
|
function:log__free_logger
|
||||||
|
|
||||||
|
function:picoev__Picoev_poll_once
|
||||||
|
function:picoev__Picoev_set_timeout
|
||||||
|
function:picoev__Picoev_update_events
|
||||||
|
function:picoev__test_if_all_file_descriptors_are_properly_initialized
|
||||||
|
|
||||||
|
function:vweb__tests__vweb_test_server__App_index
|
||||||
|
function:vweb__tests__vweb_test_server__start_in_background
|
||||||
|
function:vweb__RoutePair_test_param
|
||||||
|
function:veb__RoutePair_test_param
|
||||||
|
function:veb__test_load_files_translations
|
||||||
|
|
||||||
|
## needed for tests; TODO: move the test specific setup code into its own separate VDO_tests function, so only it can be added here
|
||||||
|
function:main
|
||||||
|
|
||||||
|
function:crypto__sha3__test_0_length_hash
|
||||||
|
function:crypto__sha3__test_0_length_xof
|
||||||
|
function:crypto__sha3__test_200_length_hash
|
||||||
|
function:crypto__sha3__test_200_length_xof
|
||||||
|
|
||||||
|
function:crypto__sha3__test_2_x_24_rounds_on_zero
|
||||||
|
function:crypto__sha3__test_stepping_functions_on_zero
|
||||||
|
function:crypto__sha3__test_zero_state
|
||||||
|
function:crypto__sha3__test_rho_offsets
|
||||||
|
function:crypto__sha3__test_to_from_bytes
|
||||||
|
function:crypto__sha3__test_round_constants
|
||||||
|
|
||||||
|
function:crypto__pem__test_decode_rfc1421
|
||||||
|
function:crypto__pem__test_decode
|
||||||
|
function:crypto__pem__test_encode_rfc1421
|
||||||
|
function:crypto__pem__test_encode
|
||||||
|
|
||||||
|
function:crypto__hmac__test_hmac_equal
|
||||||
|
function:crypto__hmac__test_hmac_sha3_224
|
||||||
|
function:crypto__hmac__test_hmac_sha3_256
|
||||||
|
function:crypto__hmac__test_hmac_sha3_384
|
||||||
|
function:crypto__hmac__test_hmac_sha3_512
|
||||||
|
function:crypto__hmac__test_hmac_blake3_256
|
||||||
|
function:crypto__hmac__test_hmac_blake2b_160
|
||||||
|
function:crypto__hmac__test_hmac_blake2b_256
|
||||||
|
function:crypto__hmac__test_hmac_blake2b_384
|
||||||
|
function:crypto__hmac__test_hmac_blake2b_512
|
||||||
|
function:crypto__hmac__test_hmac_blake2s_128
|
||||||
|
function:crypto__hmac__test_hmac_blake2s_160
|
||||||
|
function:crypto__hmac__test_hmac_blake2s_224
|
||||||
|
function:crypto__hmac__test_hmac_blake2s_256
|
||||||
|
function:crypto__hmac__test_hmac_sha512
|
||||||
|
function:crypto__hmac__test_hmac_sha384
|
||||||
|
function:crypto__hmac__test_hmac_sha256
|
||||||
|
function:crypto__hmac__test_hmac_sha224
|
||||||
|
function:crypto__hmac__test_hmac_sha1
|
||||||
|
function:crypto__hmac__test_hmac_md5
|
||||||
|
|
||||||
|
function:crypto__ed25519__internal__edwards25519__sc_reduce
|
||||||
|
function:crypto__ed25519__internal__edwards25519__sc_reduce
|
||||||
|
|
69
.github/workflows/sanitized_ci.yml
vendored
69
.github/workflows/sanitized_ci.yml
vendored
|
@ -71,17 +71,18 @@ on:
|
||||||
- '**/sanitized_ci.yml'
|
- '**/sanitized_ci.yml'
|
||||||
|
|
||||||
concurrency:
|
concurrency:
|
||||||
group: ${{ github.workflow }}-${{ github.ref == 'refs/heads/master' && github.sha || github.ref }}
|
group: sanitized-${{ github.workflow }}-${{ github.ref == 'refs/heads/master' && github.sha || github.ref }}
|
||||||
cancel-in-progress: true
|
cancel-in-progress: true
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
tests-sanitize-undefined-clang:
|
tests-sanitize-undefined-clang:
|
||||||
runs-on: ubuntu-20.04
|
runs-on: ubuntu-22.04
|
||||||
timeout-minutes: 120
|
timeout-minutes: 120
|
||||||
env:
|
env:
|
||||||
VFLAGS: -cc clang
|
VFLAGS: -cc clang -cflags -fno-omit-frame-pointer
|
||||||
VJOBS: 1
|
VJOBS: 1
|
||||||
VTEST_SHOW_START: 1
|
UBSAN_OPTIONS: print_stacktrace=1:halt_on_error=1:print_suppressions=0:suppressions=/home/runner/work/v/v/.github/workflows/run_sanitizers_undefined.suppressions
|
||||||
|
VNATIVE_SKIP_LIBC_VV: 1
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
- name: Build V
|
- name: Build V
|
||||||
|
@ -97,17 +98,20 @@ jobs:
|
||||||
- name: Recompile V with -cstrict
|
- name: Recompile V with -cstrict
|
||||||
run: ./v -cg -cstrict -o v cmd/v
|
run: ./v -cg -cstrict -o v cmd/v
|
||||||
- name: Self tests (-fsanitize=undefined)
|
- name: Self tests (-fsanitize=undefined)
|
||||||
run: ./v -cflags "-fsanitize=undefined" -o v2 cmd/v && ./v2 -cflags -fsanitize=undefined test-self vlib
|
run: |
|
||||||
|
./v -cflags -fsanitize=undefined -o v2 cmd/v
|
||||||
|
./v2 -cflags -fsanitize=undefined test-self vlib
|
||||||
- name: Build examples (V compiled with -fsanitize=undefined)
|
- name: Build examples (V compiled with -fsanitize=undefined)
|
||||||
run: ./v2 build-examples
|
run: ./v2 build-examples
|
||||||
|
|
||||||
tests-sanitize-undefined-gcc:
|
tests-sanitize-undefined-gcc:
|
||||||
runs-on: ubuntu-20.04
|
runs-on: ubuntu-22.04
|
||||||
timeout-minutes: 120
|
timeout-minutes: 120
|
||||||
env:
|
env:
|
||||||
VFLAGS: -cc gcc
|
VFLAGS: -cc gcc -cflags -fno-omit-frame-pointer
|
||||||
VJOBS: 1
|
VJOBS: 1
|
||||||
VTEST_SHOW_START: 1
|
UBSAN_OPTIONS: print_stacktrace=1:halt_on_error=1:print_suppressions=0:suppressions=/home/runner/work/v/v/.github/workflows/run_sanitizers_undefined.suppressions
|
||||||
|
VNATIVE_SKIP_LIBC_VV: 1
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
- name: Build V
|
- name: Build V
|
||||||
|
@ -122,17 +126,21 @@ jobs:
|
||||||
- name: Recompile V with -cstrict
|
- name: Recompile V with -cstrict
|
||||||
run: ./v -cg -cstrict -o v cmd/v
|
run: ./v -cg -cstrict -o v cmd/v
|
||||||
- name: Self tests (-fsanitize=undefined)
|
- name: Self tests (-fsanitize=undefined)
|
||||||
run: ./v -cflags "-fsanitize=undefined" -o v2 cmd/v && ./v2 -cflags -fsanitize=undefined test-self vlib
|
run: |
|
||||||
|
./v -cflags -fsanitize=undefined -o v2 cmd/v
|
||||||
|
./v2 -cflags -fsanitize=undefined test-self vlib
|
||||||
- name: Build examples (V compiled with -fsanitize=undefined)
|
- name: Build examples (V compiled with -fsanitize=undefined)
|
||||||
run: ./v2 build-examples
|
run: ./v2 build-examples
|
||||||
|
|
||||||
tests-sanitize-address-clang:
|
tests-sanitize-address-clang:
|
||||||
runs-on: ubuntu-20.04
|
runs-on: ubuntu-22.04
|
||||||
timeout-minutes: 300
|
timeout-minutes: 300
|
||||||
env:
|
env:
|
||||||
VFLAGS: -cc clang
|
VFLAGS: -cc clang -cflags -fno-omit-frame-pointer
|
||||||
VJOBS: 1
|
VJOBS: 1
|
||||||
VTEST_SHOW_START: 1
|
ASAN_OPTIONS: detect_leaks=1
|
||||||
|
LSAN_OPTIONS: max_leaks=1:print_suppressions=0:suppressions=/home/runner/work/v/v/.github/workflows/run_sanitizers_leak.suppressions
|
||||||
|
VNATIVE_SKIP_LIBC_VV: 1
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
- name: Build V
|
- name: Build V
|
||||||
|
@ -148,12 +156,13 @@ jobs:
|
||||||
- name: Recompile V with -cstrict
|
- name: Recompile V with -cstrict
|
||||||
run: ./v -cg -cstrict -o v cmd/v
|
run: ./v -cg -cstrict -o v cmd/v
|
||||||
- name: Self tests (-fsanitize=address)
|
- name: Self tests (-fsanitize=address)
|
||||||
run: ASAN_OPTIONS=detect_leaks=1 LSAN_OPTIONS=max_leaks=1:print_suppressions=0:suppressions=.github/workflows/run_sanitizers_leak.suppressions ./v -cflags "-fsanitize=address,pointer-compare,pointer-subtract" test-self vlib
|
run: ./v -cflags -fsanitize=address,pointer-compare,pointer-subtract test-self vlib
|
||||||
- name: Self tests (V compiled with -fsanitize=address)
|
- name: Self tests (V compiled with -fsanitize=address)
|
||||||
run: ./v -cflags -fsanitize=address -o v cmd/v &&
|
run: |
|
||||||
ASAN_OPTIONS=detect_leaks=1 LSAN_OPTIONS=max_leaks=1:print_suppressions=0:suppressions=.github/workflows/run_sanitizers_leak.suppressions ./v -cc tcc test-self -asan-compiler vlib
|
./v -cflags -fsanitize=address -o v cmd/v
|
||||||
|
./v -cc tcc test-self -asan-compiler vlib
|
||||||
- name: Build examples (V compiled with -fsanitize=address)
|
- name: Build examples (V compiled with -fsanitize=address)
|
||||||
run: ASAN_OPTIONS=detect_leaks=1 LSAN_OPTIONS=max_leaks=1:print_suppressions=0:suppressions=.github/workflows/run_sanitizers_leak.suppressions ./v build-examples
|
run: ./v build-examples
|
||||||
|
|
||||||
tests-sanitize-address-msvc:
|
tests-sanitize-address-msvc:
|
||||||
runs-on: windows-2019
|
runs-on: windows-2019
|
||||||
|
@ -161,7 +170,7 @@ jobs:
|
||||||
env:
|
env:
|
||||||
VFLAGS: -cc msvc
|
VFLAGS: -cc msvc
|
||||||
VJOBS: 1
|
VJOBS: 1
|
||||||
VTEST_SHOW_START: 1
|
VNATIVE_SKIP_LIBC_VV: 1
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
- name: Build
|
- name: Build
|
||||||
|
@ -180,12 +189,14 @@ jobs:
|
||||||
# run: .\v.exe -cflags "/fsanitize=address" test-self vlib
|
# run: .\v.exe -cflags "/fsanitize=address" test-self vlib
|
||||||
|
|
||||||
tests-sanitize-address-gcc:
|
tests-sanitize-address-gcc:
|
||||||
runs-on: ubuntu-20.04
|
runs-on: ubuntu-22.04
|
||||||
timeout-minutes: 300
|
timeout-minutes: 300
|
||||||
env:
|
env:
|
||||||
VFLAGS: -cc gcc
|
VFLAGS: -cc gcc -cflags -fno-omit-frame-pointer
|
||||||
VJOBS: 1
|
VJOBS: 1
|
||||||
VTEST_SHOW_START: 1
|
ASAN_OPTIONS: detect_leaks=1
|
||||||
|
LSAN_OPTIONS: max_leaks=1:print_suppressions=0:suppressions=/home/runner/work/v/v/.github/workflows/run_sanitizers_leak.suppressions
|
||||||
|
VNATIVE_SKIP_LIBC_VV: 1
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
- name: Build V
|
- name: Build V
|
||||||
|
@ -201,21 +212,21 @@ jobs:
|
||||||
- name: Recompile V with -cstrict
|
- name: Recompile V with -cstrict
|
||||||
run: ./v -cg -cstrict -o v cmd/v
|
run: ./v -cg -cstrict -o v cmd/v
|
||||||
- name: Self tests (-fsanitize=address)
|
- name: Self tests (-fsanitize=address)
|
||||||
run: ASAN_OPTIONS=detect_leaks=1 LSAN_OPTIONS=max_leaks=1:print_suppressions=0:suppressions=.github/workflows/run_sanitizers_leak.suppressions ./v -cflags -fsanitize=address test-self vlib
|
run: ./v -cflags -fsanitize=address test-self vlib
|
||||||
- name: Self tests (V compiled with -fsanitize=address)
|
- name: Self tests (V compiled with -fsanitize=address)
|
||||||
run:
|
run: |
|
||||||
./v -cflags -fsanitize=address,pointer-compare,pointer-subtract -o v cmd/v &&
|
./v -cflags -fsanitize=address,pointer-compare,pointer-subtract -o v cmd/v
|
||||||
ASAN_OPTIONS=detect_leaks=1 LSAN_OPTIONS=max_leaks=1:print_suppressions=0:suppressions=.github/workflows/run_sanitizers_leak.suppressions ./v -cc tcc test-self -asan-compiler vlib
|
./v -cc tcc test-self -asan-compiler vlib
|
||||||
- name: Build examples (V compiled with -fsanitize=address)
|
- name: Build examples (V compiled with -fsanitize=address)
|
||||||
run: ASAN_OPTIONS=detect_leaks=1 LSAN_OPTIONS=max_leaks=1:print_suppressions=0:suppressions=.github/workflows/run_sanitizers_leak.suppressions ./v build-examples
|
run: ./v build-examples
|
||||||
|
|
||||||
tests-sanitize-memory-clang:
|
tests-sanitize-memory-clang:
|
||||||
runs-on: ubuntu-20.04
|
runs-on: ubuntu-22.04
|
||||||
timeout-minutes: 240
|
timeout-minutes: 240
|
||||||
env:
|
env:
|
||||||
VFLAGS: -cc clang -gc none
|
VFLAGS: -cc clang -gc none -cflags -fno-omit-frame-pointer
|
||||||
VJOBS: 1
|
VJOBS: 1
|
||||||
VTEST_SHOW_START: 1
|
VNATIVE_SKIP_LIBC_VV: 1
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
- name: Build V
|
- name: Build V
|
||||||
|
@ -231,7 +242,7 @@ jobs:
|
||||||
- name: Recompile V with clang and -cstrict
|
- name: Recompile V with clang and -cstrict
|
||||||
run: ./v -cc clang -cg -cstrict -o v cmd/v
|
run: ./v -cc clang -cg -cstrict -o v cmd/v
|
||||||
- name: Self tests (-fsanitize=memory)
|
- name: Self tests (-fsanitize=memory)
|
||||||
run: ./v -cflags -fsanitize=memory test-self vlib
|
run: ./v -cflags -fsanitize=memory test-self -msan-compiler vlib
|
||||||
- name: Self tests (V compiled with -fsanitize=memory)
|
- name: Self tests (V compiled with -fsanitize=memory)
|
||||||
run: |
|
run: |
|
||||||
./v -cflags -fsanitize=memory -o v cmd/v
|
./v -cflags -fsanitize=memory -o v cmd/v
|
||||||
|
|
4
.github/workflows/sdl_ci.yml
vendored
4
.github/workflows/sdl_ci.yml
vendored
|
@ -20,12 +20,12 @@ on:
|
||||||
- '!**.md'
|
- '!**.md'
|
||||||
|
|
||||||
concurrency:
|
concurrency:
|
||||||
group: ${{ github.workflow }}-${{ github.ref == 'refs/heads/master' && github.sha || github.ref }}
|
group: sdl-${{ github.workflow }}-${{ github.ref == 'refs/heads/master' && github.sha || github.ref }}
|
||||||
cancel-in-progress: true
|
cancel-in-progress: true
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
v-compiles-sdl-examples:
|
v-compiles-sdl-examples:
|
||||||
runs-on: ubuntu-20.04
|
runs-on: ubuntu-24.04
|
||||||
timeout-minutes: 30
|
timeout-minutes: 30
|
||||||
env:
|
env:
|
||||||
VFLAGS: -cc tcc
|
VFLAGS: -cc tcc
|
||||||
|
|
2
.github/workflows/symlink_ci.yml
vendored
2
.github/workflows/symlink_ci.yml
vendored
|
@ -12,7 +12,7 @@ on:
|
||||||
- '.github/workflows/symlink_ci.yml'
|
- '.github/workflows/symlink_ci.yml'
|
||||||
|
|
||||||
concurrency:
|
concurrency:
|
||||||
group: ${{ github.workflow }}-${{ github.ref_name == 'master' && github.sha || github.ref_name }}
|
group: symlink-${{ github.workflow }}-${{ github.ref_name == 'master' && github.sha || github.ref_name }}
|
||||||
cancel-in-progress: true
|
cancel-in-progress: true
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
|
|
2
.github/workflows/time_ci.yml
vendored
2
.github/workflows/time_ci.yml
vendored
|
@ -15,7 +15,7 @@ on:
|
||||||
- '!**.md'
|
- '!**.md'
|
||||||
|
|
||||||
concurrency:
|
concurrency:
|
||||||
group: ${{ github.workflow }}-${{ github.ref == 'refs/heads/master' && github.sha || github.ref }}
|
group: time-${{ github.workflow }}-${{ github.ref == 'refs/heads/master' && github.sha || github.ref }}
|
||||||
cancel-in-progress: true
|
cancel-in-progress: true
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
|
|
2
.github/workflows/toml_ci.yml
vendored
2
.github/workflows/toml_ci.yml
vendored
|
@ -13,7 +13,7 @@ on:
|
||||||
- '!**.md'
|
- '!**.md'
|
||||||
|
|
||||||
concurrency:
|
concurrency:
|
||||||
group: ${{ github.workflow }}-${{ github.ref == 'refs/heads/master' && github.sha || github.ref }}
|
group: toml-${{ github.workflow }}-${{ github.ref == 'refs/heads/master' && github.sha || github.ref }}
|
||||||
cancel-in-progress: true
|
cancel-in-progress: true
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
|
|
22
.github/workflows/tools_ci.yml
vendored
22
.github/workflows/tools_ci.yml
vendored
|
@ -19,12 +19,12 @@ on:
|
||||||
- '**/tools_ci.yml'
|
- '**/tools_ci.yml'
|
||||||
|
|
||||||
concurrency:
|
concurrency:
|
||||||
group: ${{ github.workflow }}-${{ github.ref == 'refs/heads/master' && github.sha || github.ref }}
|
group: tools-${{ github.workflow }}-${{ github.ref == 'refs/heads/master' && github.sha || github.ref }}
|
||||||
cancel-in-progress: true
|
cancel-in-progress: true
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
linux:
|
linux:
|
||||||
runs-on: ubuntu-20.04
|
runs-on: ubuntu-22.04
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
cc: [tcc, gcc, clang]
|
cc: [tcc, gcc, clang]
|
||||||
|
@ -47,19 +47,19 @@ jobs:
|
||||||
- name: Test sanitized
|
- name: Test sanitized
|
||||||
if: ${{ matrix.cc != 'tcc' }}
|
if: ${{ matrix.cc != 'tcc' }}
|
||||||
run: |
|
run: |
|
||||||
|
export VNATIVE_SKIP_LIBC_VV=1
|
||||||
if [[ ${{ matrix.cc }} == "clang" ]]; then
|
if [[ ${{ matrix.cc }} == "clang" ]]; then
|
||||||
cmd="./v -cc clang -cflags -fsanitize=undefined test-self cmd"
|
cmd="./v -cc clang -cflags -fsanitize=undefined test-self -ubsan-compiler cmd"
|
||||||
echo $cmd && $cmd
|
echo $cmd && $cmd
|
||||||
cmd="./v -cc clang -cflags -fsanitize=memory test-self cmd"
|
cmd="./v -cc clang -cflags -fsanitize=memory test-self -msan-compiler cmd"
|
||||||
echo $cmd && $cmd
|
echo $cmd && $cmd
|
||||||
else
|
else
|
||||||
# TODO: enable thread sanitizer after switching to ubuntu-22.04. Ref. https://github.com/orgs/community/discussions/63391
|
cmd="./v -cc gcc -cflags -fsanitize=thread test-self cmd"
|
||||||
# cmd="./v -cc gcc -cflags -fsanitize=thread test-self cmd"
|
|
||||||
# echo $cmd && $cmd
|
|
||||||
cmd="./v -cc gcc -cflags -fsanitize=address,leak,undefined,shift,shift-exponent,shift-base,integer-divide-by-zero,unreachable,vla-bound,null,return,signed-integer-overflow,bounds,bounds-strict,alignment,object-size,float-divide-by-zero,float-cast-overflow,nonnull-attribute,returns-nonnull-attribute,bool,enum,vptr test-self cmd/tools"
|
|
||||||
echo $cmd && $cmd
|
echo $cmd && $cmd
|
||||||
# cmd="./v -cc gcc -cflags -fsanitize=kernel-address test-self cmd"
|
cmd="./v -cc gcc -cflags -fsanitize=address,leak,undefined,shift,shift-exponent,shift-base,integer-divide-by-zero,unreachable,vla-bound,null,return,signed-integer-overflow,bounds,bounds-strict,alignment,object-size,float-divide-by-zero,float-cast-overflow,nonnull-attribute,returns-nonnull-attribute,bool,enum,vptr test-self -asan-compiler cmd/tools"
|
||||||
# echo $cmd && $cmd
|
echo $cmd && $cmd
|
||||||
|
## cmd="./v -cc gcc -cflags -fsanitize=kernel-address test-self -asan-compiler cmd"
|
||||||
|
## echo $cmd && $cmd
|
||||||
fi
|
fi
|
||||||
|
|
||||||
macos:
|
macos:
|
||||||
|
@ -102,7 +102,7 @@ jobs:
|
||||||
run: ./v -W -cstrict test-self cmd
|
run: ./v -W -cstrict test-self cmd
|
||||||
|
|
||||||
tools-docker-ubuntu-musl:
|
tools-docker-ubuntu-musl:
|
||||||
runs-on: ubuntu-20.04
|
runs-on: ubuntu-24.04
|
||||||
timeout-minutes: 121
|
timeout-minutes: 121
|
||||||
container:
|
container:
|
||||||
image: thevlang/vlang:ubuntu-build
|
image: thevlang/vlang:ubuntu-build
|
||||||
|
|
|
@ -17,7 +17,7 @@ on:
|
||||||
- 'cmd/tools/vrepl.v'
|
- 'cmd/tools/vrepl.v'
|
||||||
|
|
||||||
concurrency:
|
concurrency:
|
||||||
group: ${{ github.workflow }}-${{ github.ref == 'refs/heads/master' && github.sha || github.ref }}
|
group: v_apps-${{ github.workflow }}-${{ github.ref == 'refs/heads/master' && github.sha || github.ref }}
|
||||||
cancel-in-progress: true
|
cancel-in-progress: true
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
|
|
6
.github/workflows/vab_ci.yml
vendored
6
.github/workflows/vab_ci.yml
vendored
|
@ -18,12 +18,12 @@ on:
|
||||||
- '!**.md'
|
- '!**.md'
|
||||||
|
|
||||||
concurrency:
|
concurrency:
|
||||||
group: ${{ github.workflow }}-${{ github.ref == 'refs/heads/master' && github.sha || github.ref }}
|
group: vab-${{ github.workflow }}-${{ github.ref == 'refs/heads/master' && github.sha || github.ref }}
|
||||||
cancel-in-progress: true
|
cancel-in-progress: true
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
vab-compiles-v-examples:
|
vab-compiles-v-examples:
|
||||||
runs-on: ubuntu-20.04
|
runs-on: ubuntu-24.04
|
||||||
timeout-minutes: 121
|
timeout-minutes: 121
|
||||||
env:
|
env:
|
||||||
VAB_FLAGS: --api 30 --build-tools 29.0.0 -v 3
|
VAB_FLAGS: --api 30 --build-tools 29.0.0 -v 3
|
||||||
|
@ -65,7 +65,7 @@ jobs:
|
||||||
done
|
done
|
||||||
|
|
||||||
v-compiles-os-android:
|
v-compiles-os-android:
|
||||||
runs-on: ubuntu-20.04
|
runs-on: ubuntu-24.04
|
||||||
timeout-minutes: 20
|
timeout-minutes: 20
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
|
|
4
.github/workflows/vinix_ci.yml
vendored
4
.github/workflows/vinix_ci.yml
vendored
|
@ -18,12 +18,12 @@ on:
|
||||||
- 'cmd/tools/vrepl.v'
|
- 'cmd/tools/vrepl.v'
|
||||||
|
|
||||||
concurrency:
|
concurrency:
|
||||||
group: ${{ github.workflow }}-${{ github.ref == 'refs/heads/master' && github.sha || github.ref }}
|
group: vinix-${{ github.workflow }}-${{ github.ref == 'refs/heads/master' && github.sha || github.ref }}
|
||||||
cancel-in-progress: true
|
cancel-in-progress: true
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
vinix-build:
|
vinix-build:
|
||||||
runs-on: ubuntu-20.04
|
runs-on: ubuntu-24.04
|
||||||
timeout-minutes: 10
|
timeout-minutes: 10
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
|
|
2
.github/workflows/vpm_ci.yml
vendored
2
.github/workflows/vpm_ci.yml
vendored
|
@ -11,7 +11,7 @@ on:
|
||||||
- '**/cmd/tools/vpm/**'
|
- '**/cmd/tools/vpm/**'
|
||||||
|
|
||||||
concurrency:
|
concurrency:
|
||||||
group: ${{ github.workflow }}-${{ github.ref == 'refs/heads/master' && github.sha || github.ref }}
|
group: vpm-${{ github.workflow }}-${{ github.ref == 'refs/heads/master' && github.sha || github.ref }}
|
||||||
cancel-in-progress: true
|
cancel-in-progress: true
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
|
|
2
.github/workflows/vsl_and_vtl_compile_ci.yml
vendored
2
.github/workflows/vsl_and_vtl_compile_ci.yml
vendored
|
@ -17,7 +17,7 @@ on:
|
||||||
- 'cmd/tools/vrepl.v'
|
- 'cmd/tools/vrepl.v'
|
||||||
|
|
||||||
concurrency:
|
concurrency:
|
||||||
group: ${{ github.workflow }}-${{ github.ref == 'refs/heads/master' && github.sha || github.ref }}
|
group: vsl-vtl-${{ github.workflow }}-${{ github.ref == 'refs/heads/master' && github.sha || github.ref }}
|
||||||
cancel-in-progress: true
|
cancel-in-progress: true
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
|
|
2
.github/workflows/vup_works.yml
vendored
2
.github/workflows/vup_works.yml
vendored
|
@ -21,7 +21,7 @@ on:
|
||||||
- 'cmd/tools/vrepl.v'
|
- 'cmd/tools/vrepl.v'
|
||||||
|
|
||||||
concurrency:
|
concurrency:
|
||||||
group: ${{ github.workflow }}-${{ github.ref == 'refs/heads/master' && github.sha || github.ref }}
|
group: vup-${{ github.workflow }}-${{ github.ref == 'refs/heads/master' && github.sha || github.ref }}
|
||||||
cancel-in-progress: true
|
cancel-in-progress: true
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
|
|
2
.github/workflows/wasm_backend_ci.yml
vendored
2
.github/workflows/wasm_backend_ci.yml
vendored
|
@ -39,7 +39,7 @@ on:
|
||||||
- '**/wasm_backend_ci.yml'
|
- '**/wasm_backend_ci.yml'
|
||||||
|
|
||||||
concurrency:
|
concurrency:
|
||||||
group: ${{ github.workflow }}-${{ github.ref == 'refs/heads/master' && github.sha || github.ref }}
|
group: wasm-${{ github.workflow }}-${{ github.ref == 'refs/heads/master' && github.sha || github.ref }}
|
||||||
cancel-in-progress: true
|
cancel-in-progress: true
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
|
|
4
.github/workflows/websockets_ci.yml
vendored
4
.github/workflows/websockets_ci.yml
vendored
|
@ -17,12 +17,12 @@ on:
|
||||||
- '!cmd/tools/builders/**.v'
|
- '!cmd/tools/builders/**.v'
|
||||||
|
|
||||||
concurrency:
|
concurrency:
|
||||||
group: ${{ github.workflow }}-${{ github.ref == 'refs/heads/master' && github.sha || github.ref }}
|
group: websockets-${{ github.workflow }}-${{ github.ref == 'refs/heads/master' && github.sha || github.ref }}
|
||||||
cancel-in-progress: true
|
cancel-in-progress: true
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
websocket_tests:
|
websocket_tests:
|
||||||
runs-on: ubuntu-20.04
|
runs-on: ubuntu-24.04
|
||||||
timeout-minutes: 121
|
timeout-minutes: 121
|
||||||
env:
|
env:
|
||||||
VFLAGS: -cc tcc -no-retry-compilation
|
VFLAGS: -cc tcc -no-retry-compilation
|
||||||
|
|
2
.github/workflows/windows_ci.yml
vendored
2
.github/workflows/windows_ci.yml
vendored
|
@ -20,7 +20,7 @@ on:
|
||||||
- '!cmd/tools/builders/**.v'
|
- '!cmd/tools/builders/**.v'
|
||||||
|
|
||||||
concurrency:
|
concurrency:
|
||||||
group: ${{ github.workflow }}-${{ github.ref == 'refs/heads/master' && github.sha || github.ref }}
|
group: windows-${{ github.workflow }}-${{ github.ref == 'refs/heads/master' && github.sha || github.ref }}
|
||||||
cancel-in-progress: true
|
cancel-in-progress: true
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
|
|
|
@ -60,10 +60,10 @@ fn install_dependencies_for_examples_and_tools_tcc() {
|
||||||
exec('v retry -- sudo apt install --quiet -y libssl-dev sqlite3 libsqlite3-dev valgrind')
|
exec('v retry -- sudo apt install --quiet -y libssl-dev sqlite3 libsqlite3-dev valgrind')
|
||||||
exec('v retry -- sudo apt install --quiet -y libfreetype6-dev libxi-dev libxcursor-dev libgl-dev libxrandr-dev libasound2-dev')
|
exec('v retry -- sudo apt install --quiet -y libfreetype6-dev libxi-dev libxcursor-dev libgl-dev libxrandr-dev libasound2-dev')
|
||||||
// The following is needed for examples/wkhtmltopdf.v
|
// The following is needed for examples/wkhtmltopdf.v
|
||||||
exec('v retry -- wget https://github.com/wkhtmltopdf/packaging/releases/download/0.12.6-1/wkhtmltox_0.12.6-1.focal_amd64.deb')
|
exec('v retry -- wget https://github.com/wkhtmltopdf/packaging/releases/download/0.12.6.1-2/wkhtmltox_0.12.6.1-2.jammy_amd64.deb')
|
||||||
exec('v retry -- sudo apt install --quiet -y xfonts-75dpi xfonts-base')
|
exec('v retry -- sudo apt install --quiet -y xfonts-75dpi xfonts-base')
|
||||||
exec('v retry -- sudo apt install --quiet -y expect')
|
exec('v retry -- sudo apt install --quiet -y expect')
|
||||||
exec('v retry -- sudo dpkg -i wkhtmltox_0.12.6-1.focal_amd64.deb')
|
exec('v retry -- sudo dpkg -i wkhtmltox_0.12.6.1-2.jammy_amd64.deb')
|
||||||
}
|
}
|
||||||
|
|
||||||
fn test_v_to_c_tcc() {
|
fn test_v_to_c_tcc() {
|
||||||
|
|
|
@ -4,6 +4,10 @@ const vexe = @VEXE
|
||||||
const vroot = os.dir(vexe)
|
const vroot = os.dir(vexe)
|
||||||
const tfolder = os.join_path(os.vtmp_dir(), 'cover_test')
|
const tfolder = os.join_path(os.vtmp_dir(), 'cover_test')
|
||||||
|
|
||||||
|
const t1 = np(os.join_path(tfolder, 't1'))
|
||||||
|
const t2 = np(os.join_path(tfolder, 't2'))
|
||||||
|
const t3 = np(os.join_path(tfolder, 't3'))
|
||||||
|
|
||||||
fn testsuite_begin() {
|
fn testsuite_begin() {
|
||||||
os.setenv('VCOLORS', 'never', true)
|
os.setenv('VCOLORS', 'never', true)
|
||||||
os.chdir(vroot)!
|
os.chdir(vroot)!
|
||||||
|
@ -16,7 +20,7 @@ fn testsuite_end() {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn test_help() {
|
fn test_help() {
|
||||||
res := os.execute('${os.quoted_path(vexe)} cover -h')
|
res := execute('${os.quoted_path(vexe)} cover -h')
|
||||||
assert res.exit_code == 0
|
assert res.exit_code == 0
|
||||||
assert res.output.contains('Usage: v cover')
|
assert res.output.contains('Usage: v cover')
|
||||||
assert res.output.contains('Description: Analyze & make reports')
|
assert res.output.contains('Description: Analyze & make reports')
|
||||||
|
@ -34,27 +38,20 @@ fn np(path string) string {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn test_simple() {
|
fn test_simple() {
|
||||||
// if true {
|
|
||||||
// return
|
|
||||||
//}
|
|
||||||
|
|
||||||
t1 := np(os.join_path(tfolder, 't1'))
|
|
||||||
t2 := np(os.join_path(tfolder, 't2'))
|
|
||||||
t3 := np(os.join_path(tfolder, 't3'))
|
|
||||||
assert !os.exists(t1), t1
|
assert !os.exists(t1), t1
|
||||||
assert !os.exists(t2), t2
|
assert !os.exists(t2), t2
|
||||||
assert !os.exists(t3), t3
|
assert !os.exists(t3), t3
|
||||||
|
|
||||||
r1 := os.execute('${os.quoted_path(vexe)} -no-skip-unused -coverage ${os.quoted_path(t1)} cmd/tools/vcover/testdata/simple/t1_test.v')
|
r1 := execute('${os.quoted_path(vexe)} -no-skip-unused -coverage ${os.quoted_path(t1)} cmd/tools/vcover/testdata/simple/t1_test.v')
|
||||||
assert r1.exit_code == 0, r1.str()
|
assert r1.exit_code == 0, r1.str()
|
||||||
assert r1.output.trim_space() == '10', r1.str()
|
assert r1.output.trim_space() == '10', r1.str()
|
||||||
assert os.exists(t1), t1
|
assert os.exists(t1), t1
|
||||||
cmd := '${os.quoted_path(vexe)} cover ${os.quoted_path(t1)} --filter vcover/testdata/simple/'
|
cmd := '${os.quoted_path(vexe)} cover ${os.quoted_path(t1)} --filter vcover/testdata/simple/'
|
||||||
filter1 := os.execute(cmd)
|
filter1 := execute(cmd)
|
||||||
assert filter1.exit_code == 0, filter1.output
|
assert filter1.exit_code == 0, filter1.output
|
||||||
assert filter1.output.contains('cmd/tools/vcover/testdata/simple/simple.v'), filter1.output
|
assert filter1.output.contains('cmd/tools/vcover/testdata/simple/simple.v'), filter1.output
|
||||||
assert filter1.output.trim_space().ends_with('| 4 | 9 | 44.44%'), filter1.output
|
assert filter1.output.trim_space().ends_with('| 4 | 9 | 44.44%'), filter1.output
|
||||||
hfilter1 := os.execute('${os.quoted_path(vexe)} cover ${os.quoted_path(t1)} --filter vcover/testdata/simple/ -H -P false')
|
hfilter1 := execute('${os.quoted_path(vexe)} cover ${os.quoted_path(t1)} --filter vcover/testdata/simple/ -H -P false')
|
||||||
assert hfilter1.exit_code == 0, hfilter1.output
|
assert hfilter1.exit_code == 0, hfilter1.output
|
||||||
assert !hfilter1.output.contains('%'), hfilter1.output
|
assert !hfilter1.output.contains('%'), hfilter1.output
|
||||||
houtput1 := hfilter1.output.trim_space().split_into_lines()
|
houtput1 := hfilter1.output.trim_space().split_into_lines()
|
||||||
|
@ -72,15 +69,15 @@ fn test_simple() {
|
||||||
assert nzeros1.any(it.contains('simple.v:8')), nzeros1.str()
|
assert nzeros1.any(it.contains('simple.v:8')), nzeros1.str()
|
||||||
assert nzeros1.any(it.contains('simple.v:25')), nzeros1.str()
|
assert nzeros1.any(it.contains('simple.v:25')), nzeros1.str()
|
||||||
|
|
||||||
r2 := os.execute('${os.quoted_path(vexe)} -no-skip-unused -coverage ${os.quoted_path(t2)} cmd/tools/vcover/testdata/simple/t2_test.v')
|
r2 := execute('${os.quoted_path(vexe)} -no-skip-unused -coverage ${os.quoted_path(t2)} cmd/tools/vcover/testdata/simple/t2_test.v')
|
||||||
assert r2.exit_code == 0, r2.str()
|
assert r2.exit_code == 0, r2.str()
|
||||||
assert r2.output.trim_space() == '24', r2.str()
|
assert r2.output.trim_space() == '24', r2.str()
|
||||||
assert os.exists(t2), t2
|
assert os.exists(t2), t2
|
||||||
filter2 := os.execute('${os.quoted_path(vexe)} cover ${os.quoted_path(t2)} --filter vcover/testdata/simple')
|
filter2 := execute('${os.quoted_path(vexe)} cover ${os.quoted_path(t2)} --filter vcover/testdata/simple')
|
||||||
assert filter2.exit_code == 0, filter2.output
|
assert filter2.exit_code == 0, filter2.output
|
||||||
assert filter2.output.contains('cmd/tools/vcover/testdata/simple/simple.v')
|
assert filter2.output.contains('cmd/tools/vcover/testdata/simple/simple.v')
|
||||||
assert filter2.output.trim_space().ends_with('| 6 | 9 | 66.67%'), filter2.output
|
assert filter2.output.trim_space().ends_with('| 6 | 9 | 66.67%'), filter2.output
|
||||||
hfilter2 := os.execute('${os.quoted_path(vexe)} cover ${os.quoted_path(t2)} --filter testdata/simple -H -P false')
|
hfilter2 := execute('${os.quoted_path(vexe)} cover ${os.quoted_path(t2)} --filter testdata/simple -H -P false')
|
||||||
assert hfilter2.exit_code == 0, hfilter2.output
|
assert hfilter2.exit_code == 0, hfilter2.output
|
||||||
assert !hfilter2.output.contains('%'), hfilter2.output
|
assert !hfilter2.output.contains('%'), hfilter2.output
|
||||||
houtput2 := hfilter2.output.trim_space().split_into_lines()
|
houtput2 := hfilter2.output.trim_space().split_into_lines()
|
||||||
|
@ -97,12 +94,17 @@ fn test_simple() {
|
||||||
assert nzeros2.any(it.contains('simple.v:25')), nzeros2.str()
|
assert nzeros2.any(it.contains('simple.v:25')), nzeros2.str()
|
||||||
|
|
||||||
// Run both tests. The coverage should be combined and == 100%
|
// Run both tests. The coverage should be combined and == 100%
|
||||||
r3 := os.execute('${os.quoted_path(vexe)} -no-skip-unused -coverage ${os.quoted_path(t3)} test cmd/tools/vcover/testdata/simple/')
|
r3 := execute('${os.quoted_path(vexe)} -no-skip-unused -coverage ${os.quoted_path(t3)} test cmd/tools/vcover/testdata/simple/')
|
||||||
assert r3.exit_code == 0, r3.str()
|
assert r3.exit_code == 0, r3.str()
|
||||||
assert r3.output.trim_space().contains('Summary for all V _test.v files: '), r3.str()
|
assert r3.output.trim_space().contains('Summary for all V _test.v files: '), r3.str()
|
||||||
assert os.exists(t3), t3
|
assert os.exists(t3), t3
|
||||||
filter3 := os.execute('${os.quoted_path(vexe)} cover ${os.quoted_path(t3)} --filter simple/')
|
filter3 := execute('${os.quoted_path(vexe)} cover ${os.quoted_path(t3)} --filter simple/')
|
||||||
assert filter3.exit_code == 0, filter3.str()
|
assert filter3.exit_code == 0, filter3.str()
|
||||||
assert filter3.output.contains('cmd/tools/vcover/testdata/simple/simple.v'), filter3.str()
|
assert filter3.output.contains('cmd/tools/vcover/testdata/simple/simple.v'), filter3.str()
|
||||||
assert filter3.output.trim_space().match_glob('*cmd/tools/vcover/testdata/simple/simple.v *| 9 | 9 | 100.00%'), filter3.str()
|
assert filter3.output.trim_space().match_glob('*cmd/tools/vcover/testdata/simple/simple.v *| 9 | 9 | 100.00%'), filter3.str()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn execute(cmd string) os.Result {
|
||||||
|
eprintln('Executing: ${cmd}')
|
||||||
|
return os.execute(cmd)
|
||||||
|
}
|
||||||
|
|
|
@ -14,6 +14,7 @@ mut:
|
||||||
test_dirs []string = ['cmd', 'vlib']
|
test_dirs []string = ['cmd', 'vlib']
|
||||||
is_asan_compiler bool
|
is_asan_compiler bool
|
||||||
is_msan_compiler bool
|
is_msan_compiler bool
|
||||||
|
is_ubsan_compiler bool
|
||||||
// Options relating to the v command itself (passed in the prefix) `v [...args] test-self`.
|
// Options relating to the v command itself (passed in the prefix) `v [...args] test-self`.
|
||||||
werror bool
|
werror bool
|
||||||
sanitize_memory bool
|
sanitize_memory bool
|
||||||
|
@ -234,6 +235,9 @@ const skip_with_asan_compiler = [
|
||||||
const skip_with_msan_compiler = [
|
const skip_with_msan_compiler = [
|
||||||
'do_not_remove',
|
'do_not_remove',
|
||||||
]
|
]
|
||||||
|
const skip_with_ubsan_compiler = [
|
||||||
|
'do_not_remove',
|
||||||
|
]
|
||||||
const skip_on_musl = [
|
const skip_on_musl = [
|
||||||
'do_not_remove',
|
'do_not_remove',
|
||||||
'vlib/v/slow_tests/profile/profile_test.v',
|
'vlib/v/slow_tests/profile/profile_test.v',
|
||||||
|
@ -396,6 +400,9 @@ fn Config.init(vargs []string, targs []string) !Config {
|
||||||
'-msan-compiler', '--msan-compiler' {
|
'-msan-compiler', '--msan-compiler' {
|
||||||
cfg.is_msan_compiler = true
|
cfg.is_msan_compiler = true
|
||||||
}
|
}
|
||||||
|
'-ubsan-compiler', '--ubsan-compiler' {
|
||||||
|
cfg.is_ubsan_compiler = true
|
||||||
|
}
|
||||||
else {
|
else {
|
||||||
if arg.starts_with('-') {
|
if arg.starts_with('-') {
|
||||||
errs << 'error: unknown flag `${arg}`'
|
errs << 'error: unknown flag `${arg}`'
|
||||||
|
@ -465,7 +472,7 @@ fn main() {
|
||||||
}
|
}
|
||||||
if !cfg.run_slow_sanitize
|
if !cfg.run_slow_sanitize
|
||||||
&& ((cfg.sanitize_undefined || cfg.sanitize_memory || cfg.sanitize_address)
|
&& ((cfg.sanitize_undefined || cfg.sanitize_memory || cfg.sanitize_address)
|
||||||
|| (cfg.is_msan_compiler || cfg.is_asan_compiler)) {
|
|| (cfg.is_msan_compiler || cfg.is_asan_compiler || cfg.is_ubsan_compiler)) {
|
||||||
tsession.skip_files << skip_fsanitize_too_slow
|
tsession.skip_files << skip_fsanitize_too_slow
|
||||||
}
|
}
|
||||||
if cfg.werror {
|
if cfg.werror {
|
||||||
|
@ -486,6 +493,9 @@ fn main() {
|
||||||
if cfg.is_msan_compiler {
|
if cfg.is_msan_compiler {
|
||||||
tsession.skip_files << skip_with_msan_compiler
|
tsession.skip_files << skip_with_msan_compiler
|
||||||
}
|
}
|
||||||
|
if cfg.is_ubsan_compiler {
|
||||||
|
tsession.skip_files << skip_with_ubsan_compiler
|
||||||
|
}
|
||||||
if cfg.is_musl_ci {
|
if cfg.is_musl_ci {
|
||||||
tsession.skip_files << skip_on_musl
|
tsession.skip_files << skip_on_musl
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,6 +29,9 @@ pub fn vmemcpy(dest voidptr, const_src voidptr, n isize) voidptr {
|
||||||
print_backtrace()
|
print_backtrace()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if n == 0 {
|
||||||
|
return dest
|
||||||
|
}
|
||||||
unsafe {
|
unsafe {
|
||||||
return C.memcpy(dest, const_src, n)
|
return C.memcpy(dest, const_src, n)
|
||||||
}
|
}
|
||||||
|
@ -44,6 +47,9 @@ pub fn vmemmove(dest voidptr, const_src voidptr, n isize) voidptr {
|
||||||
$if trace_vmemmove ? {
|
$if trace_vmemmove ? {
|
||||||
C.fprintf(C.stderr, c'vmemmove dest: %p src: %p n: %6ld\n', dest, const_src, n)
|
C.fprintf(C.stderr, c'vmemmove dest: %p src: %p n: %6ld\n', dest, const_src, n)
|
||||||
}
|
}
|
||||||
|
if n == 0 {
|
||||||
|
return dest
|
||||||
|
}
|
||||||
unsafe {
|
unsafe {
|
||||||
return C.memmove(dest, const_src, n)
|
return C.memmove(dest, const_src, n)
|
||||||
}
|
}
|
||||||
|
@ -66,6 +72,9 @@ pub fn vmemcmp(const_s1 voidptr, const_s2 voidptr, n isize) int {
|
||||||
$if trace_vmemcmp ? {
|
$if trace_vmemcmp ? {
|
||||||
C.fprintf(C.stderr, c'vmemcmp s1: %p s2: %p n: %6ld\n', const_s1, const_s2, n)
|
C.fprintf(C.stderr, c'vmemcmp s1: %p s2: %p n: %6ld\n', const_s1, const_s2, n)
|
||||||
}
|
}
|
||||||
|
if n == 0 {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
unsafe {
|
unsafe {
|
||||||
return C.memcmp(const_s1, const_s2, n)
|
return C.memcmp(const_s1, const_s2, n)
|
||||||
}
|
}
|
||||||
|
@ -85,6 +94,9 @@ pub fn vmemset(s voidptr, c int, n isize) voidptr {
|
||||||
print_backtrace()
|
print_backtrace()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if n == 0 {
|
||||||
|
return s
|
||||||
|
}
|
||||||
unsafe {
|
unsafe {
|
||||||
return C.memset(s, c, n)
|
return C.memset(s, c, n)
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,7 +28,11 @@ pub fn (mut d TerminalStreamingDownloader) on_chunk(request &Request, chunk []u8
|
||||||
d.past_time = now
|
d.past_time = now
|
||||||
d.past_received = already_received
|
d.past_received = already_received
|
||||||
ratio := f64(already_received) / f64(expected)
|
ratio := f64(already_received) / f64(expected)
|
||||||
estimated := time.Duration(i64(f64(elapsed) / ratio))
|
res := f64(elapsed) / ratio
|
||||||
|
mut estimated := time.Duration(max_i64)
|
||||||
|
if f64(min_i64) < res && res < f64(max_i64) {
|
||||||
|
estimated = i64(res)
|
||||||
|
}
|
||||||
speed := f64(time.millisecond) * f64(already_received) / f64(elapsed)
|
speed := f64(time.millisecond) * f64(already_received) / f64(elapsed)
|
||||||
elapsed_s := elapsed.seconds()
|
elapsed_s := elapsed.seconds()
|
||||||
estimated_s := estimated.seconds()
|
estimated_s := estimated.seconds()
|
||||||
|
|
|
@ -206,12 +206,14 @@ fn (mut s Server) setup_callbacks(mut sc ServerClient) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// set standard close so we can remove client if closed
|
// set standard close so we can remove client if closed
|
||||||
sc.client.on_close_ref(fn (mut c Client, code int, reason string, mut sc ServerClient) ! {
|
sc.client.on_close_ref(delete_client_cb, sc)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn delete_client_cb(mut c Client, code int, reason string, mut sc ServerClient) ! {
|
||||||
c.logger.debug('server-> Delete client')
|
c.logger.debug('server-> Delete client')
|
||||||
lock sc.server.server_state {
|
lock sc.server.server_state {
|
||||||
sc.server.server_state.clients.delete(sc.client.id)
|
sc.server.server_state.clients.delete(sc.client.id)
|
||||||
}
|
}
|
||||||
}, sc)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// accept_new_client creates a new client instance for client that connects to the socket
|
// accept_new_client creates a new client instance for client that connects to the socket
|
||||||
|
|
|
@ -87,23 +87,18 @@ fn start_server_in_thread_and_wait_till_it_is_ready_to_accept_connections(mut ws
|
||||||
eprintln('-----------------------------------------------------------------------------')
|
eprintln('-----------------------------------------------------------------------------')
|
||||||
}
|
}
|
||||||
|
|
||||||
// ws_test tests connect to the websocket server from websocket client
|
fn open_cb(mut client websocket.Client) ! {
|
||||||
fn ws_test(family net.AddrFamily, uri string) ! {
|
|
||||||
eprintln('connecting to ${uri} ...')
|
|
||||||
|
|
||||||
mut test_results := WebsocketTestResults{}
|
|
||||||
mut client := websocket.new_client(uri)!
|
|
||||||
client.on_open(fn (mut client websocket.Client) ! {
|
|
||||||
client.pong()!
|
client.pong()!
|
||||||
assert true
|
assert true
|
||||||
})
|
}
|
||||||
client.on_error(fn (mut client websocket.Client, err string) ! {
|
|
||||||
|
fn close_cb(mut client websocket.Client, err string) ! {
|
||||||
println('error: ${err}')
|
println('error: ${err}')
|
||||||
// this can be thrown by internet connection problems
|
// this can be thrown by internet connection problems
|
||||||
assert false
|
assert false
|
||||||
})
|
}
|
||||||
|
|
||||||
client.on_message_ref(fn (mut client websocket.Client, msg &websocket.Message, mut res WebsocketTestResults) ! {
|
fn message_cb(mut client websocket.Client, msg &websocket.Message, mut res WebsocketTestResults) ! {
|
||||||
println('client got type: ${msg.opcode} payload:\n${msg.payload}')
|
println('client got type: ${msg.opcode} payload:\n${msg.payload}')
|
||||||
if msg.opcode == .text_frame {
|
if msg.opcode == .text_frame {
|
||||||
smessage := msg.payload.bytestr()
|
smessage := msg.payload.bytestr()
|
||||||
|
@ -121,7 +116,17 @@ fn ws_test(family net.AddrFamily, uri string) ! {
|
||||||
} else {
|
} else {
|
||||||
println('Binary message: ${msg}')
|
println('Binary message: ${msg}')
|
||||||
}
|
}
|
||||||
}, test_results)
|
}
|
||||||
|
|
||||||
|
// ws_test tests connect to the websocket server from websocket client
|
||||||
|
fn ws_test(family net.AddrFamily, uri string) ! {
|
||||||
|
eprintln('connecting to ${uri} ...')
|
||||||
|
|
||||||
|
mut test_results := WebsocketTestResults{}
|
||||||
|
mut client := websocket.new_client(uri)!
|
||||||
|
client.on_open(open_cb)
|
||||||
|
client.on_error(close_cb)
|
||||||
|
client.on_message_ref(message_cb, test_results)
|
||||||
client.connect()!
|
client.connect()!
|
||||||
spawn client.listen()
|
spawn client.listen()
|
||||||
|
|
||||||
|
@ -140,17 +145,21 @@ fn ws_test(family net.AddrFamily, uri string) ! {
|
||||||
assert test_results.nr_messages == 2
|
assert test_results.nr_messages == 2
|
||||||
}
|
}
|
||||||
|
|
||||||
fn test_on_close_when_server_closing_connection() ! {
|
fn on_message_cb_2(mut cli websocket.Client, msg &websocket.Message) ! {
|
||||||
mut ws := websocket.new_server(.ip, 30003, '')
|
|
||||||
ws.on_message(fn (mut cli websocket.Client, msg &websocket.Message) ! {
|
|
||||||
if msg.opcode == .text_frame {
|
if msg.opcode == .text_frame {
|
||||||
cli.close(1000, 'closing connection')!
|
cli.close(1000, 'closing connection')!
|
||||||
}
|
}
|
||||||
})
|
}
|
||||||
mut test_results := WebsocketTestResults{}
|
|
||||||
ws.on_close_ref(fn (mut cli websocket.Client, code int, reason string, mut res WebsocketTestResults) ! {
|
fn on_close_cb_2(mut cli websocket.Client, code int, reason string, mut res WebsocketTestResults) ! {
|
||||||
res.nr_closes++
|
res.nr_closes++
|
||||||
}, test_results)
|
}
|
||||||
|
|
||||||
|
fn test_on_close_when_server_closing_connection() ! {
|
||||||
|
mut ws := websocket.new_server(.ip, 30003, '')
|
||||||
|
ws.on_message(on_message_cb_2)
|
||||||
|
mut test_results := WebsocketTestResults{}
|
||||||
|
ws.on_close_ref(on_close_cb_2, test_results)
|
||||||
start_server_in_thread_and_wait_till_it_is_ready_to_accept_connections(mut ws)
|
start_server_in_thread_and_wait_till_it_is_ready_to_accept_connections(mut ws)
|
||||||
|
|
||||||
mut client := websocket.new_client('ws://localhost:30003')!
|
mut client := websocket.new_client('ws://localhost:30003')!
|
||||||
|
@ -162,15 +171,17 @@ fn test_on_close_when_server_closing_connection() ! {
|
||||||
assert test_results.nr_closes == 1
|
assert test_results.nr_closes == 1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn on_close_cb_3(mut cli websocket.Client, code int, reason string, mut res WebsocketTestResults) ! {
|
||||||
|
res.nr_closes++
|
||||||
|
}
|
||||||
|
|
||||||
fn test_on_close_when_client_closing_connection() ! {
|
fn test_on_close_when_client_closing_connection() ! {
|
||||||
mut ws := websocket.new_server(.ip, 30004, '')
|
mut ws := websocket.new_server(.ip, 30004, '')
|
||||||
start_server_in_thread_and_wait_till_it_is_ready_to_accept_connections(mut ws)
|
start_server_in_thread_and_wait_till_it_is_ready_to_accept_connections(mut ws)
|
||||||
|
|
||||||
mut client := websocket.new_client('ws://localhost:30004')!
|
mut client := websocket.new_client('ws://localhost:30004')!
|
||||||
mut test_results := WebsocketTestResults{}
|
mut test_results := WebsocketTestResults{}
|
||||||
client.on_close_ref(fn (mut cli websocket.Client, code int, reason string, mut res WebsocketTestResults) ! {
|
client.on_close_ref(on_close_cb_3, test_results)
|
||||||
res.nr_closes++
|
|
||||||
}, test_results)
|
|
||||||
client.connect()!
|
client.connect()!
|
||||||
spawn client.listen()
|
spawn client.listen()
|
||||||
time.sleep(1000 * time.millisecond)
|
time.sleep(1000 * time.millisecond)
|
||||||
|
|
|
@ -656,6 +656,7 @@ fn (mut c Checker) check_shift(mut node ast.InfixExpr, left_type_ ast.Type, righ
|
||||||
node.right.pos())
|
node.right.pos())
|
||||||
return left_type
|
return left_type
|
||||||
}
|
}
|
||||||
|
if !c.inside_unsafe {
|
||||||
if node.ct_left_value_evaled {
|
if node.ct_left_value_evaled {
|
||||||
if lval := node.ct_left_value.i64() {
|
if lval := node.ct_left_value.i64() {
|
||||||
if lval < 0 {
|
if lval < 0 {
|
||||||
|
@ -664,6 +665,7 @@ fn (mut c Checker) check_shift(mut node ast.InfixExpr, left_type_ ast.Type, righ
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
// c.note('can not evaluate "$node.right" at comptime, err: $err', node.pos)
|
// c.note('can not evaluate "$node.right" at comptime, err: $err', node.pos)
|
||||||
return left_type
|
return left_type
|
||||||
|
|
|
@ -5249,7 +5249,7 @@ fn (mut g Gen) ident(node ast.Ident) {
|
||||||
key := node.name
|
key := node.name
|
||||||
g.write('/* obf identfn: ${key} */')
|
g.write('/* obf identfn: ${key} */')
|
||||||
name = g.obf_table[key] or {
|
name = g.obf_table[key] or {
|
||||||
panic('cgen: obf key name "${key}" not found, this should never happen')
|
panic('cgen: obf name "${key}" not found, this should never happen')
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -362,7 +362,11 @@ const c_common_macros = '
|
||||||
|
|
||||||
// for __offset_of
|
// for __offset_of
|
||||||
#ifndef __offsetof
|
#ifndef __offsetof
|
||||||
|
#if defined(__TINYC__) || defined(_MSC_VER)
|
||||||
#define __offsetof(PTYPE,FIELDNAME) ((size_t)(&((PTYPE *)0)->FIELDNAME))
|
#define __offsetof(PTYPE,FIELDNAME) ((size_t)(&((PTYPE *)0)->FIELDNAME))
|
||||||
|
#else
|
||||||
|
#define __offsetof(st, m) __builtin_offsetof(st, m)
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define OPTION_CAST(x) (x)
|
#define OPTION_CAST(x) (x)
|
||||||
|
|
|
@ -34,6 +34,13 @@ fn test_native() {
|
||||||
}
|
}
|
||||||
bench.set_total_expected_steps(tests.len)
|
bench.set_total_expected_steps(tests.len)
|
||||||
for test in tests {
|
for test in tests {
|
||||||
|
if test == 'libc.vv' {
|
||||||
|
// TODO: remove the skip here, when the native backend is more advanced
|
||||||
|
if os.getenv('VNATIVE_SKIP_LIBC_VV') != '' {
|
||||||
|
println('>>> SKIPPING ${test} since VNATIVE_SKIP_LIBC_VV is defined')
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
}
|
||||||
bench.step()
|
bench.step()
|
||||||
full_test_path := os.real_path(os.join_path(dir, test))
|
full_test_path := os.real_path(os.join_path(dir, test))
|
||||||
test_file_name := os.file_name(test)
|
test_file_name := os.file_name(test)
|
||||||
|
@ -41,7 +48,7 @@ fn test_native() {
|
||||||
work_test_path := os.join_path(wrkdir, test_file_name)
|
work_test_path := os.join_path(wrkdir, test_file_name)
|
||||||
exe_test_path := os.join_path(wrkdir, test_file_name + '.exe')
|
exe_test_path := os.join_path(wrkdir, test_file_name + '.exe')
|
||||||
tmperrfile := os.join_path(dir, test + '.tmperr')
|
tmperrfile := os.join_path(dir, test + '.tmperr')
|
||||||
cmd := '${os.quoted_path(vexe)} -o ${os.quoted_path(exe_test_path)} -b native -skip-unused ${os.quoted_path(full_test_path)} -d no_backtrace -d custom_define 2> ${os.quoted_path(tmperrfile)}'
|
cmd := '${os.quoted_path(vexe)} -o ${os.quoted_path(exe_test_path)} -b native ${os.quoted_path(full_test_path)} -d no_backtrace -d custom_define 2> ${os.quoted_path(tmperrfile)}'
|
||||||
if is_verbose {
|
if is_verbose {
|
||||||
println(cmd)
|
println(cmd)
|
||||||
}
|
}
|
||||||
|
|
|
@ -925,7 +925,7 @@ pub fn (mut t Transformer) infix_expr(mut node ast.InfixExpr) ast.Expr {
|
||||||
}
|
}
|
||||||
.left_shift {
|
.left_shift {
|
||||||
return ast.IntegerLiteral{
|
return ast.IntegerLiteral{
|
||||||
val: (u32(left_val) << right_val).str()
|
val: (unsafe { left_val << right_val }).str()
|
||||||
pos: pos
|
pos: pos
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -937,7 +937,7 @@ pub fn (mut t Transformer) infix_expr(mut node ast.InfixExpr) ast.Expr {
|
||||||
}
|
}
|
||||||
.unsigned_right_shift {
|
.unsigned_right_shift {
|
||||||
return ast.IntegerLiteral{
|
return ast.IntegerLiteral{
|
||||||
val: (left_val >>> right_val).str()
|
val: (u64(left_val) >>> right_val).str()
|
||||||
pos: pos
|
pos: pos
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -291,6 +291,7 @@ pub fn (mut bmp BitMap) aline(in_x0 int, in_y0 int, in_x1 int, in_y1 int, c u32)
|
||||||
mut y := y0
|
mut y := y0
|
||||||
for y <= y1 + 0.5 {
|
for y <= y1 + 0.5 {
|
||||||
x := n * (y - y0) + x0
|
x := n * (y - y0) + x0
|
||||||
|
if !math.is_nan(x) && !math.is_nan(y) {
|
||||||
e := f32(1 - math.abs(x - 0.5 - int(x)))
|
e := f32(1 - math.abs(x - 0.5 - int(x)))
|
||||||
bmp.plot(int(x), int(y), color_multiply_alpha(c, f32(e * 0.75)))
|
bmp.plot(int(x), int(y), color_multiply_alpha(c, f32(e * 0.75)))
|
||||||
|
|
||||||
|
@ -305,6 +306,7 @@ pub fn (mut bmp BitMap) aline(in_x0 int, in_y0 int, in_x1 int, in_y1 int, c u32)
|
||||||
v2 := math.abs(x - xs1) / dist * (1 - e)
|
v2 := math.abs(x - xs1) / dist * (1 - e)
|
||||||
bmp.plot(int(xs2), int(y), color_multiply_alpha(c, f32(v2)))
|
bmp.plot(int(xs2), int(y), color_multiply_alpha(c, f32(v2)))
|
||||||
}
|
}
|
||||||
|
}
|
||||||
y += 1.0
|
y += 1.0
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue