| ... | @@ -300,7 +300,7 @@ pub const Block = struct { | ... | @@ -300,7 +300,7 @@ pub const Block = struct { |
| 300 | .ty = ty, | 300 | .ty = ty, |
| 301 | .payload = try block.sema.addExtra(Air.StructField{ | 301 | .payload = try block.sema.addExtra(Air.StructField{ |
| 302 | .struct_operand = struct_ptr, | 302 | .struct_operand = struct_ptr, |
| 303 | .field_index = @intCast(u32, field_index), | 303 | .field_index = field_index, |
| 304 | }), | 304 | }), |
| 305 | } }, | 305 | } }, |
| 306 | }); | 306 | }); |
| ... | @@ -315,6 +315,24 @@ pub const Block = struct { | ... | @@ -315,6 +315,24 @@ pub const Block = struct { |
| 315 | }); | 315 | }); |
| 316 | } | 316 | } |
| 317 | | 317 | |
| | 318 | pub fn addStructFieldVal( |
| | 319 | block: *Block, |
| | 320 | struct_val: Air.Inst.Ref, |
| | 321 | field_index: u32, |
| | 322 | field_ty: Type, |
| | 323 | ) !Air.Inst.Ref { |
| | 324 | return block.addInst(.{ |
| | 325 | .tag = .struct_field_val, |
| | 326 | .data = .{ .ty_pl = .{ |
| | 327 | .ty = try block.sema.addType(field_ty), |
| | 328 | .payload = try block.sema.addExtra(Air.StructField{ |
| | 329 | .struct_operand = struct_val, |
| | 330 | .field_index = field_index, |
| | 331 | }), |
| | 332 | } }, |
| | 333 | }); |
| | 334 | } |
| | 335 | |
| 318 | pub fn addInst(block: *Block, inst: Air.Inst) error{OutOfMemory}!Air.Inst.Ref { | 336 | pub fn addInst(block: *Block, inst: Air.Inst) error{OutOfMemory}!Air.Inst.Ref { |
| 319 | return Air.indexToRef(try block.addInstAsIndex(inst)); | 337 | return Air.indexToRef(try block.addInstAsIndex(inst)); |
| 320 | } | 338 | } |
| ... | @@ -11261,8 +11279,10 @@ fn structFieldVal( | ... | @@ -11261,8 +11279,10 @@ fn structFieldVal( |
| 11261 | const struct_ty = try sema.resolveTypeFields(block, src, unresolved_struct_ty); | 11279 | const struct_ty = try sema.resolveTypeFields(block, src, unresolved_struct_ty); |
| 11262 | const struct_obj = struct_ty.castTag(.@"struct").?.data; | 11280 | const struct_obj = struct_ty.castTag(.@"struct").?.data; |
| 11263 | | 11281 | |
| 11264 | const field_index = struct_obj.fields.getIndex(field_name) orelse | 11282 | const field_index_big = struct_obj.fields.getIndex(field_name) orelse |
| 11265 | return sema.failWithBadFieldAccess(block, struct_obj, field_name_src, field_name); | 11283 | return sema.failWithBadFieldAccess(block, struct_obj, field_name_src, field_name); |
| | 11284 | const field_index = @intCast(u32, field_index_big); |
| | 11285 | |
| 11266 | const field = struct_obj.fields.values()[field_index]; | 11286 | const field = struct_obj.fields.values()[field_index]; |
| 11267 | | 11287 | |
| 11268 | if (try sema.resolveMaybeUndefVal(block, src, struct_byval)) |struct_val| { | 11288 | if (try sema.resolveMaybeUndefVal(block, src, struct_byval)) |struct_val| { |
| ... | @@ -11273,16 +11293,7 @@ fn structFieldVal( | ... | @@ -11273,16 +11293,7 @@ fn structFieldVal( |
| 11273 | } | 11293 | } |
| 11274 | | 11294 | |
| 11275 | try sema.requireRuntimeBlock(block, src); | 11295 | try sema.requireRuntimeBlock(block, src); |
| 11276 | return block.addInst(.{ | 11296 | return block.addStructFieldVal(struct_byval, field_index, field.ty); |
| 11277 | .tag = .struct_field_val, | | |
| 11278 | .data = .{ .ty_pl = .{ | | |
| 11279 | .ty = try sema.addType(field.ty), | | |
| 11280 | .payload = try sema.addExtra(Air.StructField{ | | |
| 11281 | .struct_operand = struct_byval, | | |
| 11282 | .field_index = @intCast(u32, field_index), | | |
| 11283 | }), | | |
| 11284 | } }, | | |
| 11285 | }); | | |
| 11286 | } | 11297 | } |
| 11287 | | 11298 | |
| 11288 | fn unionFieldPtr( | 11299 | fn unionFieldPtr( |
| ... | @@ -11341,8 +11352,9 @@ fn unionFieldVal( | ... | @@ -11341,8 +11352,9 @@ fn unionFieldVal( |
| 11341 | const union_ty = try sema.resolveTypeFields(block, src, unresolved_union_ty); | 11352 | const union_ty = try sema.resolveTypeFields(block, src, unresolved_union_ty); |
| 11342 | const union_obj = union_ty.cast(Type.Payload.Union).?.data; | 11353 | const union_obj = union_ty.cast(Type.Payload.Union).?.data; |
| 11343 | | 11354 | |
| 11344 | const field_index = union_obj.fields.getIndex(field_name) orelse | 11355 | const field_index_big = union_obj.fields.getIndex(field_name) orelse |
| 11345 | return sema.failWithBadUnionFieldAccess(block, union_obj, field_name_src, field_name); | 11356 | return sema.failWithBadUnionFieldAccess(block, union_obj, field_name_src, field_name); |
| | 11357 | const field_index = @intCast(u32, field_index_big); |
| 11346 | | 11358 | |
| 11347 | const field = union_obj.fields.values()[field_index]; | 11359 | const field = union_obj.fields.values()[field_index]; |
| 11348 | | 11360 | |
| ... | @@ -11355,7 +11367,7 @@ fn unionFieldVal( | ... | @@ -11355,7 +11367,7 @@ fn unionFieldVal( |
| 11355 | } | 11367 | } |
| 11356 | | 11368 | |
| 11357 | try sema.requireRuntimeBlock(block, src); | 11369 | try sema.requireRuntimeBlock(block, src); |
| 11358 | return sema.fail(block, src, "TODO implement runtime union field access", .{}); | 11370 | return block.addStructFieldVal(union_byval, field_index, field.ty); |
| 11359 | } | 11371 | } |
| 11360 | | 11372 | |
| 11361 | fn elemPtr( | 11373 | fn elemPtr( |