From 51a013fcf142fd7fcfed370bdbaf9de6db19020e Mon Sep 17 00:00:00 2001 From: Feoramund <161657516+Feoramund@users.noreply.github.com> Date: Sat, 15 Jun 2024 01:32:28 -0400 Subject: [PATCH] Work around BSD lack of `core:net` support --- core/flags/errors.odin | 8 ------- core/flags/errors_bsd.odin | 9 ++++++++ core/flags/errors_nonbsd.odin | 11 ++++++++++ core/flags/internal_rtti.odin | 14 +------------ core/flags/internal_rtti_nonbsd.odin | 31 ++++++++++++++++++++++++++++ 5 files changed, 52 insertions(+), 21 deletions(-) create mode 100644 core/flags/errors_bsd.odin create mode 100644 core/flags/errors_nonbsd.odin create mode 100644 core/flags/internal_rtti_nonbsd.odin diff --git a/core/flags/errors.odin b/core/flags/errors.odin index 1862a7a00..21ea05477 100644 --- a/core/flags/errors.odin +++ b/core/flags/errors.odin @@ -1,7 +1,5 @@ package flags -import "base:runtime" -import "core:net" import "core:os" Parse_Error_Reason :: enum { @@ -20,12 +18,6 @@ Parse_Error_Reason :: enum { Unsupported_Type, } -Unified_Parse_Error_Reason :: union #shared_nil { - Parse_Error_Reason, - runtime.Allocator_Error, - net.Parse_Endpoint_Error, -} - // Raised during parsing, naturally. Parse_Error :: struct { reason: Unified_Parse_Error_Reason, diff --git a/core/flags/errors_bsd.odin b/core/flags/errors_bsd.odin new file mode 100644 index 000000000..10c04b506 --- /dev/null +++ b/core/flags/errors_bsd.odin @@ -0,0 +1,9 @@ +//+build freebsd, netbsd, openbsd +package flags + +import "base:runtime" + +Unified_Parse_Error_Reason :: union #shared_nil { + Parse_Error_Reason, + runtime.Allocator_Error, +} diff --git a/core/flags/errors_nonbsd.odin b/core/flags/errors_nonbsd.odin new file mode 100644 index 000000000..ff46f38ed --- /dev/null +++ b/core/flags/errors_nonbsd.odin @@ -0,0 +1,11 @@ +//+build !freebsd !netbsd !openbsd +package flags + +import "base:runtime" +import "core:net" + +Unified_Parse_Error_Reason :: union #shared_nil { + Parse_Error_Reason, + runtime.Allocator_Error, + net.Parse_Endpoint_Error, +} diff --git a/core/flags/internal_rtti.odin b/core/flags/internal_rtti.odin index 8a11ebbc1..c9b1f59fd 100644 --- a/core/flags/internal_rtti.odin +++ b/core/flags/internal_rtti.odin @@ -5,7 +5,6 @@ import "base:intrinsics" import "base:runtime" import "core:fmt" import "core:mem" -@require import "core:net" import "core:os" import "core:reflect" import "core:strconv" @@ -309,18 +308,7 @@ parse_and_set_pointer_by_named_type :: proc(ptr: rawptr, str: string, data_type: } when IMPORTING_NET { - if data_type == net.Host_Or_Endpoint { - addr, net_error := net.parse_hostname_or_endpoint(str) - if net_error != nil { - // We pass along `net.Error` here. - out_error^ = Parse_Error { - net_error, - "Invalid Host/Endpoint.", - } - return - } - - (cast(^net.Host_Or_Endpoint)ptr)^ = addr + if try_net_parse_workaround(data_type, str, ptr, out_error) { return } } diff --git a/core/flags/internal_rtti_nonbsd.odin b/core/flags/internal_rtti_nonbsd.odin new file mode 100644 index 000000000..196c27ab8 --- /dev/null +++ b/core/flags/internal_rtti_nonbsd.odin @@ -0,0 +1,31 @@ +//+private +//+build !freebsd !netbsd !openbsd +package flags + +import "core:net" + +// This proc exists purely as a workaround for import restrictions. +// Returns true if caller should return early. +try_net_parse_workaround :: #force_inline proc ( + data_type: typeid, + str: string, + ptr: rawptr, + out_error: ^Error, +) -> bool { + if data_type == net.Host_Or_Endpoint { + addr, net_error := net.parse_hostname_or_endpoint(str) + if net_error != nil { + // We pass along `net.Error` here. + out_error^ = Parse_Error { + net_error, + "Invalid Host/Endpoint.", + } + return true + } + + (cast(^net.Host_Or_Endpoint)ptr)^ = addr + return true + } + + return false +}