| ... | ... | @@ -667,7 +667,7 @@ const DocData = struct { |
| 667 | 667 | rhs: usize, // index in `exprs` |
| 668 | 668 | // opKind |
| 669 | 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 | 671 | // Others binOp are not handled yet |
| 672 | 672 | opKind: usize = 0, |
| 673 | 673 | // flags to operations |
| ... | ... | @@ -1342,6 +1342,260 @@ fn walkInstruction( |
| 1342 | 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 | 1599 | .error_union_type => { |
| 1346 | 1600 | const pl_node = data[inst_index].pl_node; |
| 1347 | 1601 | const extra = file.zir.extraData(Zir.Inst.Bin, pl_node.payload_index); |
| ... | ... | @@ -1846,14 +2100,6 @@ fn walkInstruction( |
| 1846 | 2100 | const dest_type_idx = self.exprs.items.len; |
| 1847 | 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 | 2103 | // TODO: there's something wrong with how both `as` and `WalkrResult` |
| 1858 | 2104 | // try to store type information. |
| 1859 | 2105 | return DocData.WalkResult{ |
| ... | ... | @@ -3305,14 +3551,7 @@ fn analyzeFunctionExtended( |
| 3305 | 3551 | if (extra.data.bits.has_align) { |
| 3306 | 3552 | const align_ref = @intToEnum(Zir.Inst.Ref, file.zir.extra[extra_index]); |
| 3307 | 3553 | align_index = self.exprs.items.len; |
| 3308 | | const result = 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}); |
| 3554 | _ = try self.walkRef(file, scope, align_ref, false); |
| 3316 | 3555 | } |
| 3317 | 3556 | |
| 3318 | 3557 | self.types.items[type_slot_index] = .{ |