@greenpandastudios/aug-cli 0.20.1 → 0.21.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (295) hide show
  1. package/README.md +1 -1
  2. package/docs/assets/benchmarks/execution.svg +774 -637
  3. package/docs/assets/benchmarks/http.svg +278 -249
  4. package/docs/assets/benchmarks/improvements.svg +66 -66
  5. package/docs/assets/benchmarks/kernels-mobile.svg +1 -0
  6. package/docs/assets/benchmarks/kernels.svg +1 -0
  7. package/docs/assets/benchmarks/memory.svg +153 -153
  8. package/docs/benchmark-results.json +227089 -90363
  9. package/docs/compatibility.md +6 -6
  10. package/docs/contributing-benchmarks.md +36 -6
  11. package/docs/dev-containers.md +8 -15
  12. package/docs/dgx-consumers.json +122 -0
  13. package/docs/dgx-gyms.json +784 -0
  14. package/docs/dgx-kernels.json +1170 -0
  15. package/docs/dgx-performance.json +227849 -0
  16. package/docs/dgx-spark.md +64 -0
  17. package/docs/diagnostics.md +1 -1
  18. package/docs/docker.md +16 -17
  19. package/docs/example-projects.json +32 -0
  20. package/docs/examples/approved-design/dependencies/august/{0.20.1 → 0.21.0}/io/contracts.md +3 -3
  21. package/docs/examples/approved-design/domain/app.md +4 -4
  22. package/docs/examples/approved-design/main.md +2 -2
  23. package/docs/examples/calls-benchmark/index.md +36 -0
  24. package/docs/examples/calls-benchmark/main.md +78 -0
  25. package/docs/examples/calls-benchmark/operations.md +60 -0
  26. package/docs/examples/developer-workflow/calculator.md +5 -5
  27. package/docs/examples/developer-workflow/dependencies/august/{0.20.1 → 0.21.0}/io/contracts.md +3 -3
  28. package/docs/examples/developer-workflow/logging/console.md +2 -2
  29. package/docs/examples/developer-workflow/logging/logger.md +2 -2
  30. package/docs/examples/developer-workflow/main.md +2 -2
  31. package/docs/examples/errors-benchmark/index.md +36 -0
  32. package/docs/examples/errors-benchmark/main.md +92 -0
  33. package/docs/examples/errors-benchmark/operations.md +65 -0
  34. package/docs/examples/float-benchmark/index.md +35 -0
  35. package/docs/examples/float-benchmark/main.md +75 -0
  36. package/docs/examples/generic-di/dependencies/august/{0.20.1 → 0.21.0}/io/contracts.md +3 -3
  37. package/docs/examples/generic-di/main.md +2 -2
  38. package/docs/examples/generic-di/types.md +3 -3
  39. package/docs/examples/hello/app/greeter.md +3 -3
  40. package/docs/examples/hello/dependencies/august/{0.20.1 → 0.21.0}/io/contracts.md +3 -3
  41. package/docs/examples/hello/logging/console.md +2 -2
  42. package/docs/examples/hello/logging/logger.md +2 -2
  43. package/docs/examples/hello/main.md +2 -2
  44. package/docs/examples/index.md +18 -1
  45. package/docs/examples/interceptors/app.md +5 -5
  46. package/docs/examples/interceptors/dependencies/august/{0.20.1 → 0.21.0}/io/contracts.md +3 -3
  47. package/docs/examples/interceptors/interceptors.md +2 -2
  48. package/docs/examples/interceptors/logging.md +3 -3
  49. package/docs/examples/interceptors/main.md +2 -2
  50. package/docs/examples/list-benchmark/index.md +35 -0
  51. package/docs/examples/list-benchmark/main.md +78 -0
  52. package/docs/examples/map-churn-benchmark/index.md +35 -0
  53. package/docs/examples/map-churn-benchmark/main.md +106 -0
  54. package/docs/examples/native-blake3/dependencies/packages/@greenpandastudios/aug-blake3/0.1.3/api.md +104 -0
  55. package/docs/examples/native-blake3/dependencies/packages/@greenpandastudios/aug-blake3/0.1.3/contracts.md +54 -0
  56. package/docs/examples/native-blake3/dependencies/packages/@greenpandastudios/aug-blake3/0.1.3/native.abi-json.md +48 -0
  57. package/docs/examples/native-blake3/hashing.md +93 -0
  58. package/docs/examples/native-blake3/index.md +38 -0
  59. package/docs/examples/native-blake3/main.md +73 -0
  60. package/docs/examples/native-pytorch/dependencies/packages/@greenpandastudios/aug-pytorch/0.1.4/api.md +406 -0
  61. package/docs/examples/native-pytorch/dependencies/packages/@greenpandastudios/aug-pytorch/0.1.4/bindings.md +51 -0
  62. package/docs/examples/native-pytorch/dependencies/packages/@greenpandastudios/aug-pytorch/0.1.4/contracts.md +63 -0
  63. package/docs/examples/native-pytorch/dependencies/packages/@greenpandastudios/aug-pytorch/0.1.4/native.abi-json.md +161 -0
  64. package/docs/examples/native-pytorch/index.md +38 -0
  65. package/docs/examples/native-pytorch/main.md +73 -0
  66. package/docs/examples/native-pytorch/tensors.md +123 -0
  67. package/docs/examples/native-sqlite/database.md +116 -0
  68. package/docs/examples/native-sqlite/dependencies/packages/@greenpandastudios/aug-sqlite/0.1.3/api.md +284 -0
  69. package/docs/examples/native-sqlite/dependencies/packages/@greenpandastudios/aug-sqlite/0.1.3/bindings.md +51 -0
  70. package/docs/examples/native-sqlite/dependencies/packages/@greenpandastudios/aug-sqlite/0.1.3/contracts.md +75 -0
  71. package/docs/examples/native-sqlite/dependencies/packages/@greenpandastudios/aug-sqlite/0.1.3/native.abi-json.md +119 -0
  72. package/docs/examples/native-sqlite/index.md +38 -0
  73. package/docs/examples/native-sqlite/main.md +73 -0
  74. package/docs/examples/native-zlib/compression.md +99 -0
  75. package/docs/examples/native-zlib/dependencies/packages/@greenpandastudios/aug-zlib/0.1.3/api.md +153 -0
  76. package/docs/examples/native-zlib/dependencies/packages/@greenpandastudios/aug-zlib/0.1.3/contracts.md +54 -0
  77. package/docs/examples/native-zlib/dependencies/packages/@greenpandastudios/aug-zlib/0.1.3/native.abi-json.md +76 -0
  78. package/docs/examples/native-zlib/index.md +38 -0
  79. package/docs/examples/native-zlib/main.md +78 -0
  80. package/docs/examples/new-syntax/console.md +2 -2
  81. package/docs/examples/new-syntax/dependencies/august/{0.20.1 → 0.21.0}/io/contracts.md +3 -3
  82. package/docs/examples/new-syntax/greeter.md +3 -3
  83. package/docs/examples/new-syntax/logger.md +2 -2
  84. package/docs/examples/new-syntax/main.md +2 -2
  85. package/docs/examples/ownership-transfer/dependencies/august/{0.20.1 → 0.21.0}/io/contracts.md +3 -3
  86. package/docs/examples/ownership-transfer/main.md +2 -2
  87. package/docs/examples/ownership-transfer/resource.md +2 -2
  88. package/docs/examples/packages-math/aug-package-json.md +1 -1
  89. package/docs/examples/records-benchmark/data.md +55 -0
  90. package/docs/examples/records-benchmark/index.md +36 -0
  91. package/docs/examples/records-benchmark/main.md +85 -0
  92. package/docs/examples/strings-benchmark/index.md +35 -0
  93. package/docs/examples/strings-benchmark/main.md +76 -0
  94. package/docs/examples/tasks-benchmark/index.md +36 -0
  95. package/docs/examples/tasks-benchmark/main.md +89 -0
  96. package/docs/examples/tasks-benchmark/operations.md +58 -0
  97. package/docs/getting-started.md +3 -3
  98. package/docs/grammar.md +2 -2
  99. package/docs/gym-results.json +784 -0
  100. package/docs/implementation-map.md +6 -0
  101. package/docs/index.md +1 -1
  102. package/docs/kernel-results.json +1170 -0
  103. package/docs/language-conformance.md +6 -0
  104. package/docs/language-constructs.md +9 -1
  105. package/docs/learn/index.md +1 -1
  106. package/docs/maintaining-docs.md +1 -1
  107. package/docs/native-implementation.md +276 -0
  108. package/docs/native-interop-llvm-plan.md +342 -0
  109. package/docs/native-package-examples.md +684 -0
  110. package/docs/native-packages.md +179 -0
  111. package/docs/packages.md +2 -2
  112. package/docs/performance.md +50 -29
  113. package/docs/production-readiness.md +11 -1
  114. package/docs/public/downloads/approved-design.zip +0 -0
  115. package/docs/public/downloads/calls-benchmark.zip +0 -0
  116. package/docs/public/downloads/developer-workflow.zip +0 -0
  117. package/docs/public/downloads/errors-benchmark.zip +0 -0
  118. package/docs/public/downloads/float-benchmark.zip +0 -0
  119. package/docs/public/downloads/generic-di.zip +0 -0
  120. package/docs/public/downloads/hello.zip +0 -0
  121. package/docs/public/downloads/interceptors.zip +0 -0
  122. package/docs/public/downloads/json-benchmark.zip +0 -0
  123. package/docs/public/downloads/list-benchmark.zip +0 -0
  124. package/docs/public/downloads/map-churn-benchmark.zip +0 -0
  125. package/docs/public/downloads/native-blake3.zip +0 -0
  126. package/docs/public/downloads/native-pytorch.zip +0 -0
  127. package/docs/public/downloads/native-sqlite.zip +0 -0
  128. package/docs/public/downloads/native-zlib.zip +0 -0
  129. package/docs/public/downloads/new-syntax.zip +0 -0
  130. package/docs/public/downloads/oidc-login.zip +0 -0
  131. package/docs/public/downloads/ownership-transfer.zip +0 -0
  132. package/docs/public/downloads/packages-app.zip +0 -0
  133. package/docs/public/downloads/packages-math.zip +0 -0
  134. package/docs/public/downloads/records-benchmark.zip +0 -0
  135. package/docs/public/downloads/strings-benchmark.zip +0 -0
  136. package/docs/public/downloads/tasks-benchmark.zip +0 -0
  137. package/docs/qualification-results.md +66 -0
  138. package/docs/reference.md +24 -0
  139. package/docs/releasing.md +81 -6
  140. package/docs/research/libtorch-native-qualification.md +115 -0
  141. package/docs/research/native-interop-llvm.md +197 -0
  142. package/docs/research/qualification-methods.md +15 -0
  143. package/docs/roadmap.md +1 -0
  144. package/docs/safety-gyms.md +41 -0
  145. package/docs/tooling.md +16 -15
  146. package/docs/web-library-gaps.md +1 -1
  147. package/docs/web.md +4 -0
  148. package/examples/approved-design/.aug-spec/manifest.json +3 -3
  149. package/examples/approved-design/domain/app.aug.md +4 -4
  150. package/examples/approved-design/main.aug.md +2 -2
  151. package/examples/developer-workflow/.aug-spec/manifest.json +3 -3
  152. package/examples/developer-workflow/calculator.aug.md +5 -5
  153. package/examples/developer-workflow/logging/console.aug.md +2 -2
  154. package/examples/developer-workflow/logging/logger.aug.md +2 -2
  155. package/examples/developer-workflow/main.aug.md +2 -2
  156. package/examples/generic-di/.aug-spec/manifest.json +3 -3
  157. package/examples/generic-di/main.aug.md +2 -2
  158. package/examples/generic-di/types.aug.md +3 -3
  159. package/examples/hello/.aug-spec/manifest.json +3 -3
  160. package/examples/hello/app/greeter.aug.md +3 -3
  161. package/examples/hello/logging/console.aug.md +2 -2
  162. package/examples/hello/logging/logger.aug.md +2 -2
  163. package/examples/hello/main.aug.md +2 -2
  164. package/examples/interceptors/.aug-spec/manifest.json +3 -3
  165. package/examples/interceptors/app.aug.md +5 -5
  166. package/examples/interceptors/interceptors.aug.md +2 -2
  167. package/examples/interceptors/logging.aug.md +3 -3
  168. package/examples/interceptors/main.aug.md +2 -2
  169. package/examples/native-blake3/.aug-spec/manifest.json +16 -0
  170. package/examples/native-blake3/.aug-spec/packages/@greenpandastudios/aug-blake3/0.1.1/native.abi.json +29 -0
  171. package/examples/native-blake3/.aug-spec/packages/@greenpandastudios/aug-blake3/0.1.3/api.aug +14 -0
  172. package/examples/native-blake3/.aug-spec/packages/@greenpandastudios/aug-blake3/0.1.3/api.aug.md +34 -0
  173. package/examples/native-blake3/.aug-spec/packages/@greenpandastudios/aug-blake3/0.1.3/contracts.aug +4 -0
  174. package/examples/native-blake3/.aug-spec/packages/@greenpandastudios/aug-blake3/0.1.3/contracts.aug.md +8 -0
  175. package/examples/native-blake3/.aug-spec/packages/@greenpandastudios/aug-blake3/0.1.3/native.abi.json +29 -0
  176. package/examples/native-blake3/AGENTS.md +5 -0
  177. package/examples/native-blake3/aug.lock.json +253 -0
  178. package/examples/native-blake3/hashing.aug +11 -0
  179. package/examples/native-blake3/hashing.aug.md +25 -0
  180. package/examples/native-blake3/main.aug +8 -0
  181. package/examples/native-blake3/main.aug.md +13 -0
  182. package/examples/native-pytorch/.aug-spec/manifest.json +18 -0
  183. package/examples/native-pytorch/.aug-spec/packages/@greenpandastudios/aug-pytorch/0.1.1/native.abi.json +142 -0
  184. package/examples/native-pytorch/.aug-spec/packages/@greenpandastudios/aug-pytorch/0.1.3/native.abi.json +142 -0
  185. package/examples/native-pytorch/.aug-spec/packages/@greenpandastudios/aug-pytorch/0.1.4/api.aug +101 -0
  186. package/examples/native-pytorch/.aug-spec/packages/@greenpandastudios/aug-pytorch/0.1.4/api.aug.md +160 -0
  187. package/examples/native-pytorch/.aug-spec/packages/@greenpandastudios/aug-pytorch/0.1.4/bindings.aug +3 -0
  188. package/examples/native-pytorch/.aug-spec/packages/@greenpandastudios/aug-pytorch/0.1.4/bindings.aug.md +8 -0
  189. package/examples/native-pytorch/.aug-spec/packages/@greenpandastudios/aug-pytorch/0.1.4/contracts.aug +6 -0
  190. package/examples/native-pytorch/.aug-spec/packages/@greenpandastudios/aug-pytorch/0.1.4/contracts.aug.md +13 -0
  191. package/examples/native-pytorch/.aug-spec/packages/@greenpandastudios/aug-pytorch/0.1.4/native.abi.json +142 -0
  192. package/examples/native-pytorch/AGENTS.md +5 -0
  193. package/examples/native-pytorch/aug.lock.json +309 -0
  194. package/examples/native-pytorch/main.aug +8 -0
  195. package/examples/native-pytorch/main.aug.md +13 -0
  196. package/examples/native-pytorch/tensors.aug +23 -0
  197. package/examples/native-pytorch/tensors.aug.md +35 -0
  198. package/examples/native-sqlite/.aug-spec/manifest.json +18 -0
  199. package/examples/native-sqlite/.aug-spec/packages/@greenpandastudios/aug-sqlite/0.1.2/native.abi.json +100 -0
  200. package/examples/native-sqlite/.aug-spec/packages/@greenpandastudios/aug-sqlite/0.1.3/api.aug +48 -0
  201. package/examples/native-sqlite/.aug-spec/packages/@greenpandastudios/aug-sqlite/0.1.3/api.aug.md +91 -0
  202. package/examples/native-sqlite/.aug-spec/packages/@greenpandastudios/aug-sqlite/0.1.3/bindings.aug +3 -0
  203. package/examples/native-sqlite/.aug-spec/packages/@greenpandastudios/aug-sqlite/0.1.3/bindings.aug.md +8 -0
  204. package/examples/native-sqlite/.aug-spec/packages/@greenpandastudios/aug-sqlite/0.1.3/contracts.aug +8 -0
  205. package/examples/native-sqlite/.aug-spec/packages/@greenpandastudios/aug-sqlite/0.1.3/contracts.aug.md +22 -0
  206. package/examples/native-sqlite/.aug-spec/packages/@greenpandastudios/aug-sqlite/0.1.3/native.abi.json +100 -0
  207. package/examples/native-sqlite/AGENTS.md +5 -0
  208. package/examples/native-sqlite/aug.lock.json +236 -0
  209. package/examples/native-sqlite/database.aug +15 -0
  210. package/examples/native-sqlite/database.aug.md +27 -0
  211. package/examples/native-sqlite/main.aug +8 -0
  212. package/examples/native-sqlite/main.aug.md +13 -0
  213. package/examples/native-zlib/.aug-spec/manifest.json +16 -0
  214. package/examples/native-zlib/.aug-spec/packages/@greenpandastudios/aug-zlib/0.1.1/native.abi.json +57 -0
  215. package/examples/native-zlib/.aug-spec/packages/@greenpandastudios/aug-zlib/0.1.3/api.aug +29 -0
  216. package/examples/native-zlib/.aug-spec/packages/@greenpandastudios/aug-zlib/0.1.3/api.aug.md +54 -0
  217. package/examples/native-zlib/.aug-spec/packages/@greenpandastudios/aug-zlib/0.1.3/contracts.aug +4 -0
  218. package/examples/native-zlib/.aug-spec/packages/@greenpandastudios/aug-zlib/0.1.3/contracts.aug.md +8 -0
  219. package/examples/native-zlib/.aug-spec/packages/@greenpandastudios/aug-zlib/0.1.3/native.abi.json +57 -0
  220. package/examples/native-zlib/AGENTS.md +5 -0
  221. package/examples/native-zlib/aug.lock.json +236 -0
  222. package/examples/native-zlib/compression.aug +15 -0
  223. package/examples/native-zlib/compression.aug.md +27 -0
  224. package/examples/native-zlib/main.aug +10 -0
  225. package/examples/native-zlib/main.aug.md +13 -0
  226. package/examples/new-syntax/.aug-spec/manifest.json +3 -3
  227. package/examples/new-syntax/console.aug.md +2 -2
  228. package/examples/new-syntax/greeter.aug.md +3 -3
  229. package/examples/new-syntax/logger.aug.md +2 -2
  230. package/examples/new-syntax/main.aug.md +2 -2
  231. package/examples/oidc-login/aug.lock.json +6 -6
  232. package/examples/ownership-transfer/.aug-spec/manifest.json +3 -3
  233. package/examples/ownership-transfer/main.aug.md +2 -2
  234. package/examples/ownership-transfer/resource.aug.md +2 -2
  235. package/examples/packages/math/aug-package.json +1 -1
  236. package/native/compiler-packs.json +43 -0
  237. package/package.json +3 -2
  238. package/runtime/aug_http.c +48 -21
  239. package/runtime/aug_http_ir.c +30 -0
  240. package/runtime/aug_http_ir.h +18 -0
  241. package/runtime/aug_ir.c +209 -0
  242. package/runtime/aug_ir.h +89 -0
  243. package/runtime/aug_json.c +6 -1
  244. package/runtime/aug_runtime.c +82 -16
  245. package/runtime/aug_runtime.h +16 -2
  246. package/runtime/aug_tasks.c +38 -7
  247. package/runtime/aug_values.c +12 -6
  248. package/scripts/bootstrap-native.mjs +4 -1
  249. package/src/ast.js +1 -1
  250. package/src/checker.js +110 -28
  251. package/src/cli.js +92 -14
  252. package/src/codegen.js +31 -6
  253. package/src/compiler-packs.js +66 -0
  254. package/src/config.js +2 -2
  255. package/src/editor.js +15 -6
  256. package/src/formatter.js +4 -2
  257. package/src/git-http.js +137 -0
  258. package/src/git-packages.js +9 -1
  259. package/src/help.js +10 -2
  260. package/src/ir-types.js +5 -0
  261. package/src/ir-verify.js +277 -0
  262. package/src/ir.js +962 -0
  263. package/src/llvm-debug.js +101 -0
  264. package/src/llvm-native.js +152 -0
  265. package/src/llvm-platform.js +20 -0
  266. package/src/llvm.js +781 -0
  267. package/src/native-artifacts.js +207 -0
  268. package/src/native-bindings.js +189 -0
  269. package/src/native-contracts.js +295 -0
  270. package/src/native-declarations.js +68 -0
  271. package/src/native-facts.js +63 -0
  272. package/src/package-locking.js +43 -0
  273. package/src/package-manager.js +23 -8
  274. package/src/parser.js +20 -2
  275. package/src/project.js +2 -2
  276. package/src/runtime-abi.js +23 -0
  277. package/src/runtime-adapters.js +18 -0
  278. package/src/schemas.js +24 -17
  279. package/src/semantic.js +8 -3
  280. package/src/snippets.js +1 -0
  281. package/src/spec.js +49 -8
  282. /package/examples/approved-design/.aug-spec/august/{0.20.1 → 0.21.0}/io/contracts.aug +0 -0
  283. /package/examples/approved-design/.aug-spec/august/{0.20.1 → 0.21.0}/io/contracts.aug.md +0 -0
  284. /package/examples/developer-workflow/.aug-spec/august/{0.20.1 → 0.21.0}/io/contracts.aug +0 -0
  285. /package/examples/developer-workflow/.aug-spec/august/{0.20.1 → 0.21.0}/io/contracts.aug.md +0 -0
  286. /package/examples/generic-di/.aug-spec/august/{0.20.1 → 0.21.0}/io/contracts.aug +0 -0
  287. /package/examples/generic-di/.aug-spec/august/{0.20.1 → 0.21.0}/io/contracts.aug.md +0 -0
  288. /package/examples/hello/.aug-spec/august/{0.20.1 → 0.21.0}/io/contracts.aug +0 -0
  289. /package/examples/hello/.aug-spec/august/{0.20.1 → 0.21.0}/io/contracts.aug.md +0 -0
  290. /package/examples/interceptors/.aug-spec/august/{0.20.1 → 0.21.0}/io/contracts.aug +0 -0
  291. /package/examples/interceptors/.aug-spec/august/{0.20.1 → 0.21.0}/io/contracts.aug.md +0 -0
  292. /package/examples/new-syntax/.aug-spec/august/{0.20.1 → 0.21.0}/io/contracts.aug +0 -0
  293. /package/examples/new-syntax/.aug-spec/august/{0.20.1 → 0.21.0}/io/contracts.aug.md +0 -0
  294. /package/examples/ownership-transfer/.aug-spec/august/{0.20.1 → 0.21.0}/io/contracts.aug +0 -0
  295. /package/examples/ownership-transfer/.aug-spec/august/{0.20.1 → 0.21.0}/io/contracts.aug.md +0 -0
