|
16 | 16 |
|
17 | 17 | use super::*; |
18 | 18 |
|
| 19 | +use leo_span::sym; |
| 20 | + |
19 | 21 | use leo_ast::{ |
20 | 22 | ArrayAccess, |
21 | 23 | ArrayExpression, |
@@ -69,7 +71,10 @@ impl CodeGeneratingVisitor<'_> { |
69 | 71 |
|
70 | 72 | match input { |
71 | 73 | Expression::ArrayAccess(expr) => (Some(self.visit_array_access(expr)), vec![]), |
72 | | - Expression::MemberAccess(expr) => (Some(self.visit_member_access(expr)), vec![]), |
| 74 | + Expression::MemberAccess(expr) => { |
| 75 | + let (expr, stmts) = self.visit_member_access(expr); |
| 76 | + (Some(expr), stmts) |
| 77 | + } |
73 | 78 | Expression::Path(expr) => (Some(self.visit_path(expr)), vec![]), |
74 | 79 | Expression::Literal(expr) => (Some(self.visit_value(expr)), vec![]), |
75 | 80 |
|
@@ -405,11 +410,28 @@ impl CodeGeneratingVisitor<'_> { |
405 | 410 | AleoExpr::ArrayAccess(Box::new(array_operand), Box::new(index_operand)) |
406 | 411 | } |
407 | 412 |
|
408 | | - fn visit_member_access(&mut self, input: &MemberAccess) -> AleoExpr { |
409 | | - let (inner_expr, _) = self.visit_expression(&input.inner); |
| 413 | + fn visit_member_access(&mut self, input: &MemberAccess) -> (AleoExpr, Vec<AleoStmt>) { |
| 414 | + let (inner_expr, mut instructions) = self.visit_expression(&input.inner); |
410 | 415 | let inner_expr = inner_expr.expect("Trying to access a member of an empty expression."); |
411 | 416 |
|
412 | | - AleoExpr::MemberAccess(Box::new(inner_expr), input.name.to_string()) |
| 417 | + // Check if the inner expression is a dyn record. |
| 418 | + let inner_type = self.state.type_table.get(&input.inner.id()); |
| 419 | + if matches!(inner_type, Some(Type::DynRecord)) && input.name.name != sym::owner { |
| 420 | + // Non-owner field access on dyn record: emit get.record.dynamic. |
| 421 | + let result_type = self.state.type_table.get(&input.id).expect("Type should be resolved."); |
| 422 | + let dest_reg = self.next_register(); |
| 423 | + let aleo_type = self.visit_type(&result_type); |
| 424 | + instructions.push(AleoStmt::GetRecordDynamic( |
| 425 | + inner_expr, |
| 426 | + input.name.to_string(), |
| 427 | + dest_reg.clone(), |
| 428 | + aleo_type, |
| 429 | + )); |
| 430 | + return (AleoExpr::Reg(dest_reg), instructions); |
| 431 | + } |
| 432 | + |
| 433 | + // Regular member access (or .owner on dyn record). |
| 434 | + (AleoExpr::MemberAccess(Box::new(inner_expr), input.name.to_string()), instructions) |
413 | 435 | } |
414 | 436 |
|
415 | 437 | fn visit_repeat(&mut self, input: &RepeatExpression) -> (AleoExpr, Vec<AleoStmt>) { |
|
0 commit comments