Skip to content

Instantly share code, notes, and snippets.

@metaleap
Created January 13, 2020 19:28
Show Gist options
  • Save metaleap/244268f50ab5b466809460ada68becaf to your computer and use it in GitHub Desktop.
Save metaleap/244268f50ab5b466809460ada68becaf to your computer and use it in GitHub Desktop.
pub fn FromJson(mem: *std.mem.Allocator, src: []u8) !atem.Prog {
var jsonparser = std.json.Parser.init(mem, true);
defer jsonparser.deinit();
var jsontree = try jsonparser.parse(src);
defer jsontree.deinit();
const rootarr = try as(std.json.Value.Array, std.json.Array, jsontree.root);
// defer rootarr.deinit();
return fromJson(mem, rootarr.toSlice());
}
@metaleap
Copy link
Author

Comment: try as(... calls a comptime fn as (not shown here) that merely type-switches as instructed by its args

@metaleap
Copy link
Author

inline fn as(comptime UnionMemberTag: var, comptime TUnionMember: type, scrutinee: var) !TUnionMember {
    switch (scrutinee) {
        UnionMemberTag => |ok| return ok,
        else => return error.BadJsonSrc,
    }
}

@metaleap
Copy link
Author

If ln #7 uncommented, would segfault:

Segmentation fault at address 0x3
/home/_/a/zig/lib/zig/std/special/c.zig:81:0: 0x3 in std.target.Target.isDarwin (c)
pub fn panic(msg: []const u8, error_return_trace: ?*builtin.StackTrace) noreturn {

/home/_/a/zig/lib/zig/std/array_list.zig:54:32: 0x22efca in std.array_list.AlignedArrayList(std.json.Value,null).deinit (run)
            self.allocator.free(self.items);
                               ^
/home/_/c/z/atem/cmd/src/load.zig:11:25: 0x22df2e in load.FromJson (run)
    defer rootarr.deinit();
                        ^
/home/_/c/z/atem/cmd/src/main.zig:25:35: 0x22966e in main (run)
    const prog = try load.FromJson(&mem.allocator, srcfiletext);
                                  ^
/home/_/a/zig/lib/zig/std/start.zig:259:37: 0x207985 in std.start.posixCallMainAndExit (run)
            const result = root.main() catch |err| {
                                    ^
/home/_/a/zig/lib/zig/std/start.zig:123:5: 0x2077ff in std.start._start (run)
    @call(.{ .modifier = .never_inline }, posixCallMainAndExit, .{});
    ^
Aborted

@metaleap
Copy link
Author

lldb:

Process 7580 stopped
* thread #1, name = 'main', stop reason = signal SIGSEGV: invalid address (fault address: 0x3)
    frame #0: 0x0000000000000003
error: memory read failed for 0x0

@metaleap
Copy link
Author

backtrace:

(lldb) bt
* thread #1, name = 'main', stop reason = signal SIGSEGV: invalid address (fault address: 0x3)
  * frame #0: 0x0000000000000003
    frame #1: 0x0000000000237ef0 main`std.mem.Allocator.free(self=0x00007fffffffde48, memory=<unavailable>) at mem.zig:237:44
    frame #2: 0x000000000022efcb main`std.array_list.AlignedArrayList(self=std.array_list.AlignedArrayList(std.json.Value,null) @ 0x00007fffffffdfa0).deinit at array_list.zig:54:32
    frame #3: 0x000000000022df2f main`load.FromJson(mem=0x00007fffffffe338, src=(ptr = "[ [ [\"[0]std.same\",\"it\"], [1],\n\t\t\"0\" ]\n, [ [\"[1]std.True\",\"__Bool_Of_True\",\"__Bool_Of_False\"], [1,0],\n\t\t\"0\" ]\n, [ [\"[2]std.False\",\"__Bool_Of_True\",\"__Bool_Of_False\"], [0,1],\n\t\t\"1\" ]\n, [ [\"[3]std.ListEnd\",\"__List_Of_ListEnd\",\"__List_Of_ListLink\"], [1,0],\n\t\t\"0\" ]\n, [ [\"[4]std.ListLink\",\"__list0__\",\"__list1__\",\"__List_Of_ListEnd\",\"__List_Of_ListLink\"], [1,1,0,1],\n\t\t[\"3\", \"0\", \"1\"] ]\n, [ [\"[5]std.**\",\"args\"], [2],\n\t\t[[6], [8], [\"0\", [[-1010101], [[4], 102, [[4], 111, [[4], 114, [[4], 103, [[4], 111, [[4], 116, [[4], 32, [[4], 110, [[4], 105, [[4], 108, [[4], 32, [[4], 99, [[4], 104, [[4], 101, [[4], 99, [[4], 107, [[4], 32, [[4], 98, [[4], 101, [[4], 102, [[4], 111, [[4], 114, [[4], 101, [[4], 32, [[4], 62, [[4], 45, [3]]]]]]]]]]]]]]]]]]]]]]]]]]], [0]], [2]], [\"0\", [[-1010101], [[4], 102, [[4], 111, [[4], 114, [[4], 103, [[4], 111, [[4], 116, [[4], 32, [[4], 110, [[4], 105, [[4], 108, [[4], 32, [[4], 99, [[4], 104, [[4], 101, [[4], 99, [[4], 107, [[4], 32, [[4], 98, [[4], 101, [[4], 102, [[4], 111, [[4], 114, [[4"..., len = 1867)) at load.zig:11:25
    frame #4: 0x000000000022966f main`main at main.zig:25:35
    frame #5: 0x0000000000207986 main`std.start.posixCallMainAndExit at start.zig:259:37
    frame #6: 0x000000000020797a main`std.start.posixCallMainAndExit [inlined] std.start.initEventLoopAndCallMain at start.zig:231
    frame #7: 0x000000000020797a main`std.start.posixCallMainAndExit [inlined] std.start.callMainWithArgs(argc=2, argv=0x00007fffffffe578, envp=[][*:0]u8 @ 0x00007fffffffe3e0) at start.zig:194
    frame #8: 0x0000000000207915 main`std.start.posixCallMainAndExit at start.zig:185
    frame #9: 0x0000000000207800 main`std.start._start at start.zig:123:5

@metaleap
Copy link
Author

up 1:

frame #1: 0x0000000000237ef0 main`std.mem.Allocator.free(self=0x00007fffffffde48, memory=<unavailable>) at mem.zig:237:44
   234 	        const bytes_len = bytes.len + @boolToInt(Slice.sentinel != null);
   235 	        if (bytes_len == 0) return;
   236 	        const non_const_ptr = @intToPtr([*]u8, @ptrToInt(bytes.ptr));
-> 237 	        const shrink_result = self.shrinkFn(self, non_const_ptr[0..bytes_len], Slice.alignment, 0, 1);
   238 	        assert(shrink_result.len == 0);
   239 	    }
   240 	};

p *self:

(std.mem.Allocator) $0 = {
  reallocFn = 0x0000000000000008
  shrinkFn = 0x0000000000000003
}

@metaleap
Copy link
Author

(std.array_list.AlignedArrayList(std.json.Value,null)) $1 = {
  items = {
    ptr = 0x00007ffff7fe2828
    len = 20
  }
  len = 12
  allocator = 0x00007fffffffde48
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment