From 420c16eb4be73fb3fd27970a58fa0a59a3a0aa47 Mon Sep 17 00:00:00 2001 From: Alexander Medvednikov Date: Fri, 19 Sep 2025 13:36:29 +0300 Subject: [PATCH] V 0.4.12 --- CHANGELOG.md | 402 ++++++++++++++++++++++++++++++++++ cmd/tools/changelog_helper.v | 31 ++- v.mod | 2 +- vlib/v/util/version/version.v | 2 +- 4 files changed, 431 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 75b85377a4..bcab50edbc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,403 @@ +## V 0.4.12 +*19 Sep 2025* + +#### Improvements in the language +- json2: replace encoder with a new implementation. It's 70% faster than the old json2, and 110% faster than json that is based on cJSON (#25224) +- Virtual C consts with custom types (const C.MY_CONST u8) +- Support `-div-by-zero-is-zero`, which allows for `x / 0 == 0` and `x % 0 == x`, avoiding division by zero traps/panics (#24981) +- Limit -div-by-zero-is-zero influence to just the integer types (for f32 and f64, / produces a +inf or -inf value, and the program continues to run) +- VLS mode for the language server in pure V +- Add support for `@OS`, `@CCOMPILER` `@BACKEND` and `@PLATFORM` (#25174) + +#### Breaking changes +- Deprecate `gx` and replace all occurences with `gg` (which now contains all the functionality of `gx`) (#24966) + +#### Checker improvements/fixes +- Fix `sizeof(T)` usage in generic struct (fix #24806) (#24808) +- Add `$if sizeof(T) == int_literal {` support (#24831) +- Improve virtual C consts +- Markused,checker: fix hello world size after the introduction of `builtin.closure` in 2d87ac4 (#24989) +- Remove dump() dependency from ComptimeFor (#25000) +- Cleanup - remove unused c.using_new_err_struct (#25036) +- Cleanup `err` removal (#25043) +- Add comptime support for s390x, ppc64le and loongarch64 platforms (#25048) +- Allow for `v -is_o -o x mm.v`, where `mm.v` starts with `module abc` (i.e. not just `module main`) +- Fix calls with result propagation, using other consts, in const declaration expressions (fix #21609) (#25060) +- Fix array init with interface (fix #24255) (#25073) +- Fix missing map float key duplicated checking (fix #25098) (#25117) +- Fix missing check for struct generic init from call (fix #25084) (#25119) +- Fix missing check for empty array to generic param (fix #25056) (#25118) +- Rewrite comptime_if_cond() to support comptime if cond evaluate (fix #24938) (fix #25099) (#25122) +- Add error for struct not init (fix #24893) (#25134) +- Fix sql insert expr propagate result (fix #24833) (#25136) +- Fix checking return type call disregarding unwrapping (fix #25140) (#25143) +- Ensure the defer behavior matches that of cgen (fix #25148) (#25146) +- Nil check for c.table.cur_fn in gen_branch_context_string() (fix #25170) (#25171) +- Relax the "unreachable code after a @[noreturn] call" error to a warning to reduce prototyping friction (#25173) +- Fix multi return arg passing checking (fix #25167) (fix #25180) (#25177) +- Use keywords matcher trie for imported symbol presence checks, instead of `x in p.imported_symbol` (#25201) +- Fix iteration over mutable option (fix #24860) (#25199) +- Add `T.typ` and `T.unaliased_typ` checking to `$match` (fix #25200) (#25202) +- Add more checks for map.delete (fix #25204) (#25205) +- Fix static init var (fix #25203) (#25209) +- Add top level comptime support for `$match @OS {` too (#25222) +- Comptime match only eval true branch (fix #25223) (#25225) +- Fix multi return var passing to fn arg (potential fix for #24870) (#25250) +- Prevent usage of imported module name prefix as identifier names, to avoid cgen collisions (#25280) +- Disallow duplicate export names (fix #25301) (#25302) +- Reduce the verboseness of `unsupported size ... for global` messages, for `v -b native examples/hello_world.v` + +#### Parser improvements +- Split parser methods to files based on topic (#24786) +- Fix arch loongarch64 comptime support (fix #24906) (#24907) +- Fix const error +- pref,parser: implement support for `-force-bounds-checking` to enable easier testing of functions tagged with `@[direct_array_access]` (essentially turning off that flag) +- Allow keyword as struct param key on fn call (fix #24957) (#24958) +- Fix syntax error for `for c in [othermod.Struct{field: 255}] {` (fix #24943) (#24978) +- Reduce calls to util.contains_capital +- Fix overriding of fn names in `-translated` mode (fix #25024) (#25061) +- Fix asm modifier parsing (allow for `=r, =&r, +r, +&r,=m,=rm,=@ccl, =*r`) (fix #25070) (#25072) +- Allow using aliased types in interface method implementations (provide backwards compatibility to `ui`, during the migration of code from `gx` to `gg`) (#25106) +- Fix interface method declaration with fixed array return type (fix #25137) (#25145) +- Prepare for eliminating a warning for `v -cross -o vc/v.c cmd/v` (part 1) (reduce CI annotation noise) +- Add duplicate import symbol detect (fix #25185) (#25187) +- vfmt,parser: move mark used from vfmt to parser (#25190) +- v.ast: add a `mod` field to ast.FnTypeDecl too + +#### Compiler internals +- scanner: fix multi-level string interpolation in if/match branch (#24805) +- markused: fix mark for array init from sumtype (fix #24887) (#24889) +- markused: whitelist `_option_none` too (fix #24862) (#24885) +- markused: remove `@[markused]` from option and result fns (#24900) +- markused: skip unused symbols, dump fns and generic specialization (fix #24921) (fix #24927) (#24924) +- parser,markused: support `@[markused]` for interface declarations too (#24963) +- markused: fix interface fields and chan usage (fix #24961) (#24962) +- v.builder: add a clearer error message for `v -shared run empty.v` (issue found by Felipe Pena) +- markused: use eprintln for `PANIC DEPS` too (for consistency and easier redirection for the whole trace) +- v.util: add support for setting VUTIL_RETRY_MAX_COUNT=1 to ease the workflow for developing backends +- markused: improve the tracking of used closures (#25009) +- markused: improve array resources tracking + remove all_fns loop for orm (#25007) +- markused: fix generic map index (fix #25012) (#25022) +- markused: improve array tracking (range, gated) (#25023) +- markused: fix option tracking on sumtype (fix #25025) (#25028) +- markused: fix thread type mark by go/spawn expr (fix #25049) (#25054) +- scanner: refactor string interpolation (fix #24198) (#25053) +- markused: fix array append c code dependency (fix #25057) (#25058) +- markused: fix option array element (fix #23089) (#25179) +- markused: fix option map value (fix #25186) (#25188) +- parser,fmt,markused: add top level comptime `$if` support (enable `$if platform { import module struct Abc {} }`) (#25216) +- v.builder: add -DNO_DEBUGGING in addition to -DNDEBUG, when compiling with -prod +- v.builder: support `-d trace_type_symbols_after_checker` +- scanner: uncomment working rune test (#25305) +- v.util: fix handling of "start \u005c${...} end" in cgen (fix #25304) (#25306) +- markused: fix marking of mutable generic method calls (fix #25312) (#25314) + +#### Standard library +- x.crypto: initial addition of curve25519 module (#24748) +- thirdparty: add NDEBUG check before glGetErrorCode if-statement in sokol_gfx.h (#24754) +- math.big: remove unnecessary code from / and % (the same is done in div_mod, which they call) (#24766) +- builtin: add a rune iterator method to strings, allowing `for for i, r in s.runes_iterator() {` without first allocating an array for all the runes (#24769) +- builtin: support `-d builtin_free_nop` to help diagnose problems with too early manual free() calls +- builtin: use s.runes_iterator() in trim_runes/2 to avoid needless allocation +- builtin: add string.expand_tabs() (#24781) +- os: do not resolve symlinks in os.find_abs_path_of_executable/1 (fix #24759) (#24761) +- os: improve documentation (#24790) +- gg: allow for `-d gg_memory_trace_frame` to be used in combination with `-prealloc -d prealloc_dump` +- sync: add SpinLock (#24788) +- os: fix documentation for environ function (#24796) +- sync: fix documentation for new_spin_lock function (#24795) +- sync: add implementation for WaitGroup.go/1, add test (#24797) +- sync: improve documentation (#24799) +- sync: fix spin lock, add destroy() and try_lock(), add valgrind annotate support (#24798) +- os: add os.write_bytes/2 as a complement to os.read_bytes/1, add test +- sync: use SpinLock for channel (fix #24680) (#24802) +- crypto: fix ambiguous expressions in DES implementation (#24814) +- sync: use an atomic counter in test_waitgroup_go in waitgroup_test.v +- datatypes: add lockfree version of counter and ringbuffer (#24839) +- sync: add thread local storage (TLS) support (#24849) +- math.unsigned: fix rotate_left() for uint256, add test (#24872) +- math.unsigned: replace untested comments for uint256 public APIs (#24873) +- log: use `@[noinline]` for level_from_tag/1 and target_from_label/1 to avoid triggering panics for programs using `log`, compiled with -prod and -cc gcc>10 (fix #24874) +- math.big: fix toom-cook 3-way multiplication (#24888) +- runtime: add used_memory() (#24897) +- runtime: add note for the availability of the used_memory implementation (#24913) +- os: remove commented code in home_dir() function (#24929) +- math.big: fix the order of calculations in mod_pow() to improve performance (#24935) +- math.big: add shrink zeros to karatsuba and toom-cook (#24937) +- math.big: fix big_mod_pow() (#24939) +- os,runtime: move some C struct and fn def to `builtin` (#24942) +- math.big: fix validate_string and integer_from_regular_string (check for characters.len > 0, before accessing characters[0]) +- builtin: prepare for adding a `-force-bounds-checking` option +- strconv: fix bounds check bug, discovered by the equivalent of `./v -g -force-bounds-checking test vlib/toml/` (thanks to tankf33der) +- builtin: fix OOB bugs in s.is_bin, s.is_oct, s.is_hex, discovered through `./v -force-bounds-checking test vlib/builtin/` +- regex: fix OOB bug discovered through `./v -g -force-bounds-checking vlib/regex/` (fix by @penguindark) (#24960) +- time: fix custom_format panic (fix #24977) (#24987) +- time: fix more panics in the supported specifiers in Time.custom_format/1 (#24988) +- vlib: add `archive.tar` module to enable reading of .tar ang .tar.gz files (#24995) +- builtin: fix warnings for `./v doc -m -f html vlib/builtin/` +- sokol.gfx: set the missed array_count field too in the `set_vert_uniform` and `set_frag_uniform` APIs (#25019) +- builtin: fix `assert "ä ö å æ ã ø ô é ë".title() == "Ä Ö Å Æ Ã Ø Ô É Ë"` (fix #25017) (#25026) +- Apply `@[markused]` to builtin_init, remove its heuristic from markused.v +- gg: improve drawing effect and logic of draw_rounded_rect_empty (#25062) +- math.bits: add asm implementations for some 64 bit ops (#25020) +- vls: autocomplete for module functions: e.g. `os. ...` +- math.big: move from u32 to u60 digits (#25018) +- os: simplify file.c.v using cross platform f.seek/2 calls, add EINTR handling to f.write_full_buffer/2 (fix #25107) (#25110) +- builtin: add arr.pop_left() func (#25133) +- math.big: refactor add_digit_array() (#25138) +- math.big: optimize add_digit_array() (#25139) +- math.big: optimize subtract_digit_array() (#25142) +- strconv: produce a maximum of 8 digits after the `.` for f32.str() (fix #25141) (#25144) +- math.big: restore and refactor str() and integer_from_string() (#25154) +- os: remove `unknown host OS` panic from os.get_host_os() +- flag: fix tail/single bool flag error condition logic in `flag_to.v` (fix #25166) (#25172) +- flag: improve the fix for #25166 tail/single bool flag error in `flag_to.v` (#25189) +- readline: fix wide char display width for Chinese characters (fix #25219) (#25220) +- repl: fix handling of lines with comments like `math.pi // comment` (fix #25229) +- time: always return utc() timezone for Time.unix/0 (fix #17784) (#25233) +- builtin: fix C prefix for proc_pidpath() (#25239) +- math.big: replace division with Knuth, improve performance (#25242) +- time: move the nanosecond comparison before the rest in the Time == Time implementation +- builtin: add a temporary ctovstring_impl/1 API to enable `ui` to compile cleanly for PR#25264, part 1 +- json2: replace encoder with new implementation (#25224) +- json2: improve enum decoding; fix handling of required fields at the end of a json string (#25289) +- json2: improve checker with better EOF detection (#25075) +- json2: prepare for moving into json2 (#25039) +- json2: fix remaining json2 discrepancies (#25029) +- json2: support custom decoders (#25021) +- json2: fix number decoding and improve errors (#25015) +- json2: add support for decoding utf-16 surrogates, produced by some JSON encoder implementations (Python, Java, C#) (#25193) + +- x.crypto: add a new `ascon` cryptographic module, based on https://doi.org/10.6028/NIST.SP.800-232 (Lightweight Cryptography Standards for Constrained Devices) (#25260) +- x.crypto.ascon: improve the core of Ascon permutation routine (#25278) +- x.crypto.ascon: improve single-shot functions of ascon hashing variant; add benchmark (#25282) +- x.crypto.chacha20: improves the internals of chacha20, add a bench (#25311) + +### V interpreter +- Add comptime-if support (#24919) +- Reset return value after const eval and fix if-expr (#24955) +- Add more infix op support; fix early func return (#24965) +- Fix if-else; add infix op; fix func calls (#24972) + +#### Web +- picoev: fix documentation (#24811) +- veb: fix `app.text()` -> `ctx.text()` in `README.md` +- net.http: fix panic in parse_multipart_form for invalid boundary (fix #24974) (#24976) +- net.http: remove debug println statement from post_multipart_form (#25030) +- net.http: reduce the false positives on the CI for server_test.v, let test_host_header_sent_to_server return early, when the server can not start +- net: improve tracing output for `-d trace_tcp`; move `error_code()` calls right after the corresponding C APIs (errno is a global that should be read immediately to be valid) +- veb: fix a spurious error with Chromium, for POST requests, split into 2 parts, 1st with only http headers, without body (fix #25191) (#25195) +- net.http: Use a full url when using a proxy, instead of only the path (#25228) +- net.http.file: allow for serving requests to static files with cache busting suffixes like `/dist/littlejs.js?1117` +- veb: fix generic field access from alias (fix #25215) (#25246) +- ci: change url to http://archive.ubuntu.com in .github/workflows/disable_azure_mirror.sh + +#### ORM +- Support lowercase operators `like`, `in`, `not in` etc (fix #25032) (#25035) +- Fix sub_structs (fix #25104) (#25105) + +#### Database drivers +- db: modify mysql/pg/sqlite interface for pool working (#24780) +- db.sqlite: fix get_text trimming data after (including) first 0 character (#25040) + +#### Native backend +- Add comptime cpu archs support (#24956) +- Add support for (elf) globals (#25016) +- Improve consts, support more assigns (#25277) +- Structs multi_assign and multi_return (#25281) +- Support more assign ops, reduce code duplication (#25283) +- Begin array support, `a := []Type{len: x, cap: y}` and `a[i]` read/write (#25299) + +#### C backend +- Only run freestanding_module_import on amd64 (#24763) +- Fix sumtype option unwrapping (fix #24746) (#24770) +- Protect against unlimited recursion in type_default_impl, by converting to a verror/1 call instead +- Fix `static` and `volatile` var deref (fix #24778) (fix #24779) (#24807) +- Fix codegen for interface method closure get (fix #24810) (#24818) +- Fix codegen for multi return assignment with option type (fix #24812) (#24817) +- Fix if codegen when func parameter is option type (fix #24813) (#24816) +- Skip `struct none {` in cgen, if `none` is not used by V code reachable from `fn main() {` (#24824) +- Skip `struct map {` and related type declarations, when no V maps are used (#24826) +- Fix anon struct encode (fix #24836) (#24852) +- Fix json decode option alias (fix #24843) (#24853) +- Fix const indexexpr dep (fix #24850) (#24851) +- Fix codegen for generic interface with multi return generic type (fix #24838) (#24858) +- Fix anon struct init passing (fix #24879) (#24884) +- Allow alias to map `type Dict = map[string]string` (fix #24878) (#24883) +- Builtin,cgen,markused: add struct @[aligned] support for structs allocated on the heap too (#24886) +- Add a `__closure_init` call for sokol/gg programs on android as well (#24892) +- Allow alias types to be iterated if parent type has `next` method (fix #24890) (#24894) +- Use alias `next` method if defined in `for x in iterator {` (#24905) +- Fix const fixed array with type alias (fix #24936) (#24946) +- Fix callback codegen on generic struct resolution (fix #24947) (#24948) +- Move sort fn after interface definitions(fix #24465) (#24967) +- Fix struct field init within fn without result type (fix #24970) (#24973) +- Move closure C code to V code under vlib/builtin/closure/ (#24912) +- Parser,ast,checker,cgen: use enum comparisons instead of string ones on ast.ComptimeCall.method_name (#25003) +- Fix generic key's type with `in` operation (fix #24983) (#25011) +- Remove unused enum declarations too (#25033) +- Parser,checker,cgen: remove unused `err` declaration or `or { }` blocks (#25034) +- Add a test for builtin_init being present (part 2 of 4a6941a) +- Fix closures on s390x, ppc64le, loongarch64 platforms, add test to s390x CI (#25047) +- Fix anon fn checking adding unresolved generic type on codegen (fix #25050) (#25055) +- Fix building on Termux after fa904c4 +- Use `#if defined __BIONIC_AVAILABILITY_GUARD && ...` to be compatible with more Termux versions +- Fix asm stmt separators (#25067) +- Fix translated file fixed-array assignment (#25080) +- Fix codegen for passing int from selector to voidptr expect arg (fix #25081) (#25083) +- Fix codegen for option void fn return block unwrap (fix #25074) (#25082) +- Fix alias to sumtype cast initialization (fix #25086) (#25091) +- Allow alias sumtype smartcasting (fix #25085) (#25096) +- Fix codegen for generic struct field array option (fix #25093) (#25097) +- Fix mutable sumtype (fix #25108) (#25111) +- Fix generic return assign to ComptimeSelector (fix #25125) (#25131) +- Fix address of call with `cast(&(arr.last() as Type))` (fix #23528) (#25132) +- Fix eq for anon C structs (#25152) +- Fix generated str method for enums that have C values (use ifs, instead of switch) (fix #25135) (#25157) +- Fix autofree with option array (fix #25124) (#25149) +- Fix assigning fn address (fix #24537) (#25158) +- Fix veb alias type identification and generic CastExpr (fix #24895) (#25155) +- Revert "checker,cgen: evaluate comptime `$if` results in checker *only* (fix #25123) (fix #25156) (#25150)" +- Evaluate comptime if results in checker only (with fixed -cross compilation) (#25162) +- Fix generic_fn_name generating incorrect names for C structs (#25164) +- Add comptime match support (#25165) +- Fix resolving generic interface field from generic struct (fix #23556) (#25182) +- Fix autofree used vars on return (fix #25196) (#25198) +- Fix hash stmt code generation (fix #25184) (#25207) +- Expose is_embed in FieldData (#25232) +- Fix alias enum used in comptime `$for` (fix #25211) (#25212) +- Ensure variable names do not conflict with builtin methods (fix #25063) (#25178)" +- Add `@[reused]` attribute to mark methods, reusing the receiver memory on return (needed for autofree) (fix #25221) (#25235) +- Fix gen_struct_equality_fn null pointer crash (fix #25237) (#25231) +- Allow generic alias enum comptime (fix #25249) (#25251) +- Fix big IntegerLiteral LL postfix (fix #25269) (#25275) +- Prefix `builtin` APIs with `builtin__` (#25264) +- Fix fixed-array const initializer (fix #25291) (#25293) +- Fix generic cast to sumtype of empty struct (fix #25263) (#25290) +- Fix option variadic arg passing (fix #25261) (#25273) +- Support for 64bit int 1 (#25236) +- Cgen,parser,markused: add export const support (fix #25300) (#25303) +- Fix i64 enum as a map key, when the enum values are too small (fix #25294) (#25310) + +#### JavaScript backend +- Simplify comptime if; catch up with cgen (fix #25295) (#25313) + +#### vfmt +- Fix `if x := g() { x } else { return }` adding newline after `return` (fix #24908) (#24945) +- Fix eating the attribute from `@[deprecated] pub type Alias = int` (fix #24968), workaround -usecache bug (#24969) +- Fix call expr with single line comment in or expr (fix #24659) (#25159) +- Fix comment line number in file with crlf line separator (fix #23524) (#25163) +- Add support for 64bit int with `-new_int` (part 2) (#25298) + +#### Tools +- v.vmod,tools: support a repo_branch property in v.mod files, in addition to the existing repo_url property, to allow for backlinks to repos that use `main` instead of `master` as their core branch +- Make the output of `v should-compile-all` more immediately useful in CI jobs (turn off stdout buffering) +- Add support for `// vtest vflags: -w` in `_test.v` files, to allow `v -W test .` later, for files, that have known warnings +- ci: make sure the generator for vlang/docs can be compiled with latest V (prevent silent doc update stops, after breaking changes) +- Add cmd/tools/gg_split_memdump_to_frames.vsh to ease working with memdump.bin files generated by gg programs (split by frames) +- Add find_doc_comments_with_no_dots.v +- Improve summary output of find_doc_comments_with_no_dots.v +- Skip _test.v and _test.c.v files in find_doc_comments_with_no_dots.v +- ci: add report-missing-dots-in-doc-comments job +- ci: mark tcp_test.v and unix_socket_test.v as flaky (they still fail sporadically on the CI, although very rarely now) +- ci: add `-prealloc` self compilation checks on more platforms (#24891) +- docs,ci: check more vlib modules in the report-missing-dots-in-doc-comments job (#24928) +- ci: add a watchdog timer thread to ringbuffer_test.v, to make sure the program exits in a reasonable time (~10s). Let the test be retried 2 times in a row if it fails. +- ci: bump cross-platform-actions/action from 0.28.0 to 0.29.0 (#24952) +- ci: retry session_app_test.v 2 times, since it is network dependent, and sometimes (rarely) fails +- v.help: document the new `-force-bounds-checking` option +- Improve alignment for `v repeat "program" "program_that_is_over_10x_faster"` +- ci: add checks for compilation of vlang/gui to v_apps_and_modules_compile_ci.yml +- ci: retry 2 times vlib/net/http/server_test.v to avoid false positives for unrelated commits/PRs +- ci: force changes to vlib/x/json2 to trigger the full sanitized checks (the implementation there uses unsafe blocks and vmemcmp/3...) +- ci: workaround -usecache issue afte 2d87ac4 +- ci: add a performance-compare-with-master job +- Fix `return""` in vdoc html output (fix #24979) +- ci,tools: implement support for VREPEAT_SILENT=1 and `v repeat -S`, to only show the summary of the runs, without the progress lines +- ci: fix the performance-compare-with-master job, when run on PRs (#25014) +- ci: trigger updates to the module docs, even if just only the static files for the doc generator are changed +- ci: make sure to always compare with the latest commit on the main V repo's master branch, when running .github/workflows/compare_pr_to_master.v +- ci: compare the sizes of small programs like hello_world.v, but generated with `-cc gcc` too +- ci: improve the alignment of the results of file size comparisons in compare_pr_to_master.v +- Improve the output of `./v doc -m -f html vlib/` +- Use `Copying` instead of `Generating` for the static resources in `./v doc -m -f html vlib/` +- ci: bump actions/download-artifact from 4 to 5 (#25051) +- v.help: document the `-is_o option` (in `v help build-c`) and add a test for it (#25052) +- ci: add experimental support for building V and testing on a Termux docker container (#25059) +- ci: use retry.sh for the `pkg install` in termux_ci.yml to reduce false positives. +- ci: update vlang/gui commit its latest e5cc33fe816fef33d718cb1b91f66d6bd38fb4a4 +- ci: bump actions/checkout from 4 to 5 (#25095) +- ci: retry 3 times vdoc_file_test.v +- ci: add a build_on_ubuntu_25_ci.yml script, for testing bootstrapping with GCC 14.2.0 (#25109) +- ci: define TERMUX_VERSION in .github/workflows/termux_ci.yml instead of using `-os termux`, to make the emulation closer to a real Termux (#25128) +- ci: reduce timeout-minutes for CI jobs that are normally fast to help detect anomalies earlier (#25129) +- ci: add a disable_azure_mirror.sh script, and use it before `apt update` to reduce the recent timeouts during installing dependencies (#25147) +- ci: bump timeout-minutes to 15 in termux_ci.yml +- ci: bump actions/setup-java from 4 to 5 (#25153) +- ci: retry vlib/v/eval/interpret_test.v 2 times +- ci: bump retry time from 10 to 15 minutes (reduce false positives for slow dependency installations on the CI) +- ci: change the azure mirror URL in /etc/apt/sources.list too +- ci: use `awalsh128/cache-apt-pkgs-action@v1.5.3` instead of a manual `apt update/apt install` step, to leverage caching more (#25256) +- ci: check if `awalsh128/cache-apt-pkgs-action@v1.5.3` works on master (#25257) +- ci: extract .github/actions/cache-apt-packages-action/action.yml, use it in puzzle_vibes_ci.yml + +#### Operating System support +- docs: add section in README for compilation on OpenBSD (#24775) +- crypto.ecdsa: add support for OpenSSL on OpenBSD (#24772) +- picoev: add implementation for OpenBSD using kqueue (#24801) +- log: fix `Unhandled Exception` on windows 7 (#24803) +- ci: migrate the remaining jobs from the deprecated windows-2019 image to windows-2022 (#24825) +- os: fix windows get_error_msg() leak (#24899) +- runtime: reduce allocations done in runtime.used_memory/0 on linux (#24901) +- ci: skip checking vlib/datatypes/lockfree/ringbuffer_test.v on the gcc-windows job for now +- runtime: add used_memory() implementation for FreeBSD (#24909) +- runtime: add used_memory implementation for OpenBSD (#24918) +- ci: skip ringbuffer_test.v in the tcc-windows and msvc-windows jobs too, to avoid flakyness for unrelated commits/PRs. +- ci: use FreeBSD version 14.3 after the bump of cross-platform-actions/action to 0.29.0 (#24953) +- time: fix timezone test on windows +- ci: add a release build for Linux on arm64 to release_ci.yml (#25064) +- thirdparty: add `thirdparty-linux-armv7_bdwgc.sh` for building `libgc.a` on ARMv7 CPUs (#25077) +- ci: bump retry count for server_test.v to 5 (reduce false positives on windows) +- ci: use `v build-tools` without flags for the tools-windows job +- os: eliminate warning for `v -cross -o vc/v.c cmd/v` on linux (part 2, see also 037a3b4) +- os,sync: enable running `v -cross -o x.c cmd/v` on windows too (part 1, fix V errors) +- ci: run .github/workflows/disable_azure_mirror.sh before all `apt update` commands, in ci/linux_ci.vsh, when run in a github CI runner +- ci: retry 3 times cmd/tools/vtimeout_test.v on windows, before failing +- os,ci: use a conditional include, instead of a platform file, to include libproc.h on macos only +- ci: run input_rune_iterator_test.v only on linux for now +- builtin: fix thread naming issue on Windows by ignoring RaiseException (0x406D1388) (#25270) + +#### Examples +- Fix for `v build-tools` and `v build-examples` running on a i686 (the problem was discovered by @tankf33der) +- Add examples/sokol/sounds/simple_keyboard_synth.v +- builtin,markused: consider println of non string to use .str() method calls too, reduce generated C code for `v -cc gcc examples/hello_world.v` (#24996) +- Use a sieve of Eratosthenes in primes.v, to handle bigger inputs more efficiently +- vdoc: make -run-examples compatible with all output modes, not just the plaintext one +- vdoc: extract vdoc_run_examples_test.v from vdoc_file_test.v +- vdoc: implement -unsafe-run-examples and -check-examples support, add tests and document them +- builtin,vdoc: fix the examples for the builtin methods, so that `v doc -check-examples -time -f ansi vlib/builtin/` pass +- builtin,vdoc: make `v doc -unsafe-run-examples -time -f ansi vlib/builtin/` pass too +- vdoc: improve failed example report +- vdoc: support `v doc -check-examples -f none vlib/builtin` +- bitfield: fix `v doc -unsafe-run-examples -f none vlib/bitfield/` too +- arrays.parallel: fix `v doc -unsafe-run-examples -f none vlib/arrays/parallel/` too +- arrays: fix `v doc -unsafe-run-examples -f none vlib/arrays/` too +- compress.deflate,compress.gzip,compress.zlib,compress.zstd: fix `v doc -unsafe-run-examples -f none vlib/compress/` too +- sokol.audio: fix doc comment examples +- encoding.base64: fix doc comment examples +- math: fix doc comment examples +- readline: fix doc comment example by removing it +- semver: fix doc comment examples +- vdoc: enable example lines that have explicit imports too, fixup the remaining vlib examples, so `v doc -v -unsafe-run-examples -f none vlib/` could be added to the CI +- Add euler.v +- examples,gg: add examples/gg/grid_of_rectangles.v; add gg.Context.draw_rect_filled_no_context/5 and gg.Context.draw_rect_empty_no_context/5 +- veb.auth: update the README.md example (#25245) +- builtin: fix `v -W -Wimpure-v examples/hello_world.v` (move ctovstring_impl to builtin.c.v) +- Fix rune casting from u32 in rune.v (#25307) + + + + ## V 0.4.11 *19 Jun 2025* @@ -60,6 +460,8 @@ - Reduce memory usage of ast.ScopeObject and ast.Ident instances (#24704) #### Comptime +- comptime: support type interpolation in the msg argument of `$compile_warn(msg)` and `$compile_error(msg)` (#24992) +- comptime: fix $match with fn type (#25271) - Support `$if T is $pointer {` and `$if T is $voidptr {`, to make it easier to implement a pure V dump(), without cgen specific code (#24628) - i32 is now `$int` too (fix #24346) (#24378) - Fix `$dbg` with `@[heap]` structs (fix #23979) (#23989) diff --git a/cmd/tools/changelog_helper.v b/cmd/tools/changelog_helper.v index 151bd40fc9..776318fa9d 100644 --- a/cmd/tools/changelog_helper.v +++ b/cmd/tools/changelog_helper.v @@ -24,10 +24,13 @@ enum Category { examples vfmt os_support + interpreter } const category_titles = '#### Improvements in the language +#### V interpreter + #### Breaking changes #### Checker improvements/fixes @@ -99,8 +102,7 @@ fn main() { } mut lines := os.read_lines(log_txt)! // Trim everything before current version, commit "(tag: 0.4.4) V 0.4.4" - mut prev_version := (version.replace('.', '').int() - 1).str() - prev_version = '0.${prev_version[0].ascii_str()}.${prev_version[1].ascii_str()}' + mut prev_version := get_prev_version(version) println('prev version=${prev_version}') for i, line in lines { if line == ('V ${prev_version}') { @@ -163,6 +165,8 @@ fn (mut app App) process_line(text string) ! { mut category := Category.examples if text.contains('checker:') { category = .checker + } else if is_interpreter(text) { + category = .interpreter } else if is_examples(text) { category = .examples // println("Skipping line (example) $text") @@ -222,7 +226,7 @@ fn (mut app App) process_line(text string) ! { // exit(0) //} if (semicolon_pos < 15 - && prefix in ['checker', 'cgen', 'orm', 'parser', 'v.parser', 'native', 'ast', 'jsgen', 'v.gen.js', 'fmt', 'vfmt', 'tools', 'examples']) + && prefix in ['checker', 'cgen', 'orm', 'parser', 'v.parser', 'native', 'ast', 'jsgen', 'v.gen.js', 'fmt', 'vfmt', 'tools', 'examples', 'eval']) || (semicolon_pos < 30 && prefix.contains(', ')) { s = '- ' + text[semicolon_pos + 2..].capitalize() } @@ -293,6 +297,7 @@ const category_map = { Category.checker: '#### Checker improvements' .breaking: '#### Breaking changes' .improvements: '#### Improvements in the' + .interpreter: '#### V interpreter' .parser: '#### Parser improvements' .stdlib: '#### Standard library' .web: '#### Web' @@ -327,7 +332,7 @@ fn (l Line) write_at_category(txt string) ?string { // Trim "prefix:" for some categories // mut capitalized := false mut has_prefix := true - if l.category in [.cgen, .checker, .improvements, .native, .orm] { + if l.category in [.cgen, .checker, .improvements, .native, .orm, .interpreter] { has_prefix = false if semicolon_pos := line_text.index(': ') { prefix := line_text[..semicolon_pos] @@ -566,6 +571,10 @@ fn is_comptime(text string) bool { return text.contains('comptime:') } +fn is_interpreter(text string) bool { + return text.starts_with('eval:') +} + fn is_xxx(text string, words []string) bool { for s in words { if text.contains(s) { @@ -580,3 +589,17 @@ fn print_category_hint() { println('${int(val.value) + 1} - ${val.name}; ') } } + + + +// For 0.4.12 returns 0.4.11 etc +fn get_prev_version(version string) string { + parts := version.split('.') + if parts.len != 3 { + return '' + } + major := parts[0] + minor := parts[1] + patch := parts[2].int() + return '${major}.${minor}.${patch-1}' +} diff --git a/v.mod b/v.mod index e66226832c..13c5662f98 100644 --- a/v.mod +++ b/v.mod @@ -1,7 +1,7 @@ Module { name: 'V' description: 'The V programming language.' - version: '0.4.11' + version: '0.4.12' license: 'MIT' repo_url: 'https://github.com/vlang/v' dependencies: [] diff --git a/vlib/v/util/version/version.v b/vlib/v/util/version/version.v index 02ef942af3..efcb73c527 100644 --- a/vlib/v/util/version/version.v +++ b/vlib/v/util/version/version.v @@ -2,7 +2,7 @@ module version import os -pub const v_version = '0.4.11' +pub const v_version = '0.4.12' pub fn full_hash() string { build_hash := vhash()