@zigc/lib 0.15.0-dev.0 → 0.15.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (92) hide show
  1. package/README.md +1 -5
  2. package/build-web/fuzz.zig +6 -6
  3. package/build-web/time_report.zig +13 -14
  4. package/compiler/reduce/Walk.zig +9 -10
  5. package/compiler/reduce.zig +20 -19
  6. package/compiler/resinator/compile.zig +1 -1
  7. package/compiler_rt/arm.zig +1 -1
  8. package/init/build.zig +1 -1
  9. package/libc/freebsd/lib/csu/aarch64/crt.h +1 -0
  10. package/libc/freebsd/lib/csu/aarch64/crt1_c.c +33 -0
  11. package/libc/freebsd/lib/csu/aarch64/crt1_s.S +68 -0
  12. package/libc/freebsd/lib/csu/amd64/crt.h +30 -0
  13. package/libc/freebsd/lib/csu/amd64/crt1_c.c +30 -0
  14. package/libc/freebsd/lib/csu/amd64/crt1_s.S +89 -0
  15. package/libc/freebsd/lib/csu/arm/crt.h +1 -0
  16. package/libc/freebsd/lib/csu/arm/crt1_c.c +80 -0
  17. package/libc/freebsd/lib/csu/arm/crt1_s.S +77 -0
  18. package/libc/freebsd/lib/csu/common/crtbegin.c +95 -0
  19. package/libc/freebsd/lib/csu/common/crtbrand.S +55 -0
  20. package/libc/freebsd/lib/csu/common/crtend.c +65 -0
  21. package/libc/freebsd/lib/csu/common/csu_common.h +50 -0
  22. package/libc/freebsd/lib/csu/common/feature_note.S +47 -0
  23. package/libc/freebsd/lib/csu/common/ignore_init_note.S +48 -0
  24. package/libc/freebsd/lib/csu/common/notes.h +32 -0
  25. package/libc/freebsd/lib/csu/i386/crt.h +30 -0
  26. package/libc/freebsd/lib/csu/i386/crt1_c.c +30 -0
  27. package/libc/freebsd/lib/csu/i386/crt1_s.S +91 -0
  28. package/libc/freebsd/lib/csu/powerpc/crt.h +31 -0
  29. package/libc/freebsd/lib/csu/powerpc/crt1_c.c +89 -0
  30. package/libc/freebsd/lib/csu/powerpc/crtsavres.S +189 -0
  31. package/libc/freebsd/lib/csu/powerpc64/crt.h +31 -0
  32. package/libc/freebsd/lib/csu/powerpc64/crt1_c.c +83 -0
  33. package/libc/freebsd/lib/csu/riscv/crt.h +8 -0
  34. package/libc/freebsd/lib/csu/riscv/crt1_c.c +51 -0
  35. package/libc/freebsd/lib/csu/riscv/crt1_s.S +51 -0
  36. package/libc/freebsd/lib/libc/include/libc_private.h +450 -0
  37. package/libc/include/generic-glibc/arpa/inet.h +0 -3
  38. package/libc/netbsd/lib/csu/arch/aarch64/crt0.S +45 -0
  39. package/libc/netbsd/lib/csu/arch/earm/crt0.S +61 -0
  40. package/libc/netbsd/lib/csu/arch/i386/crt0.S +48 -0
  41. package/libc/netbsd/lib/csu/arch/m68k/crt0.S +47 -0
  42. package/libc/netbsd/lib/csu/arch/mips/crt0.S +59 -0
  43. package/libc/netbsd/lib/csu/arch/powerpc/crt0.S +56 -0
  44. package/libc/netbsd/lib/csu/arch/sparc/crt0.S +55 -0
  45. package/libc/netbsd/lib/csu/arch/sparc64/crt0.S +59 -0
  46. package/libc/netbsd/lib/csu/arch/x86_64/crt0.S +48 -0
  47. package/libc/netbsd/lib/csu/common/crt0-common.c +351 -0
  48. package/libc/netbsd/lib/csu/common/crtbegin.c +135 -0
  49. package/libc/netbsd/lib/csu/common/csu-common.h +38 -0
  50. package/libc/netbsd/lib/csu/common/sysident.S +89 -0
  51. package/libc/netbsd/lib/csu/common/sysident_assym.h +17 -0
  52. package/package.json +2 -2
  53. package/std/Build/Step/Compile.zig +1 -20
  54. package/std/Build/Step/TranslateC.zig +0 -6
  55. package/std/Build/WebServer.zig +1 -1
  56. package/std/Build.zig +1 -4
  57. package/std/Io/Reader/Limited.zig +0 -44
  58. package/std/Io/Reader.zig +28 -128
  59. package/std/Io/Writer.zig +6 -31
  60. package/std/Target.zig +0 -8
  61. package/std/Thread.zig +4 -3
  62. package/std/c.zig +26 -87
  63. package/std/crypto/aes_ocb.zig +3 -32
  64. package/std/crypto/tls/Client.zig +8 -19
  65. package/std/debug.zig +1 -1
  66. package/std/fs/Dir.zig +1 -2
  67. package/std/fs/File.zig +104 -105
  68. package/std/http/Client.zig +2 -3
  69. package/std/json/static.zig +3 -3
  70. package/std/math/big/int.zig +4 -3
  71. package/std/math/powi.zig +0 -1
  72. package/std/mem/Allocator.zig +1 -3
  73. package/std/mem.zig +1 -3
  74. package/std/net.zig +2 -3
  75. package/std/os/linux/bpf.zig +2 -2
  76. package/std/os/linux/powerpc.zig +12 -74
  77. package/std/os/linux/powerpc64.zig +12 -74
  78. package/std/os/linux.zig +2 -7
  79. package/std/os/uefi/protocol/service_binding.zig +1 -1
  80. package/std/os/uefi/tables.zig +1 -1
  81. package/std/pie.zig +1 -1
  82. package/std/posix.zig +4 -6
  83. package/std/process/Child.zig +1 -5
  84. package/std/process.zig +2 -16
  85. package/std/sort/pdq.zig +1 -48
  86. package/std/testing.zig +0 -60
  87. package/std/zig/llvm/BitcodeReader.zig +1 -5
  88. package/std/zig/system/linux.zig +4 -1
  89. package/std/zig/system.zig +2 -3
  90. package/std/zon/parse.zig +0 -1
  91. package/ubsan_rt.zig +3 -3
  92. package/libc/musl/src/fenv/loongarch64/fenv-sf.c +0 -3
