@@ -1879,7 +1879,7 @@ fn (mut c Amd64) div_reg_rax(b Amd64Register) {
18791879// rax % b
18801880fn (mut c Amd64) mod_reg_rax (b Amd64 Register) {
18811881 c.div_reg_rax (b)
1882- c.mov_reg (Amd64 Register.rdx , Amd64 Register.rax )
1882+ c.mov_reg (Amd64 Register.rax , Amd64 Register.rdx )
18831883}
18841884
18851885fn (mut c Amd64) sub_reg (a Amd64 Register, b Amd64 Register) {
@@ -2515,8 +2515,9 @@ fn (mut c Amd64) assign_ident_right_expr(node ast.AssignStmt, i i32, right ast.E
25152515 match node.op {
25162516 .decl_assign {
25172517 if right.is_fixed {
2518- c.g.n_error ('${@LOCATION } Unexpected operator `${node .op }`' )
2519- } else {
2518+ c.g.n_error ('${@LOCATION } Unsupported ${node } ${right }' )
2519+ } else if right.exprs.len == 0 {
2520+ // `[]int{len: 6, cap:10, init:22}`
25202521 c.g.allocate_by_type (ident.name, ast.array_type)
25212522 len := ast.CallArg{
25222523 expr: if right.has_len {
@@ -2550,9 +2551,61 @@ fn (mut c Amd64) assign_ident_right_expr(node ast.AssignStmt, i i32, right ast.E
25502551 return_type: ast.array_type
25512552 nr_ret_values: 1
25522553 is_return_used: true
2553- })
2554+ }) // rax: address of returned array struct
25542555 c.lea_var_to_reg (Amd64 Register.rdx, c.g.get_var_offset (ident.name))
2555- c.move_struct (.rax, .rdx, c.g.get_type_size (ast.array_type))
2556+ c.move_struct (.rdx, .rax, c.g.get_type_size (ast.array_type))
2557+ } else {
2558+ // `[1, 2, 3]`
2559+
2560+ // array struct
2561+ c.g.allocate_by_type (ident.name, ast.array_type)
2562+ len := ast.CallArg{
2563+ expr: ast.IntegerLiteral{right.exprs.len.str (), right.pos}
2564+ typ: ast.int_type
2565+ pos: right.pos
2566+ }
2567+ cap := len
2568+ elem_size := c.g.get_type_size (right.elem_type)
2569+ size := ast.CallArg{
2570+ expr: ast.IntegerLiteral{elem_size.str (), right.pos}
2571+ typ: ast.int_type
2572+ pos: right.pos
2573+ }
2574+ c.call_fn (ast.CallExpr{
2575+ pos: right.pos
2576+ name: '__new_array'
2577+ args: [len, cap, size]
2578+ expected_arg_types: [ast.int_type, ast.int_type, ast.int_type]
2579+ language: .v
2580+ return_type: ast.array_type
2581+ nr_ret_values: 1
2582+ is_return_used: true
2583+ }) // rax: address of returned array struct
2584+ c.lea_var_to_reg (Amd64 Register.rdx, c.g.get_var_offset (ident.name))
2585+ c.move_struct (.rdx, .rax, c.g.get_type_size (ast.array_type))
2586+
2587+ // init array
2588+ e_ts := c.g.table.sym (right.elem_type)
2589+ c.g.expr (node.left[i])
2590+ offset := c.g.get_field_offset (ast.array_type, 'data' )
2591+ if offset != 0 {
2592+ c.add (Amd64 Register.rax, offset)
2593+ }
2594+ c.mov_deref (Amd64 Register.rdx, Amd64 Register.rax, ast.u64_ type) // address of the data
2595+ for e in right.exprs {
2596+ c.g.expr (e) // rax
2597+ if e_ts.info is ast.Struct {
2598+ c.move_struct (.rdx, .rax, elem_size)
2599+ } else {
2600+ c.mov_store (.rdx, .rax, match elem_size {
2601+ 1 { ._8 }
2602+ 2 { ._16 }
2603+ 4 { ._32 }
2604+ else { ._64 }
2605+ })
2606+ }
2607+ c.add (Amd64 Register.rdx, elem_size)
2608+ }
25562609 }
25572610 }
25582611 else {
@@ -2735,12 +2788,13 @@ fn (mut c Amd64) gen_index_expr(node ast.IndexExpr) {
27352788 c.mul_reg_main (Amd64 Register.rbx)
27362789 c.add_reg2 (Amd64 Register.rax, Amd64 Register.rcx)
27372790 } else if node.is_array {
2791+ // TODO: use functions from builtin instead (array.set, array.get...)
27382792 c.g.expr (node.left)
27392793 offset := c.g.get_field_offset (ast.array_type, 'data' )
27402794 if offset != 0 {
27412795 c.add (Amd64 Register.rax, offset)
27422796 }
2743- c.mov_reg (Amd64 Register.rcx, Amd64 Register.rax)
2797+ c.mov_deref (Amd64 Register.rcx, Amd64 Register.rax, ast.u 64_ type )
27442798 // add the index times the size (bytes) of the type
27452799 c.g.expr (node.index)
27462800 c.mov (Amd64 Register.rbx, i32 (c.g.get_type_size (node.typ)))
0 commit comments