authorgravatar for michael.dusan@gmail.comMichael Dusan <michael.dusan@gmail.com> 2019-05-29 14:39:13-04:00
committergravatar for michael.dusan@gmail.comMichael Dusan <michael.dusan@gmail.com> 2019-05-29 14:39:13-04:00
log2975bdc684b74b013dc4d45c39535b872ac46a0a
treea842890099776c82ea6f9e632a25ef83d0f3b829
parentd4b241c14e7e9eb8f0c5fcb767c6021e8651c93f
signature Commit is signed but in an unrecognized format.

add review changes

- use std.heap.c_allocator - use @panic instead of unreachable - use extern enum for tokenizer result type

3 files changed, 29 insertions(+), 20 deletions(-)

src-self-hosted/dep_tokenizer.zig+25-16
...@@ -359,12 +359,9 @@ pub const Tokenizer = struct {...@@ -359,12 +359,9 @@ pub const Tokenizer = struct {
359 };359 };
360};360};
361361
362// stage1 compiler support
363var stage2_da = std.heap.DirectAllocator.init();
364
365export fn stage2_DepTokenizer_init(input: [*]const u8, len: usize) stage2_DepTokenizer {362export fn stage2_DepTokenizer_init(input: [*]const u8, len: usize) stage2_DepTokenizer {
366 const t = stage2_da.allocator.create(Tokenizer) catch unreachable;363 const t = std.heap.c_allocator.create(Tokenizer) catch @panic("failed to create .d tokenizer");
367 t.* = Tokenizer.init(&stage2_da.allocator, input[0..len]);364 t.* = Tokenizer.init(std.heap.c_allocator, input[0..len]);
368 return stage2_DepTokenizer{365 return stage2_DepTokenizer{
369 .handle = t,366 .handle = t,
370 };367 };
...@@ -376,20 +373,25 @@ export fn stage2_DepTokenizer_deinit(self: *stage2_DepTokenizer) void {...@@ -376,20 +373,25 @@ export fn stage2_DepTokenizer_deinit(self: *stage2_DepTokenizer) void {
376373
377export fn stage2_DepTokenizer_next(self: *stage2_DepTokenizer) stage2_DepNextResult {374export fn stage2_DepTokenizer_next(self: *stage2_DepTokenizer) stage2_DepNextResult {
378 const otoken = self.handle.next() catch {375 const otoken = self.handle.next() catch {
376 const textz = std.Buffer.init(&self.handle.arena.allocator, self.handle.error_text) catch @panic("failed to create .d tokenizer error text");
379 return stage2_DepNextResult{377 return stage2_DepNextResult{
380 .ent = 0,378 .type_id = .error_,
381 .textz = (std.Buffer.init(&self.handle.arena.allocator, self.handle.error_text) catch unreachable).toSlice().ptr,379 .textz = textz.toSlice().ptr,
382 };380 };
383 };381 };
384 const token = otoken orelse {382 const token = otoken orelse {
385 return stage2_DepNextResult{383 return stage2_DepNextResult{
386 .ent = 1,384 .type_id = .null_,
387 .textz = undefined,385 .textz = undefined,
388 };386 };
389 };387 };
388 const textz = std.Buffer.init(&self.handle.arena.allocator, token.bytes) catch @panic("failed to create .d tokenizer token text");
390 return stage2_DepNextResult{389 return stage2_DepNextResult{
391 .ent = @enumToInt(token.id) + u8(2),390 .type_id = switch (token.id) {
392 .textz = (std.Buffer.init(&self.handle.arena.allocator, token.bytes) catch unreachable).toSlice().ptr,391 .target => stage2_DepNextResult.TypeId.target,
392 .prereq => stage2_DepNextResult.TypeId.prereq,
393 },
394 .textz = textz.toSlice().ptr,
393 };395 };
394}396}
395397
...@@ -398,13 +400,20 @@ export const stage2_DepTokenizer = extern struct {...@@ -398,13 +400,20 @@ export const stage2_DepTokenizer = extern struct {
398};400};
399401
400export const stage2_DepNextResult = extern struct {402export const stage2_DepNextResult = extern struct {
401 // 0=error, 1=null, 2=token=target, 3=token=prereq403 type_id: TypeId,
402 ent: u8,404
403 // ent=0 -- error text405 // when type_id == error --> error text
404 // ent=1 -- NEVER406 // when type_id == null --> undefined
405 // ent=2 -- token text value407 // when type_id == target --> target pathname
406 // ent=3 -- token text value408 // when type_id == prereq --> prereq pathname
407 textz: [*]const u8,409 textz: [*]const u8,
410
411 export const TypeId = extern enum {
412 error_,
413 null_,
414 target,
415 prereq,
416 };
408};417};
409418
410test "empty file" {419test "empty file" {
src/cache_hash.cpp+2-2
...@@ -482,7 +482,7 @@ Error cache_add_dep_file(CacheHash *ch, Buf *dep_file_path, bool verbose) {...@@ -482,7 +482,7 @@ Error cache_add_dep_file(CacheHash *ch, Buf *dep_file_path, bool verbose) {
482 // skip first token: target482 // skip first token: target
483 {483 {
484 auto result = stage2_DepTokenizer_next(&it);484 auto result = stage2_DepTokenizer_next(&it);
485 switch (result.ent) {485 switch (result.type_id) {
486 case stage2_DepNextResult::error:486 case stage2_DepNextResult::error:
487 if (verbose) {487 if (verbose) {
488 fprintf(stderr, "%s: failed processing .d file: %s\n", result.textz, buf_ptr(dep_file_path));488 fprintf(stderr, "%s: failed processing .d file: %s\n", result.textz, buf_ptr(dep_file_path));
...@@ -502,7 +502,7 @@ Error cache_add_dep_file(CacheHash *ch, Buf *dep_file_path, bool verbose) {...@@ -502,7 +502,7 @@ Error cache_add_dep_file(CacheHash *ch, Buf *dep_file_path, bool verbose) {
502 // clang is invoked in single-source mode so we never get more targets.502 // clang is invoked in single-source mode so we never get more targets.
503 for (;;) {503 for (;;) {
504 auto result = stage2_DepTokenizer_next(&it);504 auto result = stage2_DepTokenizer_next(&it);
505 switch (result.ent) {505 switch (result.type_id) {
506 case stage2_DepNextResult::error:506 case stage2_DepNextResult::error:
507 if (verbose) {507 if (verbose) {
508 fprintf(stderr, "%s: failed processing .d file: %s\n", result.textz, buf_ptr(dep_file_path));508 fprintf(stderr, "%s: failed processing .d file: %s\n", result.textz, buf_ptr(dep_file_path));
src/userland.h+2-2
...@@ -126,14 +126,14 @@ struct stage2_DepTokenizer {...@@ -126,14 +126,14 @@ struct stage2_DepTokenizer {
126126
127// ABI warning127// ABI warning
128struct stage2_DepNextResult {128struct stage2_DepNextResult {
129 enum Ent : uint8_t {129 enum TypeId {
130 error,130 error,
131 null,131 null,
132 target,132 target,
133 prereq,133 prereq,
134 };134 };
135135
136 Ent ent;136 TypeId type_id;
137137
138 // when ent == error --> error text138 // when ent == error --> error text
139 // when ent == null --> undefined139 // when ent == null --> undefined