V 0.4.5
20 March 2024
Improvements in the language
- Add map update-init syntax:
new_map := {...old_map, 'k1': 1, 'k2': 5}
(#20561) - Improve coroutines, Photon vcpu creation, coroutines + GC fixes (#20549)
- Update Boehm GC libs/headers to the latest version 8.3.0 (#20772)
- $dbg statement - native V debugger REPL (#20533)
- Implement @[_linker_section] attribute (#20629)
- Enable
@[export]
for global variables too (#20649) - Add callstack support on v.debug (#20680)
Breaking changes
- sokol: the sokol wrapper was updated, to match its upstream version at commit 058a4c5, several of its APIs no longer exist
- templating.dtm: compile_template_file is no longer public
- v.trace_calls:
pub fn on_c_main() {
, is nowpub fn on_c_main(should_trace_c_main bool) {
- v.transformer:
Transformer.fn_decl
is nowTransformer.fn_decl_trace_calls
- x.vweb:
Context.redirect(url string, redirect_type RedirectType)
is nowContext.redirect(url string, params RedirectParams)
Checker improvements/fixes
- Check invalid lambda expr (#20461)
- Fix comptime if with comptime smartcast (#20466)
- Fix anon struct init with const fields (fix #20452) (#20463)
- Disallow
option
orresult
return type, for infix operator overloading (#20494) - Cleanup the const variable evaluate for fixed array fields of structs (#20503)
- Fix missing check for struct initialization with
@[noinit]
attribute, through usingT{}
(#20516) - Fix mark methods into used-list, when generics as receivers (fix #20509) (#20527)
- Modify comments on generic receiver type storage (#20539)
- Fix checking give const map as default or init value to struct fields (fix #20512) (#20546)
- Fix return map index with or_block (#20544)
- Cleanup the generic tests (#20553)
- Fix @[deprecated] attribute for consts (fix #20523) (#20550)
- Cleanup in method_call() (#20554)
- Disallow
non_opt_array << optvalue
(#20573) - Fix non dereferenced enum in match statements (fixes #10045) (#20591)
- Fix .variant smartcast on non-comptime variables (#20575)
- Disallow static maps:
mut static x := map[string]int{}
(#20596) - Allow
#define X
andasm riscv64 {}
blocks in .v files, with-freestanding
(make embedded usecases easier) - Add cast overflow checks (#20641)
- Disallow assigning none to _ (#20646)
- Fix checking for option matching with non-option (#20673)
- Disallow
(x) := 10
(#20695) - Disallow
none
as match cond (#20688) - Fix comptime ident checking on defer stmt (fix #20719) (#20723)
- Add error for
x as Y.field
, suggesting using(x as Y).field
instead for clarity (#20725) - Disallow sum type holding alias ptrs (#20786)
- Optimise out calls to
arg_typ_sym.embed_name()
when there are no errors (#20820) - Fix if branch option type mismatch (fix #20809) (#20830)
- Fix auto deref arg when fn expects ref (#20846)
- Fix struct field init with generic fn variable (fix #20847) (#20878)
- Cleanup in assign_stmt() (#20880)
- Check assigning immutable reference struct field (fix #20814) (#20883)
- Fix struct field init with generic anon fn (add the test from #18294) (#20888)
- Fix checking match branch call expr twice (#20910)
- Support
Flags.bit ^ Flags.bit1
and~Flags.bit
(flagged enums) (fix #20925) (#20929) - Fix some specific interface generic inference within generics struct and method (#20932)
- Remove notice when shifting signed int for
@[translated]
(#20935) - Silence "assigning 0 to a reference field" and "uninitialized fn struct fields" notices for
@[translated]\nmodule ...
files (#20938) - Fix missing check for interface cast of option type (#20961)
- Silence more warnings for
@[translated]
files (#20964) - Fix comptimeselector passing to generic argument (#20985)
- Remove unnecessary string interpolation in deprecation method calls (#21007)
- Disallow void return value lambdas in array.map method calls (#21011)
- Cleanup and simplify
check_ref_fields_initialized
methods (#21016) - Cleanup and simplify struct processing p1 (#21009)
- Add support for deprecation messages for structs and struct fields (#21017)
- Cleanup and simplify struct processing p2, extend test (#21025)
- Fix undefined reference to interface struct field regression (after #21025) (#21030)
- Add test for interface embedding and interface with erroneous implementation (test related to #21030) (#21033)
- Disallow
Optional
andResult
high val in afor x in low..high {
loop (#21043) - Fix missing incompatible pushval type for chan <- operator (#21040)
Parser improvements
- Fix close_scope() missing, when field.name is
sort
orsorted
(fix#20436) (#20485) - Check non-generic interface defining generic method (#20545)
- vast,ast: output map init update expression (#20574)
- Implement
MyEnum.from(1)!
generic static method (#20411) - Fix
MyEnum.from(0)!
, implementMyFlaggedEnum.zero()
(#20623) - vfmt,parser: keep the original import name in ast.Import, and use it without modifications for paths unders ~/.vmodules
- Allow double quotes in
@include
template directives (#20628) - Fn type declaration does not check already registered name (#20732)
- Fix global const ordering with string inter literal (fix #20760) (#20770)
- Disallow option alias with option parent type (#20769)
- Make Scope.find methods more robust, when called on default initialised
scope &Scope = unsafe { nil }
fields (#20774) - Fix parsing of cgen.v, in normal mode, when the table is empty (no files in
builtin
are preparsed) (fix #20606) (#20611) - Fix infinite loop in Parser.sql stmt in
-silent -print-watched-files
mode (used byv watch
) (#20873) - Disallow defining map key more than once (#20905)
- Fix formatting comptime if expr, after inc expr (fix #20927) (#20931)
- Fix for comptime with fully type name (fix #20948) (#20988)
- Allow lock prefix instructions and numbered reg in inline asm blocks (#21022)
- Add better error for mut variadic fn argument (#21063)
Compiler internals
- v.util: make launch_tool failures more detailed (for the
Text file busy; code: 26
case), bump tool_recompile_retry_max_count from 3 to 7 - v.util: make launch_tool more robust, when multiple
v -b js file.v
commands are run at the same time (all trying to recompile the JS backend program) (#20631) - builder: allow for
./v -freestanding -cc riscv64-elf-gcc -d no_main -no-builtin -no-preludes -showcc -keepc x.v
- pref: support file_notd_freestanding.v + file_d_freestanding.v, remove dependency to
os
, of $embed_file(), when compiling with -freestanding (#20712) - v.builder: reduce the default noise from successfully rebuilding cached thirdparty object files
- pref: allow fetching the photonwrapper .so (for the coroutines) with curl too, or print details for manual download (#20855)
- scanner: disallow a shebang line, that is not at the top of a file (#21029)
- strings.textscanner: fix off-by-one error in skip method (#21045)
Standard library
- x.crypto.chacha20: speed up the core functionality of the ChaCha20 stream cipher (#20470)
- log: enhance log time format setting (#20484)
- encoding.csv: add a new utility fn
new_reader_from_file/2
(#20530) - readline: add completion support (#20559)
- builtin: add
is_hex()
,is_int()
,is_bin()
, andis_oct()
methods to the string type (#20540) - builtin: add empty string verification for the new string .is_oct() etc methods, suggested on PR #20540 (#20564)
- json: fix struct with option enum field (fix #20597) #20597
- x.json2: fix panic on calling json2.decode of an optional enum (fix #20593) (#20603)
- vlib: add a compress.zstd module (#20616)
- io: ensure BufferedReader.read_line() returns
io.Eof
, instead oferror('none')
(#20619) - log: add support for l.set_short_tag/1 (#20652)
- Update error checking for new error io.Eof (#20656)
- io: allow BufferedReader.read_line() to accept custom line delimiters (#20655)
- builtin: implement unbuffer_stdout/0 (#20662)
- x.crypto: add sm4 module (#20651)
- crypto.aes: optimise performance (#20674)
- os: add proper process termination with p.signal_term() (#20671)
- bitfield: enhance operation with multiple flags (#20683)
- os: fix File.read() in JS backends (fix #20501) (#20633)
- os: add error_posix() and error_win32() for explicit platform error handling and default behavior (#20694)
- log: implement set_always_flush/1 for log.Log, log.ThreadSafeLog and log.Logger (#20698)
- x.vweb: error() and simpler redirect(); comptime: a clearer error
- builtin: add a string.u8_array() method (#20736)
- os: add os.stat() and helpers (#20739)
- os: make os.SystemError struct public so the os.error_* functions can be used by other modules (#20754)
- os: refactor to use os.stat and os.lstat instead of unsafe C calls (#20759)
- os: make os_stat_test.v more robust to reporting false positives
- x.crypto: add poly1305 message authentication code (mac) in pure v (#20752)
- encoding.binary: add _fixed variants for the conversion fns, that accept fixed arrays (#20766)
- x.crypto.sm4: make sm4 use the encoding.binary _fixed fns (#20773)
- builtin: add gc_collect/0, gc_get_warn_proc/0, gc_set_warn_proc/1. Use them to turn off GC warnings by default. (#20788)
- builtin: support
-d gc_warn_on_stderr
, to show the GC warnings, without installing a custom warn fn callback - x.crypto: add AEAD ChaCha20Poly1305 algorithm in pure v (#20817)
- x.crypto.chacha20: remove deprecated
math.max_u32
in favour of builtinmax_u32
, remove unneceseary bits, reorder (#20838) - json: fix decode struct ptr (#20828)
- time: add a .http_header_string() method on Time (#20861)
- json2: reorganize encode string (#20862)
- vlib: add
encoding.txtar
(port of Go's txtar module) (#20874) - gg: handle dpi change, when moving window to another monitor (#20886)
- time: add a tm_gmtoff field to
C.tm
(a BSD and GNU extension) (#20907) - x.json2: add skippable field attr
@[json: '-']
(improve backwards compatibility with thejson
module) (#20892) - time: rename identifiers and parameter names (#20913)
- io: add a
string_reader
submodule (#20893) - toml: return an error from toml.parse_file(), when the passed file path does not exist (#20912)
- x.json2: fix encoder commas (#20916)
- time: microoptimise the Time formating methods (use custom number->string conversion, instead of string interpolation) (#20917)
- x.json2: improve performance of string encoding for unicode special characters and emojis (#20867)
- x.json2: minor performance improvement, update benchmark recommendations (#20954)
- os: workaround a
-prod -cc gcc
bug, affecting os.open_file (fix #20923) (related to #20872) (#20960) - cli: add pluralization to err msg, if required number of args is not met (#20971)
- os: remove repetitive words in comments (#20981)
- gg: fix empty circle in native; http: post_form_with_cookies; veb: print veb action in html errors
- io.reader: make read_all constants public (#20997)
- builtin: expose gc_disable(), gc_enable(), gc_is_enabled(), in addition to the existing gc_collect() (#21002)
- x.json2: improve error message upon missing comma (#20602)
- builtin: fix a few grammar errors in builtin.string comments (#21010)
- io.string_reader: fix needs_fill_until check (#21005)
- builtin: add missing return type to fn signature for C.GC_get_stack_base
- x.json2: predefine buffer capacity for encoding to avoid reallocations (#20920)
- rand: add PRNG.fill_buffer_from_set/2 (#21037)
- sokol.gfx: update the PixelFormat V enum, to exactly match the C sg_pixel_format from thirdparty/sokol/sokol_gfx.h
Web
- net: fix vlib/net/tcp_test.v (since .listen_tcp with af .unix, is now expected to return an error) (#20472)
- net: remove unused import in tcp_test.v
- x.vweb: add error, when static directory does not exist (#20455)
- net.urllib: fix parsing url error, when querypath is '//' (fix #20476) (#20504)
- vweb: unify listen addres from tcp and print (#20448)
- net.unix: make the error messages in unix_test.v more specific (#20537)
- vweb: add an optional Context.before_accept_loop/0 method, to make testing easier and more robust (#20538)
- vweb: fix routes without results in vweb_app_test.v (#20548)
- vweb: make vweb_test.v more robust and faster, by embedding its server as a module
- Small fixes and backport changes from vweb (#20584)
- net.smtp: implement mail attachment support (fix #19920) (#20640)
- vweb: fix quickstart docs in the module's README.md on how to create a new vweb project (#20644)
- net.http: add a temporary fix for the intermittent segfault with http.get_ text/1 and
-prod -cc gcc
13.2.0 (fix #20506) (#20660) - x.vweb: support HTTP 1.1 persistent connections (#20658)
- x.vweb: use
$if debug_ev_callback ? {
for the[vweb] error: write event on connection should be closed
message - x.vweb: add cors middleware (#20713)
- x.vweb: add new sessions module (#20642)
- net: fix non-blocking read/write (#20438)
- net: reduce flakyness of tcp test (#20761)
- picoev: renaming, doc (#20567)
- x.vweb: add full static host support, for urls ending with /folder/ , where the folder backing it, has
index.html
inside (#20784) - x.sessions: change session Store interface to use results instead of options (#20796)
- net: fix function name in split_address doc comment (#20794)
- doc: x.vweb static website capabilities (#20808)
- thirdparty: update picohttpparser (#20843)
- picohttpparser: restore formatting for g_digits_lut, after f09826e (#20844)
- x.vweb: fix handling of static URL paths like
/sub.folder/a_folder
(#20863) - veb: a new module veb.auth for authentication logic (tokens, hashed passwords)
- veb.auth: make work with any db
- net: workaround a
-prod -cc gcc
bug (#20872) - picoev: add more logging of errors (#20558)
- picoev: remove fmt off tags (#20569)
ORM
- orm: fix checking invalid recursive structs (fix #20285) (#20491)
- orm: fix checking invalid recursive structs in sql stmts (fix #20278) (#20505)
- orm: fix orm insert issue if table missing [Issue : #20017] (#20580)
- orm: fix orm_option_time_test.v after 2d0ed2c made insert in parent tables with child ones missing fail
- orm: insert expressions returning id
Database drivers
- db.sqlite: fix exec_param_many bug (#21008)
Native backend
C backend
- Fix multidimensional fixed array size expression evaluation (fix #20311) (#20458)
- Fix fixed array handling with operator overloading call (fix #20467) (#20469)
- Fix C code, generated for generic option fixed array return type (fix #20465) (#20479)
- Fix fixed array handling, on generic result return, and on or block (#20492)
- Fix generated code for fixed array cast (fix #20454) (#20480)
- Change
x.filter(cond).len > 0
tox.any(cond)
, andx.filter(cond) == 0
tox.all(!cond)
(#20513) - Fix code generation wrong, when '?foo.array or {}' as a 'for-in' condition (fix #20528) (#20542)
- Add a necessary clone, when the closure param is string/array with -autofree (fix #20498) (#20557)
- Fix wrong cgen, when auto_heap var, is used as a closed over arg in a closure (fix #20208) (#20566)
- Initialize closures in shared library mode (#20630)
- Fix interface generic smartcast (#20609)
- Support inter-dependent function types (#20638)
- Write the profile file out, even upon CTRL-C or kill (#20677)
- Fix as cast as selector (fix #20710) (#20718)
- Fix method call checking against
none
(fix #20711) (#20717) - Fix interface on multi return func (fix #20720) (#20721)
- Fix premature variable release by autofree (#20731)
- Fix return with option on orexpr (#20728)
- Fix auto str for map with ptr str (#20741)
- Remove
ull
suffix, which looks like the cause for the first scanner error in PR#20726 (#20750) - Fix comptime smartcast as receiver on method call (#20749)
- Fix unwrap on or-expr, when calling f() ?Type (fix #20756) (#20758)
- Builtin,coroutines,cgen: fix using coroutines with boehm GC, by using a stack pointer corrector (#20771)
- Fix interface casting (#20789)
- Fix auto_eq for option eq operator overload (#20795)
- Fix from_string fn generation missing mod name (#20807)
- Fix const fixed array initialization handling (#20812)
- Fix unwrapped option selector assigning (#20816)
- Fix map methods call with generic types (fix #20827) (#20829)
- Fix codegen for a.index/1, where a is []Fn (#20849)
- Fix thread return type generation (fix #20836) (#20850)
- Fix code generated for anon struct default value (fix #20839) (#20851)
- Fix comptime selector of interface (#20876)
- Fix multiple fixed array variable init (fix #20895) (#20902)
- Ast,checker,cgen: fix generics function with embedded structs, ensure correct link generation in cgen (#20900)
- Fix returning option call in non-option fn (#20943)
- Fix global initializer of fixed array on gcc (#20934)
- Fix comptime
is
condition when using interface (#20952) - Fix const fixed array init with index (#20950)
- Fix generic map inferring key and value types (#20959)
- Fix missing scope enclosing for const init which needs temp variables (#20973)
- Fix fixed array return on fn with option generic return (#20974)
- Fix code generated to comptime passed to generic arg (#20994)
- Fix match for alias (#21028)
- Add ability to mark a global as
@[hidden]
(#21035) - Fix _str name generated for C struct which define str() method (#21042)
- Fix for/in codegen when iterating over C structs (#21052)
JavaScript backend
- Fix javascript backend treating u32 as i32 (fix #20499) (#20618)
- Fix u16 cast handling in the JS backend (#20620)
- Make program_test.v not flaky anymore, so that it is more sensitive to early errors. Fix compilation error for u16.v . Make u32.out match the current reality (the bug will be filed separately)
- Fix inconsistent output (u32) in JS backend (#20691)
vfmt
- v.fmt: drop newline in end comments for const (#20672)
- Fix alias array no cast init (#20898)
- Fix removal of used selective and alias imports in modules in
$VMODULES
dirs (#20977) - Improve submodule type alias lookup; fix formatting of modules in
$VMODULES
(#20989) - Fix type names for casts (#21036)
- Insert auto imports after shebang (#21038)
- Fix autoimport with shebang and comments above other imports (#21050)
- Fix formatting for imports of submodule from module
src
dir (#21060) - tools.fmt: extend exit codes to allow spotting unformatted files next to internal errors (#21058)
- Fix parsing of interface with comment above
mut:
keyword (#21062)
Tools
- repl: support executing shell commands on the REPL with
!sh [COMMAND]
(#20496) - repl: fix an issue with
print
and println after the execution offor
orif
(fix #20524) (#20525) - tools: bump too_long_line_length_table to 160, to avoid warnings for just
v check-md doc/docs.md
(most common) - tools: bump too_long_line_length_link to 250, to avoid warnings for very common long links
- ci: simplify time_ci.yml, use more descriptive CI job names, for easier judging of CI failures
- debug: fix variable dereferencing (#20594)
- tools: support setting another SCANNER_MODE=parse_comments in parser_speed.v and scanner_speed.v
- testing: fix warning for compiling
./v cmd/tools/vtest.v
- docs: add a section about modules specifics (#20653)
- github: add dependabot.yml (#20800)
- vtest,pref: add ability to have platform specific _test.v files (#20810)
- ci: change spaceface777/cancel-workflow-action to styfle/cancel-workflow-action (#20806)
- tools: use the same same skipping logic for the platform specific _test.v files in
v test-self
too (#20815) - tools: make the output of
v check-md .
more informative (#20819) - v.debug: implement tracing hook feature (#20818)
- ci: mark db_store_test.v as flaky
- ci: add a vtcc step (check that vtcc, continues to be able to compile with v, and v itself can be compiled with vtcc) (#21000)
- v.util: simplify vtest (#21013)
- vtest-self: add sandboxed packaging case (#21059)
Operating System support
- v.builder: allow for
v -shared -os windows file.v
on Linux/macos (fix #20445) (#20453) - Add windows dll support, fix (#20447) (#20459)
- sync: add mutex.try*lock functions for FreeBSD too (#20482)
- sync: fix FreeBSD implementation of sync functions (#20483)
- os: make os.cache_dir() and os.vtmp_dir() more robust to parallel test executions on windows (#20495)
- builder: replace "-rdynamic" for clang on macos with "-Wl,-export_dynamic" (fix #20510) (#20511)
- builder: restore ability to use tcc, without fallback to cc on macos
- v.builder: use a more uniq prefix for the generated temporary file names, to further reduce the chances of collision and sporadic CI failures on windows (#20551)
- encoding.csv: fix bug in RandomAccessReader, spotted on windows with mingw32 (#20571)
- builtin: use
#pkgconfig bdw-gc-threaded
where available, instead of#pkgconfig bdw-gc
(on FreeBSD) - db.pg: add include and lib paths for PostgreSQL on FreeBSD (#20582)
- thirdparty: fix
v cmd/tools/vcompress.v
on FreeBSD - os: fix an error in Process.win_spawn_process, not using stdout pipe in a cmd environment on 32bit Windows (#20613)
- testing: retry 1 additional time sporadic silent test run failures on macos
- builder: add '-lelf' to linker flags on freebsd (fix #20481) (#20643)
- GNUmakefile: use standard default RM make variable to fix MSYS2 env on windows (#20701)
- x.vweb: add the missing include for C.sendfile to sendfile_linux.c.v
- clipboard: fix notice in clipboard_windows.c.v (#20733)
- ci: update macos runners to macos-14, to make use of the much faster m1 instances (#20747)
- builder: support musl-gcc on macos
- builtin: link to user32 to fix boehm GC compilation on Windows with clang released from the LLVM project (fix #20724) (#20767)
- pref: download correct photonwrapper.so for linux (#20783)
- ci: improve repo CI robustness, by marking dynamic_template_manager_cache_system_test.v as flaky, and only failing db_store_test.v on !windows
- tools.vpm: fix remove command on Windows, add test (#20852)
- os: don't check rdev equality on FreeBSD, inside vlib/os/os_stat_test.v (#20885)
- sync: support more gcc version specific search locations on linux with tcc