aboutsummaryrefslogtreecommitdiff
path: root/src/Module.zig
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2021-03-20 21:48:35 -0700
committerAndrew Kelley <andrew@ziglang.org>2021-03-20 21:48:35 -0700
commit8bad5dfa72a33dec3919c3c3cb7590e51d03723b (patch)
treed70339e575f8f209364ef6066bf6d3e2cece7ca9 /src/Module.zig
parent260c610708451624eab783bc4e99388e2b28a3ba (diff)
downloadzig-8bad5dfa72a33dec3919c3c3cb7590e51d03723b.tar.gz
zig-8bad5dfa72a33dec3919c3c3cb7590e51d03723b.zip
astgen: implement inline assembly
Diffstat (limited to 'src/Module.zig')
-rw-r--r--src/Module.zig35
1 files changed, 27 insertions, 8 deletions
diff --git a/src/Module.zig b/src/Module.zig
index cb1c11cda7..9830e43d4a 100644
--- a/src/Module.zig
+++ b/src/Module.zig
@@ -1183,6 +1183,22 @@ pub const Scope = struct {
});
}
+ pub fn addStrTok(
+ gz: *GenZir,
+ tag: zir.Inst.Tag,
+ str_index: u32,
+ /// Absolute token index. This function does the conversion to Decl offset.
+ abs_tok_index: ast.TokenIndex,
+ ) !zir.Inst.Ref {
+ return gz.add(.{
+ .tag = tag,
+ .data = .{ .str_tok = .{
+ .start = str_index,
+ .src_tok = abs_tok_index - gz.zir_code.decl.srcToken(),
+ } },
+ });
+ }
+
pub fn addBin(
gz: *GenZir,
tag: zir.Inst.Tag,
@@ -4090,10 +4106,10 @@ pub fn identifierTokenString(mod: *Module, scope: *Scope, token: ast.TokenIndex)
if (!mem.startsWith(u8, ident_name, "@")) {
return ident_name;
}
- var buf = std.ArrayList(u8).init(mod.gpa);
- defer buf.deinit();
+ var buf: std.ArrayListUnmanaged(u8) = .{};
+ defer buf.deinit(mod.gpa);
try parseStrLit(mod, scope, token, &buf, ident_name, 1);
- return buf.toOwnedSlice();
+ return buf.toOwnedSlice(mod.gpa);
}
/// Given an identifier token, obtain the string for it (possibly parsing as a string
@@ -4103,16 +4119,16 @@ pub fn appendIdentStr(
mod: *Module,
scope: *Scope,
token: ast.TokenIndex,
- buf: *ArrayList(u8),
+ buf: *std.ArrayListUnmanaged(u8),
) InnerError!void {
const tree = scope.tree();
const token_tags = tree.tokens.items(.tag);
assert(token_tags[token] == .identifier);
const ident_name = tree.tokenSlice(token);
if (!mem.startsWith(u8, ident_name, "@")) {
- return buf.appendSlice(ident_name);
+ return buf.appendSlice(mod.gpa, ident_name);
} else {
- return parseStrLit(scope, token, buf, ident_name, 1);
+ return mod.parseStrLit(scope, token, buf, ident_name, 1);
}
}
@@ -4121,14 +4137,17 @@ pub fn parseStrLit(
mod: *Module,
scope: *Scope,
token: ast.TokenIndex,
- buf: *std.ArrayList(u8),
+ buf: *std.ArrayListUnmanaged(u8),
bytes: []const u8,
offset: u32,
) InnerError!void {
const tree = scope.tree();
const token_starts = tree.tokens.items(.start);
const raw_string = bytes[offset..];
- switch (try std.zig.string_literal.parseAppend(buf, raw_string)) {
+ var buf_managed = buf.toManaged(mod.gpa);
+ const result = std.zig.string_literal.parseAppend(&buf_managed, raw_string);
+ buf.* = buf_managed.toUnmanaged();
+ switch (try result) {
.success => return,
.invalid_character => |bad_index| {
return mod.failOff(