code wiki / (root) / nx_abi_lock_test.nx

nx_abi_lock_test.nx source

↩ module page · 65 lines · 2222 B

1// nx_abi_lock_test.nx -- smoke: seal two identical manifests, verify UNCHANGED. 2 3import "nx_syscalls.nx" 4import "nx_tier.nx" 5import "nx_sha256.nx" 6import "nx_abi_lock.nx" 7 8// Helper: build a one-symbol AbiManifest where the symbol is named 9// "foo" with sig_bytes = {0,0,0,1} (4-byte stub canonical signature). 10// Returns pointer to the manifest. 11func _make_manifest() -> *AbiManifest { 12 let am: *AbiManifest = (sys_mmap(NX_SIZEOF_NX_INT * 8)) as *AbiManifest 13 let name: *u8 = (sys_mmap(4)) as *u8 14 name[0] = 102 // f 15 name[1] = 111 // o 16 name[2] = 111 // o 17 let sig: *u8 = (sys_mmap(4)) as *u8 18 sig[0] = 0 19 sig[1] = 0 20 sig[2] = 0 21 sig[3] = 1 22 23 // Single-element symbol "array": just one AbiSymbol pointed-to. 24 // Array-of-struct indexing with `.field` is not yet supported in 25 // the parser (codegen-Gap-3 territory) -- use single-element form. 26 let syms: *AbiSymbol = (sys_mmap(NX_SIZEOF_NX_INT * 8)) as *AbiSymbol 27 syms.name_bytes = name 28 syms.name_len = 3 29 syms.sig_bytes = sig 30 syms.sig_len = 4 31 32 let mod_name: *u8 = (sys_mmap(4)) as *u8 33 mod_name[0] = 109 // m 34 mod_name[1] = 111 // o 35 mod_name[2] = 100 // d 36 37 am.module_name = mod_name 38 am.module_name_len = 3 39 am.symbols = syms 40 am.n_symbols = 1 41 am.signature_hash = (sys_mmap(32)) as *u8 42 nx_abi_lock_seal(am) 43 return am 44} 45 46func main() -> nx_int { 47 let m1: *AbiManifest = _make_manifest() 48 let m2: *AbiManifest = _make_manifest() 49 50 // Two manifests built from identical bytes -> same signature hash. 51 let v: nx_int = nx_abi_lock_compare(m1, m2) 52 if v != NX_ABI_UNCHANGED { return 1 } 53 54 // The upgrade-safety predicate must accept UNCHANGED. 55 if nx_abi_upgrade_is_safe(NX_ABI_UNCHANGED) != 1 { return 2 } 56 if nx_abi_upgrade_is_safe(NX_ABI_ADDITIVE_OK) != 1 { return 3 } 57 if nx_abi_upgrade_is_safe(NX_ABI_BREAKING_REMOVED) != 0 { return 4 } 58 if nx_abi_upgrade_is_safe(NX_ABI_BREAKING_RETYPED) != 0 { return 5 } 59 60 // Sealed-enum validity gate. 61 if nx_abi_verdict_is_valid(NX_ABI_UNCHANGED) != 1 { return 6 } 62 if nx_abi_verdict_is_valid(99) != 0 { return 7 } 63 64 return 0 65}