aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/std/build.zig5
-rw-r--r--lib/std/zig.zig38
-rw-r--r--lib/std/zig/ast.zig2
-rw-r--r--lib/std/zig/parse.zig2
4 files changed, 44 insertions, 3 deletions
diff --git a/lib/std/build.zig b/lib/std/build.zig
index a4d922f2ad..df1dc6d73a 100644
--- a/lib/std/build.zig
+++ b/lib/std/build.zig
@@ -1905,10 +1905,11 @@ pub const LibExeObjStep = struct {
builder.allocator,
&[_][]const u8{ builder.cache_root, builder.fmt("{}_build_options.zig", .{self.name}) },
);
- try fs.cwd().writeFile(build_options_file, self.build_options_contents.span());
+ const path_from_root = builder.pathFromRoot(build_options_file);
+ try fs.cwd().writeFile(path_from_root, self.build_options_contents.span());
try zig_args.append("--pkg-begin");
try zig_args.append("build_options");
- try zig_args.append(builder.pathFromRoot(build_options_file));
+ try zig_args.append(path_from_root);
try zig_args.append("--pkg-end");
}
diff --git a/lib/std/zig.zig b/lib/std/zig.zig
index bb4f955797..841827cc19 100644
--- a/lib/std/zig.zig
+++ b/lib/std/zig.zig
@@ -1,4 +1,6 @@
+const std = @import("std.zig");
const tokenizer = @import("zig/tokenizer.zig");
+
pub const Token = tokenizer.Token;
pub const Tokenizer = tokenizer.Tokenizer;
pub const parse = @import("zig/parse.zig").parse;
@@ -9,6 +11,21 @@ pub const ast = @import("zig/ast.zig");
pub const system = @import("zig/system.zig");
pub const CrossTarget = @import("zig/cross_target.zig").CrossTarget;
+pub const SrcHash = [16]u8;
+
+/// If the source is small enough, it is used directly as the hash.
+/// If it is long, blake3 hash is computed.
+pub fn hashSrc(src: []const u8) SrcHash {
+ var out: SrcHash = undefined;
+ if (src.len <= SrcHash.len) {
+ std.mem.copy(u8, &out, src);
+ std.mem.set(u8, out[src.len..], 0);
+ } else {
+ std.crypto.Blake3.hash(src, &out);
+ }
+ return out;
+}
+
pub fn findLineColumn(source: []const u8, byte_offset: usize) struct { line: usize, column: usize } {
var line: usize = 0;
var column: usize = 0;
@@ -26,6 +43,27 @@ pub fn findLineColumn(source: []const u8, byte_offset: usize) struct { line: usi
return .{ .line = line, .column = column };
}
+/// Returns the standard file system basename of a binary generated by the Zig compiler.
+pub fn binNameAlloc(
+ allocator: *std.mem.Allocator,
+ root_name: []const u8,
+ target: std.Target,
+ output_mode: std.builtin.OutputMode,
+ link_mode: ?std.builtin.LinkMode,
+) error{OutOfMemory}![]u8 {
+ switch (output_mode) {
+ .Exe => return std.fmt.allocPrint(allocator, "{}{}", .{ root_name, target.exeFileExt() }),
+ .Lib => {
+ const suffix = switch (link_mode orelse .Static) {
+ .Static => target.staticLibSuffix(),
+ .Dynamic => target.dynamicLibSuffix(),
+ };
+ return std.fmt.allocPrint(allocator, "{}{}{}", .{ target.libPrefix(), root_name, suffix });
+ },
+ .Obj => return std.fmt.allocPrint(allocator, "{}{}", .{ root_name, target.oFileExt() }),
+ }
+}
+
test "" {
@import("std").meta.refAllDecls(@This());
}
diff --git a/lib/std/zig/ast.zig b/lib/std/zig/ast.zig
index 4d63011266..370f42b463 100644
--- a/lib/std/zig/ast.zig
+++ b/lib/std/zig/ast.zig
@@ -2260,6 +2260,8 @@ pub const Node = struct {
}
};
+ /// TODO break this into separate Break, Continue, Return AST Nodes to save memory.
+ /// Could be further broken into LabeledBreak, LabeledContinue, and ReturnVoid to save even more.
pub const ControlFlowExpression = struct {
base: Node = Node{ .id = .ControlFlowExpression },
ltoken: TokenIndex,
diff --git a/lib/std/zig/parse.zig b/lib/std/zig/parse.zig
index e6cd7a8b6d..5a34c0ff91 100644
--- a/lib/std/zig/parse.zig
+++ b/lib/std/zig/parse.zig
@@ -3222,7 +3222,7 @@ const Parser = struct {
}
/// Op* Child
- fn parsePrefixOpExpr(p: *Parser, opParseFn: NodeParseFn, childParseFn: NodeParseFn) Error!?*Node {
+ fn parsePrefixOpExpr(p: *Parser, comptime opParseFn: NodeParseFn, comptime childParseFn: NodeParseFn) Error!?*Node {
if (try opParseFn(p)) |first_op| {
var rightmost_op = first_op;
while (true) {