nx_field_type_gate_t280.nx source
↩ module page · 54 lines · 5769 B
1import "nx_ccbuild_lib.nx"
2import "nx_gate_verdict.nx"
3func fg_write(path:*u8,body:*u8)->i64{
4 var n:i64=0;while body[n]!=(0 as u8){n=n+1}
5 let fd:i64=sys_openat_exclusive(path,MODE_0600)
6 if fd<0{
7 if fd!=-17{return -1}
8 var stored_bytes:i64=0;let stored:*u8=sys_read_file(path,&stored_bytes)
9 if (stored as i64)<=0{return -1}
10 var same:i64=1;if stored_bytes!=n{same=0}else{var i:i64=0;while i<n{if stored[i]!=body[i]{same=0;break};i=i+1}}
11 sys_free_file(stored,stored_bytes)
12 if same==1{return 0};return -3
13 }
14 var off:i64=0
15 while off<n{let k:i64=sys_write(fd,((body as i64)+off) as *u8,n-off);if k<=0{sys_close(fd);return -2};off=off+k}
16 return sys_close(fd)
17}
18func fg_case(cc:*u8,src:*u8,body:*u8,positive:i64,ctr:*i64)->i64{
19 let written:i64=fg_write(src,body);gv_check_eq("fresh fixture source retained",written,0,ctr);if written!=0{return 0-1}
20 let log:i64=sys_openat_wr("knowledge/gates/field-compiler-current-t280.log" as *u8,MODE_0600)
21 if log<0{return 0-2}
22 let rc:i64=cb_build(cc,src,"knowledge/gates/field-compiler-current-t280.s" as *u8,"knowledge/gates/field-compiler-current-t280.elf" as *u8,0 as *i64,log,"knowledge/gates/field-compiler-current-t280.tmp" as *u8,"knowledge/gates/field-assembler-current-t280.log" as *u8)
23 sys_close(log)
24 let lens:*i64=sys_mmap_try(8) as *i64;let diagnostic:*u8=sys_read_file("knowledge/gates/field-compiler-current-t280.log" as *u8,lens);if diagnostic!=(0 as *u8){sys_write(1,diagnostic,lens[0]);sys_munmap(diagnostic,lens[0])};sys_munmap_direct(lens as *u8,8)
25 gv_puts("FIELD source=");gv_puts(src);gv_puts(" buildResult=");gv_num(rc);gv_puts("\n")
26 if positive==1{
27 gv_check_eq("typed field program compiles",rc,0,ctr)
28 if rc==0{
29 let st:i64=cb_run_capture("knowledge/gates/field-compiler-current-t280.elf" as *u8,"knowledge/gates/field-runtime-t280.out" as *u8,0 as *i64,0-1)
30 gv_check_eq("typed field exact runtime values",st,0,ctr)
31 }
32 }else{gv_check_eq("invalid field program rejected at compile",rc,1,ctr)}
33 return rc
34}
35func main(argc:i64,argv:*i64)->i64{
36 if argc!=2{return 2};let cc:*u8=argv[1] as *u8;let ctr:*i64=gv_ctr()
37 fg_case(cc,"runtime/field-positive-r3-t280.nx" as *u8,
38 "import \"nx_syscalls.nx\"\nstruct Inner{f:f64,i:i64}\nstruct Outer{inner:*Inner,p:*i64,fp:*f64}\nfunc main(argc:i64,argv:*i64)->i64{let a:*Inner=sys_mmap_try(__size_of(Inner)) as *Inner;let b:*Outer=sys_mmap_try(__size_of(Outer)) as *Outer;let p:*i64=sys_mmap_try(8) as *i64;a.f=1.25;a.i=37;b.inner=a;b.p=p;b.fp=p as *f64;b.fp[0]=0.5;if b.fp[0]!=0.5{return 5};b.inner[0].f=2.0;b.inner.f=b.inner.f+1.75;b.p[0]=51;if a.f!=3.75{return 1};if a.i!=37{return 2};if b.inner!=a{return 3};if b.p[0]!=51{return 4};sys_munmap_direct(p as *u8,8);sys_munmap_direct(b as *u8,__size_of(Outer));sys_munmap_direct(a as *u8,__size_of(Inner));return 0}\n" as *u8,1,ctr)
39 fg_case(cc,"runtime/field-negative-r3-integer-t280.nx" as *u8,
40 "struct S{i:i64}\nfunc f(s:*S)->i64{s.i=1.25;return 0}\nfunc main(argc:i64,argv:*i64)->i64{return 0}\n" as *u8,0,ctr)
41 fg_case(cc,"runtime/field-negative-r3-missing-t280.nx" as *u8,
42 "struct S{i:i64}\nfunc f(s:*S)->i64{s.missing=1;return 0}\nfunc main(argc:i64,argv:*i64)->i64{return 0}\n" as *u8,0,ctr)
43 fg_case(cc,"runtime/field-negative-r3-nonstruct-t280.nx" as *u8,
44 "func f(s:*i64)->i64{s.missing=1;return 0}\nfunc main(argc:i64,argv:*i64)->i64{return 0}\n" as *u8,0,ctr)
45 fg_case(cc,"runtime/field-negative-r3-missing-index-t280.nx" as *u8,
46 "struct S{i:i64}\nfunc f(s:*S)->i64{s.missing[0]=1;return 0}\nfunc main(argc:i64,argv:*i64)->i64{return 0}\n" as *u8,0,ctr)
47 fg_case(cc,"runtime/field-negative-r3-index-missing-t280.nx" as *u8,
48 "struct S{i:i64}\nstruct O{ptr:*S}\nfunc f(s:*O)->i64{s.ptr[0].missing=1;return 0}\nfunc main(argc:i64,argv:*i64)->i64{return 0}\n" as *u8,0,ctr)
49 fg_case(cc,"runtime/field-positive-narrow-t299.nx" as *u8,
50 "import \"nx_syscalls.nx\"\nstruct Narrow{a:u8,b:u8,c:u8,d:u8,x:i32,y:i32,guard:i64}\nstruct Holder{ptr:*Narrow}\nfunc main(argc:i64,argv:*i64)->i64{let s:*Narrow=sys_mmap_try(__size_of(Narrow)) as *Narrow;let h:*Holder=sys_mmap_try(__size_of(Holder)) as *Holder;if (s as i64)<=0{return 90};if (h as i64)<=0{return 91};h.ptr=s;s.guard=123456789;s.y=7654321 as i32;s.x=42 as i32;s.d=251 as u8;s.c=199 as u8;s.b=177 as u8;s.a=160 as u8;if (s.a as i64)!=160{return 1};if (s.b as i64)!=177{return 2};if (s.c as i64)!=199{return 3};if (s.d as i64)!=251{return 4};if (s.x as i64)!=42{return 5};if (s.y as i64)!=7654321{return 6};if s.guard!=123456789{return 7};h.ptr[0].x=(0-1234567) as i32;if (s.x as i64)!=(0-1234567){return 8};if (s.y as i64)!=7654321{return 9};h.ptr.b=255 as u8;if (s.a as i64)!=160{return 10};if (s.b as i64)!=255{return 11};if (s.c as i64)!=199{return 12};if (s.d as i64)!=251{return 13};if s.guard!=123456789{return 14};sys_munmap_direct(h as *u8,__size_of(Holder));sys_munmap_direct(s as *u8,__size_of(Narrow));return 0}\n" as *u8,1,ctr)
51 fg_case(cc,"runtime/field-positive-f32-t300.nx" as *u8,
52 "import \"nx_syscalls.nx\"\nstruct Single{a:f32,b:f32,guard:i64}\nstruct Holder{ptr:*Single}\nfunc main(argc:i64,argv:*i64)->i64{let s:*Single=sys_mmap_try(__size_of(Single)) as *Single;let h:*Holder=sys_mmap_try(__size_of(Holder)) as *Holder;if (s as i64)<=0{return 90};if (h as i64)<=0{return 91};h.ptr=s;s.guard=123456789;s.b=2.5f32;s.a=1.25f32;if s.a!=1.25f32{return 1};if s.b!=2.5f32{return 2};if s.guard!=123456789{return 3};h.ptr[0].a=3.75f32;if s.a!=3.75f32{return 4};if s.b!=2.5f32{return 5};h.ptr.b=0.5f32;if s.a!=3.75f32{return 6};if s.b!=0.5f32{return 7};if s.guard!=123456789{return 8};sys_munmap_direct(h as *u8,__size_of(Holder));sys_munmap_direct(s as *u8,__size_of(Single));return 0}\n" as *u8,1,ctr)
53 return gv_verdict("FIELD-TYPE-T280",ctr,"Isolated compiler; native exact-value checks and rejection controls")
54}