Skip to content

Commit

Permalink
Merge remote-tracking branch 'origin/master' into json_anon_struct
Browse files Browse the repository at this point in the history
  • Loading branch information
felipensp committed Sep 16, 2024
2 parents 34c4a4b + 0fb95a8 commit 6c43774
Show file tree
Hide file tree
Showing 19 changed files with 129 additions and 64 deletions.
4 changes: 2 additions & 2 deletions .github/workflows/wasm_backend_ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -47,9 +47,9 @@ jobs:
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [ubuntu-22.04, macos-12, windows-2022]
os: [ubuntu-22.04, windows-2022]
fail-fast: false
timeout-minutes: 121
timeout-minutes: 10
env:
VTEST_ONLY: wasm
steps:
Expand Down
4 changes: 3 additions & 1 deletion GNUmakefile
Original file line number Diff line number Diff line change
Expand Up @@ -144,7 +144,10 @@ fresh_vc:
ifndef local
latest_tcc: $(TMPTCC)/.git/config
cd $(TMPTCC) && $(GITCLEANPULL)
ifneq (,$(wildcard ./tcc.exe))
@$(MAKE) --quiet check_for_working_tcc 2> /dev/null
endif

else
latest_tcc:
@echo "Using local tcc"
Expand All @@ -161,7 +164,6 @@ ifneq (,$(findstring thirdparty-$(TCCOS)-$(TCCARCH), $(shell git ls-remote --hea
else
@echo 'Pre-built TCC not available for thirdparty-$(TCCOS)-$(TCCARCH) at $(TCCREPO), will use the system compiler: $(CC)'
$(GITFASTCLONE) --branch thirdparty-unknown-unknown $(TCCREPO) $(TMPTCC)
@$(MAKE) --quiet check_for_working_tcc 2> /dev/null
endif
else
@echo "Using local tccbin"
Expand Down
7 changes: 7 additions & 0 deletions cmd/tools/vtest-all.v
Original file line number Diff line number Diff line change
Expand Up @@ -402,6 +402,13 @@ fn get_all_commands() []Command {
rmfile: 'v.c'
}
}
$if linux || macos {
res << Command{
line: '${vexe} -gc none -no-retry-compilation -cc tcc -d use_openssl -showcc examples/veb/todo/main.v'
okmsg: 'A simple veb app, compiles with `-gc none -no-retry-compilation -cc tcc -d use_openssl` on macos and linux'
rmfile: 'examples/veb/todo/main'
}
}
$if linux {
res << Command{
line: '${vexe} vlib/v/tests/bench/bench_stbi_load.v && prlimit -v10485760 vlib/v/tests/bench/bench_stbi_load'
Expand Down
34 changes: 34 additions & 0 deletions doc/docs.md
Original file line number Diff line number Diff line change
Expand Up @@ -5632,6 +5632,40 @@ fn main() {
}
```
```v
// @[_allow_multiple_values] allows an enum to have multiple duplicate values.
// Use it carefully, only when you really need it.

@[_allow_multiple_values]
enum ButtonStyle {
primary = 1
secondary = 2
success = 3

blurple = 1
grey = 2
gray = 2
green = 3
}

fn main() {
assert int(ButtonStyle.primary) == 1
assert int(ButtonStyle.blurple) == 1

assert int(ButtonStyle.secondary) == 2
assert int(ButtonStyle.gray) == 2
assert int(ButtonStyle.grey) == 2

assert int(ButtonStyle.success) == 3
assert int(ButtonStyle.green) == 3

assert ButtonStyle.primary == ButtonStyle.blurple
assert ButtonStyle.secondary == ButtonStyle.grey
assert ButtonStyle.secondary == ButtonStyle.gray
assert ButtonStyle.success == ButtonStyle.green
}
```
Struct field deprecations:
```v oksyntax
Expand Down
6 changes: 6 additions & 0 deletions thirdparty/mbedtls/include/mbedtls/check_config.h
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,12 @@
#ifndef MBEDTLS_CHECK_CONFIG_H
#define MBEDTLS_CHECK_CONFIG_H

#if ( defined(__TINYC__) && defined(__APPLE__) && defined(__arm64__) )
#undef MBEDTLS_HAVE_ASM
#undef MBEDTLS_AESNI_C
#undef MBEDTLS_PADLOCK_C
#endif

/*
* We assume CHAR_BIT is 8 in many places. In practice, this is true on our
* target platforms, so not an issue, but let's just be extra sure.
Expand Down
4 changes: 2 additions & 2 deletions thirdparty/zip/miniz.h
Original file line number Diff line number Diff line change
Expand Up @@ -5026,7 +5026,7 @@ static int mz_mkdir(const char *pDirname) {
}

#ifndef MINIZ_NO_TIME
#if (defined(__FreeBSD__) || defined(__DragonFly__) || defined(__FreeBSD_kernel__)) && !defined(FREEBSD)
#if ( defined(__APPLE__) || defined(__FreeBSD__) || defined(__DragonFly__) || defined(__FreeBSD_kernel__)) && !defined(FREEBSD)
#include <utime.h>
#else
#include <sys/utime.h>
Expand Down Expand Up @@ -5073,7 +5073,7 @@ static int mz_mkdir(const char *pDirname) {

#elif defined(__TINYC__)
#ifndef MINIZ_NO_TIME
#if (defined(__FreeBSD__) || defined(__DragonFly__) || defined(__FreeBSD_kernel__)) && !defined(FREEBSD)
#if ( defined(__APPLE__) || defined(__FreeBSD__) || defined(__DragonFly__) || defined(__FreeBSD_kernel__)) && !defined(FREEBSD)
#include <utime.h>
#else
#include <sys/utime.h>
Expand Down
100 changes: 46 additions & 54 deletions vlib/builtin/string.v
Original file line number Diff line number Diff line change
Expand Up @@ -1721,9 +1721,9 @@ pub fn (s string) trim(cutset string) string {
return s.clone()
}
if cutset.len_utf8() == cutset.len {
return s.trim_chars(cutset)
return s.trim_chars(cutset, .trim_both)
} else {
return s.trim_runes(cutset)
return s.trim_runes(cutset, .trim_both)
}
}

Expand Down Expand Up @@ -1757,25 +1757,35 @@ pub fn (s string) trim_indexes(cutset string) (int, int) {
return pos_left, pos_right + 1
}

enum TrimMode {
trim_left
trim_right
trim_both
}

@[direct_array_access]
fn (s string) trim_chars(cutset string) string {
fn (s string) trim_chars(cutset string, mode TrimMode) string {
mut pos_left := 0
mut pos_right := s.len - 1
mut cs_match := true
for pos_left <= s.len && pos_right >= -1 && cs_match {
cs_match = false
for cs in cutset {
if s[pos_left] == cs {
pos_left++
cs_match = true
break
if mode in [.trim_left, .trim_both] {
for cs in cutset {
if s[pos_left] == cs {
pos_left++
cs_match = true
break
}
}
}
for cs in cutset {
if s[pos_right] == cs {
pos_right--
cs_match = true
break
if mode in [.trim_right, .trim_both] {
for cs in cutset {
if s[pos_right] == cs {
pos_right--
cs_match = true
break
}
}
}
if pos_left > pos_right {
Expand All @@ -1786,26 +1796,30 @@ fn (s string) trim_chars(cutset string) string {
}

@[direct_array_access]
fn (s string) trim_runes(cutset string) string {
fn (s string) trim_runes(cutset string, mode TrimMode) string {
s_runes := s.runes()
c_runes := cutset.runes()
mut pos_left := 0
mut pos_right := s_runes.len - 1
mut cs_match := true
for pos_left <= s_runes.len && pos_right >= -1 && cs_match {
cs_match = false
for cs in c_runes {
if s_runes[pos_left] == cs {
pos_left++
cs_match = true
break
if mode in [.trim_left, .trim_both] {
for cs in c_runes {
if s_runes[pos_left] == cs {
pos_left++
cs_match = true
break
}
}
}
for cs in c_runes {
if s_runes[pos_right] == cs {
pos_right--
cs_match = true
break
if mode in [.trim_right, .trim_both] {
for cs in c_runes {
if s_runes[pos_right] == cs {
pos_right--
cs_match = true
break
}
}
}
if pos_left > pos_right {
Expand All @@ -1822,21 +1836,11 @@ pub fn (s string) trim_left(cutset string) string {
if s == '' || cutset == '' {
return s.clone()
}
mut pos := 0
for pos < s.len {
mut found := false
for cs in cutset {
if s[pos] == cs {
found = true
break
}
}
if !found {
break
}
pos++
if cutset.len_utf8() == cutset.len {
return s.trim_chars(cutset, .trim_left)
} else {
return s.trim_runes(cutset, .trim_left)
}
return s[pos..]
}

// trim_right strips any of the characters given in `cutset` from the right of the string.
Expand All @@ -1846,23 +1850,11 @@ pub fn (s string) trim_right(cutset string) string {
if s.len < 1 || cutset.len < 1 {
return s.clone()
}
mut pos := s.len - 1
for pos >= 0 {
mut found := false
for cs in cutset {
if s[pos] == cs {
found = true
}
}
if !found {
break
}
pos--
}
if pos < 0 {
return ''
if cutset.len_utf8() == cutset.len {
return s.trim_chars(cutset, .trim_right)
} else {
return s.trim_runes(cutset, .trim_right)
}
return s[..pos + 1]
}

// trim_string_left strips `str` from the start of the string.
Expand Down
2 changes: 2 additions & 0 deletions vlib/builtin/string_test.v
Original file line number Diff line number Diff line change
Expand Up @@ -943,6 +943,7 @@ fn test_trim_left() {
s = 'banana'
assert s.trim_left('ba') == 'nana'
assert s.trim_left('ban') == ''
assert 'あいうえお'.trim_left('あい') == 'うえお'
}

fn test_trim_right() {
Expand All @@ -954,6 +955,7 @@ fn test_trim_right() {
s = 'banana'
assert s.trim_right('na') == 'b'
assert s.trim_right('ban') == ''
assert 'あいうえお'.trim_right('うえお') == 'あい'
}

fn test_all_before() {
Expand Down
8 changes: 3 additions & 5 deletions vlib/crypto/rand/rand_darwin.c.v
Original file line number Diff line number Diff line change
Expand Up @@ -4,16 +4,14 @@

module rand

#include <Security/SecRandom.h>
#include <sys/random.h>

#flag darwin -framework Security

fn C.SecRandomCopyBytes(rnd C.SecRandomRef, count usize, bytes voidptr) int
fn C.getentropy(buf voidptr, buflen usize) int

// read returns an array of `bytes_needed` random bytes read from the OS.
pub fn read(bytes_needed int) ![]u8 {
mut buffer := []u8{len: bytes_needed}
status := C.SecRandomCopyBytes(C.SecRandomRef(0), bytes_needed, buffer.data)
status := C.getentropy(buffer.data, bytes_needed)
if status != 0 {
return &ReadError{}
}
Expand Down
3 changes: 3 additions & 0 deletions vlib/crypto/scrypt/scrypt_test.v
Original file line number Diff line number Diff line change
Expand Up @@ -203,6 +203,9 @@ struct ScryptTestData {
expected_result []u8
}

// The scrypt test vectors are taken from
// [RFC7914](https://datatracker.ietf.org/doc/html/rfc7914#section-12)
// section 12.
const scrypt_test_cases = [
ScryptTestData{
name: 'test case 1'
Expand Down
3 changes: 3 additions & 0 deletions vlib/v/checker/checker.v
Original file line number Diff line number Diff line change
Expand Up @@ -1975,6 +1975,7 @@ fn (mut c Checker) enum_decl(mut node ast.EnumDecl) {
field.pos)
} else if !c.pref.translated && !c.file.is_translated && !node.is_multi_allowed
&& ilast + 1 in iseen {
c.add_error_detail('use `@[_allow_multiple_values]` attribute to allow multiple enum values. Use only when it is needed')
c.error('enum value `${ilast + 1}` already exists', field.pos)
}
iseen << ilast + 1
Expand All @@ -1989,6 +1990,7 @@ fn (mut c Checker) enum_decl(mut node ast.EnumDecl) {
field.pos)
} else if !c.pref.translated && !c.file.is_translated && !node.is_multi_allowed
&& ulast + 1 in useen {
c.add_error_detail('use `@[_allow_multiple_values]` attribute to allow multiple enum values. Use only when it is needed')
c.error('enum value `${ulast + 1}` already exists', field.pos)
}
useen << ulast + 1
Expand Down Expand Up @@ -2038,6 +2040,7 @@ fn (mut c Checker) check_enum_field_integer_literal(expr ast.IntegerLiteral, is_
}
if !overflows && !c.pref.translated && !c.file.is_translated && !is_multi_allowed {
if (is_signed && ival in iseen) || (!is_signed && uval in useen) {
c.add_error_detail('use `@[_allow_multiple_values]` attribute to allow multiple enum values. Use only when it is needed')
c.error('enum value `${expr.val}` already exists', pos)
}
}
Expand Down
2 changes: 2 additions & 0 deletions vlib/v/checker/struct.v
Original file line number Diff line number Diff line change
Expand Up @@ -350,6 +350,8 @@ fn (mut c Checker) struct_decl(mut node ast.StructDecl) {
}
}
}
} else {
c.error('`${t_sym.name}` is not an interface type', t.pos)
}
c.type_implements(struct_type, t.typ, node.pos)
}
Expand Down
2 changes: 2 additions & 0 deletions vlib/v/checker/tests/enum_field_value_duplicate_a.out
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,11 @@ vlib/v/checker/tests/enum_field_value_duplicate_a.vv:3:10: error: enum value `0`
| ^
4 | blue = 1
5 | alpha = 1
Details: use `@[_allow_multiple_values]` attribute to allow multiple enum values. Use only when it is needed
vlib/v/checker/tests/enum_field_value_duplicate_a.vv:5:10: error: enum value `1` already exists
3 | green = 0
4 | blue = 1
5 | alpha = 1
| ^
6 | }
Details: use `@[_allow_multiple_values]` attribute to allow multiple enum values. Use only when it is needed
1 change: 1 addition & 0 deletions vlib/v/checker/tests/enum_field_value_duplicate_b.out
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,4 @@ vlib/v/checker/tests/enum_field_value_duplicate_b.vv:4:2: error: enum value `0`
4 | blue // -1 + 1 = 0
| ~~~~
5 | }
Details: use `@[_allow_multiple_values]` attribute to allow multiple enum values. Use only when it is needed
1 change: 1 addition & 0 deletions vlib/v/checker/tests/enum_field_value_duplicate_c.out
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,4 @@ vlib/v/checker/tests/enum_field_value_duplicate_c.vv:6:12: error: enum value `1`
| ~~~~~~~~
7 | all = 0xFFFFFFFF
8 | }
Details: use `@[_allow_multiple_values]` attribute to allow multiple enum values. Use only when it is needed
1 change: 1 addition & 0 deletions vlib/v/checker/tests/enum_field_value_duplicate_d.out
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,4 @@ vlib/v/checker/tests/enum_field_value_duplicate_d.vv:6:6: error: enum value `1`
| ~~~
7 | }
8 |
Details: use `@[_allow_multiple_values]` attribute to allow multiple enum values. Use only when it is needed
1 change: 1 addition & 0 deletions vlib/v/checker/tests/enum_field_value_duplicate_e.out
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,4 @@ vlib/v/checker/tests/enum_field_value_duplicate_e.vv:4:6: error: enum value `2`
| ~~~
5 | }
6 |
Details: use `@[_allow_multiple_values]` attribute to allow multiple enum values. Use only when it is needed
5 changes: 5 additions & 0 deletions vlib/v/checker/tests/struct_implements_non_interface_err.out
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
vlib/v/checker/tests/struct_implements_non_interface_err.vv:1:26: error: `Abcde` is not an interface type
1 | struct Walker implements Abcde {
| ~~~~~
2 | aaa string
3 | }
5 changes: 5 additions & 0 deletions vlib/v/checker/tests/struct_implements_non_interface_err.vv
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
struct Walker implements Abcde {
aaa string
}

fn main() {}

0 comments on commit 6c43774

Please sign in to comment.