@@ -0,0 +1,277 @@
1
+ import { isIRScalar } from "./ir-types.js";
2
+ import { runtimeOperations, httpOperations, schemaKinds, runtimeArities } from "./runtime-abi.js";
3
+ import { runtimeAdapters, adapterSymbol } from "./runtime-adapters.js";
4
+ export class IRVerificationError extends Error {
5
+ code = 'IR_INVALID';
6
+ span;
7
+ constructor(span, message) { super(message); this.span = span; }
8
+ }
9
+ const identifier = /^[A-Za-z_][A-Za-z0-9_]*$/;
10
+ const successors = (t) => t.op === 'return' ? [] : t.op === 'jump' ? [t.target] : t.op === 'error' ? [t.failed, t.success] : [t.then, t.otherwise];
11
+ /** Check compiler data before emitting any native code. All slots are initialized
12
+ * null root cells, including cells used only on failure/cleanup paths. This is a
13
+ * structural and ABI verifier; source typing/loan analysis remains the frontend. */
14
+ export function verifyIR(ir) {
15
+ const span = ir.functions[0]?.span ?? { file: 'main.aug', line: 1, column: 1, start: 0, end: 0 };
16
+ const fail = (message, at = span) => { throw new IRVerificationError(at, message); };
17
+ if (ir.format !== 1 || !/^[0-9a-f]{64}$/.test(ir.sourceRevision))
18
+ fail('Invalid IR format or source revision');
19
+ const functions = new Map();
20
+ for (const fn of ir.functions) {
21
+ if (!identifier.test(fn.name) || functions.has(fn.name))
22
+ fail('Duplicate or invalid function ' + fn.name, fn.span);
23
+ functions.set(fn.name, fn);
24
+ }
25
+ const entry = (name, count, receiver, at) => {
26
+ const fn = functions.get(name);
27
+ if (!fn)
28
+ fail('Unresolved IR function ' + name, at);
29
+ if (fn.parameters.length !== count || (fn.receiver !== undefined) !== receiver)
30
+ fail('Call signature differs for ' + name, at);
31
+ };
32
+ entry(ir.main, 0, false, span);
33
+ if (ir.bindings.length !== ir.scoped.length)
34
+ fail('Binding scope table has a different length');
35
+ ir.bindings.forEach(binding => entry(binding.function, 0, false, span));
36
+ const schemas = new Map(ir.schemas.map(schema => [schema.name, schema]));
37
+ if (schemas.size !== ir.schemas.length)
38
+ fail('Duplicate data schema');
39
+ for (const schema of ir.schemas) {
40
+ if (!identifier.test(schema.name) || !schemaKinds.includes(schema.kind))
41
+ fail('Invalid data schema ' + schema.name);
42
+ for (const field of schema.fields)
43
+ if (!schemas.has(field))
44
+ fail('Unresolved schema ' + field);
45
+ if (schema.kind === 'RECORD') {
46
+ if (schema.fields.length !== schema.labels.length || !schema.maker)
47
+ fail('Invalid record schema ' + schema.name);
48
+ entry(schema.maker, schema.fields.length, false, span);
49
+ }
50
+ else if (schema.maker || schema.labels.length)
51
+ fail('A nonrecord schema has a constructor or labels');
52
+ }
53
+ const routes = new Set();
54
+ for (const table of ir.routes) {
55
+ if (!identifier.test(table.name) || routes.has(table.name))
56
+ fail('Duplicate or invalid route table');
57
+ routes.add(table.name);
58
+ for (const route of table.items) {
59
+ const fn = functions.get(route.function);
60
+ if (!fn || fn.receiver !== undefined || fn.parameters.length > 1)
61
+ fail('Invalid route callback ' + route.function);
62
+ }
63
+ }
64
+ const components = new Set(ir.components);
65
+ for (const component of components)
66
+ if (!['crypto', 'http'].includes(component))
67
+ fail('Unsupported runtime component ' + component);
68
+ if (routes.size && !components.has('http'))
69
+ fail('HTTP routes require their runtime component');
70
+ for (const fn of ir.functions) {
71
+ const at = fn.span, slot = (value) => { if (!Number.isSafeInteger(value) || value < 0 || value >= fn.slots)
72
+ fail('Slot outside the registered root frame: ' + value, at); };
73
+ if (!Number.isSafeInteger(fn.slots) || fn.slots < 1 || fn.values.length !== fn.slots || fn.values.some(value => !value.type.id || !value.type.name || value.storage !== 'rooted-value' && (value.storage !== 'scalar-value' || !isIRScalar(value.type))))
74
+ fail('Invalid typed root frame', at);
75
+ for (const value of [...fn.parameters, ...fn.owned, ...fn.constructorResults, ...fn.variables.map(variable => variable.slot)])
76
+ slot(value);
77
+ if (fn.receiver !== undefined)
78
+ slot(fn.receiver);
79
+ if (new Set(fn.parameters).size !== fn.parameters.length || fn.parameters.includes(0) || fn.receiver === 0 || fn.receiver !== undefined && fn.parameters.includes(fn.receiver))
80
+ fail('Overlapping result/parameter/receiver cells', at);
81
+ if (fn.owned.includes(0) || new Set(fn.owned).size !== fn.owned.length)
82
+ fail('Invalid owned cleanup cells', at);
83
+ const scopes = new Set();
84
+ for (const scope of fn.scopes) {
85
+ if (!identifier.test(scope.name) || scopes.has(scope.name) || scope.parent !== undefined && !scopes.has(scope.parent))
86
+ fail('Invalid lexical scope tree', at);
87
+ scopes.add(scope.name);
88
+ }
89
+ for (const variable of fn.variables)
90
+ if (variable.scope !== undefined && !scopes.has(variable.scope))
91
+ fail('Variable has an unresolved lexical scope', variable.span);
92
+ const blocks = new Set(fn.blocks.map(block => block.name));
93
+ if (blocks.size !== fn.blocks.length || !blocks.has('entry_body') || !blocks.has('cleanup'))
94
+ fail('Missing or duplicated entry/cleanup blocks', at);
95
+ for (const block of fn.blocks) {
96
+ if (!identifier.test(block.name) || !block.terminator)
97
+ fail('Invalid basic block', at);
98
+ if (block.terminator.op === 'return' && block.name !== 'cleanup' || block.name === 'cleanup' && block.terminator.op !== 'return')
99
+ fail('Return bypasses function cleanup', at);
100
+ for (const target of successors(block.terminator))
101
+ if (!blocks.has(target))
102
+ fail('Branch to missing block ' + target, at);
103
+ const t = block.terminator;
104
+ if (t.op === 'branch')
105
+ slot(t.condition);
106
+ if (t.op === 'null')
107
+ slot(t.input);
108
+ for (const instruction of block.instructions) {
109
+ if (instruction.debugScope !== undefined && !scopes.has(instruction.debugScope))
110
+ fail('Instruction has an unresolved lexical scope', instruction.span);
111
+ if ('out' in instruction && instruction.out !== undefined)
112
+ slot(instruction.out);
113
+ if ('input' in instruction)
114
+ slot(instruction.input);
115
+ if ('slot' in instruction)
116
+ slot(instruction.slot);
117
+ if ('args' in instruction)
118
+ instruction.args.forEach(slot);
119
+ if ('receiver' in instruction && instruction.receiver !== undefined)
120
+ slot(instruction.receiver);
121
+ verifyInstruction(instruction, ir, fn, entry, schemas, routes, components, slot, fail);
122
+ }
123
+ }
124
+ }
125
+ }
126
+ function verifyInstruction(i, ir, fn, entry, schemas, routes, components, slot, fail) {
127
+ const error = (message) => fail(message, i.span);
128
+ switch (i.op) {
129
+ case 'call':
130
+ entry(i.function, i.args.length, i.receiver !== undefined, i.span);
131
+ return;
132
+ case 'method':
133
+ if (!identifier.test(i.name))
134
+ error('Invalid method identity');
135
+ return;
136
+ case 'start':
137
+ entry(i.function, i.args.length, i.receiver !== undefined, i.span);
138
+ if (i.owned.length !== i.args.length)
139
+ error('Task capture ownership mask has a different length');
140
+ return;
141
+ case 'runtime': {
142
+ if (!runtimeOperations.includes(i.operation) && !httpOperations.includes(i.operation))
143
+ error('Unknown runtime operation ' + i.operation);
144
+ const arity = runtimeArities[i.operation];
145
+ if (arity !== 'variadic' && i.args.length !== arity)
146
+ error('Runtime argument count differs for ' + i.operation);
147
+ if (i.operation === 'BINARY' && !['+', '-', '*', '/', '==', '!=', '<', '>', '<=', '>='].includes(i.text ?? ''))
148
+ error('Invalid binary operator');
149
+ if (i.operation === 'UNARY' && !['!', '-'].includes(i.text ?? ''))
150
+ error('Invalid unary operator');
151
+ if (i.operation === 'IS_TYPE' && (typeof i.text !== 'string' || !i.text || i.text.includes('\0')))
152
+ error('Missing nominal type identity');
153
+ if (i.operation === 'HTTP_ACTION') {
154
+ try {
155
+ const action = JSON.parse(i.text);
156
+ if (!action || typeof action !== 'object')
157
+ throw new Error();
158
+ }
159
+ catch {
160
+ error('Missing action metadata');
161
+ }
162
+ }
163
+ if (i.operation.startsWith('HTTP_') && !components.has('http'))
164
+ error('HTTP operation has no runtime component');
165
+ if (['FIELD', 'SET_FIELD'].includes(i.operation) && (!Number.isSafeInteger(i.number) || i.number < 0))
166
+ error('Invalid field offset');
167
+ return;
168
+ }
169
+ case 'adapter': {
170
+ const adapter = runtimeAdapters.find(adapter => adapterSymbol(adapter) === i.name);
171
+ if (!adapter || !components.has(adapter.component) || adapter.parameters.length !== i.args.length)
172
+ error('Unsupported runtime adapter signature ' + i.name);
173
+ return;
174
+ }
175
+ case 'native':
176
+ if (i.args.length !== i.binding.params.length || i.binding.callingConvention !== 'C' || i.binding.thread !== 'caller' || i.binding.retainsInputs)
177
+ error('Unsupported native call contract');
178
+ for (const view of [...i.binding.params, i.binding.result])
179
+ if (view.kind === 'resource' && (!view.resource || !i.resources[view.resource]))
180
+ error('Unresolved native resource identity');
181
+ if (i.binding.error) {
182
+ if (!i.error || !i.errorFactory)
183
+ error('Missing resolved native error factory');
184
+ entry(i.errorFactory, 2, false, i.span);
185
+ }
186
+ return;
187
+ case 'extern':
188
+ if (i.types.length !== i.args.length || !identifier.test(i.name) || i.types.some(type => !['int', 'c_int', 'float', 'bool', 'string'].includes(type)) || !['void', 'int', 'c_int', 'float', 'bool'].includes(i.result))
189
+ error('Unsupported direct C signature');
190
+ return;
191
+ case 'object':
192
+ if (i.fields.length !== i.owned.length)
193
+ error('Object ownership mask has a different length');
194
+ i.methods.forEach(method => { const target = ir.functions.find(fn => fn.name === method.function); if (!target || target.receiver === undefined)
195
+ error('Invalid object method callback'); });
196
+ return;
197
+ case 'decode':
198
+ slot(i.input);
199
+ if (!schemas.has(i.schema))
200
+ error('Unresolved decoding schema');
201
+ if (i.format === 'form' && !components.has('http'))
202
+ error('Form decoding has no HTTP component');
203
+ return;
204
+ case 'http-bind':
205
+ slot(i.request);
206
+ if (i.schema && !schemas.has(i.schema))
207
+ error('Unresolved wire schema');
208
+ if (!components.has('http'))
209
+ error('Wire decoding has no HTTP component');
210
+ return;
211
+ case 'html':
212
+ i.attributes.forEach(slot);
213
+ i.children.forEach(slot);
214
+ if (i.attributes.length % 2 || !components.has('http'))
215
+ error('Invalid HTML attribute/component contract');
216
+ return;
217
+ case 'http-policy':
218
+ if (i.args.length !== 3 || !Number.isInteger(i.policy.kind) || i.policy.kind < 1 || i.policy.kind > 7 || !components.has('http'))
219
+ error('Invalid HTTP policy contract');
220
+ return;
221
+ case 'http-failure':
222
+ if (!components.has('http'))
223
+ error('HTTP failure has no runtime component');
224
+ return;
225
+ case 'routes':
226
+ if (!routes.has(i.name) || !components.has('http') || (i.port === undefined) === (i.out === undefined))
227
+ error('Invalid route invocation');
228
+ if (i.port !== undefined)
229
+ slot(i.port);
230
+ return;
231
+ case 'binding-get':
232
+ case 'binding-set':
233
+ if (!Number.isSafeInteger(i.index) || i.index < 0 || i.index >= ir.bindings.length)
234
+ error('Binding outside the global root table');
235
+ return;
236
+ case 'error-state':
237
+ slot(i.error);
238
+ slot(i.cancelled);
239
+ if (i.error === i.cancelled)
240
+ error('Overlapping error/cancellation cells');
241
+ return;
242
+ case 'scope':
243
+ case 'lock':
244
+ if (i.depth !== undefined)
245
+ slot(i.depth);
246
+ return;
247
+ case 'wait':
248
+ i.tasks.forEach(slot);
249
+ if (!i.tasks.length)
250
+ error('Empty task wait');
251
+ return;
252
+ case 'assert':
253
+ slot(i.input);
254
+ return;
255
+ case 'cover':
256
+ if (!ir.coverage.some(point => point.file === i.file && point.line === i.line))
257
+ error('Unregistered statement coverage point');
258
+ return;
259
+ case 'debug-variable':
260
+ if (!Number.isSafeInteger(i.variable) || i.variable < 0 || i.variable >= fn.variables.length)
261
+ error('Unresolved debug variable');
262
+ return;
263
+ case 'literal':
264
+ case 'copy':
265
+ case 'clear':
266
+ case 'checkpoint':
267
+ case 'throw':
268
+ case 'take-error':
269
+ case 'drop':
270
+ case 'scope-depth':
271
+ case 'lock-depth': return;
272
+ default: {
273
+ const unreachable = i;
274
+ error('Unsupported IR instruction ' + JSON.stringify(unreachable));
275
+ }
276
+ }
277
+ }