package/std/fs/File.zig CHANGED
@@ -1242,7 +1242,7 @@ pub const Reader = struct {
1242
1242
  pub fn seekBy(r: *Reader, offset: i64) Reader.SeekError!void {
1243
1243
  switch (r.mode) {
1244
1244
  .positional, .positional_reading => {
1245
- setLogicalPos(r, @intCast(@as(i64, @intCast(logicalPos(r))) + offset));
1245
+ setPosAdjustingBuffer(r, @intCast(@as(i64, @intCast(r.pos)) + offset));
1246
1246
  },
1247
1247
  .streaming, .streaming_reading => {
1248
1248
  if (posix.SEEK == void) {
@@ -1251,7 +1251,7 @@ pub const Reader = struct {
1251
1251
  }
1252
1252
  const seek_err = r.seek_err orelse e: {
1253
1253
  if (posix.lseek_CUR(r.file.handle, offset)) |_| {
1254
- setLogicalPos(r, @intCast(@as(i64, @intCast(logicalPos(r))) + offset));
1254
+ setPosAdjustingBuffer(r, @intCast(@as(i64, @intCast(r.pos)) + offset));
1255
1255
  return;
1256
1256
  } else |err| {
1257
1257
  r.seek_err = err;
@@ -1275,17 +1275,16 @@ pub const Reader = struct {
1275
1275
  pub fn seekTo(r: *Reader, offset: u64) Reader.SeekError!void {
1276
1276
  switch (r.mode) {
1277
1277
  .positional, .positional_reading => {
1278
- setLogicalPos(r, offset);
1278
+ setPosAdjustingBuffer(r, offset);
1279
1279
  },
1280
1280
  .streaming, .streaming_reading => {
1281
- const logical_pos = logicalPos(r);
1282
- if (offset >= logical_pos) return Reader.seekBy(r, @intCast(offset - logical_pos));
1281
+ if (offset >= r.pos) return Reader.seekBy(r, @intCast(offset - r.pos));
1283
1282
  if (r.seek_err) |err| return err;
1284
1283
  posix.lseek_SET(r.file.handle, offset) catch |err| {
1285
1284
  r.seek_err = err;
1286
1285
  return err;
1287
1286
  };
1288
- setLogicalPos(r, offset);
1287
+ setPosAdjustingBuffer(r, offset);
1289
1288
  },
1290
1289
  .failure => return r.seek_err.?,
1291
1290
  }
@@ -1295,7 +1294,7 @@ pub const Reader = struct {
1295
1294
  return r.pos - r.interface.bufferedLen();
1296
1295
  }
1297
1296
 
1298
- fn setLogicalPos(r: *Reader, offset: u64) void {
1297
+ fn setPosAdjustingBuffer(r: *Reader, offset: u64) void {
1299
1298
  const logical_pos = logicalPos(r);
1300
1299
  if (offset < logical_pos or offset >= r.pos) {
1301
1300
  r.interface.seek = 0;
@@ -1323,15 +1322,13 @@ pub const Reader = struct {
1323
1322
  },
1324
1323
  .positional_reading => {
1325
1324
  const dest = limit.slice(try w.writableSliceGreedy(1));
1326
- var data: [1][]u8 = .{dest};
1327
- const n = try readVecPositional(r, &data);
1325
+ const n = try readPositional(r, dest);
1328
1326
  w.advance(n);
1329
1327
  return n;
1330
1328
  },
1331
1329
  .streaming_reading => {
1332
1330
  const dest = limit.slice(try w.writableSliceGreedy(1));
1333
- var data: [1][]u8 = .{dest};
1334
- const n = try readVecStreaming(r, &data);
1331
+ const n = try readStreaming(r, dest);
1335
1332
  w.advance(n);
1336
1333
  return n;
1337
1334
  },
@@ -1342,98 +1339,92 @@ pub const Reader = struct {
1342
1339
  fn readVec(io_reader: *std.Io.Reader, data: [][]u8) std.Io.Reader.Error!usize {
1343
1340
  const r: *Reader = @alignCast(@fieldParentPtr("interface", io_reader));
1344
1341
  switch (r.mode) {
1345
- .positional, .positional_reading => return readVecPositional(r, data),
1346
- .streaming, .streaming_reading => return readVecStreaming(r, data),
1347
- .failure => return error.ReadFailed,
1348
- }
1349
- }
1350
-
1351
- fn readVecPositional(r: *Reader, data: [][]u8) std.Io.Reader.Error!usize {
1352
- const io_reader = &r.interface;
1353
- if (is_windows) {
1354
- // Unfortunately, `ReadFileScatter` cannot be used since it
1355
- // requires page alignment.
1356
- if (io_reader.seek == io_reader.end) {
1357
- io_reader.seek = 0;
1358
- io_reader.end = 0;
1359
- }
1360
- const first = data[0];
1361
- if (first.len >= io_reader.buffer.len - io_reader.end) {
1362
- return readPositional(r, first);
1363
- } else {
1364
- io_reader.end += try readPositional(r, io_reader.buffer[io_reader.end..]);
1365
- return 0;
1366
- }
1367
- }
1368
- var iovecs_buffer: [max_buffers_len]posix.iovec = undefined;
1369
- const dest_n, const data_size = try io_reader.writableVectorPosix(&iovecs_buffer, data);
1370
- const dest = iovecs_buffer[0..dest_n];
1371
- assert(dest[0].len > 0);
1372
- const n = posix.preadv(r.file.handle, dest, r.pos) catch |err| switch (err) {
1373
- error.Unseekable => {
1374
- r.mode = r.mode.toStreaming();
1375
- const pos = r.pos;
1376
- if (pos != 0) {
1377
- r.pos = 0;
1378
- r.seekBy(@intCast(pos)) catch {
1379
- r.mode = .failure;
1342
+ .positional, .positional_reading => {
1343
+ if (is_windows) {
1344
+ // Unfortunately, `ReadFileScatter` cannot be used since it
1345
+ // requires page alignment.
1346
+ if (io_reader.seek == io_reader.end) {
1347
+ io_reader.seek = 0;
1348
+ io_reader.end = 0;
1349
+ }
1350
+ const first = data[0];
1351
+ if (first.len >= io_reader.buffer.len - io_reader.end) {
1352
+ return readPositional(r, first);
1353
+ } else {
1354
+ io_reader.end += try readPositional(r, io_reader.buffer[io_reader.end..]);
1355
+ return 0;
1356
+ }
1357
+ }
1358
+ var iovecs_buffer: [max_buffers_len]posix.iovec = undefined;
1359
+ const dest_n, const data_size = try io_reader.writableVectorPosix(&iovecs_buffer, data);
1360
+ const dest = iovecs_buffer[0..dest_n];
1361
+ assert(dest[0].len > 0);
1362
+ const n = posix.preadv(r.file.handle, dest, r.pos) catch |err| switch (err) {
1363
+ error.Unseekable => {
1364
+ r.mode = r.mode.toStreaming();
1365
+ const pos = r.pos;
1366
+ if (pos != 0) {
1367
+ r.pos = 0;
1368
+ r.seekBy(@intCast(pos)) catch {
1369
+ r.mode = .failure;
1370
+ return error.ReadFailed;
1371
+ };
1372
+ }
1373
+ return 0;
1374
+ },
1375
+ else => |e| {
1376
+ r.err = e;
1380
1377
  return error.ReadFailed;
1381
- };
1378
+ },
1379
+ };
1380
+ if (n == 0) {
1381
+ r.size = r.pos;
1382
+ return error.EndOfStream;
1382
1383
  }
1383
- return 0;
1384
+ r.pos += n;
1385
+ if (n > data_size) {
1386
+ io_reader.end += n - data_size;
1387
+ return data_size;
1388
+ }
1389
+ return n;
1384
1390
  },
1385
- else => |e| {
1386
- r.err = e;
1387
- return error.ReadFailed;
1391
+ .streaming, .streaming_reading => {
1392
+ if (is_windows) {
1393
+ // Unfortunately, `ReadFileScatter` cannot be used since it
1394
+ // requires page alignment.
1395
+ if (io_reader.seek == io_reader.end) {
1396
+ io_reader.seek = 0;
1397
+ io_reader.end = 0;
1398
+ }
1399
+ const first = data[0];
1400
+ if (first.len >= io_reader.buffer.len - io_reader.end) {
1401
+ return readPositional(r, first);
1402
+ } else {
1403
+ io_reader.end += try readPositional(r, io_reader.buffer[io_reader.end..]);
1404
+ return 0;
1405
+ }
1406
+ }
1407
+ var iovecs_buffer: [max_buffers_len]posix.iovec = undefined;
1408
+ const dest_n, const data_size = try io_reader.writableVectorPosix(&iovecs_buffer, data);
1409
+ const dest = iovecs_buffer[0..dest_n];
1410
+ assert(dest[0].len > 0);
1411
+ const n = posix.readv(r.file.handle, dest) catch |err| {
1412
+ r.err = err;
1413
+ return error.ReadFailed;
1414
+ };
1415
+ if (n == 0) {
1416
+ r.size = r.pos;
1417
+ return error.EndOfStream;
1418
+ }
1419
+ r.pos += n;
1420
+ if (n > data_size) {
1421
+ io_reader.end += n - data_size;
1422
+ return data_size;
1423
+ }
1424
+ return n;
1388
1425
  },
1389
- };
1390
- if (n == 0) {
1391
- r.size = r.pos;
1392
- return error.EndOfStream;
1393
- }
1394
- r.pos += n;
1395
- if (n > data_size) {
1396
- io_reader.end += n - data_size;
1397
- return data_size;
1398
- }
1399
- return n;
1400
- }
1401
-
1402
- fn readVecStreaming(r: *Reader, data: [][]u8) std.Io.Reader.Error!usize {
1403
- const io_reader = &r.interface;
1404
- if (is_windows) {
1405
- // Unfortunately, `ReadFileScatter` cannot be used since it
1406
- // requires page alignment.
1407
- if (io_reader.seek == io_reader.end) {
1408
- io_reader.seek = 0;
1409
- io_reader.end = 0;
1410
- }
1411
- const first = data[0];
1412
- if (first.len >= io_reader.buffer.len - io_reader.end) {
1413
- return readStreaming(r, first);
1414
- } else {
1415
- io_reader.end += try readStreaming(r, io_reader.buffer[io_reader.end..]);
1416
- return 0;
1417
- }
1418
- }
1419
- var iovecs_buffer: [max_buffers_len]posix.iovec = undefined;
1420
- const dest_n, const data_size = try io_reader.writableVectorPosix(&iovecs_buffer, data);
1421
- const dest = iovecs_buffer[0..dest_n];
1422
- assert(dest[0].len > 0);
1423
- const n = posix.readv(r.file.handle, dest) catch |err| {
1424
- r.err = err;
1425
- return error.ReadFailed;
1426
- };
1427
- if (n == 0) {
1428
- r.size = r.pos;
1429
- return error.EndOfStream;
1430
- }
1431
- r.pos += n;
1432
- if (n > data_size) {
1433
- io_reader.end += n - data_size;
1434
- return data_size;
1426
+ .failure => return error.ReadFailed,
1435
1427
  }
1436
- return n;
1437
1428
  }
1438
1429
 
1439
1430
  fn discard(io_reader: *std.Io.Reader, limit: std.Io.Limit) std.Io.Reader.Error!usize {
@@ -1502,7 +1493,7 @@ pub const Reader = struct {
1502
1493
  }
1503
1494
  }
1504
1495
 
1505
- fn readPositional(r: *Reader, dest: []u8) std.Io.Reader.Error!usize {
1496
+ pub fn readPositional(r: *Reader, dest: []u8) std.Io.Reader.Error!usize {
1506
1497
  const n = r.file.pread(dest, r.pos) catch |err| switch (err) {
1507
1498
  error.Unseekable => {
1508
1499
  r.mode = r.mode.toStreaming();
@@ -1529,7 +1520,7 @@ pub const Reader = struct {
1529
1520
  return n;
1530
1521
  }
1531
1522
 
1532
- fn readStreaming(r: *Reader, dest: []u8) std.Io.Reader.Error!usize {
1523
+ pub fn readStreaming(r: *Reader, dest: []u8) std.Io.Reader.Error!usize {
1533
1524
  const n = r.file.read(dest) catch |err| {
1534
1525
  r.err = err;
1535
1526
  return error.ReadFailed;
@@ -1542,6 +1533,14 @@ pub const Reader = struct {
1542
1533
  return n;
1543
1534
  }
1544
1535
 
1536
+ pub fn read(r: *Reader, dest: []u8) std.Io.Reader.Error!usize {
1537
+ switch (r.mode) {
1538
+ .positional, .positional_reading => return readPositional(r, dest),
1539
+ .streaming, .streaming_reading => return readStreaming(r, dest),
1540
+ .failure => return error.ReadFailed,
1541
+ }
1542
+ }
1543
+
1545
1544
  pub fn atEnd(r: *Reader) bool {
1546
1545
  // Even if stat fails, size is set when end is encountered.
1547
1546
  const size = r.size orelse return false;
@@ -1784,7 +1783,7 @@ pub const Writer = struct {
1784
1783
  ) std.Io.Writer.FileError!usize {
1785
1784
  const reader_buffered = file_reader.interface.buffered();
1786
1785
  if (reader_buffered.len >= @intFromEnum(limit))
1787
- return sendFileBuffered(io_w, file_reader, limit.slice(reader_buffered));
1786
+ return sendFileBuffered(io_w, file_reader, reader_buffered);
1788
1787
  const writer_buffered = io_w.buffered();
1789
1788
  const file_limit = @intFromEnum(limit) - reader_buffered.len;
1790
1789
  const w: *Writer = @alignCast(@fieldParentPtr("interface", io_w));
@@ -1856,7 +1855,7 @@ pub const Writer = struct {
1856
1855
  return error.EndOfStream;
1857
1856
  }
1858
1857
  const consumed = io_w.consume(@intCast(sbytes));
1859
- file_reader.seekBy(@intCast(consumed)) catch return error.ReadFailed;
1858
+ file_reader.seekTo(file_reader.pos + consumed) catch return error.ReadFailed;
1860
1859
  return consumed;
1861
1860
  }
1862
1861
 
@@ -1917,7 +1916,7 @@ pub const Writer = struct {
1917
1916
  return error.EndOfStream;
1918
1917
  }
1919
1918
  const consumed = io_w.consume(@bitCast(len));
1920
- file_reader.seekBy(@intCast(consumed)) catch return error.ReadFailed;
1919
+ file_reader.seekTo(file_reader.pos + consumed) catch return error.ReadFailed;
1921
1920
  return consumed;
1922
1921
  }
1923
1922
 
@@ -1968,7 +1967,7 @@ pub const Writer = struct {
1968
1967
 
1969
1968
  const copy_file_range = switch (native_os) {
1970
1969
  .freebsd => std.os.freebsd.copy_file_range,
1971
- .linux => std.os.linux.wrapped.copy_file_range,
1970
+ .linux => if (std.c.versionCheck(if (builtin.abi.isAndroid()) .{ .major = 34, .minor = 0, .patch = 0 } else .{ .major = 2, .minor = 27, .patch = 0 })) std.os.linux.wrapped.copy_file_range else {},
1972
1971
  else => {},
1973
1972
  };
1974
1973
  if (@TypeOf(copy_file_range) != void) cfr: {
@@ -2050,7 +2049,7 @@ pub const Writer = struct {
2050
2049
  reader_buffered: []const u8,
2051
2050
  ) std.Io.Writer.FileError!usize {
2052
2051
  const n = try drain(io_w, &.{reader_buffered}, 1);
2053
- file_reader.seekBy(@intCast(n)) catch return error.ReadFailed;
2052
+ file_reader.seekTo(file_reader.pos + n) catch return error.ReadFailed;
2054
2053
  return n;
2055
2054
  }
2056
2055
 
@@ -1375,7 +1375,7 @@ pub const basic_authorization = struct {
1375
1375
  var buf: [max_user_len + 1 + max_password_len]u8 = undefined;
1376
1376
  var w: Writer = .fixed(&buf);
1377
1377
  const user: Uri.Component = uri.user orelse .empty;
1378
- const password: Uri.Component = uri.password orelse .empty;
1378
+ const password: Uri.Component = uri.user orelse .empty;
1379
1379
  user.formatUser(&w) catch unreachable;
1380
1380
  w.writeByte(':') catch unreachable;
1381
1381
  password.formatPassword(&w) catch unreachable;
@@ -1797,10 +1797,9 @@ pub fn fetch(client: *Client, options: FetchOptions) FetchError!FetchResult {
1797
1797
 
1798
1798
  if (options.payload) |payload| {
1799
1799
  req.transfer_encoding = .{ .content_length = payload.len };
1800
- var body = try req.sendBodyUnflushed(&.{});
1800
+ var body = try req.sendBody(&.{});
1801
1801
  try body.writer.writeAll(payload);
1802
1802
  try body.end();
1803
- try req.connection.?.flush();
1804
1803
  } else {
1805
1804
  try req.sendBodiless();
1806
1805
  }
@@ -567,8 +567,8 @@ pub fn innerParseFromValue(
567
567
  switch (source) {
568
568
  .float => |f| {
569
569
  if (@round(f) != f) return error.InvalidNumber;
570
- if (f > @as(@TypeOf(f), @floatFromInt(std.math.maxInt(T)))) return error.Overflow;
571
- if (f < @as(@TypeOf(f), @floatFromInt(std.math.minInt(T)))) return error.Overflow;
570
+ if (f > std.math.maxInt(T)) return error.Overflow;
571
+ if (f < std.math.minInt(T)) return error.Overflow;
572
572
  return @as(T, @intFromFloat(f));
573
573
  },
574
574
  .integer => |i| {
@@ -770,7 +770,7 @@ fn sliceToInt(comptime T: type, slice: []const u8) !T {
770
770
  // Try to coerce a float to an integer.
771
771
  const float = try std.fmt.parseFloat(f128, slice);
772
772
  if (@round(float) != float) return error.InvalidNumber;
773
- if (float > @as(f128, @floatFromInt(std.math.maxInt(T))) or float < @as(f128, @floatFromInt(std.math.minInt(T)))) return error.Overflow;
773
+ if (float > std.math.maxInt(T) or float < std.math.minInt(T)) return error.Overflow;
774
774
  return @as(T, @intCast(@as(i128, @intFromFloat(float))));
775
775
  }
776
776
 
@@ -786,10 +786,11 @@ pub const Mutable = struct {
786
786
  assert(rma.limbs.ptr != b.limbs.ptr); // illegal aliasing
787
787
 
788
788
  if (a.limbs.len == 1 and b.limbs.len == 1) {
789
- rma.limbs[0], const overflow_bit = @mulWithOverflow(a.limbs[0], b.limbs[0]);
790
- if (overflow_bit == 0) {
789
+ const ov = @mulWithOverflow(a.limbs[0], b.limbs[0]);
790
+ rma.limbs[0] = ov[0];
791
+ if (ov[1] == 0) {
791
792
  rma.len = 1;
792
- rma.positive = (a.positive == b.positive) or rma.limbs[0] == 0;
793
+ rma.positive = (a.positive == b.positive);
793
794
  return;
794
795
  }
795
796
  }
package/std/math/powi.zig CHANGED
@@ -13,7 +13,6 @@ const testing = std.testing;
13
13
  /// Errors:
14
14
  /// - Overflow: Integer overflow or Infinity
15
15
  /// - Underflow: Absolute value of result smaller than 1
16
- ///
17
16
  /// Edge case rules ordered by precedence:
18
17
  /// - powi(T, x, 0) = 1 unless T is i1, i0, u0
19
18
  /// - powi(T, 0, x) = 0 when x > 0
@@ -358,10 +358,8 @@ pub fn remap(self: Allocator, allocation: anytype, new_len: usize) t: {
358
358
  return mem.bytesAsSlice(T, new_memory);
359
359
  }
360
360
 
361
- /// This function requests a new size for an existing allocation, which
361
+ /// This function requests a new byte size for an existing allocation, which
362
362
  /// can be larger, smaller, or the same size as the old memory allocation.
363
- /// The result is an array of `new_n` items of the same type as the existing
364
- /// allocation.
365
363
  ///
366
364
  /// If `new_n` is 0, this is the same as `free` and it always succeeds.
367
365
  ///
package/std/mem.zig CHANGED
@@ -3785,7 +3785,6 @@ test rotate {
3785
3785
 
3786
3786
  /// Replace needle with replacement as many times as possible, writing to an output buffer which is assumed to be of
3787
3787
  /// appropriate size. Use replacementSize to calculate an appropriate buffer size.
3788
- /// The `input` and `output` slices must not overlap.
3789
3788
  /// The needle must not be empty.
3790
3789
  /// Returns the number of replacements made.
3791
3790
  pub fn replace(comptime T: type, input: []const T, needle: []const T, replacement: []const T, output: []T) usize {
@@ -4485,8 +4484,7 @@ pub fn doNotOptimizeAway(val: anytype) void {
4485
4484
  } else doNotOptimizeAway(&val);
4486
4485
  },
4487
4486
  .float => {
4488
- // https://github.com/llvm/llvm-project/issues/159200
4489
- if ((t.float.bits == 32 or t.float.bits == 64) and builtin.zig_backend != .stage2_c and !builtin.cpu.arch.isLoongArch()) {
4487
+ if ((t.float.bits == 32 or t.float.bits == 64) and builtin.zig_backend != .stage2_c) {
4490
4488
  asm volatile (""
4491
4489
  :
4492
4490
  : [_] "rm" (val),
package/std/net.zig CHANGED
@@ -1393,7 +1393,7 @@ fn parseHosts(
1393
1393
  br: *Io.Reader,
1394
1394
  ) error{ OutOfMemory, ReadFailed }!void {
1395
1395
  while (true) {
1396
- const line = br.takeDelimiter('\n') catch |err| switch (err) {
1396
+ const line = br.takeDelimiterExclusive('\n') catch |err| switch (err) {
1397
1397
  error.StreamTooLong => {
1398
1398
  // Skip lines that are too long.
1399
1399
  _ = br.discardDelimiterInclusive('\n') catch |e| switch (e) {
@@ -1403,8 +1403,7 @@ fn parseHosts(
1403
1403
  continue;
1404
1404
  },
1405
1405
  error.ReadFailed => return error.ReadFailed,
1406
- } orelse {
1407
- break; // end of stream
1406
+ error.EndOfStream => break,
1408
1407
  };
1409
1408
  var split_it = mem.splitScalar(u8, line, '#');
1410
1409
  const no_comment_line = split_it.first();
@@ -642,7 +642,7 @@ pub const Insn = packed struct {
642
642
  .dst = @intFromEnum(dst),
643
643
  .src = @intFromEnum(src),
644
644
  .off = 0,
645
- .imm = @as(i32, @bitCast(@as(u32, @truncate(imm)))),
645
+ .imm = @as(i32, @intCast(@as(u32, @truncate(imm)))),
646
646
  };
647
647
  }
648
648
 
@@ -652,7 +652,7 @@ pub const Insn = packed struct {
652
652
  .dst = 0,
653
653
  .src = 0,
654
654
  .off = 0,
655
- .imm = @as(i32, @bitCast(@as(u32, @truncate(imm >> 32)))),
655
+ .imm = @as(i32, @intCast(@as(u32, @truncate(imm >> 32)))),
656
656
  };
657
657
  }
658
658
 
@@ -15,125 +15,84 @@ const sockaddr = linux.sockaddr;
15
15
  const timespec = linux.timespec;
16
16
 
17
17
  pub fn syscall0(number: SYS) usize {
18
- // r0 is both an input register and a clobber. musl and glibc achieve this with
19
- // a "+" constraint, which isn't supported in Zig, so instead we separately list
20
- // r0 as both an input and an output. (Listing it as an input and a clobber would
21
- // cause the C backend to emit invalid code; see #25209.)
22
- var r0_out: usize = undefined;
23
18
  return asm volatile (
24
19
  \\ sc
25
20
  \\ bns+ 1f
26
21
  \\ neg 3, 3
27
22
  \\ 1:
28
23
  : [ret] "={r3}" (-> usize),
29
- [r0_out] "={r0}" (r0_out),
30
24
  : [number] "{r0}" (@intFromEnum(number)),
31
- : .{ .memory = true, .cr0 = true, .r4 = true, .r5 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .ctr = true, .xer = true });
25
+ : .{ .memory = true, .cr0 = true, .r0 = true, .r4 = true, .r5 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true });
32
26
  }
33
27
 
34
28
  pub fn syscall1(number: SYS, arg1: usize) usize {
35
- // r0 is both an input and a clobber.
36
- var r0_out: usize = undefined;
37
29
  return asm volatile (
38
30
  \\ sc
39
31
  \\ bns+ 1f
40
32
  \\ neg 3, 3
41
33
  \\ 1:
42
34
  : [ret] "={r3}" (-> usize),
43
- [r0_out] "={r0}" (r0_out),
44
35
  : [number] "{r0}" (@intFromEnum(number)),
45
36
  [arg1] "{r3}" (arg1),
46
- : .{ .memory = true, .cr0 = true, .r4 = true, .r5 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .ctr = true, .xer = true });
37
+ : .{ .memory = true, .cr0 = true, .r0 = true, .r4 = true, .r5 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true });
47
38
  }
48
39
 
49
40
  pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
50
- // These registers are both inputs and clobbers.
51
- var r0_out: usize = undefined;
52
- var r4_out: usize = undefined;
53
41
  return asm volatile (
54
42
  \\ sc
55
43
  \\ bns+ 1f
56
44
  \\ neg 3, 3
57
45
  \\ 1:
58
46
  : [ret] "={r3}" (-> usize),
59
- [r0_out] "={r0}" (r0_out),
60
- [r4_out] "={r4}" (r4_out),
61
47
  : [number] "{r0}" (@intFromEnum(number)),
62
48
  [arg1] "{r3}" (arg1),
63
49
  [arg2] "{r4}" (arg2),
64
- : .{ .memory = true, .cr0 = true, .r5 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .ctr = true, .xer = true });
50
+ : .{ .memory = true, .cr0 = true, .r0 = true, .r4 = true, .r5 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true });
65
51
  }
66
52
 
67
53
  pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {
68
- // These registers are both inputs and clobbers.
69
- var r0_out: usize = undefined;
70
- var r4_out: usize = undefined;
71
- var r5_out: usize = undefined;
72
54
  return asm volatile (
73
55
  \\ sc
74
56
  \\ bns+ 1f
75
57
  \\ neg 3, 3
76
58
  \\ 1:
77
59
  : [ret] "={r3}" (-> usize),
78
- [r0_out] "={r0}" (r0_out),
79
- [r4_out] "={r4}" (r4_out),
80
- [r5_out] "={r5}" (r5_out),
81
60
  : [number] "{r0}" (@intFromEnum(number)),
82
61
  [arg1] "{r3}" (arg1),
83
62
  [arg2] "{r4}" (arg2),
84
63
  [arg3] "{r5}" (arg3),
85
- : .{ .memory = true, .cr0 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .ctr = true, .xer = true });
64
+ : .{ .memory = true, .cr0 = true, .r0 = true, .r4 = true, .r5 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true });
86
65
  }
87
66
 
88
67
  pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize) usize {
89
- // These registers are both inputs and clobbers.
90
- var r0_out: usize = undefined;
91
- var r4_out: usize = undefined;
92
- var r5_out: usize = undefined;
93
- var r6_out: usize = undefined;
94
68
  return asm volatile (
95
69
  \\ sc
96
70
  \\ bns+ 1f
97
71
  \\ neg 3, 3
98
72
  \\ 1:
99
73
  : [ret] "={r3}" (-> usize),
100
- [r0_out] "={r0}" (r0_out),
101
- [r4_out] "={r4}" (r4_out),
102
- [r5_out] "={r5}" (r5_out),
103
- [r6_out] "={r6}" (r6_out),
104
74
  : [number] "{r0}" (@intFromEnum(number)),
105
75
  [arg1] "{r3}" (arg1),
106
76
  [arg2] "{r4}" (arg2),
107
77
  [arg3] "{r5}" (arg3),
108
78
  [arg4] "{r6}" (arg4),
109
- : .{ .memory = true, .cr0 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .ctr = true, .xer = true });
79
+ : .{ .memory = true, .cr0 = true, .r0 = true, .r4 = true, .r5 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true });
110
80
  }
111
81
 
112
82
  pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize, arg5: usize) usize {
113
- // These registers are both inputs and clobbers.
114
- var r0_out: usize = undefined;
115
- var r4_out: usize = undefined;
116
- var r5_out: usize = undefined;
117
- var r6_out: usize = undefined;
118
- var r7_out: usize = undefined;
119
83
  return asm volatile (
120
84
  \\ sc
121
85
  \\ bns+ 1f
122
86
  \\ neg 3, 3
123
87
  \\ 1:
124
88
  : [ret] "={r3}" (-> usize),
125
- [r0_out] "={r0}" (r0_out),
126
- [r4_out] "={r4}" (r4_out),
127
- [r5_out] "={r5}" (r5_out),
128
- [r6_out] "={r6}" (r6_out),
129
- [r7_out] "={r7}" (r7_out),
130
89
  : [number] "{r0}" (@intFromEnum(number)),
131
90
  [arg1] "{r3}" (arg1),
132
91
  [arg2] "{r4}" (arg2),
133
92
  [arg3] "{r5}" (arg3),
134
93
  [arg4] "{r6}" (arg4),
135
94
  [arg5] "{r7}" (arg5),
136
- : .{ .memory = true, .cr0 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .ctr = true, .xer = true });
95
+ : .{ .memory = true, .cr0 = true, .r0 = true, .r4 = true, .r5 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true });
137
96
  }
138
97
 
139
98
  pub fn syscall6(
@@ -145,25 +104,12 @@ pub fn syscall6(
145
104
  arg5: usize,
146
105
  arg6: usize,
147
106
  ) usize {
148
- // These registers are both inputs and clobbers.
149
- var r0_out: usize = undefined;
150
- var r4_out: usize = undefined;
151
- var r5_out: usize = undefined;
152
- var r6_out: usize = undefined;
153
- var r7_out: usize = undefined;
154
- var r8_out: usize = undefined;
155
107
  return asm volatile (
156
108
  \\ sc
157
109
  \\ bns+ 1f
158
110
  \\ neg 3, 3
159
111
  \\ 1:
160
112
  : [ret] "={r3}" (-> usize),
161
- [r0_out] "={r0}" (r0_out),
162
- [r4_out] "={r4}" (r4_out),
163
- [r5_out] "={r5}" (r5_out),
164
- [r6_out] "={r6}" (r6_out),
165
- [r7_out] "={r7}" (r7_out),
166
- [r8_out] "={r8}" (r8_out),
167
113
  : [number] "{r0}" (@intFromEnum(number)),
168
114
  [arg1] "{r3}" (arg1),
169
115
  [arg2] "{r4}" (arg2),
@@ -171,7 +117,7 @@ pub fn syscall6(
171
117
  [arg4] "{r6}" (arg4),
172
118
  [arg5] "{r7}" (arg5),
173
119
  [arg6] "{r8}" (arg6),
174
- : .{ .memory = true, .cr0 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .ctr = true, .xer = true });
120
+ : .{ .memory = true, .cr0 = true, .r0 = true, .r4 = true, .r5 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true });
175
121
  }
176
122
 
177
123
  pub fn clone() callconv(.naked) usize {
@@ -247,19 +193,11 @@ pub fn clone() callconv(.naked) usize {
247
193
  pub const restore = restore_rt;
248
194
 
249
195
  pub fn restore_rt() callconv(.naked) noreturn {
250
- switch (@import("builtin").zig_backend) {
251
- .stage2_c => asm volatile (
252
- \\ li 0, %[number]
253
- \\ sc
254
- :
255
- : [number] "i" (@intFromEnum(SYS.rt_sigreturn)),
256
- : .{ .memory = true, .cr0 = true, .r4 = true, .r5 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true }),
257
- else => _ = asm volatile (
258
- \\ sc
259
- :
260
- : [number] "{r0}" (@intFromEnum(SYS.rt_sigreturn)),
261
- : .{ .memory = true, .cr0 = true, .r4 = true, .r5 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true }),
262
- }
196
+ asm volatile (
197
+ \\ sc
198
+ :
199
+ : [number] "{r0}" (@intFromEnum(SYS.rt_sigreturn)),
200
+ : .{ .memory = true, .cr0 = true, .r4 = true, .r5 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true });
263
201
  }
264
202
 
265
203
  pub const F = struct {