Function generate [src]

Prototype

pub fn generate(gpa: Allocator, tree: Ast, options: Options) Allocator.Error!Zoir

Parameters

gpa: Allocatortree: Astoptions: Options

Source

pub fn generate(gpa: Allocator, tree: Ast, options: Options) Allocator.Error!Zoir { assert(tree.mode == .zon); var zg: ZonGen = .{ .gpa = gpa, .tree = tree, .options = options, .nodes = .empty, .extra = .empty, .limbs = .empty, .string_bytes = .empty, .string_table = .empty, .compile_errors = .empty, .error_notes = .empty, }; defer { zg.nodes.deinit(gpa); zg.extra.deinit(gpa); zg.limbs.deinit(gpa); zg.string_bytes.deinit(gpa); zg.string_table.deinit(gpa); zg.compile_errors.deinit(gpa); zg.error_notes.deinit(gpa); } if (tree.errors.len == 0) { const root_ast_node = tree.rootDecls()[0]; try zg.nodes.append(gpa, undefined); // index 0; root node try zg.expr(root_ast_node, .root); } else { try zg.lowerAstErrors(); } if (zg.compile_errors.items.len > 0) { const string_bytes = try zg.string_bytes.toOwnedSlice(gpa); errdefer gpa.free(string_bytes); const compile_errors = try zg.compile_errors.toOwnedSlice(gpa); errdefer gpa.free(compile_errors); const error_notes = try zg.error_notes.toOwnedSlice(gpa); errdefer gpa.free(error_notes); return .{ .nodes = .empty, .extra = &.{}, .limbs = &.{}, .string_bytes = string_bytes, .compile_errors = compile_errors, .error_notes = error_notes, }; } else { assert(zg.error_notes.items.len == 0); var nodes = zg.nodes.toOwnedSlice(); errdefer nodes.deinit(gpa); const extra = try zg.extra.toOwnedSlice(gpa); errdefer gpa.free(extra); const limbs = try zg.limbs.toOwnedSlice(gpa); errdefer gpa.free(limbs); const string_bytes = try zg.string_bytes.toOwnedSlice(gpa); errdefer gpa.free(string_bytes); return .{ .nodes = nodes, .extra = extra, .limbs = limbs, .string_bytes = string_bytes, .compile_errors = &.{}, .error_notes = &.{}, }; } }