| ... | @@ -667,7 +667,7 @@ const DocData = struct { | ... | @@ -667,7 +667,7 @@ const DocData = struct { |
| 667 | rhs: usize, // index in `exprs` | 667 | rhs: usize, // index in `exprs` |
| 668 | // opKind | 668 | // opKind |
| 669 | // Identify the operator in js | 669 | // Identify the operator in js |
| 670 | // 0: add, 1: sub, 2: mul, 3: div, 4: mod, 5: rem, 6: shl, 7: shr, 8: bitwise_and, 9: bitwise_or | 670 | // 0: add, 1: sub, 2: mul, 3: div, 4: mod, 5: rem, 6: rem_mod, 7: shl, 8: shr |
| 671 | // Others binOp are not handled yet | 671 | // Others binOp are not handled yet |
| 672 | opKind: usize = 0, | 672 | opKind: usize = 0, |
| 673 | // flags to operations | 673 | // flags to operations |
| ... | @@ -1342,6 +1342,260 @@ fn walkInstruction( | ... | @@ -1342,6 +1342,260 @@ fn walkInstruction( |
| 1342 | .expr = .{ .binOpIndex = binop_index }, | 1342 | .expr = .{ .binOpIndex = binop_index }, |
| 1343 | }; | 1343 | }; |
| 1344 | }, | 1344 | }, |
| | 1345 | |
| | 1346 | .mod => { |
| | 1347 | const pl_node = data[inst_index].pl_node; |
| | 1348 | const extra = file.zir.extraData(Zir.Inst.Bin, pl_node.payload_index); |
| | 1349 | |
| | 1350 | const binop_index = self.exprs.items.len; |
| | 1351 | try self.exprs.append(self.arena, .{ .binOp = .{ .lhs = 0, .rhs = 0 } }); |
| | 1352 | |
| | 1353 | var lhs: DocData.WalkResult = try self.walkRef( |
| | 1354 | file, |
| | 1355 | parent_scope, |
| | 1356 | extra.data.lhs, |
| | 1357 | false, |
| | 1358 | ); |
| | 1359 | var rhs: DocData.WalkResult = try self.walkRef( |
| | 1360 | file, |
| | 1361 | parent_scope, |
| | 1362 | extra.data.rhs, |
| | 1363 | false, |
| | 1364 | ); |
| | 1365 | |
| | 1366 | const lhs_index = self.exprs.items.len; |
| | 1367 | try self.exprs.append(self.arena, lhs.expr); |
| | 1368 | const rhs_index = self.exprs.items.len; |
| | 1369 | try self.exprs.append(self.arena, rhs.expr); |
| | 1370 | self.exprs.items[binop_index] = .{ .binOp = .{ .lhs = lhs_index, .rhs = rhs_index, .exact = true, .opKind = 4 } }; |
| | 1371 | |
| | 1372 | return DocData.WalkResult{ |
| | 1373 | .typeRef = .{ .type = @enumToInt(Ref.type_type) }, |
| | 1374 | .expr = .{ .binOpIndex = binop_index }, |
| | 1375 | }; |
| | 1376 | }, |
| | 1377 | .rem => { |
| | 1378 | const pl_node = data[inst_index].pl_node; |
| | 1379 | const extra = file.zir.extraData(Zir.Inst.Bin, pl_node.payload_index); |
| | 1380 | |
| | 1381 | const binop_index = self.exprs.items.len; |
| | 1382 | try self.exprs.append(self.arena, .{ .binOp = .{ .lhs = 0, .rhs = 0 } }); |
| | 1383 | |
| | 1384 | var lhs: DocData.WalkResult = try self.walkRef( |
| | 1385 | file, |
| | 1386 | parent_scope, |
| | 1387 | extra.data.lhs, |
| | 1388 | false, |
| | 1389 | ); |
| | 1390 | var rhs: DocData.WalkResult = try self.walkRef( |
| | 1391 | file, |
| | 1392 | parent_scope, |
| | 1393 | extra.data.rhs, |
| | 1394 | false, |
| | 1395 | ); |
| | 1396 | |
| | 1397 | const lhs_index = self.exprs.items.len; |
| | 1398 | try self.exprs.append(self.arena, lhs.expr); |
| | 1399 | const rhs_index = self.exprs.items.len; |
| | 1400 | try self.exprs.append(self.arena, rhs.expr); |
| | 1401 | self.exprs.items[binop_index] = .{ .binOp = .{ .lhs = lhs_index, .rhs = rhs_index, .floor = true, .opKind = 5 } }; |
| | 1402 | |
| | 1403 | return DocData.WalkResult{ |
| | 1404 | .typeRef = .{ .type = @enumToInt(Ref.type_type) }, |
| | 1405 | .expr = .{ .binOpIndex = binop_index }, |
| | 1406 | }; |
| | 1407 | }, |
| | 1408 | |
| | 1409 | // @check how to test it |
| | 1410 | .mod_rem => { |
| | 1411 | const pl_node = data[inst_index].pl_node; |
| | 1412 | const extra = file.zir.extraData(Zir.Inst.Bin, pl_node.payload_index); |
| | 1413 | |
| | 1414 | const binop_index = self.exprs.items.len; |
| | 1415 | try self.exprs.append(self.arena, .{ .binOp = .{ .lhs = 0, .rhs = 0 } }); |
| | 1416 | |
| | 1417 | var lhs: DocData.WalkResult = try self.walkRef( |
| | 1418 | file, |
| | 1419 | parent_scope, |
| | 1420 | extra.data.lhs, |
| | 1421 | false, |
| | 1422 | ); |
| | 1423 | var rhs: DocData.WalkResult = try self.walkRef( |
| | 1424 | file, |
| | 1425 | parent_scope, |
| | 1426 | extra.data.rhs, |
| | 1427 | false, |
| | 1428 | ); |
| | 1429 | |
| | 1430 | const lhs_index = self.exprs.items.len; |
| | 1431 | try self.exprs.append(self.arena, lhs.expr); |
| | 1432 | const rhs_index = self.exprs.items.len; |
| | 1433 | try self.exprs.append(self.arena, rhs.expr); |
| | 1434 | self.exprs.items[binop_index] = .{ .binOp = .{ .lhs = lhs_index, .rhs = rhs_index, .floor = true, .opKind = 6 } }; |
| | 1435 | |
| | 1436 | return DocData.WalkResult{ |
| | 1437 | .typeRef = .{ .type = @enumToInt(Ref.type_type) }, |
| | 1438 | .expr = .{ .binOpIndex = binop_index }, |
| | 1439 | }; |
| | 1440 | }, |
| | 1441 | |
| | 1442 | .shl => { |
| | 1443 | const pl_node = data[inst_index].pl_node; |
| | 1444 | const extra = file.zir.extraData(Zir.Inst.Bin, pl_node.payload_index); |
| | 1445 | |
| | 1446 | const binop_index = self.exprs.items.len; |
| | 1447 | try self.exprs.append(self.arena, .{ .binOp = .{ .lhs = 0, .rhs = 0 } }); |
| | 1448 | |
| | 1449 | var lhs: DocData.WalkResult = try self.walkRef( |
| | 1450 | file, |
| | 1451 | parent_scope, |
| | 1452 | extra.data.lhs, |
| | 1453 | false, |
| | 1454 | ); |
| | 1455 | var rhs: DocData.WalkResult = try self.walkRef( |
| | 1456 | file, |
| | 1457 | parent_scope, |
| | 1458 | extra.data.rhs, |
| | 1459 | false, |
| | 1460 | ); |
| | 1461 | |
| | 1462 | const lhs_index = self.exprs.items.len; |
| | 1463 | try self.exprs.append(self.arena, lhs.expr); |
| | 1464 | const rhs_index = self.exprs.items.len; |
| | 1465 | try self.exprs.append(self.arena, rhs.expr); |
| | 1466 | self.exprs.items[binop_index] = .{ .binOp = .{ .lhs = lhs_index, .rhs = rhs_index, .opKind = 7 } }; |
| | 1467 | |
| | 1468 | return DocData.WalkResult{ |
| | 1469 | .typeRef = .{ .type = @enumToInt(Ref.type_type) }, |
| | 1470 | .expr = .{ .binOpIndex = binop_index }, |
| | 1471 | }; |
| | 1472 | }, |
| | 1473 | .shl_exact => { |
| | 1474 | const pl_node = data[inst_index].pl_node; |
| | 1475 | const extra = file.zir.extraData(Zir.Inst.Bin, pl_node.payload_index); |
| | 1476 | |
| | 1477 | const binop_index = self.exprs.items.len; |
| | 1478 | try self.exprs.append(self.arena, .{ .binOp = .{ .lhs = 0, .rhs = 0 } }); |
| | 1479 | |
| | 1480 | var lhs: DocData.WalkResult = try self.walkRef( |
| | 1481 | file, |
| | 1482 | parent_scope, |
| | 1483 | extra.data.lhs, |
| | 1484 | false, |
| | 1485 | ); |
| | 1486 | var rhs: DocData.WalkResult = try self.walkRef( |
| | 1487 | file, |
| | 1488 | parent_scope, |
| | 1489 | extra.data.rhs, |
| | 1490 | false, |
| | 1491 | ); |
| | 1492 | |
| | 1493 | const lhs_index = self.exprs.items.len; |
| | 1494 | try self.exprs.append(self.arena, lhs.expr); |
| | 1495 | const rhs_index = self.exprs.items.len; |
| | 1496 | try self.exprs.append(self.arena, rhs.expr); |
| | 1497 | self.exprs.items[binop_index] = .{ .binOp = .{ .lhs = lhs_index, .rhs = rhs_index, .exact = true, .opKind = 7 } }; |
| | 1498 | |
| | 1499 | return DocData.WalkResult{ |
| | 1500 | .typeRef = .{ .type = @enumToInt(Ref.type_type) }, |
| | 1501 | .expr = .{ .binOpIndex = binop_index }, |
| | 1502 | }; |
| | 1503 | }, |
| | 1504 | .shl_sat => { |
| | 1505 | const pl_node = data[inst_index].pl_node; |
| | 1506 | const extra = file.zir.extraData(Zir.Inst.Bin, pl_node.payload_index); |
| | 1507 | |
| | 1508 | const binop_index = self.exprs.items.len; |
| | 1509 | try self.exprs.append(self.arena, .{ .binOp = .{ .lhs = 0, .rhs = 0 } }); |
| | 1510 | |
| | 1511 | var lhs: DocData.WalkResult = try self.walkRef( |
| | 1512 | file, |
| | 1513 | parent_scope, |
| | 1514 | extra.data.lhs, |
| | 1515 | false, |
| | 1516 | ); |
| | 1517 | var rhs: DocData.WalkResult = try self.walkRef( |
| | 1518 | file, |
| | 1519 | parent_scope, |
| | 1520 | extra.data.rhs, |
| | 1521 | false, |
| | 1522 | ); |
| | 1523 | |
| | 1524 | const lhs_index = self.exprs.items.len; |
| | 1525 | try self.exprs.append(self.arena, lhs.expr); |
| | 1526 | const rhs_index = self.exprs.items.len; |
| | 1527 | try self.exprs.append(self.arena, rhs.expr); |
| | 1528 | self.exprs.items[binop_index] = .{ .binOp = .{ .lhs = lhs_index, .rhs = rhs_index, .sat = true, .opKind = 7 } }; |
| | 1529 | |
| | 1530 | return DocData.WalkResult{ |
| | 1531 | .typeRef = .{ .type = @enumToInt(Ref.type_type) }, |
| | 1532 | .expr = .{ .binOpIndex = binop_index }, |
| | 1533 | }; |
| | 1534 | }, |
| | 1535 | |
| | 1536 | .shr => { |
| | 1537 | const pl_node = data[inst_index].pl_node; |
| | 1538 | const extra = file.zir.extraData(Zir.Inst.Bin, pl_node.payload_index); |
| | 1539 | |
| | 1540 | const binop_index = self.exprs.items.len; |
| | 1541 | try self.exprs.append(self.arena, .{ .binOp = .{ .lhs = 0, .rhs = 0 } }); |
| | 1542 | |
| | 1543 | var lhs: DocData.WalkResult = try self.walkRef( |
| | 1544 | file, |
| | 1545 | parent_scope, |
| | 1546 | extra.data.lhs, |
| | 1547 | false, |
| | 1548 | ); |
| | 1549 | var rhs: DocData.WalkResult = try self.walkRef( |
| | 1550 | file, |
| | 1551 | parent_scope, |
| | 1552 | extra.data.rhs, |
| | 1553 | false, |
| | 1554 | ); |
| | 1555 | |
| | 1556 | const lhs_index = self.exprs.items.len; |
| | 1557 | try self.exprs.append(self.arena, lhs.expr); |
| | 1558 | const rhs_index = self.exprs.items.len; |
| | 1559 | try self.exprs.append(self.arena, rhs.expr); |
| | 1560 | self.exprs.items[binop_index] = .{ .binOp = .{ .lhs = lhs_index, .rhs = rhs_index, .opKind = 8 } }; |
| | 1561 | |
| | 1562 | return DocData.WalkResult{ |
| | 1563 | .typeRef = .{ .type = @enumToInt(Ref.type_type) }, |
| | 1564 | .expr = .{ .binOpIndex = binop_index }, |
| | 1565 | }; |
| | 1566 | }, |
| | 1567 | .shr_exact => { |
| | 1568 | const pl_node = data[inst_index].pl_node; |
| | 1569 | const extra = file.zir.extraData(Zir.Inst.Bin, pl_node.payload_index); |
| | 1570 | |
| | 1571 | const binop_index = self.exprs.items.len; |
| | 1572 | try self.exprs.append(self.arena, .{ .binOp = .{ .lhs = 0, .rhs = 0 } }); |
| | 1573 | |
| | 1574 | var lhs: DocData.WalkResult = try self.walkRef( |
| | 1575 | file, |
| | 1576 | parent_scope, |
| | 1577 | extra.data.lhs, |
| | 1578 | false, |
| | 1579 | ); |
| | 1580 | var rhs: DocData.WalkResult = try self.walkRef( |
| | 1581 | file, |
| | 1582 | parent_scope, |
| | 1583 | extra.data.rhs, |
| | 1584 | false, |
| | 1585 | ); |
| | 1586 | |
| | 1587 | const lhs_index = self.exprs.items.len; |
| | 1588 | try self.exprs.append(self.arena, lhs.expr); |
| | 1589 | const rhs_index = self.exprs.items.len; |
| | 1590 | try self.exprs.append(self.arena, rhs.expr); |
| | 1591 | self.exprs.items[binop_index] = .{ .binOp = .{ .lhs = lhs_index, .rhs = rhs_index, .exact = true, .opKind = 8 } }; |
| | 1592 | |
| | 1593 | return DocData.WalkResult{ |
| | 1594 | .typeRef = .{ .type = @enumToInt(Ref.type_type) }, |
| | 1595 | .expr = .{ .binOpIndex = binop_index }, |
| | 1596 | }; |
| | 1597 | }, |
| | 1598 | |
| 1345 | .error_union_type => { | 1599 | .error_union_type => { |
| 1346 | const pl_node = data[inst_index].pl_node; | 1600 | const pl_node = data[inst_index].pl_node; |
| 1347 | const extra = file.zir.extraData(Zir.Inst.Bin, pl_node.payload_index); | 1601 | const extra = file.zir.extraData(Zir.Inst.Bin, pl_node.payload_index); |
| ... | @@ -1846,14 +2100,6 @@ fn walkInstruction( | ... | @@ -1846,14 +2100,6 @@ fn walkInstruction( |
| 1846 | const dest_type_idx = self.exprs.items.len; | 2100 | const dest_type_idx = self.exprs.items.len; |
| 1847 | try self.exprs.append(self.arena, dest_type_walk.expr); | 2101 | try self.exprs.append(self.arena, dest_type_walk.expr); |
| 1848 | | 2102 | |
| 1849 | const sep = "=" ** 200; | | |
| 1850 | std.debug.print("{s}\n", .{sep}); | | |
| 1851 | std.debug.print("AS NODE\n", .{}); | | |
| 1852 | std.debug.print("extra = {any}\n", .{extra}); | | |
| 1853 | std.debug.print("desty_type_walk = {any}\n", .{dest_type_walk}); | | |
| 1854 | std.debug.print("operand = {any}\n", .{operand}); | | |
| 1855 | std.debug.print("{s}\n", .{sep}); | | |
| 1856 | | | |
| 1857 | // TODO: there's something wrong with how both `as` and `WalkrResult` | 2103 | // TODO: there's something wrong with how both `as` and `WalkrResult` |
| 1858 | // try to store type information. | 2104 | // try to store type information. |
| 1859 | return DocData.WalkResult{ | 2105 | return DocData.WalkResult{ |
| ... | @@ -3305,14 +3551,7 @@ fn analyzeFunctionExtended( | ... | @@ -3305,14 +3551,7 @@ fn analyzeFunctionExtended( |
| 3305 | if (extra.data.bits.has_align) { | 3551 | if (extra.data.bits.has_align) { |
| 3306 | const align_ref = @intToEnum(Zir.Inst.Ref, file.zir.extra[extra_index]); | 3552 | const align_ref = @intToEnum(Zir.Inst.Ref, file.zir.extra[extra_index]); |
| 3307 | align_index = self.exprs.items.len; | 3553 | align_index = self.exprs.items.len; |
| 3308 | const result = try self.walkRef(file, scope, align_ref, false); | 3554 | _ = try self.walkRef(file, scope, align_ref, false); |
| 3309 | | | |
| 3310 | const sep = "=" ** 200; | | |
| 3311 | std.debug.print("{s}\n", .{sep}); | | |
| 3312 | std.debug.print("ALIGN\n", .{}); | | |
| 3313 | std.debug.print("align_ref = {any}\n", .{align_ref}); | | |
| 3314 | std.debug.print("result = {any}\n", .{result}); | | |
| 3315 | std.debug.print("{s}\n", .{sep}); | | |
| 3316 | } | 3555 | } |
| 3317 | | 3556 | |
| 3318 | self.types.items[type_slot_index] = .{ | 3557 | self.types.items[type_slot_index] = .{ |