@@ -1334,147 +1334,147 @@ fn (mut g Gen) for_stmt(node ast.ForStmt) {
1334
1334
}
1335
1335
}
1336
1336
1337
- fn (mut g Gen) for_in_stmt (it ast.ForInStmt) {
1338
- if it .label.len > 0 {
1339
- g.writeln ('\t $it .label : {}' )
1337
+ fn (mut g Gen) for_in_stmt (node ast.ForInStmt) {
1338
+ if node .label.len > 0 {
1339
+ g.writeln ('\t $node .label : {}' )
1340
1340
}
1341
- if it .is_range {
1341
+ if node .is_range {
1342
1342
// `for x in 1..10 {`
1343
- i := if it .val_var == '_' { g.new_tmp_var () } else { c_name (it .val_var) }
1343
+ i := if node .val_var == '_' { g.new_tmp_var () } else { c_name (node .val_var) }
1344
1344
g.write ('for (int $i = ' )
1345
- g.expr (it .cond)
1345
+ g.expr (node .cond)
1346
1346
g.write ('; $i < ' )
1347
- g.expr (it .high)
1347
+ g.expr (node .high)
1348
1348
g.writeln ('; ++$i ) {' )
1349
- } else if it .kind == .array {
1349
+ } else if node .kind == .array {
1350
1350
// `for num in nums {`
1351
1351
g.writeln ('// FOR IN array' )
1352
- styp := g.typ (it .val_type)
1353
- val_sym := g.table.get_type_symbol (it .val_type)
1352
+ styp := g.typ (node .val_type)
1353
+ val_sym := g.table.get_type_symbol (node .val_type)
1354
1354
tmp := g.new_tmp_var ()
1355
- g.write (g.typ (it .cond_type))
1355
+ g.write (g.typ (node .cond_type))
1356
1356
g.write (' $tmp = ' )
1357
- g.expr (it .cond)
1357
+ g.expr (node .cond)
1358
1358
g.writeln (';' )
1359
- i := if it .key_var in ['' , '_' ] { g.new_tmp_var () } else { it .key_var }
1360
- op_field := if it .cond_type.is_ptr () { '->' } else { '.' } +
1361
- if it .cond_type.share () == .shared_t { 'val.' } else { '' }
1359
+ i := if node .key_var in ['' , '_' ] { g.new_tmp_var () } else { node .key_var }
1360
+ op_field := if node .cond_type.is_ptr () { '->' } else { '.' } +
1361
+ if node .cond_type.share () == .shared_t { 'val.' } else { '' }
1362
1362
g.writeln ('for (int $i = 0; $i < $tmp${op_field} len; ++$i ) {' )
1363
- if it .val_var != '_' {
1363
+ if node .val_var != '_' {
1364
1364
if val_sym.kind == .function {
1365
1365
g.write ('\t ' )
1366
- g.write_fn_ptr_decl (val_sym.info as table.FnType , c_name (it .val_var))
1366
+ g.write_fn_ptr_decl (val_sym.info as table.FnType , c_name (node .val_var))
1367
1367
g.writeln (' = ((voidptr*)$tmp${op_field} data)[$i ];' )
1368
1368
} else {
1369
1369
// If val is mutable (pointer behind the scenes), we need to generate
1370
1370
// `int* val = ((int*)arr.data) + i;`
1371
1371
// instead of
1372
1372
// `int* val = ((int**)arr.data)[i];`
1373
- // right := if it .val_is_mut { styp } else { styp + '*' }
1374
- right := if it .val_is_mut {
1373
+ // right := if node .val_is_mut { styp } else { styp + '*' }
1374
+ right := if node .val_is_mut {
1375
1375
'(($styp )$tmp${op_field} data) + $i '
1376
1376
} else {
1377
1377
'(($styp *)$tmp${op_field} data)[$i ]'
1378
1378
}
1379
- g.writeln ('\t $styp ${c_name(it .val_var)} = $right ;' )
1379
+ g.writeln ('\t $styp ${c_name(node .val_var)} = $right ;' )
1380
1380
}
1381
1381
}
1382
- } else if it .kind == .array_fixed {
1382
+ } else if node .kind == .array_fixed {
1383
1383
atmp := g.new_tmp_var ()
1384
- atmp_type := g.typ (it .cond_type).trim ('*' )
1385
- if it .cond_type.is_ptr () || it .cond is ast.ArrayInit {
1386
- if ! it .cond.is_lvalue () {
1384
+ atmp_type := g.typ (node .cond_type).trim ('*' )
1385
+ if node .cond_type.is_ptr () || node .cond is ast.ArrayInit {
1386
+ if ! node .cond.is_lvalue () {
1387
1387
g.write ('$atmp_type *$atmp = (($atmp_type )' )
1388
1388
} else {
1389
1389
g.write ('$atmp_type *$atmp = (' )
1390
1390
}
1391
- g.expr (it .cond)
1391
+ g.expr (node .cond)
1392
1392
g.writeln (');' )
1393
1393
}
1394
- i := if it .key_var in ['' , '_' ] { g.new_tmp_var () } else { it .key_var }
1395
- cond_sym := g.table.get_type_symbol (it .cond_type)
1394
+ i := if node .key_var in ['' , '_' ] { g.new_tmp_var () } else { node .key_var }
1395
+ cond_sym := g.table.get_type_symbol (node .cond_type)
1396
1396
info := cond_sym.info as table.ArrayFixed
1397
1397
g.writeln ('for (int $i = 0; $i != $info.size ; ++$i ) {' )
1398
- if it .val_var != '_' {
1399
- val_sym := g.table.get_type_symbol (it .val_type)
1398
+ if node .val_var != '_' {
1399
+ val_sym := g.table.get_type_symbol (node .val_type)
1400
1400
if val_sym.kind == .function {
1401
1401
g.write ('\t ' )
1402
- g.write_fn_ptr_decl (val_sym.info as table.FnType , c_name (it .val_var))
1402
+ g.write_fn_ptr_decl (val_sym.info as table.FnType , c_name (node .val_var))
1403
1403
} else {
1404
- styp := g.typ (it .val_type)
1405
- g.write ('\t $styp ${c_name(it .val_var)} ' )
1404
+ styp := g.typ (node .val_type)
1405
+ g.write ('\t $styp ${c_name(node .val_var)} ' )
1406
1406
}
1407
- addr := if it .val_is_mut { '&' } else { '' }
1408
- if it .cond_type.is_ptr () || it .cond is ast.ArrayInit {
1407
+ addr := if node .val_is_mut { '&' } else { '' }
1408
+ if node .cond_type.is_ptr () || node .cond is ast.ArrayInit {
1409
1409
g.writeln (' = ${addr} (*$atmp )[$i ];' )
1410
1410
} else {
1411
1411
g.write (' = $addr ' )
1412
- g.expr (it .cond)
1412
+ g.expr (node .cond)
1413
1413
g.writeln ('[$i ];' )
1414
1414
}
1415
1415
}
1416
- } else if it .kind == .map {
1416
+ } else if node .kind == .map {
1417
1417
// `for key, val in map {
1418
1418
g.writeln ('// FOR IN map' )
1419
1419
idx := g.new_tmp_var ()
1420
1420
atmp := g.new_tmp_var ()
1421
- arw_or_pt := if it .cond_type.is_ptr () { '->' } else { '.' }
1422
- g.write (g.typ (it .cond_type))
1421
+ arw_or_pt := if node .cond_type.is_ptr () { '->' } else { '.' }
1422
+ g.write (g.typ (node .cond_type))
1423
1423
g.write (' $atmp = ' )
1424
- g.expr (it .cond)
1424
+ g.expr (node .cond)
1425
1425
g.writeln (';' )
1426
1426
g.writeln ('for (int $idx = 0; $idx < $atmp${arw_or_pt} key_values.len; ++$idx ) {' )
1427
1427
// TODO: don't have this check when the map has no deleted elements
1428
1428
g.writeln ('\t if (!DenseArray_has_index(&$atmp${arw_or_pt} key_values, $idx )) {continue;}' )
1429
- if it .key_var != '_' {
1430
- key_styp := g.typ (it .key_type)
1431
- key := c_name (it .key_var)
1429
+ if node .key_var != '_' {
1430
+ key_styp := g.typ (node .key_type)
1431
+ key := c_name (node .key_var)
1432
1432
g.writeln ('\t $key_styp $key = /*key*/ *($key_styp *)DenseArray_key(&$atmp${arw_or_pt} key_values, $idx );' )
1433
- // TODO: analyze whether it .key_type has a .clone() method and call .clone() for all types:
1434
- if it .key_type == table.string_type {
1433
+ // TODO: analyze whether node .key_type has a .clone() method and call .clone() for all types:
1434
+ if node .key_type == table.string_type {
1435
1435
g.writeln ('\t $key = string_clone($key );' )
1436
1436
}
1437
1437
}
1438
- if it .val_var != '_' {
1439
- val_sym := g.table.get_type_symbol (it .val_type)
1438
+ if node .val_var != '_' {
1439
+ val_sym := g.table.get_type_symbol (node .val_type)
1440
1440
if val_sym.kind == .function {
1441
1441
g.write ('\t ' )
1442
- g.write_fn_ptr_decl (val_sym.info as table.FnType , c_name (it .val_var))
1442
+ g.write_fn_ptr_decl (val_sym.info as table.FnType , c_name (node .val_var))
1443
1443
g.write (' = (*(voidptr*)' )
1444
1444
} else {
1445
- val_styp := g.typ (it .val_type)
1446
- if it .val_type.is_ptr () {
1447
- g.write ('\t $val_styp ${c_name(it .val_var)} = &(*($val_styp )' )
1445
+ val_styp := g.typ (node .val_type)
1446
+ if node .val_type.is_ptr () {
1447
+ g.write ('\t $val_styp ${c_name(node .val_var)} = &(*($val_styp )' )
1448
1448
} else {
1449
- g.write ('\t $val_styp ${c_name(it .val_var)} = (*($val_styp *)' )
1449
+ g.write ('\t $val_styp ${c_name(node .val_var)} = (*($val_styp *)' )
1450
1450
}
1451
1451
}
1452
1452
g.writeln ('DenseArray_value(&$atmp${arw_or_pt} key_values, $idx ));' )
1453
1453
}
1454
- g.stmts (it .stmts)
1455
- if it .key_type == table.string_type && ! g.is_builtin_mod {
1454
+ g.stmts (node .stmts)
1455
+ if node .key_type == table.string_type && ! g.is_builtin_mod {
1456
1456
// g.writeln('string_free(&$key);')
1457
1457
}
1458
- if it .label.len > 0 {
1459
- g.writeln ('\t ${it .label} __continue: {}' )
1458
+ if node .label.len > 0 {
1459
+ g.writeln ('\t ${node .label} __continue: {}' )
1460
1460
}
1461
1461
g.writeln ('}' )
1462
- if it .label.len > 0 {
1463
- g.writeln ('\t ${it .label} __break: {}' )
1462
+ if node .label.len > 0 {
1463
+ g.writeln ('\t ${node .label} __break: {}' )
1464
1464
}
1465
1465
return
1466
- } else if it .kind == .string {
1467
- i := if it .key_var in ['' , '_' ] { g.new_tmp_var () } else { it .key_var }
1466
+ } else if node .kind == .string {
1467
+ i := if node .key_var in ['' , '_' ] { g.new_tmp_var () } else { node .key_var }
1468
1468
g.write ('for (int $i = 0; $i < ' )
1469
- g.expr (it .cond)
1469
+ g.expr (node .cond)
1470
1470
g.writeln ('.len; ++$i ) {' )
1471
- if it .val_var != '_' {
1472
- g.write ('\t byte ${c_name(it .val_var)} = ' )
1473
- g.expr (it .cond)
1471
+ if node .val_var != '_' {
1472
+ g.write ('\t byte ${c_name(node .val_var)} = ' )
1473
+ g.expr (node .cond)
1474
1474
g.writeln ('.str[$i ];' )
1475
1475
}
1476
- } else if it .kind == .struct_ {
1477
- cond_type_sym := g.table.get_type_symbol (it .cond_type)
1476
+ } else if node .kind == .struct_ {
1477
+ cond_type_sym := g.table.get_type_symbol (node .cond_type)
1478
1478
next_fn := cond_type_sym.find_method ('next' ) or {
1479
1479
verror ('`next` method not found' )
1480
1480
return
@@ -1485,26 +1485,26 @@ fn (mut g Gen) for_in_stmt(it ast.ForInStmt) {
1485
1485
receiver_styp := g.typ (next_fn.params[0 ].typ)
1486
1486
fn_name := receiver_styp.replace_each (['*' , '' , '.' , '__' ]) + '_next'
1487
1487
g.write ('\t ${g.typ(ret_typ)} $t = ${fn_name} (' )
1488
- if ! it .cond_type.is_ptr () {
1488
+ if ! node .cond_type.is_ptr () {
1489
1489
g.write ('&' )
1490
1490
}
1491
- g.expr (it .cond)
1491
+ g.expr (node .cond)
1492
1492
g.writeln (');' )
1493
1493
g.writeln ('\t if (!${t} .ok) { break; }' )
1494
- val := if it .val_var in ['' , '_' ] { g.new_tmp_var () } else { it .val_var }
1495
- val_styp := g.typ (it .val_type)
1494
+ val := if node .val_var in ['' , '_' ] { g.new_tmp_var () } else { node .val_var }
1495
+ val_styp := g.typ (node .val_type)
1496
1496
g.writeln ('\t $val_styp $val = *($val_styp *)${t} .data;' )
1497
1497
} else {
1498
- s := g.table.type_to_str (it .cond_type)
1499
- g.error ('for in: unhandled symbol `$it .cond ` of type `$s `' , it .pos)
1498
+ s := g.table.type_to_str (node .cond_type)
1499
+ g.error ('for in: unhandled symbol `$node .cond ` of type `$s `' , node .pos)
1500
1500
}
1501
- g.stmts (it .stmts)
1502
- if it .label.len > 0 {
1503
- g.writeln ('\t ${it .label} __continue: {}' )
1501
+ g.stmts (node .stmts)
1502
+ if node .label.len > 0 {
1503
+ g.writeln ('\t ${node .label} __continue: {}' )
1504
1504
}
1505
1505
g.writeln ('}' )
1506
- if it .label.len > 0 {
1507
- g.writeln ('\t ${it .label} __break: {}' )
1506
+ if node .label.len > 0 {
1507
+ g.writeln ('\t ${node .label} __break: {}' )
1508
1508
}
1509
1509
}
1510
1510
0 commit comments