From 4c9c515f8b3bf752aaf352948a3a26510e554dad Mon Sep 17 00:00:00 2001 From: Delyan Angelov Date: Sat, 24 Jun 2023 08:03:12 +0300 Subject: [PATCH] parser: remove hardcoded check for function calls for `C.stat`, `C.sigaction`, etc (#18535) --- vlib/builtin/builtin_windows.c.v | 4 ++-- vlib/builtin/cfns.c.v | 2 +- vlib/os/os.c.v | 4 ++-- vlib/os/os_windows.c.v | 2 +- vlib/time/time.c.v | 8 ++++---- vlib/v/parser/parser.v | 21 ++++++++++++++------- 6 files changed, 24 insertions(+), 17 deletions(-) diff --git a/vlib/builtin/builtin_windows.c.v b/vlib/builtin/builtin_windows.c.v index f458ed2740..16f01c8590 100644 --- a/vlib/builtin/builtin_windows.c.v +++ b/vlib/builtin/builtin_windows.c.v @@ -232,10 +232,10 @@ pub: type VectoredExceptionHandler = fn (&ExceptionPointers) int -fn C.AddVectoredExceptionHandler(int, C.PVECTORED_EXCEPTION_HANDLER) +fn C.AddVectoredExceptionHandler(int, voidptr) fn add_vectored_exception_handler(handler VectoredExceptionHandler) { - C.AddVectoredExceptionHandler(1, C.PVECTORED_EXCEPTION_HANDLER(handler)) + C.AddVectoredExceptionHandler(1, voidptr(handler)) } [callconv: stdcall] diff --git a/vlib/builtin/cfns.c.v b/vlib/builtin/cfns.c.v index d88d3ee92a..0979f06112 100644 --- a/vlib/builtin/cfns.c.v +++ b/vlib/builtin/cfns.c.v @@ -255,7 +255,7 @@ fn C.SendMessageTimeoutW(hWnd voidptr, msg u32, wParam &u16, lParam &u32, fuFlag fn C.CreateProcessW(lpApplicationName &u16, lpCommandLine &u16, lpProcessAttributes voidptr, lpThreadAttributes voidptr, bInheritHandles bool, dwCreationFlags u32, lpEnvironment voidptr, lpCurrentDirectory &u16, lpStartupInfo voidptr, lpProcessInformation voidptr) bool -fn C.ReadFile(hFile voidptr, lpBuffer voidptr, nNumberOfBytesToRead u32, lpNumberOfBytesRead C.LPDWORD, lpOverlapped voidptr) bool +fn C.ReadFile(hFile voidptr, lpBuffer voidptr, nNumberOfBytesToRead u32, lpNumberOfBytesRead &u32, lpOverlapped voidptr) bool fn C.GetFileAttributesW(lpFileName &u8) u32 diff --git a/vlib/os/os.c.v b/vlib/os/os.c.v index 1d241e3255..7ebd34a8ed 100644 --- a/vlib/os/os.c.v +++ b/vlib/os/os.c.v @@ -558,7 +558,7 @@ pub fn get_raw_line() string { mut offset := 0 for { pos := buf + offset - res := C.ReadFile(h_input, pos, 1, C.LPDWORD(&bytes_read), 0) + res := C.ReadFile(h_input, pos, 1, &u32(&bytes_read), 0) if !res && offset == 0 { return tos(buf, 0) } @@ -600,7 +600,7 @@ pub fn get_raw_stdin() []u8 { mut offset := 0 for { pos := buf + offset - res := C.ReadFile(h_input, pos, block_bytes, C.LPDWORD(&bytes_read), 0) + res := C.ReadFile(h_input, pos, block_bytes, &u32(&bytes_read), 0) offset += bytes_read if !res { break diff --git a/vlib/os/os_windows.c.v b/vlib/os/os_windows.c.v index a8534524d9..984c820f94 100644 --- a/vlib/os/os_windows.c.v +++ b/vlib/os/os_windows.c.v @@ -449,7 +449,7 @@ pub type VectoredExceptionHandler = fn (&ExceptionPointers) u32 // duplicate definitions from displeasing the compiler // fn C.AddVectoredExceptionHandler(u32, VectoredExceptionHandler) pub fn add_vectored_exception_handler(first bool, handler VectoredExceptionHandler) { - C.AddVectoredExceptionHandler(u32(first), C.PVECTORED_EXCEPTION_HANDLER(handler)) + C.AddVectoredExceptionHandler(u32(first), voidptr(handler)) } // uname returns information about the platform on which the program is running. diff --git a/vlib/time/time.c.v b/vlib/time/time.c.v index 5062cd558b..2f09c2c54b 100644 --- a/vlib/time/time.c.v +++ b/vlib/time/time.c.v @@ -18,7 +18,7 @@ fn C.time(t &C.time_t) C.time_t fn C.gmtime(t &C.time_t) &C.tm fn C.gmtime_r(t &C.time_t, res &C.tm) &C.tm -fn C.strftime(buf &C.char, maxsize C.size_t, fmt &C.char, tm &C.tm) C.size_t +fn C.strftime(buf &char, maxsize usize, const_format &char, const_tm &C.tm) usize // now returns current local time. pub fn now() Time { @@ -129,8 +129,8 @@ pub fn (t Time) strftime(fmt string) string { } $else { C.gmtime_r(voidptr(&t.unix), tm) } - mut buf := [1024]C.char{} - fmt_c := unsafe { &C.char(fmt.str) } - C.strftime(&buf[0], C.size_t(sizeof(buf)), fmt_c, tm) + mut buf := [1024]char{} + fmt_c := unsafe { &char(fmt.str) } + C.strftime(&buf[0], usize(sizeof(buf)), fmt_c, tm) return unsafe { cstring_to_vstring(&char(&buf[0])) } } diff --git a/vlib/v/parser/parser.v b/vlib/v/parser/parser.v index 3dafe614b9..3563f6ee13 100644 --- a/vlib/v/parser/parser.v +++ b/vlib/v/parser/parser.v @@ -2605,27 +2605,34 @@ fn (mut p Parser) name_expr() ast.Expr { && p.peek_token(2).kind == .rsbr && (p.peek_token(4).kind == .lpar || p.peek_token(6).kind == .lpar)) { // ?[]foo(), ?[1]foo, foo(), foo() or type() cast - mut name := if is_array { + mut original_name := if is_array { p.peek_token(if is_fixed_array { 3 } else { 2 }).lit } else { p.tok.lit } if is_fixed_array && p.peek_token(4).kind == .dot { - mod = name - name = p.peek_token(5).lit + mod = original_name + original_name = p.peek_token(5).lit } else if is_array && p.peek_token(3).kind == .dot { - mod = name - name = p.peek_token(4).lit + mod = original_name + original_name = p.peek_token(4).lit } + mut name := original_name if mod.len > 0 { name = '${mod}.${name}' } name_w_mod := p.prepend_mod(name) + is_c_pointer_cast := language == .c && prev_tok_kind == .amp // `&C.abc(x)` is *always* a cast + is_c_type_cast := language == .c && (original_name in ['intptr_t', 'uintptr_t'] + || (name in p.table.type_idxs && original_name[0].is_capital())) + is_js_cast := language == .js && name.all_after_last('.')[0].is_capital() // type cast. TODO: finish // if name in ast.builtin_type_names_to_idx { - if (!known_var && (name in p.table.type_idxs || name_w_mod in p.table.type_idxs) - && name !in ['C.statvfs', 'C.stat', 'C.sigaction']) || is_mod_cast + // handle the easy cases first, then check for an already known V typename, not shadowed by a local variable + if is_mod_cast || is_c_pointer_cast || is_c_type_cast || is_js_cast || is_generic_cast || (language == .v && name.len > 0 && (name[0].is_capital() + || (!known_var && (name in p.table.type_idxs + || name_w_mod in p.table.type_idxs)) || name.all_after_last('.')[0].is_capital())) { // MainLetter(x) is *always* a cast, as long as it is not `C.` // TODO handle C.stat()