From 43d83717e7de5ab98bf225c6163291079163bf2e Mon Sep 17 00:00:00 2001 From: Delyan Angelov Date: Sun, 4 Apr 2021 22:43:13 +0300 Subject: [PATCH] ci: add more byteptr/&byte compatibility shims to smooth the transition to &byte --- vlib/picohttpparser/picohttpparser.v | 21 +++++++++------- vlib/picohttpparser/request.v | 35 ++++++++------------------- vlib/v/checker/check_types.v | 36 +++++++++++++++++++++------- 3 files changed, 49 insertions(+), 43 deletions(-) diff --git a/vlib/picohttpparser/picohttpparser.v b/vlib/picohttpparser/picohttpparser.v index 1dc9b31fcf..9b2680e840 100644 --- a/vlib/picohttpparser/picohttpparser.v +++ b/vlib/picohttpparser/picohttpparser.v @@ -11,22 +11,25 @@ module picohttpparser struct C.phr_header { pub: - name charptr + name &char name_len int - value charptr + value &char value_len int } +type PPchar = &&char + struct C.phr_header_t {} -fn C.phr_parse_request(buf charptr, len size_t, method &charptr, method_len &size_t, path &charptr, path_len &size_t, minor_version &int, headers &C.phr_header, num_headers &size_t, last_len size_t) int +fn C.phr_parse_request(buf &char, len size_t, method PPchar, method_len &size_t, path PPchar, path_len &size_t, minor_version &int, headers &C.phr_header, num_headers &size_t, last_len size_t) int -fn C.phr_parse_response(buf charptr, len size_t, minor_version &int, status &int, msg &charptr, msg_len &size_t, headers &C.phr_header, num_headers &size_t, last_len size_t) int +fn C.phr_parse_response(buf &char, len size_t, minor_version &int, status &int, msg PPchar, msg_len &size_t, headers &C.phr_header, num_headers &size_t, last_len size_t) int -fn C.phr_parse_headers(buf charptr, len size_t, headers &C.phr_header, num_headers &size_t, last_len size_t) int +fn C.phr_parse_headers(buf &char, len size_t, headers &C.phr_header, num_headers &size_t, last_len size_t) int + +fn C.phr_parse_request_path(buf_start &char, len size_t, method PPchar, method_len &size_t, path PPchar, path_len &size_t) int +fn C.phr_parse_request_path_pipeline(buf_start &char, len size_t, method PPchar, method_len &size_t, path PPchar, path_len &size_t) int +fn C.get_date() &byte -fn C.phr_parse_request_path(buf_start charptr, len size_t, method &charptr, method_len &size_t, path &charptr, path_len &size_t) int -fn C.phr_parse_request_path_pipeline(buf_start charptr, len size_t, method &charptr, method_len &size_t, path &charptr, path_len &size_t) int -fn C.get_date() byteptr // char * u64toa(uint64_t value, char *buffer) -fn C.u64toa(value u64, buffer charptr) charptr +fn C.u64toa(buffer &char, value u64) &char diff --git a/vlib/picohttpparser/request.v b/vlib/picohttpparser/request.v index 3e94a886c8..48523d40f3 100644 --- a/vlib/picohttpparser/request.v +++ b/vlib/picohttpparser/request.v @@ -2,16 +2,13 @@ module picohttpparser pub struct Request { pub mut: - method string - path string - headers[100] C.phr_header + method string + path string + headers [100]C.phr_header num_headers u64 - body string + body string } - - - [inline] pub fn (mut r Request) parse_request(s string, max_headers int) int { method_len := u64(0) @@ -19,14 +16,8 @@ pub fn (mut r Request) parse_request(s string, max_headers int) int { minor_version := 0 num_headers := u64(max_headers) - pret := C.phr_parse_request( - s.str, s.len, - &r.method.str, &method_len, - &r.path.str, &path_len, - &minor_version, - &r.headers[0], &num_headers, - 0 - ) + pret := C.phr_parse_request(s.str, s.len, PPchar(&r.method.str), &method_len, PPchar(&r.path.str), + &path_len, &minor_version, &r.headers[0], &num_headers, 0) if pret > 0 { unsafe { r.method = tos(r.method.str, int(method_len)) @@ -42,11 +33,8 @@ pub fn (mut r Request) parse_request_path(s string) int { method_len := u64(0) path_len := u64(0) - pret := C.phr_parse_request_path( - s.str, s.len, - &r.method.str, &method_len, - &r.path.str, &path_len - ) + pret := C.phr_parse_request_path(s.str, s.len, PPchar(&r.method.str), &method_len, + PPchar(&r.path.str), &path_len) if pret > 0 { unsafe { r.method = tos(r.method.str, int(method_len)) @@ -61,11 +49,8 @@ pub fn (mut r Request) parse_request_path_pipeline(s string) int { method_len := u64(0) path_len := u64(0) - pret := C.phr_parse_request_path_pipeline( - s.str, s.len, - &r.method.str, &method_len, - &r.path.str, &path_len - ) + pret := C.phr_parse_request_path_pipeline(s.str, s.len, PPchar(&r.method.str), &method_len, + PPchar(&r.path.str), &path_len) if pret > 0 { unsafe { r.method = tos(r.method.str, int(method_len)) diff --git a/vlib/v/checker/check_types.v b/vlib/v/checker/check_types.v index 005b368438..74838a5643 100644 --- a/vlib/v/checker/check_types.v +++ b/vlib/v/checker/check_types.v @@ -50,17 +50,35 @@ pub fn (mut c Checker) check_expected_call_arg(got ast.Type, expected_ ast.Type, if c.check_types(got, expected) { return } - igot := int(got) - iexpected := int(expected) - if (igot == ast.byteptr_type_idx && iexpected == 65545) - || (iexpected == ast.byteptr_type_idx && igot == 65545) { + idx_got := got.idx() + idx_expected := expected.idx() + if idx_got in [ ast.byteptr_type_idx, ast.charptr_type_idx] || idx_expected in [ast.byteptr_type_idx, ast.charptr_type_idx] { + igot := int(got) + iexpected := int(expected) // TODO: remove; transitional compatibility for byteptr === &byte - return - } - if (igot == ast.charptr_type_idx && iexpected == 65551) - || (iexpected == ast.charptr_type_idx && igot == 65545) { + if (igot == ast.byteptr_type_idx && iexpected == 65545) + || (iexpected == ast.byteptr_type_idx && igot == 65545) { + return + } // TODO: remove; transitional compatibility for charptr === &char - return + if (igot == ast.charptr_type_idx && iexpected == 65551) + || (iexpected == ast.charptr_type_idx && igot == 65551) { + return + } + muls_got := got.nr_muls() + muls_expected := expected.nr_muls() + if idx_got == ast.byteptr_type_idx && idx_expected == ast.byte_type_idx && muls_got + 1 == muls_expected { + return + } + if idx_expected == ast.byteptr_type_idx && idx_got == ast.byte_type_idx && muls_expected + 1 == muls_got { + return + } + if idx_got == ast.charptr_type_idx && idx_expected == ast.char_type_idx && muls_got + 1 == muls_expected { + return + } + if idx_expected == ast.charptr_type_idx && idx_got == ast.char_type_idx && muls_expected + 1 == muls_got { + return + } } return error('cannot use `${c.table.type_to_str(got.clear_flag(.variadic))}` as `${c.table.type_to_str(expected.clear_flag(.variadic))}`') }