Skip to content

Commit 414b7ae

Browse files
enghitaloclaude
andcommitted
x.json2: decode option fields via comptime $zero/$new type accessors
Build option payloads with `$zero(field.typ.payload_type)` and option pointer payloads with `$new(field.typ.payload_type.pointee_type)`, resolving each field's payload directly at the comptime field site. This replaces the `create_value_from_optional` and `create_decoded_option_ptr` generic helpers, which existed only to work around options not being passable to generic functions (the limitation lifted by #27048). The accompanying `or {}` fallbacks were dead code: `create_value_from_optional` always returned a value and never `none`. No behavior change; the full `vlib/x/json2` suite (61 files) still passes, including the `?&T` option-pointer regression in decode_embed_reference_test.v. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
1 parent 8520724 commit 414b7ae

1 file changed

Lines changed: 4 additions & 22 deletions

File tree

vlib/x/json2/decode.v

Lines changed: 4 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -335,10 +335,6 @@ fn create_decoded_ptr[T](_ &T) &T {
335335
}
336336
}
337337

338-
fn create_decoded_option_ptr[U](_ ?&U) &U {
339-
return &U{}
340-
}
341-
342338
fn decoder_field_infos[T]() []DecoderFieldInfo {
343339
mut field_infos := []DecoderFieldInfo{}
344340
$for field in T.fields {
@@ -551,16 +547,11 @@ fn decode_struct_key[T](mut decoder Decoder, val T, key_info ValueInfo, prefix s
551547
}
552548
} else {
553549
$if field.indirections == 1 {
554-
mut decoded_ptr := create_decoded_option_ptr(new_val.$(field.name))
550+
mut decoded_ptr := $new(field.typ.payload_type.pointee_type)
555551
decoder.decode_value(mut decoded_ptr)!
556552
new_val.$(field.name) = decoded_ptr
557553
} $else {
558-
mut unwrapped_val := create_value_from_optional(new_val.$(field.name)) or {
559-
return StructKeyDecodeResult[T]{
560-
matched: false
561-
value: val
562-
}
563-
}
554+
mut unwrapped_val := $zero(field.typ.payload_type)
564555
decoder.decode_value(mut unwrapped_val)!
565556
new_val.$(field.name) = unwrapped_val
566557
}
@@ -916,8 +907,6 @@ fn (mut decoder Decoder) decode_value[T](mut val T) ! {
916907
}
917908
} else {
918909
$if field.typ is $option {
919-
// it would be nicer to do this at the start of the function
920-
// but options cant be passed to generic functions
921910
if decoder.current_node.value.value_kind == .null {
922911
val.$(field.name) = none
923912

@@ -926,14 +915,11 @@ fn (mut decoder Decoder) decode_value[T](mut val T) ! {
926915
}
927916
} else {
928917
$if field.indirections == 1 {
929-
mut decoded_ptr :=
930-
create_decoded_option_ptr(val.$(field.name))
918+
mut decoded_ptr := $new(field.typ.payload_type.pointee_type)
931919
decoder.decode_value(mut decoded_ptr)!
932920
val.$(field.name) = decoded_ptr
933921
} $else {
934-
mut unwrapped_val := create_value_from_optional(val.$(field.name)) or {
935-
return
936-
}
922+
mut unwrapped_val := $zero(field.typ.payload_type)
937923
decoder.decode_value(mut unwrapped_val)!
938924
val.$(field.name) = unwrapped_val
939925
}
@@ -1307,10 +1293,6 @@ fn (mut decoder Decoder) decode_map[V](mut val map[string]V) ! {
13071293
}
13081294
}
13091295

1310-
fn create_value_from_optional[T](_val ?T) ?T {
1311-
return T{}
1312-
}
1313-
13141296
fn (mut decoder Decoder) decode_enum[T](mut val T) ! {
13151297
enum_info := decoder.current_node.value
13161298

0 commit comments

Comments
 (0)