diff --git a/vlib/compiler/gen_c.v b/vlib/compiler/gen_c.v index f17086d071..0dbf1d6c19 100644 --- a/vlib/compiler/gen_c.v +++ b/vlib/compiler/gen_c.v @@ -211,8 +211,11 @@ fn (p mut Parser) index_get(typ string, fn_ph int, cfg IndexConfig) { } } } - else if cfg.is_str && !p.builtin_mod && !p.pref.is_bare { - if cfg.is_slice { + else if cfg.is_str && !p.builtin_mod { + if p.pref.is_bare { + p.gen(index_expr) + } + else if cfg.is_slice { p.gen('string_substr2($index_expr)') } else { p.gen('string_at($index_expr)') diff --git a/vlib/compiler/parser.v b/vlib/compiler/parser.v index 7022664434..87ba9f11d8 100644 --- a/vlib/compiler/parser.v +++ b/vlib/compiler/parser.v @@ -1856,10 +1856,10 @@ fn (p mut Parser) index_expr(typ_ string, fn_ph int) string { if is_str { typ = 'byte' // Direct faster access to .str[i] in builtin modules - if p.builtin_mod { + if p.builtin_mod || p.pref.is_bare { p.gen('.str[') close_bracket = true - } + } else { // Bounds check everywhere else p.gen(', ') diff --git a/vlib/os/bare/bare_example_linux.v b/vlib/os/bare/bare_example_linux.v index 3876e2b18b..6482576d3c 100644 --- a/vlib/os/bare/bare_example_linux.v +++ b/vlib/os/bare/bare_example_linux.v @@ -1,6 +1,6 @@ fn syscall5(number, arg1, arg2, arg3, arg4, arg5 voidptr) voidptr -fn write(fd int, data voidptr, nbytes u64) int { +fn write(fd int, data voidptr, nbytes int) int { return syscall5( 1, // SYS_write fd, @@ -12,6 +12,9 @@ fn write(fd int, data voidptr, nbytes u64) int { } fn main() { - write(1, c'hallo\n', 6) + write(1, c'hello\n', 6) + s := 'test string' + write(1, s.str, s.len) + a := s[0] }