code wiki / (root) / nx_type_layout_gate.nx

nx_type_layout_gate.nx source

↩ module page · 57 lines · 2968 B

1import "nx_gate_verdict.nx" 2import "nx_tokenizer.nx" 3import "nx_parse.nx" 4 5struct LayoutNine { 6 a: i64, b: i64, c: i64, d: i64, e: i64, 7 f: i64, g: i64, h: i64, i: i64, 8} 9 10type LayoutCell = i64 11const LAYOUT_CONST_SIZE: i64 = __size_of(LayoutNine) 12const LAYOUT_CONST_ALIGN: i64 = __align_of(LayoutNine) 13const LAYOUT_CONST_ARRAY: i64 = __size_of([3]LayoutCell) 14const LAYOUT_CONST_COMPOSED: i64 = LAYOUT_CONST_SIZE + 2 * __size_of(*u8) 15 16func layout_source_refused(source: *u8) -> i64 { 17 let pid: i64=sys_fork() 18 if pid<0 { return 0 } 19 if pid==0 { 20 var n: i64=0 21 while source[n]!=0 { n=n+1 } 22 nx_diag_set_source(source,n) 23 let toks: *Tok=lex_source(source,n+2) 24 parse_module(toks,0 as *Module) 25 sys_exit(0) 26 } 27 var status: i64=0 28 var got: i64=sys_wait4(pid,&status,0) 29 while got==-4 { got=sys_wait4(pid,&status,0) } 30 return got==pid && wait_term_signal(status)==0 && wait_exit_code(status)==2 31} 32 33func main(argc: i64, argv: *i64) -> i64 { 34 let c: *i64 = gv_ctr() 35 let p: *i64 = gv_plan_new("byte-size\ninteger-size\npointer-size\narray-size\nstruct-size\nstruct-alignment\nlast-field-in-allocation\nconstant-size\nconstant-alignment\nconstant-array-alias\nconstant-composition\n" as *u8) 36 gv_plan_check(p,"constant-size",LAYOUT_CONST_SIZE==__size_of(LayoutNine),c) 37 gv_plan_check(p,"constant-alignment",LAYOUT_CONST_ALIGN==__align_of(LayoutNine),c) 38 gv_plan_check(p,"constant-array-alias",LAYOUT_CONST_ARRAY==3*__size_of(i64),c) 39 gv_plan_check(p,"constant-composition",LAYOUT_CONST_COMPOSED==__size_of(LayoutNine)+2*__size_of(*u8),c) 40 gv_plan_check(p,"byte-size",__size_of(u8)==1,c) 41 gv_plan_check(p,"integer-size",__size_of(i64)==8,c) 42 gv_plan_check(p,"pointer-size",__size_of(*u8)==__size_of(i64),c) 43 gv_plan_check(p,"array-size",__size_of([3]i64)==3*__size_of(i64),c) 44 gv_plan_check(p,"struct-size",__size_of(LayoutNine)==72,c) 45 gv_plan_check(p,"struct-alignment",__align_of(LayoutNine)==__align_of(i64),c) 46 let a: *LayoutNine = sys_mmap(__size_of(LayoutNine)) as *LayoutNine 47 a.a = 11; a.i = 99 48 gv_plan_check(p,"last-field-in-allocation",a.a==11 && a.i==99,c) 49 sys_munmap(a as *u8,__size_of(LayoutNine)) 50 gv_plan_finish(p,c) 51 let rejects: *i64=gv_plan_new("forward-layout-refused\nmissing-close-refused\nunknown-type-refused\n" as *u8) 52 gv_plan_check(rejects,"forward-layout-refused",layout_source_refused("const N: i64=__size_of(Later)\nstruct Later { x: i64 }\nfunc main() -> i64 { return N }\n"),c) 53 gv_plan_check(rejects,"missing-close-refused",layout_source_refused("const N: i64=__size_of(i64\nfunc main() -> i64 { return N }\n"),c) 54 gv_plan_check(rejects,"unknown-type-refused",layout_source_refused("const N: i64=__size_of(NoSuchType)\nfunc main() -> i64 { return N }\n"),c) 55 gv_plan_finish(rejects,c) 56 return gv_verdict("TYPE-LAYOUT" as *u8,c,"Current native compiler layout, not C/WGSL layout equivalence." as *u8) 57}