@shd101wyy/yo 0.1.7 → 0.1.8
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.
- package/LICENSE.md +2 -2
- package/README.md +7 -7
- package/out/cjs/index.cjs +1 -1
- package/out/cjs/yo-cli.cjs +31 -31
- package/out/esm/index.mjs +25 -25
- package/out/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
package/LICENSE.md
CHANGED
|
@@ -2,11 +2,11 @@ University of Illinois/NCSA
|
|
|
2
2
|
Open Source License
|
|
3
3
|
|
|
4
4
|
```
|
|
5
|
-
Copyright (c) 2023 ~
|
|
5
|
+
Copyright (c) 2023 ~ 2026 Yiyi Wang
|
|
6
6
|
All rights reserved.
|
|
7
7
|
|
|
8
8
|
Developed by: Yiyi Wang
|
|
9
|
-
https://github.com/
|
|
9
|
+
https://github.com/shd101wyy/Yo
|
|
10
10
|
```
|
|
11
11
|
|
|
12
12
|
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal with the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
package/README.md
CHANGED
|
@@ -256,13 +256,13 @@ export main;
|
|
|
256
256
|
|
|
257
257
|
### Example Projects
|
|
258
258
|
|
|
259
|
-
| Project
|
|
260
|
-
|
|
|
261
|
-
| [raylib_yo](https://github.com/shd101wyy/raylib_yo)
|
|
262
|
-
| [tetris_yo](https://github.com/shd101wyy/tetris_yo) \| [Online Demo](http://shd101wyy.github.io/tetris_yo)
|
|
263
|
-
| [http_server_demo_yo](https://github.com/shd101wyy/http_server_demo_yo)
|
|
264
|
-
| [markdown_it_yo](https://github.com/shd101wyy/markdown_it_yo)
|
|
265
|
-
| [markdown_yo](https://github.com/shd101wyy/markdown_yo)
|
|
259
|
+
| Project | Description |
|
|
260
|
+
| ------------------------------------------------------------------------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
261
|
+
| [raylib_yo](https://github.com/shd101wyy/raylib_yo) | Comprehensive [raylib](https://www.raylib.com/) bindings — 35 struct types, 535 functions, 227 constants |
|
|
262
|
+
| [tetris_yo](https://github.com/shd101wyy/tetris_yo) \| [Online Demo](http://shd101wyy.github.io/tetris_yo) | Classic Tetris game built with raylib_yo, demonstrating Yo's build system and C interop |
|
|
263
|
+
| [http_server_demo_yo](https://github.com/shd101wyy/http_server_demo_yo) | Simple HTTP/1.1 server — async I/O, algebraic effects, TCP networking, request parsing & routing |
|
|
264
|
+
| [markdown_it_yo](https://github.com/shd101wyy/markdown_it_yo) | Direct port of the popular JavaScript markdown parser [markdown-it](https://github.com/markdown-it/markdown-it) to Yo, showcasing string processing and performance |
|
|
265
|
+
| [markdown_yo](https://github.com/shd101wyy/markdown_yo) \| [Online Demo](https://shd101wyy.github.io/markdown_yo/) | High-performance markdown-to-HTML converter — 5-7× faster than markdown-it (native), 2-6× faster (WASM at ≥1 MB). [Try it in the browser](https://shd101wyy.github.io/markdown_yo/) |
|
|
266
266
|
|
|
267
267
|
## Contributing
|
|
268
268
|
|
package/out/cjs/index.cjs
CHANGED
|
@@ -192,7 +192,7 @@ registered type IDs: ${Object.keys(t.types).filter(f=>f.startsWith("sometype")).
|
|
|
192
192
|
`;if(c.isNewtype&&c.fields.length===1&&e.fields.length===1){let p=Gn(e.fields[0],t);return`((${f})(${p}))`}if(c.isReferenceSemantics){let p=e.fields.map(h=>Gn(h,t));return`${`__yo_new_${f}`}(${p.join(", ")})`}else{let p=e.fields.map((m,h)=>{let y=m,g=lt(c)?`_${h}`:Ce(c.fields[h].label),v=Gn(y,t);return`.${g} = ${v}`});return`(${f}){ ${p.join(", ")} }`}}}else if(vr(e)){let c=e.type,f=H(c,t),p=e.elements.map(m=>Gn(m,t));return`(${f}){ .data = { ${p.join(", ")} } }`}else if(be(e)){let c=(l=t.functions[e.funcId])==null?void 0:l.cName;return c||`// Error: No C function name found for function value with ID ${e.funcId}
|
|
193
193
|
`}else if(Y(e)){let c=e.value;if(c)return t.types[c.id]?t.types[c.id].cName:`/* Error: No C type name found for type ${M(c)} */`}else if(ko(e)){let c=e.targetValue[0];if(c){let f=((u=n==null?void 0:n.$)==null?void 0:u.convertedRuntimeType)||((_=n==null?void 0:n.$)==null?void 0:_.type);if(f&&Ze(f)){let p=f.childType,m=Gn(c,t,{$:{type:p,convertedRuntimeType:p}});if(m&&!m.startsWith("/*")&&!m.startsWith("//"))return`(&${m})`}}return`/* Error: Cannot generate pointer value ${dt(e)} */`}}return`/* skip generating: ${dt(e)} */`}function Zo(e,t,n){if(e===t)return!0;if(e.tag==="FnCall"){if(n&&n(e))return!1;if(Zo(e.func,t,n))return!0;for(let r of e.args)if(Zo(r,t,n))return!0}return!1}function oh(e,t,n){for(let r=0;r<t.length;r++)if(Zo(e,t[r].expr,n))return r;return-1}function xc(e,t,n){let r=[],i=n==null?void 0:n.shouldSkipBody;if(e.tag!=="FnCall"||!E(e,"begin"))return t.length===0?[{stateNumber:0,expressions:[e],suspensionPoint:null}]:[{stateNumber:0,expressions:[e],suspensionPoint:t[0]??null}];let o=e.args,a=[],s=[];for(let l of o){let u=oh(l,t,i),_=(n==null?void 0:n.handleReturnStatements)&&(rn(l,"return")||E(l,"return"));if(u!==-1){if(s.push(l),a.push(s),s=[],n!=null&&n.handleSequentialSuspensions)for(let c=u+1;c<t.length&&Zo(l,t[c].expr,i);c++)a.push([])}else if(_){s.push(l),a.push(s),s=[];break}else s.push(l)}s.length>0&&a.push(s);for(let l=0;l<a.length;l++){let u=a[l],_=l<t.length?t[l]:null;r.push({stateNumber:l,expressions:u,suspensionPoint:_})}return r}function pu(e,t){let r=xc(e,t,{shouldSkipBody:An,handleReturnStatements:!0,handleSequentialSuspensions:!0}).map(i=>({stateNumber:i.stateNumber,expressions:i.expressions,awaitPoint:i.suspensionPoint}));return r.length>0&&r[r.length-1].awaitPoint!==null&&r.push({stateNumber:r.length,expressions:[],awaitPoint:null}),r}function ah(e,t){return Zo(e,t,An)}function Dc(e,t,n,r=!1){let i=n.emitter;for(let o=0;o<e.expressions.length;o++){let a=e.expressions[o],s=o===e.expressions.length-1,l=e.awaitPoint&&ah(a,e.awaitPoint.expr),u=e.awaitPoint&&a.tag==="FnCall"&&(E(a,R.while)||E(a,R.cond)||E(a,R.match))&&er(a);if((l||u)&&e.awaitPoint)na(a,e.awaitPoint,e.stateNumber,t,n);else if(s&&r){let _=G(a,t,n);_&&(i.emitLine(`${t}// Store final expression result`),i.emitLine(`${t}sm->result = ${_};`))}else{let _=G(a,t,n);!_||!a.$||Wt(a.$.env.modulePath,_)||i.emitLine(`${t}${_};`)}}}function na(e,t,n,r,i){var a,s;let o=i.emitter;if(e.tag==="FnCall"&&ar(e)){let l=e.args[0];if(!l){o.emitLine(`${r}// Error: await without argument`);return}if(t.futureVariableId===void 0){let u=G(l,r,i);o.emitLine(`${r}// Store pattern-matched Future for await ${t.index}`),o.emitLine(`${r}sm->await_future_${t.index} = ${u};`)}else o.emitLine(`${r}// Prepare for await (future already stored in state machine variable)`);return}if(e.tag==="FnCall"&&E(e,":=")){let l=e.args[0],u=e.args[1];if(!l||!u){o.emitLine(`${r}// Error: Invalid assignment expression`);return}if(u.tag==="FnCall"&&ar(u)){let _=u.args[0];if(!_){o.emitLine(`${r}// Error: await without argument`);return}let c=(a=l.token)==null?void 0:a.value;if(!c||!l.$){o.emitLine(`${r}// Error: Invalid variable name`);return}if(t.futureVariableId===void 0){let f=G(_,r,i);o.emitLine(`${r}// Store Future for await (variable: ${c})`),o.emitLine(`${r}sm->await_future_${t.index} = ${f};`)}else o.emitLine(`${r}// Store Future for await (variable: ${c}) - future already in state machine`);return}if(u.tag==="FnCall"&&E(u,R.cond)){let _;if(l.tag==="Atom"&&l.token.type==="identifier"&&l.$){let c=l.token.value,f=ce(l.$.env,c);f.length>0&&(_=f[f.length-1].id)}Wa(u,t,r,i,_);return}if(u.tag==="FnCall"&&E(u,R.match)){let _;if(l.tag==="Atom"&&l.token.type==="identifier"&&l.$){let c=l.token.value,f=ce(l.$.env,c);f.length>0&&(_=f[f.length-1].id)}Ya(u,t,r,i,_);return}}if(e.tag==="FnCall"&&E(e,"=")){let l=e.args[0],u=e.args[1];if(l&&u){if(u.tag==="FnCall"&&E(u,R.cond)){let _=G(l,r,i);Wa(u,t,r,i,void 0,_||void 0);return}if(u.tag==="FnCall"&&E(u,R.match)){let _=G(l,r,i);Ya(u,t,r,i,void 0,_||void 0);return}}}if(e.tag==="FnCall"&&E(e,R.cond)){Wa(e,t,r,i);return}if(e.tag==="FnCall"&&E(e,R.match)){Ya(e,t,r,i);return}if(e.tag==="FnCall"&&E(e,R.while)){du(e,t,r,i);return}o.emitLine(`${r}// ERROR: Unsupported pattern for await expression`),o.emitLine(`${r}// Expression type: ${e.tag}, function: ${e.tag==="FnCall"?e.func.tag==="Atom"?(s=e.func.token)==null?void 0:s.value:e.func.tag:"N/A"}`)}function Wa(e,t,n,r,i,o){var y,g,v,T,$,b,C,k,F,S,V,N,x,I,D,z;let a=r.emitter;if(e.tag!=="FnCall"||!E(e,R.cond)){a.emitLine(`${n}// Error: Expected cond expression`);return}let s=e.args;if(s.length===0){a.emitLine(`${n}// Error: cond must have at least one branch`);return}let l=[],u=-1;for(let O=0;O<s.length;O++){let J=s[O];if(J.tag==="FnCall"&&E(J,"=>")){let B=J.args[0];if(B&&!(Et((y=B.$)==null?void 0:y.value)&&B.$.value.value===!1)){u=O;break}}}let _=!1;if(u>=0){let O=s[u];if(O.tag==="FnCall"&&E(O,"=>")){let J=O.args[0];J&&Et((g=J.$)==null?void 0:g.value)&&J.$.value.value===!0&&(_=!0)}}if(_&&u>=0){let O=s[u],J=A(O)?O.args[1]:void 0;if(J)if(zi(J)){let X=ta(J,t,n,r),_e=(v=r.asyncWhileLoopInfo)==null?void 0:v.get(t.index);if(_e&&X.length>0){let me=(T=r.asyncCondBranchInfo)==null?void 0:T.get(t.index),Q=(me==null?void 0:me.branches.some(re=>re.hasAwait&&re.remainingExprs&&re.remainingExprs.length>0))??!1;_e.condBranchPostWhileExprs={branchIndex:u,condBranchFieldIndex:t.index,exprs:X,deferredDropExpressions:($=J.$)==null?void 0:$.deferredDropExpressions,skipCondBranchCheck:Q},l.push({index:u,value:J,hasAwait:!0,remainingExprs:[],deferredDropExpressions:(b=J.$)==null?void 0:b.deferredDropExpressions})}else l.push({index:u,value:J,hasAwait:!0,remainingExprs:X,deferredDropExpressions:(C=J.$)==null?void 0:C.deferredDropExpressions})}else{if(Jo(e,J,r,i,o))ea(J,n,r);else if(A(J)&&E(J,R.begin)){let X=J.args;for(let _e=0;_e<X.length;_e++){let me=X[_e],Q=G(me,n,r);if(Q==="break"&&t.isInsideWhile)a.emitLine(`${n}sm->while_loop_${t.index}_active = false;`),a.emitLine(`${n}goto while_loop_${t.index}_end;`);else{let re=Q==="break"||Q==="continue"||(Q==null?void 0:Q.includes("return"));Q&&(re||me.$&&!Wt(me.$.env.modulePath,Q))&&a.emitLine(`${n}${Q};`)}}if((k=J.$)!=null&&k.deferredDropExpressions)for(let _e of J.$.deferredDropExpressions){let me=G(_e,n,r);me&&a.emitLine(`${n}${me};`)}}else{let X=G(J,n,r);if(X==="break"&&t.isInsideWhile)a.emitLine(`${n}sm->while_loop_${t.index}_active = false;`),a.emitLine(`${n}goto while_loop_${t.index}_end;`);else{let _e=X==="break"||X==="continue"||(X==null?void 0:X.includes("return"));X&&(_e||J.$&&!Wt(J.$.env.modulePath,X))&&a.emitLine(`${n}${X};`)}}l.push({index:u,value:J,hasAwait:!1})}r.asyncCondBranchInfo||(r.asyncCondBranchInfo=new Map);let B=r.asyncCondBranchInfo.get(t.index);((B==null?void 0:B.branches.some(q=>q.hasAwait&&q.remainingExprs&&q.remainingExprs.length>0))??!1)||r.asyncCondBranchInfo.set(t.index,{branches:l,targetVariableId:i,targetAssignmentCode:o});return}let c=!1,f=0,p=n;for(let O=0;O<s.length;O++){let J=s[O];if(J.tag!=="FnCall"||!E(J,"=>")){a.emitLine(`${p}// Error: Expected => pair in cond`);continue}let B=J.args[0],W=J.args[1];if(!B||!W){a.emitLine(`${p}// Error: Invalid pair in cond`);continue}if(Et((F=B.$)==null?void 0:F.value)&&B.$.value.value===!1)continue;c&&(a.emitLine(`${p}else {`),f++,p+=" ");let q=O===s.length-1&&B.tag==="Atom"&&((S=B.token)==null?void 0:S.value)==="true"?null:G(B,p,r);q?a.emitLine(`${p}if (${q}) {`):a.emitLine(`${p}{`),c=!0;let X=`${p} `;if(zi(W)){a.emitLine(`${X}sm->cond_branch_${t.index} = ${O};`);let me=ta(W,t,X,r),Q=(V=r.asyncWhileLoopInfo)==null?void 0:V.get(t.index);if(Q&&me.length>0){let re=(N=r.asyncCondBranchInfo)==null?void 0:N.get(t.index),se=(re==null?void 0:re.branches.some(Me=>Me.hasAwait&&Me.remainingExprs&&Me.remainingExprs.length>0))??!1;Q.condBranchPostWhileExprs={branchIndex:O,condBranchFieldIndex:t.index,exprs:me,deferredDropExpressions:(x=W.$)==null?void 0:x.deferredDropExpressions,skipCondBranchCheck:se},l.push({index:O,value:W,hasAwait:!0,remainingExprs:[],deferredDropExpressions:(I=W.$)==null?void 0:I.deferredDropExpressions})}else l.push({index:O,value:W,hasAwait:!0,remainingExprs:me,deferredDropExpressions:(D=W.$)==null?void 0:D.deferredDropExpressions})}else{if(Jo(e,W,r,i,o))ea(W,X,r);else if(A(W)&&E(W,R.begin)){let me=W.args;for(let Q=0;Q<me.length;Q++){let re=me[Q],se=G(re,X,r);if(se==="break"&&t.isInsideWhile)a.emitLine(`${X}sm->while_loop_${t.index}_active = false;`),a.emitLine(`${X}goto while_loop_${t.index}_end;`);else{let Me=se==="break"||se==="continue"||(se==null?void 0:se.includes("return"));se&&(Me||re.$&&!Wt(re.$.env.modulePath,se))&&a.emitLine(`${X}${se};`)}}if((z=W.$)!=null&&z.deferredDropExpressions)for(let Q of W.$.deferredDropExpressions){let re=G(Q,X,r);re&&a.emitLine(`${X}${re};`)}}else{let me=G(W,X,r);if(me==="break"&&t.isInsideWhile)a.emitLine(`${X}sm->while_loop_${t.index}_active = false;`),a.emitLine(`${X}goto while_loop_${t.index}_end;`);else{let Q=me==="break"||me==="continue"||(me==null?void 0:me.includes("return"));me&&(Q||W.$&&!Wt(W.$.env.modulePath,me))&&a.emitLine(`${X}${me};`)}}l.push({index:O,value:W,hasAwait:!1})}a.emitLine(`${p}}`)}for(let O=0;O<f;O++)p=p.slice(0,-2),a.emitLine(`${p}}`);r.asyncCondBranchInfo||(r.asyncCondBranchInfo=new Map);let m=r.asyncCondBranchInfo.get(t.index);((m==null?void 0:m.branches.some(O=>O.hasAwait&&O.remainingExprs&&O.remainingExprs.length>0))??!1)||r.asyncCondBranchInfo.set(t.index,{branches:l,targetVariableId:i,targetAssignmentCode:o})}function Jo(e,t,n,r,i){return!r&&!i&&n.asyncBodyReturnExpr!==void 0&&e===n.asyncBodyReturnExpr&&!!n.inAsyncStateMachine&&!Mc(t)}function ea(e,t,n){var o,a;let r=n.emitter,i=Pe((o=e.$)==null?void 0:o.type);if(A(e)&&E(e,R.begin)){let s=e.args;for(let u=0;u<s.length-1;u++){let _=s[u],c=G(_,t,n);c&&_.$&&!Wt(_.$.env.modulePath,c)&&r.emitLine(`${t}${c};`)}let l=s[s.length-1];if(l&&!i){let u=G(l,t,n);u&&r.emitLine(`${t}sm->result = ${u};`)}if((a=e.$)!=null&&a.deferredDropExpressions)for(let u of e.$.deferredDropExpressions){let _=G(u,t,n);_&&r.emitLine(`${t}${_};`)}}else if(!i){let s=G(e,t,n);s&&r.emitLine(`${t}sm->result = ${s};`)}if(r.emitLine(`${t}// Drop local variables before early completion`),n.pendingDeferredDrops)for(let s of n.pendingDeferredDrops){let l=G(s,t,n);l&&l.includes("sm->")&&r.emitLine(`${t}${l};`)}ki({emitter:r,indent:t,resultCode:void 0,debugLabel:n.currentFunctionName}),r.emitLine(`${t}return;`)}function zi(e){if(e.tag==="FnCall"&&ar(e))return!0;if(e.tag==="FnCall"){for(let t of e.args)if(zi(t))return!0}return!1}function Mc(e){if(rn(e,"return")||E(e,"return"))return!0;if(e.tag==="FnCall"){for(let t of e.args)if(Mc(t))return!0}return!1}function Ya(e,t,n,r,i,o){var m,h,y,g,v,T;let a=r.emitter;if(e.tag!=="FnCall"||!E(e,R.match)){a.emitLine(`${n}// Error: Expected match expression`);return}let s=e.args[0],l=e.args.slice(1);if(!s||l.length===0){a.emitLine(`${n}// Error: match must have a value and at least one case`);return}let u=G(s,n,r),_=(m=s.$)==null?void 0:m.type;if(!_){a.emitLine(`${n}// Error: match value has no type`);return}if((h=e.$)!=null&&h.isPrimitiveMatch){lh(e,l,u,t,n,r,i,o);return}if(!qe(_)){a.emitLine(`${n}// Error: match requires an enum type or primitive type`);return}let c=_,f=(y=r.types[c.id])==null?void 0:y.cName;if(!f){a.emitLine(`${n}// Error: enum type has no C name`);return}let p=On(c);if(p){let $=-1,b=-1,C;for(let k=0;k<l.length;k++){let F=l[k];if(A(F)&&E(F,"=>",2)){let S=F.args[0];if(S&&A(S)&&E(S,"."))$=k;else if(S&&A(S)){let V=S.func;V&&A(V)&&E(V,".")&&(b=k,S.args.length>0&&j(S.args[0])&&(C=S.args[0].token.value))}}}if(a.emitLine(`${n}if (${u} != NULL) {`),b>=0){let k=l[b];if(!A(k))a.emitLine(`${n} // Error: Expected => in case`);else{let F=k.args[1];if(C){let S=r,V=!1,N;if(S.stateMachineVariables){for(let[x,I]of S.stateMachineVariables)if(I.name===C){V=!0,N=x;break}}if(V&&N){let x=qn(N,"local",S.stateMachineFieldAliases);a.emitLine(`${n} sm->${x} = ${u};`)}else a.emitLine(`${n} ${H(p,r)} ${C} = ${u};`)}if(a.emitLine(`${n} sm->cond_branch_${t.index} = ${b};`),zi(F)){let S=ta(F,t,n+" ",r);if(S.length>0){let V=r;V.asyncCondBranchInfo||(V.asyncCondBranchInfo=new Map);let N=V.asyncCondBranchInfo.get(t.index)||{branches:[]};N.branches.push({index:b,value:F,hasAwait:!0,remainingExprs:S,deferredDropExpressions:(g=F.$)==null?void 0:g.deferredDropExpressions}),V.asyncCondBranchInfo.set(t.index,N)}}else if(Jo(e,F,r,i,o))ea(F,n+" ",r);else{let S=G(F,n+" ",r);if(i){let V=Ce(`var_${i}`);S&&a.emitLine(`${n} sm->${V} = ${S};`)}else o?S&&a.emitLine(`${n} ${o} = ${S};`):S&&F.$&&!Wt(F.$.env.modulePath,S)&&a.emitLine(`${n} ${S};`)}}}if(a.emitLine(`${n}} else {`),$>=0){let k=l[$];if(!A(k))a.emitLine(`${n} // Error: Expected => in case`);else{let F=k.args[1];if(a.emitLine(`${n} sm->cond_branch_${t.index} = ${$};`),zi(F)){let S=ta(F,t,n+" ",r);if(S.length>0){let V=r;V.asyncCondBranchInfo||(V.asyncCondBranchInfo=new Map);let N=V.asyncCondBranchInfo.get(t.index)||{branches:[]};N.branches.push({index:$,value:F,hasAwait:!0,remainingExprs:S,deferredDropExpressions:(v=F.$)==null?void 0:v.deferredDropExpressions}),V.asyncCondBranchInfo.set(t.index,N)}}else if(Jo(e,F,r,i,o))ea(F,n+" ",r);else{let S=G(F,n+" ",r);if(i){let V=Ce(`var_${i}`);S&&a.emitLine(`${n} sm->${V} = ${S};`)}else o?S&&a.emitLine(`${n} ${o} = ${S};`):S&&F.$&&!Wt(F.$.env.modulePath,S)&&a.emitLine(`${n} ${S};`)}}}a.emitLine(`${n}}`)}else{a.emitLine(`${n}switch (${u}.tag) {`);let $=!1;for(let b=0;b<l.length;b++){let C=l[b];if(!A(C)||!E(C,"=>",2))continue;let k=C.args[0],F=C.args[1],S=j(k)&&k.token.value==="_",V;if(!S){if(A(k)&&E(k,".",1))V=k.args[0].token.value;else if(A(k)){let N=k.func;N&&A(N)&&E(N,".",1)&&(V=N.args[0].token.value)}}if(!S&&!V){a.emitLine(`${n} // Error: Could not extract variant name`);continue}if(S)$=!0,a.emitLine(`${n} default: {`);else{let N=`${f.toUpperCase()}_${V.toUpperCase()}`;a.emitLine(`${n} case ${N}: {`)}if(a.emitLine(`${n} sm->cond_branch_${t.index} = ${b};`),A(k)&&k.args.length>=1){let N=k.func;if(N&&A(N)&&E(N,".")){let x=c.variants.find(I=>I.name===V);if(x&&x.fields)for(let I=0;I<Math.min(k.args.length,x.fields.length);I++){let D=k.args[I],z=x.fields[I];if(j(D)&&z){let O=D.token.value,J=Ce(O),B=r,W=!1,q;if(B.stateMachineVariables){for(let[me,Q]of B.stateMachineVariables)if(Q.name===O){W=!0,q=me;break}}let X=Ce(z.label,z.type.isExtern==="c"),_e=`${u}.data.${V}.${X}`;if(W&&q){let me=qn(q,"local",B.stateMachineFieldAliases);a.emitLine(`${n} sm->${me} = ${_e};`)}else{let me=H(z.type,r);a.emitLine(`${n} ${me} ${J} = ${_e};`)}}}}}if(zi(F)){let N=ta(F,t,n+" ",r);if(N.length>0){let x=r;x.asyncCondBranchInfo||(x.asyncCondBranchInfo=new Map);let I=x.asyncCondBranchInfo.get(t.index)||{branches:[]};I.branches.push({index:b,value:F,hasAwait:!0,remainingExprs:N,deferredDropExpressions:(T=F.$)==null?void 0:T.deferredDropExpressions}),x.asyncCondBranchInfo.set(t.index,I)}}else if(Jo(e,F,r,i,o))ea(F,n+" ",r);else{let N=G(F,n+" ",r);if(i){let x=Ce(`var_${i}`);N&&a.emitLine(`${n} sm->${x} = ${N};`)}else o?N&&a.emitLine(`${n} ${o} = ${N};`):N&&F.$&&!Wt(F.$.env.modulePath,N)&&a.emitLine(`${n} ${N};`)}a.emitLine(`${n} break;`),a.emitLine(`${n} }`)}$||a.emitLine(`${n} default: break;`),a.emitLine(`${n}}`)}}function sh(e){return A(e)?E(e,"|",2):!1}function fu(e){if(!sh(e))return[e];if(e.tag!=="FnCall")return[e];let t=e.args[0],n=e.args[1];return[...fu(t),...fu(n)]}function lh(e,t,n,r,i,o,a,s){var _,c,f;let l=o.emitter,u=[];l.emitLine(`${i}switch (${n}) {`);for(let p=0;p<t.length;p++){let m=t[p];if(!A(m)||!E(m,"=>",2))continue;let h=m.args[0],y=m.args[1];if(rn(h,"_"))l.emitLine(`${i} default:`);else{let g=(_=h.$)==null?void 0:_.primitivePatternValues;if(g&&g.length>0){for(let v of g)if(v!==void 0){let T=Gn(v,o);l.emitLine(`${i} case ${T}:`)}}else{let v=fu(h);for(let T of v){let $=(c=T.$)==null?void 0:c.value;if($!==void 0){let b=Gn($,o);l.emitLine(`${i} case ${b}:`)}}}}if(l.emitLine(`${i} sm->cond_branch_${r.index} = ${p};`),zi(y)){let g=ta(y,r,i+" ",o);u.push({index:p,value:y,hasAwait:!0,remainingExprs:g,deferredDropExpressions:(f=y.$)==null?void 0:f.deferredDropExpressions})}else{if(Jo(e,y,o,a,s))ea(y,i+" ",o);else{let g=G(y,i+" ",o);if(a){let v=Ce(`var_${a}`);g&&l.emitLine(`${i} sm->${v} = ${g};`)}else s?g&&l.emitLine(`${i} ${s} = ${g};`):g&&y.$&&!Wt(y.$.env.modulePath,g)&&l.emitLine(`${i} ${g};`)}u.push({index:p,value:y,hasAwait:!1})}l.emitLine(`${i} break;`)}l.emitLine(`${i}}`),o.asyncCondBranchInfo||(o.asyncCondBranchInfo=new Map),o.asyncCondBranchInfo.set(r.index,{branches:u,targetVariableId:a,targetAssignmentCode:s})}function ta(e,t,n,r){let i=r.emitter,o=[];if(e.tag!=="FnCall"||!E(e,"begin"))return i.emitLine(`${n}// Error: Expected begin block in cond branch with await`),o;let a=e.args,s=!1;for(let l of a){if(s){o.push(l);continue}if(zi(l))if(s=!0,l.tag==="FnCall"&&E(l,":=")){let u=l.args[1];if(u&&u.tag==="FnCall"&&ar(u)){let _=u.args[0];if(_){let c=G(_,n,r);i.emitLine(`${n}// Store Future for await ${t.index} (cond branch)`),i.emitLine(`${n}sm->await_future_${t.index} = ${c};`)}}}else if(l.tag==="FnCall"&&ar(l)){let u=l.args[0];if(u)if(t.futureVariableId===void 0){let _=G(u,n,r);i.emitLine(`${n}// Store Future for await ${t.index} (cond branch)`),i.emitLine(`${n}sm->await_future_${t.index} = ${_};`)}else i.emitLine(`${n}// Await will use Future from sm->var_${t.futureVariableId}`)}else if(l.tag==="FnCall"&&E(l,R.cond)){let u=l===a[a.length-1],_=r.asyncBodyReturnExpr;u&&r.asyncBodyReturnExpr!==void 0&&(r.asyncBodyReturnExpr=l),Wa(l,t,n,r),r.asyncBodyReturnExpr=_}else if(l.tag==="FnCall"&&E(l,R.match)){let u=l===a[a.length-1],_=r.asyncBodyReturnExpr;u&&r.asyncBodyReturnExpr!==void 0&&(r.asyncBodyReturnExpr=l),Ya(l,t,n,r),r.asyncBodyReturnExpr=_}else l.tag==="FnCall"&&E(l,R.while)&&du(l,t,n,r);else{let u=G(l,n,r);u&&l.$&&!Wt(l.$.env.modulePath,u)&&i.emitLine(`${n}${u};`)}}return o}function du(e,t,n,r){let i=r.emitter;if(e.tag!=="FnCall"||!E(e,"while")){i.emitLine(`${n}// Error: Expected while expression`);return}let o=e.args;if(o.length<2||o.length>3){i.emitLine(`${n}// Error: while must have 2 or 3 arguments (condition, [step,] body)`);return}let a=o[0],s=o.length===3?o[1]:void 0,l=o.length===3?o[2]:o[1],u=_h(l),_;u?(_=r.asyncNextWhileLoopIndex??t.index+1,r.asyncNextWhileLoopIndex=_+1):_=t.index,i.emitLine(`${n}sm->while_loop_${_}_active = true;`),i.emitLine(`${n}while_loop_${_}_start:`);let c=G(a,n,r);i.emitLine(`${n}if (!(${c})) {`),i.emitLine(`${n} sm->while_loop_${_}_active = false;`),i.emitLine(`${n} goto while_loop_${_}_end;`),i.emitLine(`${n}}`);let f=uh(l,t,n,r,_);if(i.emitLine(`${n}while_loop_${_}_end:`),r.asyncWhileLoopInfo||(r.asyncWhileLoopInfo=new Map),u){let p=r.asyncWhileLoopInfo.get(t.index);p&&(p.outerWhileLoop={whileLoopIndex:_,conditionExpr:a,stepExpr:s,bodyExpr:l,bodyExprsAfterAwait:f})}else r.asyncWhileLoopInfo.set(t.index,{conditionExpr:a,stepExpr:s,bodyExpr:l,bodyExprsAfterAwait:f})}function uh(e,t,n,r,i){var p;let o=r.emitter,a=[],s=[];e.tag==="FnCall"&&E(e,"begin")?s=e.args:s=[e];let l=-1;for(let m=0;m<s.length;m++){let h=s[m];if(er(h)){l=m;break}}if(l===-1)return o.emitLine(`${n}// Error: Expected await in while loop body but none found`),a;let u=r.smWhileBreakInfo,_=r.smWhileContinueInfo,c=r.smWhileBodyDrops;r.smWhileBreakInfo={label:`while_loop_${i}_end`,activeIndex:i},r.smWhileContinueInfo={label:`while_loop_${i}_start`,emitDropsBeforeGoto:!0},r.smWhileBodyDrops=[...((p=e.$)==null?void 0:p.deferredDropExpressions)??[]];for(let m=0;m<l;m++){let h=s[m],y=G(h,n,r);y&&h.$&&!Wt(h.$.env.modulePath,y)&&o.emitLine(`${n}${y};`)}r.smWhileBreakInfo=u,r.smWhileContinueInfo=_,r.smWhileBodyDrops=c;let f=s[l];if(A(f)&&E(f,R.while)&&er(f)){du(f,t,n,r);for(let m=l+1;m<s.length;m++)a.push(s[m]);return a}if(A(f)&&E(f,":=")){let m=f.args[1];if(m&&m.tag==="FnCall"&&ar(m)){let h=m.args[0];if(h){let y=G(h,n,r);o.emitLine(`${n}// Store Future for await ${t.index} (while loop body)`),o.emitLine(`${n}sm->await_future_${t.index} = ${y};`)}}}else if(f.tag==="FnCall"&&ar(f)){let m=f.args[0];if(m&&t.futureVariableId===void 0){let h=G(m,n,r);o.emitLine(`${n}// Store Future for await ${t.index} (while loop body)`),o.emitLine(`${n}sm->await_future_${t.index} = ${h};`)}}else if(A(f)&&E(f,R.cond)){Wa(f,t,n,r,void 0);for(let m=l+1;m<s.length;m++)a.push(s[m]);return a}else if(A(f)&&E(f,R.match)){Ya(f,t,n,r);for(let m=l+1;m<s.length;m++)a.push(s[m]);return a}for(let m=l+1;m<s.length;m++)a.push(s[m]);return a}function _h(e){let t=e.tag==="FnCall"&&E(e,"begin")?e.args:[e];for(let n of t)if(n.tag==="FnCall"&&E(n,R.while)&&er(n))return!0;return!1}function yo(e,t,n){var r,i,o;if(e)switch(e.tag){case"Atom":if(e.$&&e.token.type==="identifier"){let a=e.token.value,s=ce(e.$.env,a);if(s.length>0){let l=s[s.length-1];if(l&&!l.isCompileTimeOnly){let u=n.get(l.id)??l.id,_=l.isOwningTheSameRcValueAs?l.isOwningTheSameRcValueAs.id:u;t.add(_)}}}break;case"FnCall":if(An(e)){if((r=e.$)!=null&&r.deferredDupExpressions)for(let a of e.$.deferredDupExpressions)yo(a,t,n);break}yo(e.func,t,n);for(let a of e.args)yo(a,t,n);if((i=e.$)!=null&&i.deferredDropExpressions)for(let a of e.$.deferredDropExpressions)yo(a,t,n);if((o=e.$)!=null&&o.deferredDupExpressions)for(let a of e.$.deferredDupExpressions)yo(a,t,n);break}}function zs(e,t){var c,f,p,m;let{awaitPoints:n,capturedVariables:r,variableIdRemapping:i}=t;if(n.length===0)return{crossBoundaryIds:new Set,awaitFutureTempVarAliases:new Map,variableSegments:new Map};let o=new Set,a=pu(e,n);for(let h of a)((c=h.awaitPoint)!=null&&c.isInsideCond||(f=h.awaitPoint)!=null&&f.isInsideWhile)&&o.add(h.stateNumber);let s=new Map;for(let h of a){let y=new Set;for(let g of h.expressions)yo(g,y,i);for(let g of y){let v=s.get(g);v||(v=new Set,s.set(g,v)),v.add(h.stateNumber)}}let l=-1;if((p=e.$)!=null&&p.deferredDropExpressions){let h=new Set;for(let y of e.$.deferredDropExpressions)yo(y,h,i);for(let y of h){let g=s.get(y);g||(g=new Set,s.set(y,g)),g.add(l)}}let u=new Set;for(let h of r){if(h.kind==="outer")continue;let y=s.get(h.id);if(!y)u.add(h.id);else if(y.size>1)u.add(h.id);else if(y.has(l))u.add(h.id);else{let g=y.values().next().value;o.has(g)&&u.add(h.id)}}let _=new Map;for(let h of n){if(h.futureVariableId!==void 0)continue;let y=h.expr;if(!A(y))continue;let g=y.args[0];if(!g)continue;let v=(m=g.$)==null?void 0:m.variableName;if(!v)continue;let T=r.find($=>$.kind==="local"&&($.name===v||$.id===v));T&&(_.set(T.id,`await_future_${h.index}`),u.delete(T.id))}return{crossBoundaryIds:u,awaitFutureTempVarAliases:_,variableSegments:s}}function Us(e,t,n,r,i){let o={slotAliases:new Map,slots:[]},a=n.filter(f=>f.kind==="local"&&e.has(f.id)&&!r.has(f.id)&&!ut(f.type));if(a.length<2)return o;let s=new Map;for(let f of a){let p=t.get(f.id);if(!p||p.size===0)continue;let m=[...p].filter(g=>g>=0);if(m.length===0)continue;let h=Math.min(...m),y=Math.max(...m);s.set(f.id,[h,y])}if(s.size<2)return o;let l=new Map;for(let[f]of s){let p=a.find(y=>y.id===f);if(!p)continue;let m=H(p.type,i),h=l.get(m);h||(h=[],l.set(m,h)),h.push(f)}let u=new Map,_=[],c=0;for(let[f,p]of l){if(p.length<2)continue;let m=new Map;for(let g of p)m.set(g,new Set);for(let g=0;g<p.length;g++)for(let v=g+1;v<p.length;v++){let[T,$]=s.get(p[g]),[b,C]=s.get(p[v]);T<=C&&b<=$&&(m.get(p[g]).add(p[v]),m.get(p[v]).add(p[g]))}let h=new Map;for(let g of p){let v=new Set;for(let $ of m.get(g))h.has($)&&v.add(h.get($));let T=0;for(;v.has(T);)T++;h.set(g,T)}let y=new Map;for(let[g,v]of h){let T=y.get(v);T||(T=[],y.set(v,T)),T.push(g)}for(let[,g]of y){if(g.length<2)continue;let v=`slot_${c}`,T=g.map($=>{var b;return((b=a.find(C=>C.id===$))==null?void 0:b.name)??$});for(let $ of g)u.set($,v);_.push({fieldName:v,cType:f,variableNames:T}),c++}}return{slotAliases:u,slots:_}}function yu(e,t){if(e.futureVariableId){let n=t.capturedVariables.find(r=>r.id===e.futureVariableId);if(n)return n.kind==="outer"?n.name:`var_${n.id}`}return`await_future_${e.index}`}function qa(e){return!e||!U(e)?!1:e.resolvedConcreteType&&U(e.resolvedConcreteType)&&e.resolvedConcreteType.isExtern?!0:e.requiredTraits.some(t=>ss(t.traitType))}function qn(e,t,n){if(t==="outer")return`__capture.${Ce(e)}`;let r=n==null?void 0:n.get(e);return r||Ce(`var_${e}`)}function Rc(e,t,n,r,i,o,a,s){var y,g,v,T,$,b,C,k,F,S,V,N,x,I,D,z,O,J,B,W,q,X,_e,me,Q,re,se;let l=s.emitter,_=Cn(o).isFuture.outputType,c=Pe(_);s.asyncCondBranchInfo=new Map,s.asyncWhileLoopInfo=new Map,s.asyncNextWhileLoopIndex=i.awaitPoints.length;let f=pu(e,i.awaitPoints),p=e.tag==="FnCall"&&E(e,"begin")?e.args:[e],m=p.length>0?p[p.length-1]:void 0;l.emitLine(`// Resume function for async block ${t}`),l.emitLine(`void ${r}(${n}* sm) {`),l.emitLine(` ASYNC_DEBUG("${t}_resume: state=%d\\n", sm->state);`),l.emitLine(" switch (sm->state) {");let h=[];for(let Me=0;Me<f.length;Me++){let Fe=f[Me];if(!Fe)continue;let ae=Fe.stateNumber,Le=Me===f.length-1;if(l.emitLine(`
|
|
194
194
|
state_${ae}:`),l.emitLine(` case ${ae}: { // State ${ae}`),l.emitLine(` ASYNC_DEBUG("${t}: Entering state ${ae}\\n");`),ae>0&&i.awaitPoints[ae-1]){let et=i.awaitPoints[ae-1],mt=yu(et,i);et.isInsideCond&&l.emitLine(` if (sm->${mt} != NULL) {`);let sn=Pe(et.resultType)||U(et.resultType)&&!et.resultType.resolvedConcreteType;if(l.emitLine(" // Check if the awaited Future was aborted"),l.emitLine(` if (sm->${mt}->state == -2) {`),l.emitLine(` __yo_decr_rc((void*)sm->${mt});`),l.emitLine(` sm->${mt} = NULL;`),kr({emitter:l,indent:" ",debugLabel:t}),l.emitLine(" }"),et&&!sn){l.emitLine(` // Extract result from await ${ae-1}`),l.emitLine(` int state_before_read = sm->${mt}->state;`),l.emitLine(` ASYNC_DEBUG("${t}: Reading result from await ${ae-1}, state=%d\\n", state_before_read);`);let Ge=!!et.isInsideCond,Oe;if(Ge?Oe=`sm->await_result_${ae-1}`:et.targetVariableId&&(Oe=`sm->${qn(et.targetVariableId,"local",s.stateMachineFieldAliases)}`),Oe)if(ut(et.resultType)){let je=br(et.resultType,s);je?l.emitLine(` ${Oe} = ${je}(sm->${mt}->result);`):(l.emitLine(" /* Warning: No ___dup function found for result type, shallow copy may cause use-after-free */"),l.emitLine(` ${Oe} = sm->${mt}->result;`))}else l.emitLine(` ${Oe} = sm->${mt}->result;`);if(Ge&&et.targetVariableId){let je=qn(et.targetVariableId,"local",s.stateMachineFieldAliases);l.emitLine(` sm->${je} = sm->await_result_${ae-1};`)}l.emitLine("")}if(!et.futureVariableId){let Ge=et.expr;if(Ge.tag==="FnCall"){let Oe=Ge.args[0],je=(y=Oe==null?void 0:Oe.$)==null?void 0:y.type;je&&(U(je)||at(je))&&(l.emitLine(` if (sm->${mt} != NULL) { __yo_decr_rc((void*)sm->${mt}); sm->${mt} = NULL; }`),l.emitLine(""))}}let Ft=s;if(et){let Ge=(g=Ft.asyncCondBranchInfo)==null?void 0:g.get(et.index);if(Ge&&Ge.branches.some(je=>je.hasAwait)){let je=Ge.condBranchFieldIndex??et.index,Nt=je===-1;l.emitLine(" // Execute remaining code from chosen cond branch"),Nt||l.emitLine(` switch (sm->cond_branch_${je}) {`);let Fn=((v=Fe.awaitPoint)==null?void 0:v.isInsideCond)??!1;for(let Rt of Ge.branches)if(Rt.hasAwait){if(Nt||l.emitLine(` case ${Rt.index}: {`),l.emitLine(` ASYNC_DEBUG("${t}: Executing remaining code from branch ${Rt.index}\\n");`),Rt.remainingExprs&&Rt.remainingExprs.length>0){let cn=s.inAsyncStateMachine,ee=s.stateMachineVariables,ge=s.variableIdRemapping,ue=s.pendingDeferredDrops;s.inAsyncStateMachine={futureType:o},s.variableIdRemapping=i.variableIdRemapping;let Ee=(T=Ft.asyncWhileLoopInfo)==null?void 0:T.get(et.index);s.pendingDeferredDrops=[...Rt.deferredDropExpressions??[],...(($=Ee==null?void 0:Ee.bodyExpr.$)==null?void 0:$.deferredDropExpressions)??[],...((b=e.$)==null?void 0:b.deferredDropExpressions)??[]];let Ae=new Map;for(let ne of i.capturedVariables)Ae.set(ne.id,ne);if(a)for(let ne of a.fields)Ae.set(ne.label,{id:ne.label,name:ne.label,type:ne.type,kind:"outer",isOwningTheSameRcValueAs:void 0});s.stateMachineVariables=Ae;let Ne=!1,Je=[],He=Ge.targetAssignmentCode;for(let ne=0;ne<Rt.remainingExprs.length;ne++){let Z=Rt.remainingExprs[ne],K=ne===Rt.remainingExprs.length-1;if(Ne){Je.push(Z);continue}if(Fn&&er(Z)){Ne=!0,mu(Z,Fe.awaitPoint,i," ",s);continue}let ie=G(Z," ",s);!ie||!Z.$||Wt(Z.$.env.modulePath,ie)||(K&&He?l.emitLine(` ${He} = ${ie};`):l.emitLine(` ${ie};`))}if(Rt.remainingExprs.length===0&&He&&l.emitLine(` ${He} = sm->await_result_${et.index};`),Ne&&Fe.awaitPoint){let ne=Fe.awaitPoint.index;Ft.asyncCondBranchInfo||(Ft.asyncCondBranchInfo=new Map);let Z=Ft.asyncCondBranchInfo.get(ne);if(Z)Z.chainedBranches||(Z.chainedBranches=[]),Z.chainedBranches.push({branches:[{index:Rt.index,value:Rt.value,hasAwait:Je.length>0||Je.some(K=>er(K)),remainingExprs:Je,deferredDropExpressions:Rt.deferredDropExpressions}],condBranchFieldIndex:je});else{let K={branches:[{index:Rt.index,value:Rt.value,hasAwait:Je.length>0||Je.some(ie=>er(ie)),remainingExprs:Je,deferredDropExpressions:Rt.deferredDropExpressions}],condBranchFieldIndex:je};Ft.asyncCondBranchInfo.set(ne,K)}}else if(Rt.deferredDropExpressions)for(let ne of Rt.deferredDropExpressions){let Z=G(ne," ",s);Z&&Z.includes("sm->")&&l.emitLine(` ${Z};`)}s.inAsyncStateMachine=cn,s.stateMachineVariables=ee,s.variableIdRemapping=ge,s.pendingDeferredDrops=ue}Nt||(l.emitLine(" break;"),l.emitLine(" }"))}if(Nt||l.emitLine(" }"),Ge.chainedBranches){for(let Rt of Ge.chainedBranches)for(let cn of Rt.branches)if(cn.hasAwait&&cn.remainingExprs&&cn.remainingExprs.length>0){let ee=s.inAsyncStateMachine,ge=s.stateMachineVariables,ue=s.variableIdRemapping,Ee=s.pendingDeferredDrops;s.inAsyncStateMachine={futureType:o},s.variableIdRemapping=i.variableIdRemapping;let Ae=(C=Ft.asyncWhileLoopInfo)==null?void 0:C.get(et.index);s.pendingDeferredDrops=[...cn.deferredDropExpressions??[],...((k=Ae==null?void 0:Ae.bodyExpr.$)==null?void 0:k.deferredDropExpressions)??[],...((F=e.$)==null?void 0:F.deferredDropExpressions)??[]];let Ne=new Map;for(let Z of i.capturedVariables)Ne.set(Z.id,Z);if(a)for(let Z of a.fields)Ne.set(Z.label,{id:Z.label,name:Z.label,type:Z.type,kind:"outer",isOwningTheSameRcValueAs:void 0});s.stateMachineVariables=Ne;let Je=((S=Fe.awaitPoint)==null?void 0:S.isInsideCond)??!1,He=!1,ne=[];for(let Z of cn.remainingExprs){if(He){ne.push(Z);continue}if(Je&&er(Z)){He=!0,mu(Z,Fe.awaitPoint,i," ",s);continue}let K=G(Z," ",s);!K||!Z.$||Wt(Z.$.env.modulePath,K)||l.emitLine(` ${K};`)}if(He&&Fe.awaitPoint){let Z=Fe.awaitPoint.index;Ft.asyncCondBranchInfo||(Ft.asyncCondBranchInfo=new Map);let K=Ft.asyncCondBranchInfo.get(Z);K?(K.chainedBranches||(K.chainedBranches=[]),K.chainedBranches.push({branches:[{index:cn.index,value:cn.value,hasAwait:ne.length>0||ne.some(ie=>er(ie)),remainingExprs:ne,deferredDropExpressions:cn.deferredDropExpressions}],condBranchFieldIndex:Rt.condBranchFieldIndex})):Ft.asyncCondBranchInfo.set(Z,{branches:[{index:cn.index,value:cn.value,hasAwait:ne.length>0||ne.some(ie=>er(ie)),remainingExprs:ne,deferredDropExpressions:cn.deferredDropExpressions}],condBranchFieldIndex:Rt.condBranchFieldIndex})}else if(cn.deferredDropExpressions)for(let Z of cn.deferredDropExpressions){let K=G(Z," ",s);K&&K.includes("sm->")&&l.emitLine(` ${K};`)}s.inAsyncStateMachine=ee,s.stateMachineVariables=ge,s.variableIdRemapping=ue,s.pendingDeferredDrops=Ee}}if(Ge.targetVariableId){let Rt=qn(Ge.targetVariableId,"local",s.stateMachineFieldAliases);l.emitLine(" // Assign cond result to target variable"),l.emitLine(` sm->${Rt} = sm->await_result_${et.index};`)}l.emitLine("")}et.isInsideCond&&l.emitLine(" }");let Oe=(V=Ft.asyncWhileLoopInfo)==null?void 0:V.get(et.index);if(Oe){if(l.emitLine(" // Execute remaining code from while loop body and continue loop"),l.emitLine(` if (sm->while_loop_${et.index}_active) {`),Oe.bodyExprsAfterAwait&&Oe.bodyExprsAfterAwait.length>0){let ue=s.inAsyncStateMachine,Ee=s.stateMachineVariables,Ae=s.variableIdRemapping,Ne=s.pendingDeferredDrops;s.inAsyncStateMachine={futureType:o},s.variableIdRemapping=i.variableIdRemapping,s.pendingDeferredDrops=[...((N=Oe.bodyExpr.$)==null?void 0:N.deferredDropExpressions)??[],...((x=e.$)==null?void 0:x.deferredDropExpressions)??[]];let Je=new Map;for(let K of i.capturedVariables)Je.set(K.id,K);if(a)for(let K of a.fields)Je.set(K.label,{id:K.label,name:K.label,type:K.type,kind:"outer",isOwningTheSameRcValueAs:void 0});s.stateMachineVariables=Je;let He=s.smWhileBreakInfo,ne=s.smWhileContinueInfo,Z=s.smWhileBodyDrops;s.smWhileBreakInfo={label:`after_while_loop_${et.index}`,activeIndex:et.index},s.smWhileContinueInfo={label:`while_loop_${et.index}_continue`},s.smWhileBodyDrops=[...((I=Oe.bodyExpr.$)==null?void 0:I.deferredDropExpressions)??[]];for(let K of Oe.bodyExprsAfterAwait){let ie=G(K," ",s);!ie||!K.$||Wt(K.$.env.modulePath,ie)||l.emitLine(` ${ie};`)}s.smWhileBreakInfo=He,s.smWhileContinueInfo=ne,s.smWhileBodyDrops=Z,s.inAsyncStateMachine=ue,s.stateMachineVariables=Ee,s.variableIdRemapping=Ae,s.pendingDeferredDrops=Ne}l.emitLine(` while_loop_${et.index}_continue:`);{let ue=((D=Oe.bodyExpr.$)==null?void 0:D.deferredDropExpressions)??[];if(ue.length>0){let Ee=s.inAsyncStateMachine,Ae=s.stateMachineVariables,Ne=s.variableIdRemapping;s.inAsyncStateMachine={futureType:o},s.variableIdRemapping=i.variableIdRemapping;let Je=new Map;for(let He of i.capturedVariables)Je.set(He.id,He);if(a)for(let He of a.fields)Je.set(He.label,{id:He.label,name:He.label,type:He.type,kind:"outer",isOwningTheSameRcValueAs:void 0});s.stateMachineVariables=Je;for(let He of ue){let ne=G(He," ",s);ne&&ne.includes("sm->")&&l.emitLine(` ${ne};`)}s.inAsyncStateMachine=Ee,s.stateMachineVariables=Ae,s.variableIdRemapping=Ne}}l.emitLine(` ASYNC_DEBUG("${t}: Re-evaluating while loop condition\\n");`);let je=s.declaredTempVars;if(s.declaredTempVars=void 0,Oe.stepExpr){let ue=s.inAsyncStateMachine,Ee=s.stateMachineVariables,Ae=s.variableIdRemapping;s.inAsyncStateMachine={futureType:o},s.variableIdRemapping=i.variableIdRemapping;let Ne=new Map;for(let He of i.capturedVariables)Ne.set(He.id,He);if(a)for(let He of a.fields)Ne.set(He.label,{id:He.label,name:He.label,type:He.type,kind:"outer",isOwningTheSameRcValueAs:void 0});s.stateMachineVariables=Ne;let Je=G(Oe.stepExpr," ",s);Je&&l.emitLine(` ${Je};`),s.inAsyncStateMachine=ue,s.stateMachineVariables=Ee,s.variableIdRemapping=Ae}let Nt=s.inAsyncStateMachine,Fn=s.stateMachineVariables,Rt=s.variableIdRemapping;s.inAsyncStateMachine={futureType:o},s.variableIdRemapping=i.variableIdRemapping;let cn=new Map;for(let ue of i.capturedVariables)cn.set(ue.id,ue);if(a)for(let ue of a.fields)cn.set(ue.label,{id:ue.label,name:ue.label,type:ue.type,kind:"outer",isOwningTheSameRcValueAs:void 0});s.stateMachineVariables=cn;let ee=G(Oe.conditionExpr," ",s);s.inAsyncStateMachine=Nt,s.stateMachineVariables=Fn,s.variableIdRemapping=Rt,s.declaredTempVars=je,l.emitLine(` if (!(${ee})) {`),l.emitLine(` sm->while_loop_${et.index}_active = false;`),l.emitLine(` ASYNC_DEBUG("${t}: While loop condition false, exiting loop\\n");`),l.emitLine(" } else {"),l.emitLine(` ASYNC_DEBUG("${t}: While loop condition true, continuing iteration\\n");`);let ge=et.index;if(l.emitLine(" // Loop back by transitioning to while loop state"),l.emitLine(` sm->state = ${ge};`),l.emitLine(` goto while_loop_${ge}_start;`),l.emitLine(" }"),l.emitLine(" }"),l.emitLine(""),l.emitLine(` after_while_loop_${et.index}:`),Oe.condBranchPostWhileExprs){let ue=Oe.condBranchPostWhileExprs,Ee=ue.condBranchFieldIndex,Ae=ue.branchIndex;ue.skipCondBranchCheck?(l.emitLine(" // Execute post-while-loop code from cond branch (unconditional)"),l.emitLine(" {")):(l.emitLine(" // Execute post-while-loop code from cond branch"),l.emitLine(` if (sm->cond_branch_${Ee} == ${Ae}) {`));let Ne=s.inAsyncStateMachine,Je=s.stateMachineVariables,He=s.variableIdRemapping,ne=s.pendingDeferredDrops;s.inAsyncStateMachine={futureType:o},s.variableIdRemapping=i.variableIdRemapping,s.pendingDeferredDrops=[...((z=e.$)==null?void 0:z.deferredDropExpressions)??[]];let Z=new Map;for(let ye of i.capturedVariables)Z.set(ye.id,ye);if(a)for(let ye of a.fields)Z.set(ye.label,{id:ye.label,name:ye.label,type:ye.type,kind:"outer",isOwningTheSameRcValueAs:void 0});s.stateMachineVariables=Z;let K=Fe.awaitPoint!=null,ie=!1,Re=[];for(let ye=0;ye<ue.exprs.length;ye++){let Te=ue.exprs[ye];if(ie){Re.push(Te);continue}if(K&&er(Te)){ie=!0,mu(Te,Fe.awaitPoint,i," ",s);continue}let ve=G(Te," ",s);!ve||!Te.$||Wt(Te.$.env.modulePath,ve)||l.emitLine(` ${ve};`)}if(ie&&Fe.awaitPoint){let ye=Fe.awaitPoint.index;Ft.asyncCondBranchInfo||(Ft.asyncCondBranchInfo=new Map);let Te=ue.skipCondBranchCheck?-1:ue.condBranchFieldIndex,ve=Ft.asyncCondBranchInfo.get(ye);ve?(ve.chainedBranches||(ve.chainedBranches=[]),ve.chainedBranches.push({branches:[{index:ue.branchIndex,value:ue.exprs[0],hasAwait:Re.length>0||Re.some(Ve=>er(Ve)),remainingExprs:Re,deferredDropExpressions:ue.deferredDropExpressions}],condBranchFieldIndex:Te})):Ft.asyncCondBranchInfo.set(ye,{branches:[{index:ue.branchIndex,value:ue.exprs[0],hasAwait:Re.length>0||Re.some(Ve=>er(Ve)),remainingExprs:Re,deferredDropExpressions:ue.deferredDropExpressions}],condBranchFieldIndex:Te})}if(!ie&&ue.deferredDropExpressions)for(let ye of ue.deferredDropExpressions){let Te=G(ye," ",s);Te&&Te.includes("sm->")&&l.emitLine(` ${Te};`)}l.emitLine(" }"),s.inAsyncStateMachine=Ne,s.stateMachineVariables=Je,s.variableIdRemapping=He,s.pendingDeferredDrops=ne}if(Oe.outerWhileLoop){let ue=Oe.outerWhileLoop,Ee=ue.whileLoopIndex;if(l.emitLine(" // Execute remaining code from outer while loop body"),l.emitLine(` if (sm->while_loop_${Ee}_active) {`),ue.bodyExprsAfterAwait.length>0){let Ne=s.inAsyncStateMachine,Je=s.stateMachineVariables,He=s.variableIdRemapping,ne=s.pendingDeferredDrops;s.inAsyncStateMachine={futureType:o},s.variableIdRemapping=i.variableIdRemapping,s.pendingDeferredDrops=[...((O=ue.bodyExpr.$)==null?void 0:O.deferredDropExpressions)??[],...((J=e.$)==null?void 0:J.deferredDropExpressions)??[]];let Z=new Map;for(let ye of i.capturedVariables)Z.set(ye.id,ye);if(a)for(let ye of a.fields)Z.set(ye.label,{id:ye.label,name:ye.label,type:ye.type,kind:"outer",isOwningTheSameRcValueAs:void 0});s.stateMachineVariables=Z;let K=s.smWhileBreakInfo,ie=s.smWhileContinueInfo,Re=s.smWhileBodyDrops;s.smWhileBreakInfo={label:`after_while_loop_${Ee}`,activeIndex:Ee},s.smWhileContinueInfo={label:`while_loop_${Ee}_continue`},s.smWhileBodyDrops=[...((B=ue.bodyExpr.$)==null?void 0:B.deferredDropExpressions)??[]];for(let ye of ue.bodyExprsAfterAwait){let Te=G(ye," ",s);!Te||!ye.$||Wt(ye.$.env.modulePath,Te)||l.emitLine(` ${Te};`)}s.smWhileBreakInfo=K,s.smWhileContinueInfo=ie,s.smWhileBodyDrops=Re,s.inAsyncStateMachine=Ne,s.stateMachineVariables=Je,s.variableIdRemapping=He,s.pendingDeferredDrops=ne}l.emitLine(` while_loop_${Ee}_continue:`);{let Ne=((W=ue.bodyExpr.$)==null?void 0:W.deferredDropExpressions)??[];if(Ne.length>0){let Je=s.inAsyncStateMachine,He=s.stateMachineVariables,ne=s.variableIdRemapping;s.inAsyncStateMachine={futureType:o},s.variableIdRemapping=i.variableIdRemapping;let Z=new Map;for(let K of i.capturedVariables)Z.set(K.id,K);if(a)for(let K of a.fields)Z.set(K.label,{id:K.label,name:K.label,type:K.type,kind:"outer",isOwningTheSameRcValueAs:void 0});s.stateMachineVariables=Z;for(let K of Ne){let ie=G(K," ",s);ie&&ie.includes("sm->")&&l.emitLine(` ${ie};`)}s.inAsyncStateMachine=Je,s.stateMachineVariables=He,s.variableIdRemapping=ne}}let Ae=s.declaredTempVars;if(s.declaredTempVars=void 0,ue.stepExpr){let Ne=s.inAsyncStateMachine,Je=s.stateMachineVariables,He=s.variableIdRemapping;s.inAsyncStateMachine={futureType:o},s.variableIdRemapping=i.variableIdRemapping;let ne=new Map;for(let K of i.capturedVariables)ne.set(K.id,K);if(a)for(let K of a.fields)ne.set(K.label,{id:K.label,name:K.label,type:K.type,kind:"outer",isOwningTheSameRcValueAs:void 0});s.stateMachineVariables=ne;let Z=G(ue.stepExpr," ",s);Z&&l.emitLine(` ${Z};`),s.inAsyncStateMachine=Ne,s.stateMachineVariables=Je,s.variableIdRemapping=He}{let Ne=s.inAsyncStateMachine,Je=s.stateMachineVariables,He=s.variableIdRemapping;s.inAsyncStateMachine={futureType:o},s.variableIdRemapping=i.variableIdRemapping;let ne=new Map;for(let K of i.capturedVariables)ne.set(K.id,K);if(a)for(let K of a.fields)ne.set(K.label,{id:K.label,name:K.label,type:K.type,kind:"outer",isOwningTheSameRcValueAs:void 0});s.stateMachineVariables=ne;let Z=G(ue.conditionExpr," ",s);s.inAsyncStateMachine=Ne,s.stateMachineVariables=Je,s.variableIdRemapping=He,l.emitLine(` if (!(${Z})) {`),l.emitLine(` sm->while_loop_${Ee}_active = false;`),l.emitLine(" } else {"),l.emitLine(` sm->state = ${et.index};`),l.emitLine(` goto while_loop_${Ee}_start;`),l.emitLine(" }")}s.declaredTempVars=Ae,l.emitLine(" }"),l.emitLine(""),l.emitLine(` after_while_loop_${Ee}:`)}}}}let oe=s.inAsyncStateMachine,de=s.stateMachineVariables,he=s.variableIdRemapping;s.inAsyncStateMachine={futureType:o},s.variableIdRemapping=i.variableIdRemapping;let xe=new Map;for(let et of i.capturedVariables)xe.set(et.id,et);if(a)for(let et of a.fields)xe.set(et.label,{id:et.label,name:et.label,type:et.type,kind:"outer",isOwningTheSameRcValueAs:void 0});s.stateMachineVariables=xe;let it=s.pendingDeferredDrops;s.pendingDeferredDrops=[...((q=e.$)==null?void 0:q.deferredDropExpressions)??[]];let pt=Le&&!c&&Fe.expressions.length>0,wt=Fe.expressions.length>0?Fe.expressions[Fe.expressions.length-1]:void 0,Bt=s.asyncBodyReturnExpr;if(!c&&wt&&m&&wt===m&&Fe.awaitPoint?s.asyncBodyReturnExpr=wt:s.asyncBodyReturnExpr=void 0,Dc(Fe," ",s,pt),s.asyncBodyReturnExpr=Bt,s.pendingDeferredDrops=it,l.emitLine(""),Fe.awaitPoint){s.inAsyncStateMachine=oe,s.stateMachineVariables=de,s.variableIdRemapping=he;let et=ae+1;{let mt=yu(Fe.awaitPoint,i),Ft=(X=Fe.awaitPoint.expr.args)==null?void 0:X[0],Ge=qa((_e=Ft==null?void 0:Ft.$)==null?void 0:_e.type),Oe=(me=Fe.awaitPoint)==null?void 0:me.isInsideCond;Oe&&(l.emitLine(" // Only await if the cond branch with await was taken"),l.emitLine(` if (sm->${mt} != NULL) {`));let je=(Q=Fe.awaitPoint)==null?void 0:Q.isInsideWhile,Nt=je?(re=s.asyncWhileLoopInfo)==null?void 0:re.get(Fe.awaitPoint.index):void 0;if(je&&Nt){let Fn=Fe.awaitPoint.index;l.emitLine(" // Only await if while loop is still active (not broken)"),l.emitLine(` if (sm->while_loop_${Fn}_active) {`)}if(l.emitLine(" // Transition to next state after await"),l.emitLine(` sm->state = ${et};`),l.emitLine(""),l.emitLine(" // Check if future is ready"),l.emitLine(` int future_state = sm->${mt}->state;`),l.emitLine(" if (future_state == -1 || future_state == -2) { // -1 = completed, -2 = aborted"),l.emitLine(" // Already complete or aborted \u2014 yield once for fairness"),l.emitLine(" // Yield once to event loop for fairness (microtask yield)"),l.emitLine(` __yo_async_spawn_task((void (*)(void*))${r}, (void*)sm);`),l.emitLine(" return;"),l.emitLine(" }"),l.emitLine(""),Ge?l.emitLine(" // IO future: no extra ref needed (completion handler does not decr_rc)"):(l.emitLine(" // Future not complete \u2014 take event loop reference and start if cold"),l.emitLine(` __yo_incr_rc((void*)sm->${mt}); // event loop reference`)),Ge||(l.emitLine(" if (future_state == 0) { // 0 = cold (not started)"),fh(Fe.awaitPoint.expr,`sm->${mt}`," ",s),l.emitLine(" // Cold future \u2014 start it via stored resume function pointer"),l.emitLine(` sm->${mt}->__yo_resume_fn((void*)sm->${mt});`),l.emitLine(""),l.emitLine(" // Re-check: may have completed synchronously"),l.emitLine(` future_state = sm->${mt}->state;`),l.emitLine(" if (future_state == -1 || future_state == -2) {"),l.emitLine(" // Completed or aborted synchronously \u2014 yield for fairness"),l.emitLine(` __yo_async_spawn_task((void (*)(void*))${r}, (void*)sm);`),l.emitLine(" return;"),l.emitLine(" }"),l.emitLine(" }")),l.emitLine(""),l.emitLine(" // Still pending \u2014 register continuation and suspend"),l.emitLine(` sm->${mt}->continuation_fn = (void (*)(void*))${r};`),l.emitLine(` sm->${mt}->continuation_sm = (void*)sm;`),l.emitLine(" return;"),je&&Nt){let Fn=Fe.awaitPoint.index;l.emitLine(" } else {"),l.emitLine(" // While loop was broken, jump to code after loop"),l.emitLine(` goto after_while_loop_${Fn};`),l.emitLine(" }")}Oe&&(l.emitLine(" } else {"),l.emitLine(" // Non-await cond branch was taken, skip directly to next state"),l.emitLine(` sm->state = ${et};`),l.emitLine(` goto state_${et};`),l.emitLine(" }"))}}else if(Le){if(!Fe.expressions.some(mt=>Pc(mt))){if((se=e.$)!=null&&se.deferredDropExpressions){let mt=new ji,sn=s.emitter;s.emitter=mt;for(let Ge of e.$.deferredDropExpressions){let Oe=G(Ge,"",s);Oe&&mt.emitLine(`${Oe};`)}s.emitter=sn;let Ft=mt.print().trim();if(Ft){l.emitLine(" // Drop local variables before completion");for(let Ge of Ft.split(`
|
|
195
|
-
`)){let Oe=Ge.trim();Oe&&(l.emitLine(` ${Oe}`),h.push(Oe))}l.emitLine("")}}l.emitLine(" // Final state - complete the Future"),ki({emitter:l,indent:" ",debugLabel:"Future %p completed"})}s.inAsyncStateMachine=oe,s.stateMachineVariables=de,s.variableIdRemapping=he}else s.inAsyncStateMachine=oe,s.stateMachineVariables=de,s.variableIdRemapping=he;l.emitLine(" }")}return l.emitLine(" }"),l.emitLine("}"),l.emitLine(""),h}function mu(e,t,n,r,i){let o=i.emitter,a=yu(t,n);if(e.tag==="FnCall"&&E(e,":=")){let s=e.args[1];if(s&&s.tag==="FnCall"&&ar(s)){let l=s.args[0];if(l){let u=G(l,r,i);o.emitLine(`${r}// Store Future for additional await in cond branch`),o.emitLine(`${r}sm->${a} = ${u};`)}}return}if(e.tag==="FnCall"&&ar(e)){let s=e.args[0];if(s){let l=G(s,r,i);o.emitLine(`${r}// Store Future for additional await in cond branch`),o.emitLine(`${r}sm->${a} = ${l};`)}return}if(e.tag==="FnCall"&&E(e,R.cond)){na(e,t,0,r,i);return}if(e.tag==="FnCall"&&E(e,R.match)){na(e,t,0,r,i);return}if(e.tag==="FnCall"&&E(e,R.while)){na(e,t,0,r,i);return}if(e.tag==="FnCall"&&E(e,R.begin)){na(e,t,0,r,i);return}o.emitLine(`${r}// Warning: unhandled await pattern in remaining expressions`)}function Pc(e){if(rn(e,"return")||E(e,"return"))return!0;if(e.tag==="FnCall"){for(let t of e.args)if(Pc(t))return!0}return!1}function ch(e){let t=[];for(let n of e)if(n.isEffectRowSpread){let r=n.type;U(r)&&r.resolvedConcreteType&&(r=r.resolvedConcreteType),Gt(r)&&t.push(...r.implicitParameters)}else t.push(n);return t}function fh(e,t,n,r){var u,_,c,f,p;let i=(u=e.args)==null?void 0:u[0];if(!((_=i==null?void 0:i.$)!=null&&_.type))return;let o=Cn(i.$.type);if(!((c=o==null?void 0:o.isFuture.effects)!=null&&c.length))return;let a=ch(o.isFuture.effects),s=r.emitter,l=(f=e.args)==null?void 0:f.find(m=>A(m)&&E(m,R.using));if(l){let m=l.args;for(let h=0;h<a.length&&h<m.length;h++){let y=a[h],g=m[h];if(te(y.type)){if(y.type.forallParameters.length>0)continue;let v=G(g,n,r),T=y.label;s.emitLine(`${n}${t}->__capture.${T} = (void*)${v};`)}else Qe(y.type)&&Oc(y.type,t,n,(p=g.$)==null?void 0:p.value,r,e)}}else for(let m of a)if(te(m.type)){if(m.type.forallParameters.length>0)continue;let h=ph(m.label,r,e);h&&s.emitLine(`${n}${t}->__capture.${m.label} = (void*)${h};`)}else Qe(m.type)&&Oc(m.type,t,n,void 0,r,e)}function Oc(e,t,n,r,i,o){var s,l,u,_;let a=i.emitter;for(let c of e.fields){if(!te(c.type))continue;let f;if(i.stateMachineVariables){for(let[,p]of i.stateMachineVariables)if(p.name===c.label&&p.kind==="outer"){f=`sm->__capture.${c.label}`;break}}if(!f&&r&&bt(r)){let p=e.fields.indexOf(c),m=r.fields[p];if(m&&be(m)){let h=i.functions[m.funcId];h&&(f=h.cName)}}if(!f&&i.currentEvidenceParams){for(let p of i.currentEvidenceParams.values())if(p.fieldLabel===c.label){f=p.cParamName;break}}if(!f){let p=((s=o.$)==null?void 0:s.env)??((l=o.func.$)==null?void 0:l.env);if(p){let m=sr(p,h=>h.isImplicit===!0);for(let h=m.length-1;h>=0;h--){let y=m[h],g=(u=y.value)==null?void 0:u[y.value.length-1];if(g&&bt(g)){let v=g.type.fields.findIndex(T=>T.label===c.label);if(v>=0){let T=g.fields[v];if(T&&be(T)){let $=(_=i.functions[T.funcId])==null?void 0:_.cName;if($){f=$;break}}}}}}}f&&a.emitLine(`${n}${t}->__capture.${c.label} = (void*)${f};`)}}function ph(e,t,n){if(t.currentEvidenceParams){for(let r of t.currentEvidenceParams.values())if(r.fieldLabel===e)return r.cParamName}if(t.stateMachineVariables){for(let[,r]of t.stateMachineVariables)if(r.name===e&&r.kind==="outer")return`sm->__capture.${e}`}}var dh=new Set(["__yo_mutex_init","__yo_mutex_destroy","__yo_mutex_lock","__yo_mutex_unlock","__yo_cond_init","__yo_cond_destroy","__yo_cond_wait","__yo_cond_signal","__yo_cond_broadcast","__yo_thread_join","__yo_thread_self"]);function zc(e){var n,r,i,o,a;let t=e.emitter;t.emitDeclarationLine("// Function declarations"),t.emitDeclarationLine("/// Extern functions");for(let s in e.externFunctions){let{cName:l,type:u}=e.externFunctions[s];if(u.isExtern==="yo"){if(dh.has(l))continue;gu(u,l,!0,e);continue}u.isExtern==="c"&&u.cInclude||l.startsWith("__atomic_")||l.startsWith("__sync_")||gu(u,l,!0,e)}t.emitDeclarationLine(""),e.usesAsync&&(t.emitDeclarationLine("/// Async runtime functions"),t.emitDeclarationLine("static void __yo_async_spawn_task(void (*resume_fn)(void*), void* state_machine);"),t.emitDeclarationLine("")),t.emitDeclarationLine("/// Object constructors"),yh(e),t.emitDeclarationLine(""),t.emitDeclarationLine("/// Closure constructors"),t.emitDeclarationLine(""),t.emitDeclarationLine("/// Capture dispose functions"),gh(e),t.emitDeclarationLine(""),t.emitDeclarationLine("/// Dyn type constructors"),t.emitDeclarationLine(""),t.emitDeclarationLine("/// Regular functions");for(let s in e.functions){let{cName:l,value:u}=e.functions[s],_=l==="__yo_user_main",c=(r=(n=u.body)==null?void 0:n.$)==null?void 0:r.effectAnalysis,f=c&&c.hasEffects;if(!_&&!u.type.isClosure&&((i=u.specializedFunctionCaches)==null?void 0:i.length)>0||!_&&!f&&!u.isModuleEffectMember&&!u.type.isClosure&&!u.specializedType&&(((o=u.specializedFunctionCaches)==null?void 0:o.length)??0)===0&&_n(u.specializedType??u.type).length===0&&[...u.type.implicitParameters,...u.type.parameters.filter($=>$.isImplicit)].some($=>te($.type)))continue;let m=u.specializedType??u.type,h=_n(m).length>0;if(!_&&u.isIoAsyncStateMachineClosure||!_&&!f&&!h&&!u.isModuleEffectMember&&(ti(u.type)&&!u.type.isClosure||((a=u.specializedFunctionCaches)==null?void 0:a.length)>0&&!u.type.isClosure||Pi(u)||ci(u)||u.isIoAsyncStateMachineClosure))continue;let y=u.specializedType??u.type,g=!f&&!u.isModuleEffectMember&&(y.parameters.some($=>ze($.type))||y.forallParameters.length>0),v=ze(y.return.type),T=U(y.return.type)&&y.return.type.requiredTraits.length>0;g||v&&!T&&!u.isModuleEffectMember||gu(y,l,!1,e,u.isModuleEffectMember?void 0:u.body,u.specializedType&&_n(y).length===0&&_n(u.type).some($=>$.fieldFunctionType.forallParameters&&$.fieldFunctionType.forallParameters.length>0)?u.type:void 0)}t.emitDeclarationLine("/// Closure vtable instances"),t.emitDeclarationLine("")}function _n(e){let t=[],n=mh(e.implicitParameters);for(let r of n)Qe(r.type)?Uc(r.label,r.type,[],t):te(r.type)&&t.push({implicitLabel:r.label,fieldLabel:r.label,fieldPath:[r.label],fieldFunctionType:r.type,cParamName:Ce(r.label)});return t}function Uc(e,t,n,r){for(let i of t.fields)if(te(i.type)){let o=[...n,i.label],a=o.join("__");r.push({implicitLabel:e,fieldLabel:a,fieldPath:o,fieldFunctionType:i.type,cParamName:Ce(`${e}__${a}`)})}else Qe(i.type)&&Uc(e,i.type,[...n,i.label],r)}function mh(e){let t=[];for(let n of e)if(n.isEffectRowSpread){let r=n.type;U(r)&&r.resolvedConcreteType&&(r=r.resolvedConcreteType),Gt(r)&&t.push(...r.implicitParameters)}else t.push(n);return t}function pi(e,t,n,r,i){let o=r||H(e.return.type,n),a=e.parameters.filter(c=>!c.isCompileTimeOnly),s=[];e.isClosure&&s.push("void* closure_context");let l=a.map((c,f)=>{let p=Ce(c.label||`param${f}`);if(te(c.type))return pi(c.type,"(*)",n).replace(" (*)(",` (*${p})(`);{let m;return U(c.type)&&nt(c.type)?c.type.resolvedConcreteType?m=H(c.type.resolvedConcreteType,n)+"*":m=H(c.type,n):m=H(c.type,n),`${m} ${p}`}});s.push(...l);let u=_n(i??e);for(let c of u)if(c.fieldFunctionType.forallParameters&&c.fieldFunctionType.forallParameters.length>0)s.push(`void* ${c.cParamName}`);else{let f=pi(c.fieldFunctionType,"(*)",n).replace(" (*)(",` (*${c.cParamName})(`);s.push(f)}let _=s.join(", ");return`${o} ${t}(${_})`}function gu(e,t,n,r,i,o){var f,p,m,h;let a;if(i&&nt(e.return.type)){let y=Ga(i);(f=y==null?void 0:y.$)!=null&&f.asyncStateMachineStructName?a=`${y.$.asyncStateMachineStructName}*`:(p=i.$)!=null&&p.type&&U(i.$.type)&&nt(i.$.type)&&(a=H(i.$.type,r))}if(i&&U(e.return.type)&&!nt(e.return.type)&&(m=i.$)!=null&&m.type&&(a=H(i.$.type,r)),!a&&i&&((h=i.$)!=null&&h.type)&&!nt(e.return.type)){let y=H(e.return.type,r),g=H(i.$.type,r);y!==g&&(a=g)}let s=a?pi(e,t,r,a,o):pi(e,t,r,void 0,o),l=M(e),u=t==="__yo_user_main"||r.exportedFunctionLabels&&[...r.exportedFunctionLabels.values()].some(y=>Ce(y)===t),_=!n&&!u&&(t.includes("___drop")||t.includes("___dup")||t.includes("___dispose")),c=n?"extern ":u?"":_?"static inline __attribute__((always_inline)) ":"static inline ";r.emitter.emitDeclarationLine(`${c}${s}; // ${l}`)}function yh(e){let t=e.emitter;t.emitDeclarationLine("static inline void __yo_decr_rc(void* ptr); // Decrement reference count"),t.emitDeclarationLine("static inline void* __yo_incr_rc(void* ptr); // Increment reference count"),t.emitDeclarationLine("static void __yo_gc_register(void* ptr); // Register object for cycle detection"),t.emitDeclarationLine("static void __yo_gc_unregister(void* ptr); // Unregister object from cycle detection"),t.emitDeclarationLine("static void __yo_gc_collect(); // Trigger garbage collection"),t.emitDeclarationLine("static void __yo_gc_init_thread(); // Initialize thread-local GC state (for worker threads)"),t.emitDeclarationLine("static void __yo_cleanup_thread_gc(); // Clean up thread-local GC state"),t.emitDeclarationLine("static void __yo_init_process_cleanup(void); // Initialize process cleanup");for(let n in e.types){let{type:r,cName:i}=e.types[n];if(De(r)&&r.isReferenceSemantics){if(r.fields.some(l=>ze(l.type)))continue;let a=`__yo_new_${i}`,s=r.fields.map(l=>{let u=H(l.type,e),_=Ce(l.label);return`${u} ${_}`}).join(", ");t.emitDeclarationLine(`static ${i}* ${a}(${s}); // Constructor`)}}}function gh(e){let t=e.emitter;if(e.closureCaptureMap&&e.closureCaptureMap.size>0)for(let[n]of e.closureCaptureMap){let r=`__yo_dispose_closure_${n}`;t.emitDeclarationLine(`static void ${r}(void* closure_ptr);`)}}function Bc(e){let t=new Set;for(let n in e.functions){let{value:r,cName:i}=e.functions[n],o=r.specializedType;if(Pi(r)||!o||!Vr(r.type)||Vr(o))continue;let a=o.parameters.some(c=>ze(c.type)),s=ze(o.return.type);if(a||s||_n(r.type).some(c=>c.fieldFunctionType.forallParameters&&c.fieldFunctionType.forallParameters.length>0)||t.has(n))continue;t.add(n);let _=i.includes("___drop")||i.includes("___dup")||i.includes("___dispose")?"static inline __attribute__((always_inline)) ":"static inline ";e.emitter.emitDeclarationLine(`${_}${pi(o,i,e)}; // specialized function: ${M(r.type)}`)}}function di(e,t,n){let r=ce(t,e);return r.length===0?!1:r[r.length-1].frameLevel<=n}function Gc(e){var t,n;return!!((t=e.$)!=null&&t.closureFunctionValue&&((n=e.$)!=null&&n.type)&&Dn(e.$.type))}function hh(e,t,n,r,i,o=!1){var p;let a=Object.values(i.types).find(m=>m.type===e);if(!a)return i.emitter.emitLine(`${r}/* Error: Capture type not found for closure */`),null;let s=a.cName,l=new Map;if((p=n.$)!=null&&p.deferredDupExpressions)for(let m of n.$.deferredDupExpressions){let h=Ps(m);h&&l.set(h,m)}let u=e.fields.map(m=>{var v,T;if(m.isEffectParam)return"NULL";let h,y=m.exprs.expr;if((T=(v=y.$)==null?void 0:v.deferredDupExpressions)!=null&&T.length&&(h=y.$.deferredDupExpressions[0]),!h){let $=[m.label];j(y)&&$.push(y.token.value);for(let b of $){let C=l.get(b);if(C){h=C;break}}}if(h)return G(h,r,i);let g={tag:"Atom",token:y.token,$:y.$};return G(g,r,i)}),_=`(${s}){ ${u.map((m,h)=>{let y=e.fields[h];return y?`.${y.label} = ${m}`:`/* Error: missing field at index ${h} */`}).join(", ")} }`,c=n.token.position.row!==void 0?`${Date.now()}_${n.token.position.row}`:`${Date.now()}_${Math.random().toString(36).substr(2,9)}`,f=`__capture_${t}_${c}`;return o?i.emitter.emitLine(`${r}${s} ${f} = ${_};`):(i.emitter.emitLine(`${r}${s}* ${f} = (${s}*)__yo_malloc(sizeof(${s}));`),i.emitter.emitLine(`${r}*${f} = ${_};`)),{captureTempVar:f,captureCName:s}}function Wc(e,t,n){var m;if(!e.$||!e.$.type||!e.$.closureFunctionValue)return"// Error: Missing closure metadata";let r=Yn(e.$.type),i=r.isFn.callType,o=e.$.closureFunctionValue,a=e.$.captureType,s=(m=n.functions[o.funcId])==null?void 0:m.cName;if(!s)return"// Error: Closure implementation function not found in context";let l=at(e.$.type),u;if(l){let h=n.types[e.$.type.id];if(!h)return"// Error: Dyn closure type not found in context";u=h.cName}let _=a&&De(a)&&a.fields.length>0,c=H(i.return.type,n),f=i.parameters.map(h=>H(h.type,n)).join(", "),p=`(${c} (*)(void*${f?", "+f:""}))${s}`;if(_&&a&&De(a)){let h=!l,y=hh(a,i.id,e,t,n,h);if(!y)return"// Error: Failed to allocate closure capture";let{captureTempVar:g}=y;if(l){let v=`__yo_create_${u}`,T=`__yo_dispose_${u}`;return`${v}(${g}, ${T}, ${p})`}else return n.implClosureCallMap.set(a.id,{functionCName:s,callTypeId:r.isFn.callType.id,callType:r.isFn.callType}),g}else if(l){let h=`__yo_create_${u}`,y=`__yo_dispose_${u}`;return`${h}(NULL, ${y}, ${p})`}else{if(e.$.type.tag==="SomeType"){let h=e.$.type;if(h.resolvedConcreteType)return n.implClosureCallMap.set(h.resolvedConcreteType.id,{functionCName:s,callTypeId:r.isFn.callType.id,callType:r.isFn.callType}),`(${H(h.resolvedConcreteType,n)}){}`}return"// Error: Impl(Fn(...)) without captures missing resolvedConcreteType"}}function hu(e,t,n){if(e.pendingDeferredDrops&&e.loopBodyDropsBaselineCount!==void 0){let r=e.loopBodyDropsBaselineCount,i=e.pendingDeferredDrops.length,o=e.pendingDeferredDrops.slice(0,i-r);for(let a of o){let s=G(a,t,n);s&&n.emitter.emitLine(`${t}${s};`)}}}function ra(e,t,n=""){var a,s,l,u,_,c,f,p,m,h,y,g,v,T,$,b,C,k,F,S,V,N,x,I,D,z,O,J,B;let r=t;if(e.token.value==="continue"){if(r.currentContinueLabel)return hu(r,n,t),`goto ${r.currentContinueLabel}`;if(r.currentLoopLabel)return hu(r,n,t),"continue";if(r.smWhileContinueInfo){if(r.smWhileContinueInfo.emitDropsBeforeGoto&&r.smWhileBodyDrops&&r.smWhileBodyDrops.length>0){let W=t.emitter;for(let q of r.smWhileBodyDrops){let X=G(q,n,t);X&&X.includes("sm->")&&W.emitLine(`${n}${X};`)}}if(r.smWhileContinueInfo.stepExpr){let W=t.emitter,q=G(r.smWhileContinueInfo.stepExpr,n,t);q&&W.emitLine(`${n}${q};`)}return`goto ${r.smWhileContinueInfo.label}`}return"continue"}if(e.token.value==="break"){if(r.currentLoopLabel)return hu(r,n,t),r.insideMatch?`goto ${r.currentLoopLabel}`:"break";if(r.smWhileBreakInfo){let{label:W,activeIndex:q}=r.smWhileBreakInfo;if(r.smWhileBodyDrops&&r.smWhileBodyDrops.length>0){let X=t.emitter;for(let _e of r.smWhileBodyDrops){let me=G(_e,n,t);me&&me.includes("sm->")&&X.emitLine(`${n}${me};`)}}return q!==void 0?(t.emitter.emitLine(`${n}sm->while_loop_${q}_active = false;`),`goto ${W}`):`goto ${W}`}return"break"}if(e.token.value==="return"){if(r.inAsyncStateMachine){let W=t.emitter,q=r.inAsyncStateMachine.futureType,_e=Cn(q).isFuture.outputType,me=Pe(_e);if((a=e.$)!=null&&a.deferredDropExpressions)for(let re of e.$.deferredDropExpressions){let se=G(re,n,t);se&&se.includes("sm->")&&W.emitLine(`${n}${se};`)}if(r.pendingDeferredDrops&&r.pendingDeferredDrops.length>0){W.emitLine(`${n}// Drop local variables before early completion`);for(let re of r.pendingDeferredDrops){let se=G(re,n,t);se&&se.includes("sm->")&&W.emitLine(`${n}${se};`)}}W.emitLine(`${n}// Early return - complete the result Future`);let Q=me?void 0:`(${H(_e,t)}){0}`;return ki({emitter:W,indent:n,resultCode:Q,debugLabel:t.currentFunctionName}),""}return"return"}if((s=e.$)!=null&&s.type&&Pe(e.$.type))return"";if((r.inAsyncStateMachine||r.inEffectStateMachine)&&r.stateMachineVariables){let W=e.token.value;if((l=r.localShadowedVariables)!=null&&l.has(W))return Ce(W);let q=!1;if((u=e.$)!=null&&u.env){let X=ce(e.$.env,W);if(X.length>0){let _e=X[X.length-1],me=_e.isOwningTheSameRcValueAs?_e.isOwningTheSameRcValueAs.id:_e.id;(_=r.variableIdRemapping)!=null&&_.has(me)&&(me=r.variableIdRemapping.get(me));let Q=r.stateMachineVariables.get(me);if(Q){let re=(c=r.stateMachineFieldAliases)==null?void 0:c.get(me);if(re)return q=!0,`sm->${re}`;let se=Q.kind==="outer"?`__capture.${W}`:`var_${Q.id}`;return q=!0,`sm->${se}`}}}if(!q){for(let[X,_e]of r.stateMachineVariables)if(_e.name===W){let me=(f=r.stateMachineFieldAliases)==null?void 0:f.get(X);if(me)return q=!0,`sm->${me}`;let Q=_e.kind==="outer"?`__capture.${W}`:`var_${X}`;return q=!0,`sm->${Q}`}}if((p=e.$)!=null&&p.env){let X=ce(e.$.env,W);if(X.length>0){let _e=X[X.length-1];if(_e.isOwningTheSameRcValueAs){let me=_e.isOwningTheSameRcValueAs.name,Q=_e.isOwningTheSameRcValueAs.id;for(let[re,se]of r.stateMachineVariables)if(se.name===me||re===Q)return`sm->${se.kind==="outer"?`__capture.${me}`:`var_${re}`}`}}}if(r.currentClosureCaptures&&r.currentClosureCaptures.includes(W)&&r.currentClosureCaptureFrameLevel!==void 0){let X=r.currentClosureCaptureTypeCName;return X?`((${X}*)closure_context)->${Ye(W,(m=e.$)==null?void 0:m.env)}`:`closure_context->${Ye(W,(h=e.$)==null?void 0:h.env)}`}if((y=e.$)!=null&&y.variableName){if((g=e.$)!=null&&g.env&&((v=e.$)!=null&&v.value)&&!Se(e.$.value)){let X=ce(e.$.env,e.$.variableName);if(X.length>0&&X[X.length-1].isCompileTimeOnly)return Gn(e.$.value,t,e)}return Ye(e.$.variableName,e.$.env)}}if((T=e.$)!=null&&T.variableName){if(($=e.$)!=null&&$.env&&((b=e.$)!=null&&b.value)&&!Se(e.$.value)){let W=ce(e.$.env,e.$.variableName);if(W.length>0&&W[W.length-1].isCompileTimeOnly)return Gn(e.$.value,t,e)}if(!(r.currentClosureCaptures&&r.currentClosureCaptures.includes(e.token.value)&&((C=e.$)!=null&&C.env)&&r.currentClosureCaptureFrameLevel!==void 0&&di(e.token.value,e.$.env,r.currentClosureCaptureFrameLevel)))return Ye(e.$.variableName,(k=e.$)==null?void 0:k.env)}if((F=e.$)!=null&&F.value&&!Se(e.$.value))return Gn(e.$.value,t,e);let i=(S=e.$)!=null&&S.env&&r.currentClosureCaptureFrameLevel!==void 0?di(e.token.value,e.$.env,r.currentClosureCaptureFrameLevel):!1;if(r.currentClosureCaptures&&r.currentClosureCaptures.includes(e.token.value)&&r.currentClosureCaptureFrameLevel!==void 0&&(!((V=e.$)!=null&&V.env)||i)){let W=r.currentClosureCaptureTypeCName;return W?`((${W}*)closure_context)->${Ye(e.token.value,(N=e.$)==null?void 0:N.env)}`:`closure_context->${Ye(e.token.value,(x=e.$)==null?void 0:x.env)}`}if(r.currentFunctionName&&!r.currentClosureCaptures){let W=Object.values(r.functions).find(q=>q.cName===r.currentFunctionName);if(W&&W.value.type.isClosure){let q=Object.values(r.types).find(X=>te(X.type)&&X.type.isClosure&&X.type===W.value.type);if(q)return`((${`${q.cName}_capture`}*)closure_context->data)->${Ye(e.token.value,(I=e.$)==null?void 0:I.env)}`}}if((D=e.$)!=null&&D.env){let W=ce(e.$.env,e.token.value);if(W.length>0){let q=W[W.length-1];if((z=q.value)!=null&&z[0]&&be(q.value[0])){let X=(O=t.functions[q.value[0].funcId])==null?void 0:O.cName;if(X)return X}else if(te(q.type)&&(Se((J=q.value)==null?void 0:J[0])||q.value===void 0)){let X=Object.entries(t.functions).find(([_e,me])=>me.value.funcName===e.token.value);if(X)return X[1].cName}}}return Ye(e.token.value,(B=e.$)==null?void 0:B.env)}function Yc(e,t,n){var y,g,v,T,$,b,C,k,F,S,V,N,x,I,D,z,O,J,B,W;let r;if(An(e)){let q=(g=(y=e.$)==null?void 0:y.runtimeArgExprsInOrder)==null?void 0:g[0],X=(v=q==null?void 0:q.$)==null?void 0:v.closureFunctionValue;X&&be(X)&&(r=X.body)}else r=e.args[0];if(!r)return"/* Error: async requires exactly 1 argument */";let i=(T=e.$)==null?void 0:T.type;if(!i||!nt(i))return"/* Error: async block must have Future type */";let o=Cn(i);if(!o)return"/* Error: Could not extract Future module type */";let a=(($=e.$)==null?void 0:$.variableName)||`async_block_${Date.now()}`,s=`${a}_state_t`,l=`${a}_resume`,u=`__yo_new_${a}`,_=`${a}_state_dispose`;n.types[i.id]={type:i,cName:s};let c=(b=e.$)==null?void 0:b.awaitAnalysis;if(!c)throw new Error("Missing await analysis for async block. This should have been computed during evaluation.");let f=o.isFuture.outputType;if(U(f))if(f.resolvedConcreteType)f=f.resolvedConcreteType;else{let q=(k=(C=e.$)==null?void 0:C.runtimeArgExprsInOrder)==null?void 0:k[0],X=(F=q==null?void 0:q.$)==null?void 0:F.closureFunctionValue;if(X&&be(X)){let _e=(V=(S=X.type)==null?void 0:S.return)==null?void 0:V.type;if(_e&&U(_e)&&_e.resolvedConcreteType)f=_e.resolvedConcreteType;else if((x=(N=X.body)==null?void 0:N.$)!=null&&x.type){let me=X.body.$.type;U(me)&&me.resolvedConcreteType?f=me.resolvedConcreteType:U(me)||(f=me)}}}let p=H(f,n),m=n.emitter;if(m.emitDeclarationLine(`void ${_}(void* sm_ptr); // Dispose function for state machine`),m.emitDeclarationLine(""),m.emitDeclarationLine(`void ${l}(${s}* sm);`),m.emitDeclarationLine(""),(I=e.$)!=null&&I.captureType){let q=e.$.captureType,X=Object.values(n.types).find(me=>me.type===q),_e=X?X.cName:`async_capture_${q.id}`;m.emitDeclarationLine(`${s}* ${u}(${_e} __capture);`)}else m.emitDeclarationLine(`${s}* ${u}();`);m.emitDeclarationLine(""),n.deferredAsyncBlocks||(n.deferredAsyncBlocks=[]),n.deferredAsyncBlocks.push({bodyExpr:r,asyncBlockId:a,structName:s,resumeFunctionName:l,constructorName:u,disposeFunctionName:_,futureType:i,futureModuleType:o,resultType:f,resultTypeCName:p,captureType:(D=e.$)==null?void 0:D.captureType,analysis:c});let h=(z=e.$)==null?void 0:z.captureType;if(h){let q=Object.values(n.types).find(ae=>ae.type===h),X=q?q.cName:`async_capture_${h.id}`,_e=n,me=_e.currentClosureCaptures!==void 0||_e.inAsyncStateMachine!==void 0||_e.inEffectStateMachine!==void 0,Q=!1,re=h.fields.map(ae=>{var de,he;if(ae.isEffectParam)return`.${ae.label} = NULL`;let Le;if(!me&&((de=e.$)!=null&&de.deferredDupExpressions))for(let xe of e.$.deferredDupExpressions){let it;if(A(xe)&&(xe.args.length>0&&j(xe.args[0])?it=xe.args[0].token.value:xe.args.length===0&&A(xe.func)&&E(xe.func,".")&&xe.func.args.length>=2&&j(xe.func.args[0])&&(it=xe.func.args[0].token.value)),it===ae.label){Le=xe;break}}if(Le)return Q=!0,(he=Le.$)!=null&&he.variableName?(G(Le,t,n),`.${ae.label} = ${Le.$.variableName}`):`.${ae.label} = ${G(Le,t,n)}`;let oe={tag:"Atom",token:ae.exprs.expr.token,$:ae.exprs.expr.$};return`.${ae.label} = ${ra(oe,n)}`}).join(", "),se=`(${X}){${re}}`;if(!Q){let ae=br(h,n);ae&&(se=`${ae}(${se})`)}let Me=((O=e.$)==null?void 0:O.variableName)||"async_result",Fe=`${u}(${se})`;if(Me&&((J=e.$)!=null&&J.type)){let ae=qt(e.$.type,Me,n);return n.emitter.emitLine(`${t}${ae} = ${Fe};`),Me}else return Fe}else{let q=((B=e.$)==null?void 0:B.variableName)||"async_result",X=`${u}()`;if(q&&((W=e.$)!=null&&W.type)){let _e=qt(e.$.type,q,n);return n.emitter.emitLine(`${t}${_e} = ${X};`),q}else return X}}function qc(e,t){var y;let n=t.emitter,{asyncBlockId:r,structName:i,resultType:o,resultTypeCName:a,captureType:s,analysis:l,crossBoundaryIds:u,awaitFutureTempVarAliases:_,overlappingSlotAliases:c,overlappingSlots:f}=e;if(n.emitDeclarationLine(`// State machine for async block ${r} - implements Future(${M(o)})`),n.emitDeclarationLine(`struct ${i}_struct {`),n.emitDeclarationLine(" __yo_ref_header_t header; // Reference counting header (must be first)"),n.emitDeclarationLine(" int state; // Current state (0 = cold, 1..N = intermediate, -1 = completed, -2 = aborted)"),Pe(o)?n.emitDeclarationLine(" uint8_t result; // Dummy result for unit type"):n.emitDeclarationLine(` ${a} result; // The result value of type ${M(o)}`),n.emitDeclarationLine(" void (*continuation_fn)(void*); // Resume function of awaiting task"),n.emitDeclarationLine(" void* continuation_sm; // State machine of awaiting task"),n.emitDeclarationLine(""),n.emitDeclarationLine(" void (*__yo_resume_fn)(void*); // Resume function pointer (for lazy start at await/spawn)"),n.emitDeclarationLine(""),s){let g=Object.values(t.types).find(T=>T.type===s),v=g?g.cName:`async_capture_${s.id}`;n.emitDeclarationLine(" // Captured variables from outer scope"),n.emitDeclarationLine(` ${v} __capture;`),n.emitDeclarationLine("")}let p=l.capturedVariables.filter(g=>g.kind!=="outer");if(u&&(p=p.filter(g=>u.has(g.id)&&!(_!=null&&_.has(g.id))&&!(c!=null&&c.has(g.id)))),p.length>0){n.emitDeclarationLine(" // Local variables");for(let g of p){let v=H(g.type,t),T=qn(g.id,"local");n.emitDeclarationLine(` ${v} ${T}; // ${g.name}`)}n.emitDeclarationLine("")}if(f&&f.length>0){n.emitDeclarationLine(" // Overlapping storage slots (Phase 2)");for(let g of f)n.emitDeclarationLine(` ${g.cType} ${g.fieldName}; // shared: ${g.variableNames.join(", ")}`);n.emitDeclarationLine("")}if(l.awaitPoints.length>0){let g=[];for(let v of l.awaitPoints)if(!(Pe(v.resultType)||U(v.resultType)&&!v.resultType.resolvedConcreteType)&&v.isInsideCond){let b=v.resultType;if(v.futureType){let k=Cn(v.futureType);k&&(b=k.isFuture.outputType)}let C=H(b,t);g.push(` ${C} await_result_${v.index};`)}if(g.length>0){n.emitDeclarationLine(" // Await result temporaries");for(let v of g)n.emitDeclarationLine(v);n.emitDeclarationLine("")}}if(l.awaitPoints.length>0){let g=l.awaitPoints.filter(v=>v.futureVariableId===void 0);if(g.length>0){n.emitDeclarationLine(" // Future references for awaits");for(let v of g){let T=v.expr;if(T.tag!=="FnCall")continue;let $=T.args[0],b=(y=$==null?void 0:$.$)==null?void 0:y.type;if(!b)throw new Error(`Internal error: await expression missing type info for future argument in async block ${r}`);let C=H(b,t);n.emitDeclarationLine(` ${C} await_future_${v.index};`)}n.emitDeclarationLine("")}}let m=l.awaitPoints.filter(g=>g.needsOwnCondBranchField);if(m.length>0){n.emitDeclarationLine(" // Branch tracking for cond expressions with await");for(let g of m)n.emitDeclarationLine(` int cond_branch_${g.index}; // Which branch was taken in cond with await ${g.index}`);n.emitDeclarationLine("")}let h=l.awaitPoints.filter(g=>g.isInsideWhile);if(h.length>0){n.emitDeclarationLine(" // Loop state tracking for while loops with await");let g=l.awaitPoints.length;for(let v of h){n.emitDeclarationLine(` _Bool while_loop_${v.index}_active; // Whether while loop ${v.index} should continue`);let T=(v.whileNestingDepth??1)-1;for(let $=0;$<T;$++)n.emitDeclarationLine(` _Bool while_loop_${g}_active; // Whether outer while loop ${g} should continue`),g++}n.emitDeclarationLine("")}n.emitDeclarationLine("};"),n.emitDeclarationLine("")}function vh(e){var l;if(!e.deferredAsyncBlocks||e.deferredAsyncBlocks.length===0)return;let t=e.deferredAsyncBlocks,n=new Map;for(let u of t)n.set(u.structName,u);let r=new Map,i=new Map;for(let u of t)r.set(u.structName,new Set),i.set(u.structName,0);for(let u of t){let _=c=>{let f=r.get(c);f.has(u.structName)||(f.add(u.structName),i.set(u.structName,(i.get(u.structName)??0)+1))};for(let c of u.analysis.capturedVariables){let f;try{f=H(c.type,e)}catch{continue}let p=n.get(f);p&&p.structName!==u.structName&&_(p.structName)}for(let c of u.analysis.awaitPoints){if(c.futureVariableId!==void 0)continue;let f=c.expr;if(f.tag!=="FnCall")continue;let p=f.args[0],m=(l=p==null?void 0:p.$)==null?void 0:l.type;if(!m)continue;let h;try{h=H(m,e)}catch{continue}let y=n.get(h);y&&y.structName!==u.structName&&_(y.structName)}}let o=[];for(let[u,_]of i.entries())_===0&&o.push(u);let a=[];for(;o.length>0;){let u=o.shift();a.push(u);let _=r.get(u);if(_)for(let c of _){let f=(i.get(c)??0)-1;i.set(c,f),f===0&&o.push(c)}}let s=a.length===t.length?a.map(u=>n.get(u)).filter(Boolean):t;for(let u of s){let{crossBoundaryIds:_,awaitFutureTempVarAliases:c,variableSegments:f}=zs(u.bodyExpr,u.analysis),{slotAliases:p,slots:m}=Us(_,f,u.analysis.capturedVariables,c,e);qc({asyncBlockId:u.asyncBlockId,structName:u.structName,resultType:u.resultType,resultTypeCName:u.resultTypeCName,captureType:u.captureType,analysis:u.analysis,crossBoundaryIds:_,awaitFutureTempVarAliases:c,overlappingSlotAliases:p,overlappingSlots:m},e)}}function Th(e,t,n,r,i,o,a,s,l,u){var c;let _=u.emitter;if(_.emitLine(`// Dispose function for async block ${e} state machine`),_.emitLine("// Called by __yo_decr_rc when refcount hits 0 - do NOT call __yo_free here"),_.emitLine(`void ${n}(void* sm_ptr) {`),_.emitLine(` ${t}* sm = (${t}*)sm_ptr;`),_.emitLine(` ASYNC_DEBUG("${n}: Disposing state machine\\n");`),_.emitLine(""),i&&ut(i)){let f=Object.values(u.types).find(p=>p.type===i);if(!f)_.emitLine(" /* Error: capture struct type not found in context */");else{let p=f.cName,m=i.trait.fields.find(h=>h.label===w.___drop[0]);if(m&&m.assignedValue&&be(m.assignedValue)){let h=(c=u.functions[m.assignedValue.funcId])==null?void 0:c.cName;h&&(_.emitLine(' ASYNC_DEBUG(" Dropping capture struct\\n");'),_.emitLine(` ${h}(sm->__capture);`))}else _.emitLine(` /* Warning: ___drop function not found for capture struct ${p} */`)}}if(_.emitLine(""),!Pe(r)&&ut(r)){let f=H(r,u);_.emitLine(" // Drop result field if it was set (state == -1 means completed)"),_.emitLine(" int final_state = sm->state;"),_.emitLine(" if (final_state == -1) {"),_.emitLine(' ASYNC_DEBUG(" Dropping result field\\n");');let p=fi(r,u);p?_.emitLine(` ${p}(sm->result);`):_.emitLine(` /* Warning: No ___drop function found for result type ${f} */`),_.emitLine(" }")}_.emitLine("");{let f=[];for(let p of o.capturedVariables){if(p.kind!=="local"||!s.has(p.id)||l.has(p.id)||p.isOwningTheSameRcValueAs!==void 0)continue;let h=`sm->${qn(p.id,"local")}`;if(at(p.type))f.push(` if ((${h}).data != NULL) { __yo_decr_rc((void*)(${h}).data); }`);else if(mn(p.type)||fn(p.type))f.push(` if (${h} != NULL) { __yo_decr_rc_atomic((void*)${h}); }`);else if(Qt(p.type)||U(p.type)&&Qn(p.type)){let y=fi(p.type,u);y?f.push(` if (${h} != NULL) { ${y}(${h}); }`):f.push(` if (${h} != NULL) { __yo_decr_rc((void*)${h}); }`)}else if(ut(p.type)){let y=fi(p.type,u);y&&f.push(` ${y}(${h});`)}}if(f.length>0){_.emitLine(" // Drop local variables on escape (state == -2)"),_.emitLine(" if (sm->state == -2) {");for(let p of f)_.emitLine(p);_.emitLine(" }")}}_.emitLine(" // Memory freed by __yo_decr_rc after this function returns"),_.emitLine("}")}function Eh(e,t,n,r,i,o,a,s,l,u){let _=u.emitter;if(l){let c=Object.values(u.types).find(p=>p.type===l),f=c?c.cName:`async_capture_${l.id}`;_.emitLine(`${t}* ${r}(${f} __capture) {`)}else _.emitLine(`${t}* ${r}() {`);if(_.emitLine(" // Allocate async block state machine (heap-backed, ref-counted)"),_.emitLine(` ${t}* sm = (${t}*)__yo_malloc(sizeof(${t}));`),_.emitLine(` memset(sm, 0, sizeof(${t}));`),_.emitLine(""),_.emitLine(" // Initialize reference counting header"),_.emitLine(" sm->header.ref_count = 1; // Caller owns initial reference"),_.emitLine(` GC_DEBUG("AsyncBlock ${t}: Created ptr=%p RC=1\\n", (void*)sm);`),u.needsCycleGC&&(_.emitLine(" sm->header.gc_flags = 0;"),_.emitLine(" sm->header.gc_mark = __YO_GC_UNMARKED;"),_.emitLine(" sm->header.gc_next = NULL;"),_.emitLine(" sm->header.gc_prev = NULL;")),u.needsCycleGC)_.emitLine(` sm->header.dispose_fn = (void(*)(void*))${i};`);else{u.disposeTypeIds||(u.disposeTypeIds=new Map,u.nextDisposeTypeId=1);let c=u.disposeTypeIds.get(i);c===void 0&&(c=u.nextDisposeTypeId,u.nextDisposeTypeId=c+1,u.disposeTypeIds.set(i,c)),_.emitLine(` sm->header.type_id = ${c};`)}u.needsCycleGC&&_.emitLine(" sm->header.traverse_fn = NULL; // TODO: Add traverse for cycle detection if needed"),_.emitLine(""),_.emitLine(" sm->state = 0;"),_.emitLine(" sm->continuation_fn = NULL;"),_.emitLine(" sm->continuation_sm = NULL;"),_.emitLine(""),l&&(_.emitLine(" // Initialize captured variables"),_.emitLine(" sm->__capture = __capture;"),_.emitLine("")),_.emitLine(" // Initialize result (will be set when async block completes)"),Pe(a)?_.emitLine(" // Result is unit type, no initialization needed"):_.emitLine(` memset(&sm->result, 0, sizeof(${s}));`),_.emitLine(""),_.emitLine(` sm->__yo_resume_fn = (void(*)(void*))${n};`),_.emitLine(""),_.emitLine(" return sm;"),_.emitLine("}"),_.emitLine("")}function Hc(e){if(!e.deferredAsyncBlocks||e.deferredAsyncBlocks.length===0)return;let t=e.emitter;vh(e),t.emitLine("// Deferred async block implementations");let n=0;for(;n<e.deferredAsyncBlocks.length;){let r=e.deferredAsyncBlocks[n],i=e.deferredAsyncBlocks.length,{bodyExpr:o,asyncBlockId:a,structName:s,resumeFunctionName:l,constructorName:u,disposeFunctionName:_,futureType:c,resultType:f,resultTypeCName:p,captureType:m,analysis:h}=r,y=e.stateMachineVariables,g=e.currentEvidenceParams,v=new Map,{crossBoundaryIds:T,awaitFutureTempVarAliases:$,variableSegments:b}=zs(o,h),{slotAliases:C}=Us(T,b,h.capturedVariables,$,e),k=h.capturedVariables.filter(x=>x.kind==="outer"||T.has(x.id)||$.has(x.id)||C.has(x.id)),F={...h,capturedVariables:k};for(let x of k)v.set(x.id,x);if(m)for(let x of m.fields)v.set(x.label,{id:x.label,name:x.label,type:x.type,kind:"outer",isOwningTheSameRcValueAs:void 0});e.stateMachineVariables=v;let S=e.stateMachineFieldAliases,V=new Map($);for(let[x,I]of C)V.set(x,I);e.stateMachineFieldAliases=V;let N=Rc(o,a,s,l,F,c,m,e);if(e.stateMachineVariables=y,e.currentEvidenceParams=g,e.stateMachineFieldAliases=S,t.emitLine(""),Th(a,s,_,f,m,F,N,T,$,e),t.emitLine(""),Eh(a,s,l,u,_,c,f,p,m,e),t.emitLine(""),e.deferredAsyncBlocks.length>i){let x=e.deferredAsyncBlocks.slice(i);for(let I of x){let{crossBoundaryIds:D,awaitFutureTempVarAliases:z,variableSegments:O}=zs(I.bodyExpr,I.analysis),{slotAliases:J,slots:B}=Us(D,O,I.analysis.capturedVariables,z,e);qc({asyncBlockId:I.asyncBlockId,structName:I.structName,resultType:I.resultType,resultTypeCName:I.resultTypeCName,captureType:I.captureType,analysis:I.analysis,crossBoundaryIds:D,awaitFutureTempVarAliases:z,overlappingSlotAliases:J,overlappingSlots:B},e)}}n++}}function jc(e){for(let t in e.functions){let{value:n}=e.functions[t];n.body&&Kc(n.body,e)}}var $h=["__yo_poll_","__yo_fs_event_","__yo_async_"];function bh(e){return $h.some(t=>e.startsWith(t))}function Kc(e,t){var n,r,i,o,a,s,l;if(e&&A(e)){let u=e;if(An(e)){t.usesAsync=!0;let _=(n=e.$)==null?void 0:n.type;if(_&&nt(_)&&Cn(_)){let p=`${((r=e.$)==null?void 0:r.variableName)||`async_block_${Date.now()}`}_state_t`;e.$&&(e.$.asyncStateMachineStructName=p),t.types[_.id]={type:_,cName:p},t.emitter.emitDeclarationLine(`typedef struct ${p}_struct ${p}; // Forward declaration for async state machine`)}}if(An(e)){let _=(i=e.$)==null?void 0:i.type;if(_&&nt(_)&&Cn(_)){let f=((o=e.$)==null?void 0:o.variableName)||`io_async_block_${Date.now()}`,p=!!((a=e.$)!=null&&a.awaitAnalysis),m=p?`${f}_state_t`:`${f}_sync_fut_t`;e.$&&(e.$.asyncStateMachineStructName=m),t.types[_.id]={type:_,cName:m},t.emitter.emitDeclarationLine(`typedef struct ${m}_struct ${m}; // Forward declaration for io.async ${p?"state machine":"sync future"}`)}}(ar(e)||ws(e))&&(t.usesAsync=!0);{let _=(s=u.func.$)==null?void 0:s.type;_&&"isExtern"in _&&_.isExtern==="yo"&&"externName"in _&&typeof _.externName=="string"&&bh(_.externName)&&(t.usesAsync=!0)}{let _=(l=u.func.$)==null?void 0:l.type;_&&"isExtern"in _&&_.isExtern==="yo"&&"externName"in _&&typeof _.externName=="string"&&(_.externName==="__yo_thread_spawn"||_.externName==="__yo_worker_spawn")&&(t.usesParallelism=!0)}for(let _ of u.args)Kc(_,t)}}function Xc(e,t,n){var k,F,S,V,N,x,I,D,z,O,J,B;let r=(k=e.$)==null?void 0:k.type;if(!r||!nt(r))return"/* Error: io.async must return a Future type */";let i=Cn(r);if(!i)return"/* Error: Could not extract Future module type */";let o=i.isFuture.outputType;if(U(o))if(o.resolvedConcreteType)o=o.resolvedConcreteType;else{let W=(S=(F=e.$)==null?void 0:F.runtimeArgExprsInOrder)==null?void 0:S[0],q=(V=W==null?void 0:W.$)==null?void 0:V.closureFunctionValue;if(q&&be(q)){let X=(x=(N=q.type)==null?void 0:N.return)==null?void 0:x.type;if(X&&U(X)&&X.resolvedConcreteType)o=X.resolvedConcreteType;else if((D=(I=q.body)==null?void 0:I.$)!=null&&D.type){let _e=q.body.$.type;U(_e)&&_e.resolvedConcreteType?o=_e.resolvedConcreteType:U(_e)||(o=_e)}}}let a=H(o,n),s=(z=e.$)==null?void 0:z.asyncStateMachineStructName;if(!s)return"/* Error: Missing sync future struct name */";let l=`${s}_dispose`,u=`${s}_resume`,_=n.emitter,c=(J=(O=e.$)==null?void 0:O.runtimeArgExprsInOrder)==null?void 0:J[0];if(!(c!=null&&c.$))return"/* Error: Missing closure argument for io.async */";let f=G(c,t,n),p=c.$.type,m,h;if(U(p)&&p.resolvedConcreteType){let W=p.resolvedConcreteType,q=n.implClosureCallMap.get(W.id);q&&(m=q.functionCName);let X=n.types[W.id];X&&(h=X.cName)}if(!m||!h)return"/* Error: no closure function or capture type for io.async sync path */";_.emitDeclarationLine(`struct ${s}_struct {`),_.emitDeclarationLine(" __yo_ref_header_t header;"),_.emitDeclarationLine(" int state;"),Pe(o)?_.emitDeclarationLine(" uint8_t result;"):_.emitDeclarationLine(` ${a} result;`),_.emitDeclarationLine(" void (*continuation_fn)(void*);"),_.emitDeclarationLine(" void* continuation_sm;"),_.emitDeclarationLine(" void (*__yo_resume_fn)(void*);"),_.emitDeclarationLine(` ${h} __capture;`),_.emitDeclarationLine("};"),_.emitDeclarationLine("");let y="";for(let W in n.functions){let q=n.functions[W];if(q.cName===m){let X=_n(q.value.type);X.length>0&&(y=", "+X.map(_e=>`(void*)sm->__capture.${_e.fieldPath.join(".")}`).join(", "));break}}_.emitDeclarationLine(`void ${u}(void* ptr) {`),_.emitDeclarationLine(` ${s}* sm = (${s}*)ptr;`),Pe(o)?_.emitDeclarationLine(` ${m}(&sm->__capture${y});`):_.emitDeclarationLine(` sm->result = ${m}(&sm->__capture${y});`),y&&(_.emitDeclarationLine(" if (__yo_effect_escaped) {"),_.emitDeclarationLine(" __yo_effect_escaped = 0;"),_.emitDeclarationLine(" sm->state = -2;"),_.emitDeclarationLine(" __yo_decr_rc(ptr);"),_.emitDeclarationLine(" return;"),_.emitDeclarationLine(" }")),_.emitDeclarationLine(" sm->state = -1;"),_.emitDeclarationLine(" void (*continuation)(void*) = sm->continuation_fn;"),_.emitDeclarationLine(" if (continuation) {"),_.emitDeclarationLine(" void* cont_sm = sm->continuation_sm;"),_.emitDeclarationLine(" continuation(cont_sm);"),_.emitDeclarationLine(" }"),_.emitDeclarationLine(" __yo_decr_rc(ptr);"),_.emitDeclarationLine("}"),_.emitDeclarationLine("");let g=c.$.captureType,v=g&&ut(g)?fi(g,n):void 0,T=g&&ut(g)?br(g,n):void 0,$=fi(o,n);_.emitDeclarationLine(`void ${l}(void* ptr) {`),(v||$)&&(_.emitDeclarationLine(` ${s}* sm = (${s}*)ptr;`),v&&(_.emitDeclarationLine(" // Drop captured variables (future owns its references)"),_.emitDeclarationLine(` ${v}(sm->__capture);`)),$&&(_.emitDeclarationLine(" if (sm->state == -1) {"),_.emitDeclarationLine(` ${$}(sm->result);`),_.emitDeclarationLine(" }"))),_.emitDeclarationLine("}"),_.emitDeclarationLine("");let b=((B=e.$)==null?void 0:B.variableName)||"__io_async_result",C=qt(r,b,n);if(_.emitLine(`${t}${C} = (${s}*)__yo_malloc(sizeof(${s}));`),_.emitLine(`${t}memset(${b}, 0, sizeof(${s}));`),_.emitLine(`${t}${b}->header.ref_count = 1;`),n.needsCycleGC&&(_.emitLine(`${t}${b}->header.gc_flags = 0;`),_.emitLine(`${t}${b}->header.gc_mark = __YO_GC_UNMARKED;`),_.emitLine(`${t}${b}->header.gc_next = NULL;`),_.emitLine(`${t}${b}->header.gc_prev = NULL;`)),n.needsCycleGC)_.emitLine(`${t}${b}->header.dispose_fn = (void(*)(void*))${l};`);else{n.disposeTypeIds||(n.disposeTypeIds=new Map,n.nextDisposeTypeId=1);let W=n.disposeTypeIds.get(l);W===void 0&&(W=n.nextDisposeTypeId,n.nextDisposeTypeId=W+1,n.disposeTypeIds.set(l,W)),_.emitLine(`${t}${b}->header.type_id = ${W};`)}return n.needsCycleGC&&_.emitLine(`${t}${b}->header.traverse_fn = NULL;`),_.emitLine(`${t}${b}->__capture = ${f};`),T&&_.emitLine(`${t}${b}->__capture = ${T}(${b}->__capture);`),_.emitLine(`${t}${b}->state = 0;`),_.emitLine(`${t}${b}->__yo_resume_fn = ${u};`),_.emitLine(`${t}${b}->continuation_fn = NULL;`),_.emitLine(`${t}${b}->continuation_sm = NULL;`),b}function Qc(e,t){for(let i=0;i<e.fields.length;i++){let o=e.fields[i];be(o)&&(Fi(o.type,t),Ui(o.body,t))}if(t.moduleLevelInitExprs)for(let i of t.moduleLevelInitExprs)Ui(i,t);let n=new Set,r=!0;for(;r;){r=!1;for(let i in t.functions){if(n.has(i))continue;n.add(i),r=!0;let o=t.functions[i];if(Fi(o.value.type,t),o.value.specializedType&&Fi(o.value.specializedType,t),Ui(o.value.body,t),o.value.calledComptimeFunctionCaches)for(let a of o.value.calledComptimeFunctionCaches)a.value&&a.value.type&&kn(a.value.type,t),Ui(a.body,t)}}}function Fi(e,t){for(let n of e.parameters)kn(n.type,t);for(let n of e.forallParameters)kn(n.type,t);kn(e.return.type,t)}function Ui(e,t){var n;if(e.$&&e.$.type&&kn(e.$.type,t),e.$&&e.$.value&&be(e.$.value)){let r=e.$.value;r.isControlFunction?(Fi(r.type,t),wn(r.body,t)):t.functions[r.funcId]||r.type.parameters.map(a=>a.type).some(a=>U(a)&&nt(a)&&!a.resolvedConcreteType)||(t.functions[r.funcId]={value:r,cName:Ce(r.funcId)},Fi(r.type,t),wn(r.body,t))}if(e.$&&e.$.deferredDropExpressions&&e.$.deferredDropExpressions.length>0)for(let r of e.$.deferredDropExpressions)Ui(r,t);if(e.$&&e.$.macroExpansion&&Ui(e.$.macroExpansion,t),e.$&&e.$.runtimeDestructurings)for(let{type:r}of e.$.runtimeDestructurings)kn(r,t);if(e.$&&e.$.captureType&&De(e.$.captureType)){let r=e.$.captureType;if(!t.types[r.id]){t.types[r.id]={type:r,cName:`__yo_${r.id}`};for(let i of r.fields)kn(i.type,t);for(let i of r.trait.fields)if(i.assignedValue&&be(i.assignedValue)){let o=i.assignedValue;t.functions[o.funcId]||(t.functions[o.funcId]={value:o,cName:o.funcId},Fi(o.type,t),wn(o.body,t))}}}switch(e.tag){case"FnCall":if(E(e,R.test))break;Ui(e.func,t);for(let r of e.args)Ui(r,t);break;case"Atom":(n=e.$)!=null&&n.value&&Y(e.$.value)&&kn(e.$.value.value,t);break}}function kn(e,t){if(!t.types[e.id]){if(U(e)&&Dn(e)){if(e.resolvedConcreteType){kn(e.resolvedConcreteType,t);return}let n=Yn(e);n&&kn(n,t);return}if(U(e)&&nt(e)){let n=Cn(e);n&&kn(n.isFuture.outputType,t);return}if(U(e)&&e.resolvedConcreteType){kn(e.resolvedConcreteType,t);return}if(!ze(e)){if(De(e)||Ot(e)||qe(e)||lt(e)||at(e)||Qe(e)||ft(e)||Ct(e)||mn(e)||fn(e)){let n=Ct(e)?H(e,t):e.isExtern==="c"&&e.externName?e.externName:`__yo_${e.id}`;if(t.types[e.id]={type:e,cName:n},De(e))for(let r of e.fields)kn(r.type,t);if(qe(e)){for(let r of e.variants)if(r.fields)for(let i of r.fields)kn(i.type,t)}if(Ot(e))for(let r of e.fields)kn(r.type,t);if(at(e)){let r=e;for(let i of r.requiredTraits)kn(i.traitType,t)}if(mn(e)){let r=e;kn(r.childType,t),H(r,t)}if(fn(e)){let r=e;kn(r.childType,t),H(r,t)}if(Ct(e)&&kn(e.childType,t),Qe(e)||ft(e)){for(let r of e.fields)kn(r.type,t);for(let r of e.fields)if(r.assignedValue&&be(r.assignedValue)){let i=r.assignedValue;t.functions[i.funcId]||(t.functions[i.funcId]={value:i,cName:Ce(i.funcId)},Fi(i.type,t),wn(i.body,t))}else if(r.assignedValue&&(bt(r.assignedValue)||tn(r.assignedValue))){let i=r.assignedValue;Ha(i,t)}}}else if(tt(e)){let n=e,r=n.childType,i=n.length;if(Lt(i)){kn(r,t);let o=H(r,t),a=`Array_${Ce(o)}_${i.value}`;t.arrayStructTypes.has(a)||t.arrayStructTypes.set(a,{childType:o,length:typeof i.value=="bigint"?Number(i.value):i.value}),t.types[e.id]={type:e,cName:a}}}else if(Ze(e)){if(kn(e.childType,t),Ct(e.childType)){let r=e.childType.childType;kn(r,t);let i=H(r,t),o=`Slice_${Ce(i)}`;t.sliceStructTypes.has(o)||t.sliceStructTypes.set(o,{childType:i})}t.types[e.id]={type:e,cName:H(e,t)}}else Nc.has(e.tag)&&(t.types[e.id]={type:e,cName:H(e,t)});e.trait&&kn(e.trait,t)}}}function go(e){var t,n,r;if(e.$&&e.$.value&&Se(e.$.value)&&!(te(e.$.type)&&e.$.type.isExtern)){if(!Pe(e.$.type))return!0}if(A(e)){if(go(e.func))return!0;for(let i of e.args)if(!((t=i.$)!=null&&t.type&&Pe(i.$.type))&&go(i))return!0}if(e.$&&e.$.macroExpansion){if(e.$.type&&Pe(e.$.type))return!1;if(go(e.$.macroExpansion))return!0}if((n=e.$)!=null&&n.deferredDupExpressions){for(let i of e.$.deferredDupExpressions)if(go(i))return!0}if((r=e.$)!=null&&r.deferredDropExpressions){for(let i of e.$.deferredDropExpressions)if(go(i))return!0}return!1}function Ha(e,t,n=!0){for(let r=0;r<e.fields.length;r++){let i=e.fields[r],o=e.type.fields[r];if(be(i)){let a=o.label;if(a==="main")t.functions[i.funcId]={value:i,cName:"__yo_user_main"};else if(t.isLibrary)if(n&&t.currentModuleId&&i.funcId.startsWith(`fn_${t.currentModuleId}_`)){let l=Ce(a);Object.values(t.functions).some(_=>_.cName===l)?t.functions[i.funcId]={value:i,cName:Ce(i.funcId)}:(t.functions[i.funcId]={value:i,cName:l},t.exportedFunctionLabels||(t.exportedFunctionLabels=new Map),t.exportedFunctionLabels.set(i.funcId,a))}else t.functions[i.funcId]={value:i,cName:Ce(i.funcId)};else t.functions[i.funcId]={value:i,cName:Ce(i.funcId)};wn(i.body,t)}}}function Zc(e,t){for(let n=0;n<e.fields.length;n++){let r=e.fields[n];r&&be(r)?t.functions[r.funcId]||(r.isModuleEffectMember=!0,t.functions[r.funcId]={value:r,cName:Ce(r.funcId)},wn(r.body,t)):r&&bt(r)&&Zc(r,t)}}function wn(e,t){var i,o,a,s,l,u,_,c,f,p,m,h;if((i=e.$)!=null&&i.value&&bt(e.$.value)){let y=e.$.value;Zc(y,t)}if(A(e)&&E(e,R.test)||A(e)&&E(e,w.comptime_expect_error))return;if(e.$&&e.$.macroExpansion&&wn(e.$.macroExpansion,t),(o=e.$)!=null&&o.effectAnalysis){let y=e.$.effectAnalysis.handlerValue;y&&be(y)&&wn(y.body,t)}if(e.$&&e.$.closureFunctionValue){let y=e.$.closureFunctionValue;t.functions[y.funcId]||(t.functions[y.funcId]={value:y,cName:Ce(y.funcId)},wn(y.body,t))}if((a=e.$)!=null&&a.indexMethodValue&&be(e.$.indexMethodValue)){let y=e.$.indexMethodValue;t.functions[y.funcId]||(t.functions[y.funcId]={value:y,cName:Ce(y.funcId)},wn(y.body,t))}if(A(e)&&e.$&&e.$.dynCallTraitValues&&e.$.dynCallTraitValues.length>0){let y=e.$.type,g=e.args[0];if(at(y)&&g&&((s=g.$)!=null&&s.type)){let v=g.$.type,T=e.$.dynCallTraitValues;if(T.length>0&&(Qt(v)||mr(v))){let $=mr(v)?v.fields[0].type:v,b=`${$.id}_${y.id}`;t.dynImpls.set(b,{dynType:y,concreteType:$,dataType:v,traitValues:T})}}}if(A(e)){let y=(l=e.func.$)==null?void 0:l.type,g=(u=e.func.$)==null?void 0:u.value;if(e.func.token.value==="?=")return;if(te(y)){if(be(g)&&g.isControlFunction){wn(g.body,t);for(let v of e.args)wn(v,t);return}if(be(g)){if(g.type.return.isCompileTimeOnly||ul(g)&&!g.specializedType)return;if(g.specializedType&&ti(g.specializedType)&&_n(g.specializedType).length===0){wn(e.func,t);for(let T of e.args)wn(T,t);return}if(!t.functions[g.funcId]){let v=!1;if(go(g.body)){let T=g.specializedType??g.type;if(v=T.implicitParameters.length>0&&(_n(T).length>0||!ti(g.type)&&g.type.implicitParameters.length>0),!v)return}if(!v&&!(_n(g.specializedType??g.type).length>0)&&(g.specializedType??g.type).parameters.map(C=>C.type).some(C=>U(C)&&nt(C)&&!C.resolvedConcreteType))return;t.functions[g.funcId]={value:g,cName:Ce(g.funcId)},wn(g.body,t)}}else if(y.isExtern==="c"){let v=y.externName?y.externName:j(e.func)?e.func.token.value:y.id;t.externFunctions[y.id]={type:y,cName:v}}else if(y.isExtern==="yo"){let v=y.externName;if(!(v&&v.startsWith("__yo_"))){let T=v?Ce(v):j(e.func)?Ce(e.func.token.value):Ce(y.id);t.externFunctions[y.id]={type:y,cName:T}}}}wn(e.func,t);for(let v of e.args)wn(v,t)}let n=(_=e.$)==null?void 0:_.type,r=(c=e.$)==null?void 0:c.value;if(te(n)){if(be(r)&&r.isControlFunction){if(r.isModuleEffectMember=!0,t.functions[r.funcId]||(t.functions[r.funcId]={value:r,cName:Ce(r.funcId)}),r.specializedFunctionCaches)for(let y of r.specializedFunctionCaches){let g=y.specializedFunction;g&&!t.functions[g.funcId]&&(g.isModuleEffectMember=!0,t.functions[g.funcId]={value:g,cName:Ce(g.funcId)},wn(g.body,t))}wn(r.body,t);return}if(be(r)){if(ul(r)&&!r.specializedFunctionCaches||t.functions[r.funcId])return;if(go(r.body))return;t.functions[r.funcId]={value:r,cName:Ce(r.funcId)},wn(r.body,t)}}if(Y((f=e.$)==null?void 0:f.value)&&kn(e.$.value.value,t),(p=e.$)!=null&&p.deferredDupExpressions)for(let y of e.$.deferredDupExpressions)wn(y,t);if((m=e.$)!=null&&m.deferredDropExpressions)for(let y of e.$.deferredDropExpressions)wn(y,t);if((h=e.$)!=null&&h.dynCallTraitValues)for(let y of e.$.dynCallTraitValues)Ha(y,t,!1)}function Jc(e){let t=w.dispose[0];for(let n in e.types){let{type:r}=e.types[n];if(!De(r)||!r.isReferenceSemantics)continue;let i=Ir({concreteType:r,methodName:t,env:r.env});for(let o of i)if(o.value&&be(o.value)){let a=o.value;if(e.functions[a.funcId])continue;a.funcName||(a.funcName=t),e.functions[a.funcId]={value:a,cName:Ce(a.funcId)},Fi(a.type,e),wn(a.body,e)}}}function ef(e){var r;let t=e.emitter,n=new Set;for(let[,i]of e.dynImpls){let o=((r=e.types[i.dynType.id])==null?void 0:r.cName)||`__yo_dyn_${i.dynType.id}`;n.has(o)||(n.add(o),t.emitLine(`${o} __yo_dup_${o}(${o} dyn) {`),t.emitLine(" if (dyn.data) {"),t.emitLine(" __yo_incr_rc(dyn.data);"),t.emitLine(" }"),t.emitLine(" return dyn;"),t.emitLine("}"),t.emitLine(""),t.emitLine(`void __yo_drop_${o}(${o} dyn) {`),t.emitLine(" if (dyn.data) {"),t.emitLine(" __yo_decr_rc(dyn.data);"),t.emitLine(" }"),t.emitLine("}"),t.emitLine(""))}}function tf(e){var r,i,o;let t=e.emitter;if(e.dynImpls.size===0)return;t.emitLine(""),t.emitLine("// === Dyn Box Functions ==="),t.emitLine("// Constructor and dispose functions for dyn boxes"),t.emitLine("");let n=new Set;for(let[,a]of e.dynImpls){let s=U(a.concreteType)&&a.concreteType.resolvedConcreteType?a.concreteType.resolvedConcreteType:a.concreteType,u=`__yo_dyn_box_${((r=e.types[s.id])==null?void 0:r.cName)||`unknown_${s.id}`}`;if(n.has(u))continue;n.add(u);let _=H(s,e);t.emitLine(`static ${u}* __yo_new_${u}(${_} value) {`),t.emitLine(` ${u}* box = (${u}*)__yo_malloc(sizeof(${u}));`),t.emitLine(" box->header.ref_count = 1;"),e.needsCycleGC&&(t.emitLine(" box->header.gc_flags = 0;"),t.emitLine(" box->header.gc_mark = __YO_GC_UNMARKED;"),t.emitLine(" box->header.gc_next = NULL;"),t.emitLine(" box->header.gc_prev = NULL;"));let c=`__yo_dispose_${u}`;if(e.needsCycleGC)t.emitLine(` box->header.dispose_fn = ${c};`);else{e.disposeTypeIds||(e.disposeTypeIds=new Map,e.nextDisposeTypeId=1);let m=e.disposeTypeIds.get(c);m===void 0&&(m=e.nextDisposeTypeId,e.nextDisposeTypeId=m+1,e.disposeTypeIds.set(c,m)),t.emitLine(` box->header.type_id = ${m};`)}e.needsCycleGC&&t.emitLine(" box->header.traverse_fn = NULL; // TODO: Set if value contains GC types"),t.emitLine(" box->value = value;"),t.emitLine(" return box;"),t.emitLine("}"),t.emitLine(""),t.emitLine(`static void __yo_dispose_${u}(void* ptr) {`),t.emitLine(` ${u}* box = (${u}*)ptr;`);let p=(i=(U(a.concreteType)&&a.concreteType.resolvedConcreteType?a.concreteType.resolvedConcreteType:a.concreteType).trait)==null?void 0:i.fields.find(m=>m.label===w.___drop[0]);if(p&&p.assignedValue&&be(p.assignedValue)){let m=(o=e.functions[p.assignedValue.funcId])==null?void 0:o.cName;m&&t.emitLine(` ${m}(box->value);`)}t.emitLine("}"),t.emitLine("")}}function nf(e){var n,r,i,o;let t=e.emitter;if(e.dynImpls.size!==0){t.emitDeclarationLine(""),t.emitDeclarationLine("// === Dyn Wrapper Functions ==="),t.emitDeclarationLine("// Wrappers that unwrap boxed values and call impl methods"),t.emitDeclarationLine("");for(let[a,s]of e.dynImpls){let l=s.dataType,u=new Set([w.___dup[0],w.___drop[0],w.___dispose[0],w.dispose[0]]);for(let{traitType:_}of s.dynType.requiredTraits){if(!dn(_))continue;let c=_.isFn.callType,f=H(c.return.type,e),p=`__yo_wrap_${a}_call`,m=["void* self_ptr"];for(let h=0;h<c.parameters.length;h++){let y=c.parameters[h],g=H(y.type,e);m.push(`${g} arg${h+1}`)}if(t.emitDeclarationLine(`static ${f} ${p}(${m.join(", ")}) {`),mr(l)){let h=((n=e.types[l.id])==null?void 0:n.cName)||`unknown_${l.id}`,y=Ce(l.fields[0].label);t.emitDeclarationLine(` ${h}* box = (${h}*)self_ptr;`);let g=l.fields[0].type,v=U(g)&&g.resolvedConcreteType?g.resolvedConcreteType:g,T=e.implClosureCallMap.get(v.id),$=(()=>{var C;if(T)return T.functionCName;for(let[,k]of Object.entries(e.functions)){let S=k.value.closureInfo;if(((C=S==null?void 0:S.captureType)==null?void 0:C.id)===v.id)return k.cName}})(),b=[];if($){b.push(`(void*)&box->${y}`);for(let C=0;C<c.parameters.length;C++)b.push(`arg${C+1}`);hi(c.return.type)?t.emitDeclarationLine(` ${$}(${b.join(", ")});`):t.emitDeclarationLine(` return ${$}(${b.join(", ")});`)}else{b.push(`box->${y}.data`);for(let C=0;C<c.parameters.length;C++)b.push(`arg${C+1}`);hi(c.return.type)?t.emitDeclarationLine(` box->${y}.call(${b.join(", ")});`):t.emitDeclarationLine(` return box->${y}.call(${b.join(", ")});`)}}else{t.emitDeclarationLine(" (void)self_ptr; /* Dyn(Fn): expected Box(...) data */");for(let h=0;h<c.parameters.length;h++)t.emitDeclarationLine(` (void)arg${h+1};`);hi(c.return.type)?t.emitDeclarationLine(" return;"):(t.emitDeclarationLine(` ${f} zero = (${f})0;`),t.emitDeclarationLine(" return zero;"))}t.emitDeclarationLine("}"),t.emitDeclarationLine("")}for(let _=0;_<s.dynType.requiredTraits.length;_++){let{traitType:c}=s.dynType.requiredTraits[_];if(dn(c))continue;let f=s.traitValues[_];if(!f){t.emitDeclarationLine(`/* Warning: Module value missing for module ${_} */`);continue}let m=f.type.fields;for(let h=0;h<m.length;h++){let y=m[h];if(y.label==="Self"||u.has(y.label))continue;let g=f.fields[h];if(!g||!be(g)){t.emitDeclarationLine(`/* Warning: Module field ${y.label} is not a function value */`);continue}let v=y.type;if(!te(v)){t.emitDeclarationLine(`/* Warning: Module field ${y.label} is not a function type */`);continue}let T=g.funcId,$=(r=e.functions[T])==null?void 0:r.cName;if(!$){t.emitDeclarationLine(`/* Warning: Impl function for ${y.label} not found */`);continue}let b=`__yo_wrap_${a}_${y.label}`,C=H(v.return.type,e),k=["void* self_ptr"];for(let N=1;N<v.parameters.length;N++){let x=v.parameters[N],I=H(x.type,e);k.push(`${I} arg${N}`)}t.emitDeclarationLine(`static ${C} ${b}(${k.join(", ")}) {`);let F=(i=v.parameters[0])==null?void 0:i.type,S;if(mr(l)){let N=((o=e.types[l.id])==null?void 0:o.cName)||`unknown_${l.id}`,x=Ce(l.fields[0].label);t.emitDeclarationLine(` ${N}* box = (${N}*)self_ptr;`),F&&Ze(F)?S=`&box->${x}`:S=`box->${x}`}else{let N=H(s.concreteType,e);t.emitDeclarationLine(` ${N} concrete_value = (${N})self_ptr;`),F&&Ze(F)?S="&concrete_value":S="concrete_value"}let V=[S];for(let N=1;N<v.parameters.length;N++)V.push(`arg${N}`);hi(v.return.type)?t.emitDeclarationLine(` ${$}(${V.join(", ")});`):t.emitDeclarationLine(` return ${$}(${V.join(", ")});`),t.emitDeclarationLine("}"),t.emitDeclarationLine("")}}}}}function rf(e){var r,i,o;let t=e.emitter;if(e.dynImpls.size===0)return;t.emitDeclarationLine(""),t.emitDeclarationLine("// === Dyn TypeId Statics ==="),t.emitDeclarationLine("// Unique static per concrete type \u2014 address is the runtime TypeId"),t.emitDeclarationLine("");let n=new Set;e.typeIdStatics||(e.typeIdStatics=new Map);for(let[,a]of e.dynImpls){let s=U(a.concreteType)&&a.concreteType.resolvedConcreteType?a.concreteType.resolvedConcreteType:a.concreteType,l=((r=e.types[s.id])==null?void 0:r.cName)||`unknown_${s.id}`,u=`__yo_typeid_${l}`;!n.has(u)&&!e.typeIdStatics.has(s.id)&&(n.add(u),e.typeIdStatics.set(s.id,u),t.emitDeclarationLine(`static const char ${u} = 0; // TypeId for ${l}`))}t.emitDeclarationLine(""),t.emitDeclarationLine("// === Dyn Static Vtables ==="),t.emitDeclarationLine("// Static vtables for dynamic dispatch"),t.emitDeclarationLine("");for(let[a,s]of e.dynImpls){let l=((i=e.types[s.dynType.id])==null?void 0:i.cName)||`__yo_dyn_${s.dynType.id}`,u=U(s.concreteType)&&s.concreteType.resolvedConcreteType?s.concreteType.resolvedConcreteType:s.concreteType,_=((o=e.types[u.id])==null?void 0:o.cName)||`unknown_${u.id}`,c=`__yo_vtable_${a}`,f=`${l}_vtable`,p=`__yo_typeid_${_}`;t.emitDeclarationLine(`// Vtable for impl(${_}, ${s.dynType.requiredTraits.map(({traitType:y})=>y.typeName||"?").join(" + ")})`),t.emitDeclarationLine(`static const ${f} ${c} = {`),t.emitDeclarationLine(` .__yo_type_id = (uintptr_t)&${p},`);let m=new Set,h=new Set([w.___dup[0],w.___drop[0],w.___dispose[0],w.dispose[0]]);for(let{traitType:y}of s.dynType.requiredTraits){if(dn(y)){let g=`__yo_wrap_${a}_call`;t.emitDeclarationLine(` .call = ${g},`),m.add("call");continue}for(let g of y.fields)if(g.label!=="Self"&&!h.has(g.label)&&!m.has(g.label)&&(m.add(g.label),te(g.type))){let v=g.type;if(v.parameters.length>0){let T=v.parameters[0];if(T&&T.label==="self"){let $=`__yo_wrap_${a}_${g.label}`;t.emitDeclarationLine(` .${Ce(g.label)} = ${$},`)}}}}t.emitDeclarationLine("};"),t.emitDeclarationLine("")}}function of(e,t){let r=In(t)?"__declspec(thread)":"_Thread_local";e.emitLine(`
|
|
195
|
+
`)){let Oe=Ge.trim();Oe&&(l.emitLine(` ${Oe}`),h.push(Oe))}l.emitLine("")}}l.emitLine(" // Final state - complete the Future"),ki({emitter:l,indent:" ",debugLabel:"Future %p completed"})}s.inAsyncStateMachine=oe,s.stateMachineVariables=de,s.variableIdRemapping=he}else s.inAsyncStateMachine=oe,s.stateMachineVariables=de,s.variableIdRemapping=he;l.emitLine(" }")}return l.emitLine(" }"),l.emitLine("}"),l.emitLine(""),h}function mu(e,t,n,r,i){let o=i.emitter,a=yu(t,n);if(e.tag==="FnCall"&&E(e,":=")){let s=e.args[1];if(s&&s.tag==="FnCall"&&ar(s)){let l=s.args[0];if(l){let u=G(l,r,i);o.emitLine(`${r}// Store Future for additional await in cond branch`),o.emitLine(`${r}sm->${a} = ${u};`)}}return}if(e.tag==="FnCall"&&ar(e)){let s=e.args[0];if(s){let l=G(s,r,i);o.emitLine(`${r}// Store Future for additional await in cond branch`),o.emitLine(`${r}sm->${a} = ${l};`)}return}if(e.tag==="FnCall"&&E(e,R.cond)){na(e,t,0,r,i);return}if(e.tag==="FnCall"&&E(e,R.match)){na(e,t,0,r,i);return}if(e.tag==="FnCall"&&E(e,R.while)){na(e,t,0,r,i);return}if(e.tag==="FnCall"&&E(e,R.begin)){na(e,t,0,r,i);return}o.emitLine(`${r}// Warning: unhandled await pattern in remaining expressions`)}function Pc(e){if(rn(e,"return")||E(e,"return"))return!0;if(e.tag==="FnCall"){for(let t of e.args)if(Pc(t))return!0}return!1}function ch(e){let t=[];for(let n of e)if(n.isEffectRowSpread){let r=n.type;U(r)&&r.resolvedConcreteType&&(r=r.resolvedConcreteType),Gt(r)&&t.push(...r.implicitParameters)}else t.push(n);return t}function fh(e,t,n,r){var u,_,c,f,p;let i=(u=e.args)==null?void 0:u[0];if(!((_=i==null?void 0:i.$)!=null&&_.type))return;let o=Cn(i.$.type);if(!((c=o==null?void 0:o.isFuture.effects)!=null&&c.length))return;let a=ch(o.isFuture.effects),s=r.emitter,l=(f=e.args)==null?void 0:f.find(m=>A(m)&&E(m,R.using));if(l){let m=l.args;for(let h=0;h<a.length&&h<m.length;h++){let y=a[h],g=m[h];if(te(y.type)){if(y.type.forallParameters.length>0)continue;let v=G(g,n,r),T=y.label;s.emitLine(`${n}${t}->__capture.${T} = (void*)${v};`)}else Qe(y.type)&&Oc(y.type,t,n,(p=g.$)==null?void 0:p.value,r,e)}}else for(let m of a)if(te(m.type)){if(m.type.forallParameters.length>0)continue;let h=ph(m.label,r,e);h&&s.emitLine(`${n}${t}->__capture.${m.label} = (void*)${h};`)}else Qe(m.type)&&Oc(m.type,t,n,void 0,r,e)}function Oc(e,t,n,r,i,o){var s,l,u,_;let a=i.emitter;for(let c of e.fields){if(!te(c.type))continue;let f;if(i.stateMachineVariables){for(let[,p]of i.stateMachineVariables)if(p.name===c.label&&p.kind==="outer"){f=`sm->__capture.${c.label}`;break}}if(!f&&r&&bt(r)){let p=e.fields.indexOf(c),m=r.fields[p];if(m&&be(m)){let h=i.functions[m.funcId];h&&(f=h.cName)}}if(!f&&i.currentEvidenceParams){for(let p of i.currentEvidenceParams.values())if(p.fieldLabel===c.label){f=p.cParamName;break}}if(!f){let p=((s=o.$)==null?void 0:s.env)??((l=o.func.$)==null?void 0:l.env);if(p){let m=sr(p,h=>h.isImplicit===!0);for(let h=m.length-1;h>=0;h--){let y=m[h],g=(u=y.value)==null?void 0:u[y.value.length-1];if(g&&bt(g)){let v=g.type.fields.findIndex(T=>T.label===c.label);if(v>=0){let T=g.fields[v];if(T&&be(T)){let $=(_=i.functions[T.funcId])==null?void 0:_.cName;if($){f=$;break}}}}}}}f&&a.emitLine(`${n}${t}->__capture.${c.label} = (void*)${f};`)}}function ph(e,t,n){if(t.currentEvidenceParams){for(let r of t.currentEvidenceParams.values())if(r.fieldLabel===e)return r.cParamName}if(t.stateMachineVariables){for(let[,r]of t.stateMachineVariables)if(r.name===e&&r.kind==="outer")return`sm->__capture.${e}`}}var dh=new Set(["__yo_mutex_init","__yo_mutex_destroy","__yo_mutex_lock","__yo_mutex_unlock","__yo_cond_init","__yo_cond_destroy","__yo_cond_wait","__yo_cond_signal","__yo_cond_broadcast","__yo_thread_join","__yo_thread_self"]);function zc(e){var n,r,i,o,a;let t=e.emitter;t.emitDeclarationLine("// Function declarations"),t.emitDeclarationLine("/// Extern functions");for(let s in e.externFunctions){let{cName:l,type:u}=e.externFunctions[s];if(u.isExtern==="yo"){if(dh.has(l))continue;gu(u,l,!0,e);continue}u.isExtern==="c"&&u.cInclude||l.startsWith("__atomic_")||l.startsWith("__sync_")||gu(u,l,!0,e)}t.emitDeclarationLine(""),e.usesAsync&&(t.emitDeclarationLine("/// Async runtime functions"),t.emitDeclarationLine("static void __yo_async_spawn_task(void (*resume_fn)(void*), void* state_machine);"),t.emitDeclarationLine("")),t.emitDeclarationLine("/// Object constructors"),yh(e),t.emitDeclarationLine(""),t.emitDeclarationLine("/// Closure constructors"),t.emitDeclarationLine(""),t.emitDeclarationLine("/// Capture dispose functions"),gh(e),t.emitDeclarationLine(""),t.emitDeclarationLine("/// Dyn type constructors"),t.emitDeclarationLine(""),t.emitDeclarationLine("/// Regular functions");for(let s in e.functions){let{cName:l,value:u}=e.functions[s],_=l==="__yo_user_main",c=(r=(n=u.body)==null?void 0:n.$)==null?void 0:r.effectAnalysis,f=c&&c.hasEffects;if(!_&&!u.type.isClosure&&((i=u.specializedFunctionCaches)==null?void 0:i.length)>0||!_&&!f&&!u.isModuleEffectMember&&!u.type.isClosure&&!u.specializedType&&(((o=u.specializedFunctionCaches)==null?void 0:o.length)??0)===0&&_n(u.specializedType??u.type).length===0&&[...u.type.implicitParameters,...u.type.parameters.filter($=>$.isImplicit)].some($=>te($.type)))continue;let m=u.specializedType??u.type,h=_n(m).length>0;if(!_&&u.isIoAsyncStateMachineClosure||!_&&!f&&!h&&!u.isModuleEffectMember&&(ti(u.type)&&!u.type.isClosure||((a=u.specializedFunctionCaches)==null?void 0:a.length)>0&&!u.type.isClosure||Pi(u)||ci(u)||u.isIoAsyncStateMachineClosure))continue;let y=u.specializedType??u.type,g=!f&&!u.isModuleEffectMember&&(y.parameters.some($=>ze($.type))||y.forallParameters.length>0),v=ze(y.return.type),T=U(y.return.type)&&y.return.type.requiredTraits.length>0;g||v&&!T&&!u.isModuleEffectMember||gu(y,l,!1,e,u.isModuleEffectMember?void 0:u.body,u.specializedType&&_n(y).length===0&&_n(u.type).some($=>$.fieldFunctionType.forallParameters&&$.fieldFunctionType.forallParameters.length>0)?u.type:void 0)}t.emitDeclarationLine("/// Closure vtable instances"),t.emitDeclarationLine("")}function _n(e){let t=[],n=mh(e.implicitParameters);for(let r of n)Qe(r.type)?Uc(r.label,r.type,[],t):te(r.type)&&t.push({implicitLabel:r.label,fieldLabel:r.label,fieldPath:[r.label],fieldFunctionType:r.type,cParamName:Ce(r.label)});return t}function Uc(e,t,n,r){for(let i of t.fields)if(te(i.type)){let o=[...n,i.label],a=o.join("__");r.push({implicitLabel:e,fieldLabel:a,fieldPath:o,fieldFunctionType:i.type,cParamName:Ce(`${e}__${a}`)})}else Qe(i.type)&&Uc(e,i.type,[...n,i.label],r)}function mh(e){let t=[];for(let n of e)if(n.isEffectRowSpread){let r=n.type;U(r)&&r.resolvedConcreteType&&(r=r.resolvedConcreteType),Gt(r)&&t.push(...r.implicitParameters)}else t.push(n);return t}function pi(e,t,n,r,i){let o=r||H(e.return.type,n),a=e.parameters.filter(c=>!c.isCompileTimeOnly),s=[];e.isClosure&&s.push("void* closure_context");let l=a.map((c,f)=>{let p=Ce(c.label||`param${f}`);if(te(c.type))return pi(c.type,"(*)",n).replace(" (*)(",` (*${p})(`);{let m;return U(c.type)&&nt(c.type)?c.type.resolvedConcreteType?m=H(c.type.resolvedConcreteType,n)+"*":m=H(c.type,n):m=H(c.type,n),`${m} ${p}`}});s.push(...l);let u=_n(i??e);for(let c of u)if(c.fieldFunctionType.forallParameters&&c.fieldFunctionType.forallParameters.length>0)s.push(`void* ${c.cParamName}`);else{let f=pi(c.fieldFunctionType,"(*)",n).replace(" (*)(",` (*${c.cParamName})(`);s.push(f)}let _=s.join(", ");return`${o} ${t}(${_})`}function gu(e,t,n,r,i,o){var f,p,m,h;let a;if(i&&nt(e.return.type)){let y=Ga(i);(f=y==null?void 0:y.$)!=null&&f.asyncStateMachineStructName?a=`${y.$.asyncStateMachineStructName}*`:(p=i.$)!=null&&p.type&&U(i.$.type)&&nt(i.$.type)&&(a=H(i.$.type,r))}if(i&&U(e.return.type)&&!nt(e.return.type)&&(m=i.$)!=null&&m.type&&(a=H(i.$.type,r)),!a&&i&&((h=i.$)!=null&&h.type)&&!nt(e.return.type)){let y=H(e.return.type,r),g=H(i.$.type,r);y!==g&&(a=g)}let s=a?pi(e,t,r,a,o):pi(e,t,r,void 0,o),l=M(e),u=t==="__yo_user_main"||r.exportedFunctionLabels&&[...r.exportedFunctionLabels.values()].some(y=>Ce(y)===t),_=!n&&!u&&(t.includes("___drop")||t.includes("___dup")||t.includes("___dispose")),c=n?"extern ":u?"":_?"static inline __attribute__((always_inline)) ":"static inline ";r.emitter.emitDeclarationLine(`${c}${s}; // ${l}`)}function yh(e){let t=e.emitter;t.emitDeclarationLine("static inline void __yo_decr_rc(void* ptr); // Decrement reference count"),t.emitDeclarationLine("static inline void* __yo_incr_rc(void* ptr); // Increment reference count"),t.emitDeclarationLine("static void __yo_gc_register(void* ptr); // Register object for cycle detection"),t.emitDeclarationLine("static void __yo_gc_unregister(void* ptr); // Unregister object from cycle detection"),t.emitDeclarationLine("static void __yo_gc_collect(); // Trigger garbage collection"),t.emitDeclarationLine("static void __yo_gc_init_thread(); // Initialize thread-local GC state (for worker threads)"),t.emitDeclarationLine("static void __yo_cleanup_thread_gc(); // Clean up thread-local GC state"),t.emitDeclarationLine("static void __yo_init_process_cleanup(void); // Initialize process cleanup");for(let n in e.types){let{type:r,cName:i}=e.types[n];if(De(r)&&r.isReferenceSemantics){if(r.fields.some(l=>ze(l.type)))continue;let a=`__yo_new_${i}`,s=r.fields.map(l=>{let u=H(l.type,e),_=Ce(l.label);return`${u} ${_}`}).join(", ");t.emitDeclarationLine(`static ${i}* ${a}(${s}); // Constructor`)}}}function gh(e){let t=e.emitter;if(e.closureCaptureMap&&e.closureCaptureMap.size>0)for(let[n]of e.closureCaptureMap){let r=`__yo_dispose_closure_${n}`;t.emitDeclarationLine(`static void ${r}(void* closure_ptr);`)}}function Bc(e){let t=new Set;for(let n in e.functions){let{value:r,cName:i}=e.functions[n],o=r.specializedType;if(Pi(r)||!o||!Vr(r.type)||Vr(o))continue;let a=o.parameters.some(c=>ze(c.type)),s=ze(o.return.type);if(a||s||_n(r.type).some(c=>c.fieldFunctionType.forallParameters&&c.fieldFunctionType.forallParameters.length>0)||t.has(n))continue;t.add(n);let _=i.includes("___drop")||i.includes("___dup")||i.includes("___dispose")?"static inline __attribute__((always_inline)) ":"static inline ";e.emitter.emitDeclarationLine(`${_}${pi(o,i,e)}; // specialized function: ${M(r.type)}`)}}function di(e,t,n){let r=ce(t,e);return r.length===0?!1:r[r.length-1].frameLevel<=n}function Gc(e){var t,n;return!!((t=e.$)!=null&&t.closureFunctionValue&&((n=e.$)!=null&&n.type)&&Dn(e.$.type))}function hh(e,t,n,r,i,o=!1){var p;let a=Object.values(i.types).find(m=>m.type===e);if(!a)return i.emitter.emitLine(`${r}/* Error: Capture type not found for closure */`),null;let s=a.cName,l=new Map;if((p=n.$)!=null&&p.deferredDupExpressions)for(let m of n.$.deferredDupExpressions){let h=Ps(m);h&&l.set(h,m)}let u=e.fields.map(m=>{var v,T;if(m.isEffectParam)return"NULL";let h,y=m.exprs.expr;if((T=(v=y.$)==null?void 0:v.deferredDupExpressions)!=null&&T.length&&(h=y.$.deferredDupExpressions[0]),!h){let $=[m.label];j(y)&&$.push(y.token.value);for(let b of $){let C=l.get(b);if(C){h=C;break}}}if(h)return G(h,r,i);let g={tag:"Atom",token:y.token,$:y.$};return G(g,r,i)}),_=`(${s}){ ${u.map((m,h)=>{let y=e.fields[h];return y?`.${y.label} = ${m}`:`/* Error: missing field at index ${h} */`}).join(", ")} }`,c=n.token.position.row!==void 0?`${Date.now()}_${n.token.position.row}`:`${Date.now()}_${Math.random().toString(36).substr(2,9)}`,f=`__capture_${t}_${c}`;return o?i.emitter.emitLine(`${r}${s} ${f} = ${_};`):(i.emitter.emitLine(`${r}${s}* ${f} = (${s}*)__yo_malloc(sizeof(${s}));`),i.emitter.emitLine(`${r}*${f} = ${_};`)),{captureTempVar:f,captureCName:s}}function Wc(e,t,n){var m;if(!e.$||!e.$.type||!e.$.closureFunctionValue)return"// Error: Missing closure metadata";let r=Yn(e.$.type),i=r.isFn.callType,o=e.$.closureFunctionValue,a=e.$.captureType,s=(m=n.functions[o.funcId])==null?void 0:m.cName;if(!s)return"// Error: Closure implementation function not found in context";let l=at(e.$.type),u;if(l){let h=n.types[e.$.type.id];if(!h)return"// Error: Dyn closure type not found in context";u=h.cName}let _=a&&De(a)&&a.fields.length>0,c=H(i.return.type,n),f=i.parameters.map(h=>H(h.type,n)).join(", "),p=`(${c} (*)(void*${f?", "+f:""}))${s}`;if(_&&a&&De(a)){let h=!l,y=hh(a,i.id,e,t,n,h);if(!y)return"// Error: Failed to allocate closure capture";let{captureTempVar:g}=y;if(l){let v=`__yo_create_${u}`,T=`__yo_dispose_${u}`;return`${v}(${g}, ${T}, ${p})`}else return n.implClosureCallMap.set(a.id,{functionCName:s,callTypeId:r.isFn.callType.id,callType:r.isFn.callType}),g}else if(l){let h=`__yo_create_${u}`,y=`__yo_dispose_${u}`;return`${h}(NULL, ${y}, ${p})`}else{if(e.$.type.tag==="SomeType"){let h=e.$.type;if(h.resolvedConcreteType)return n.implClosureCallMap.set(h.resolvedConcreteType.id,{functionCName:s,callTypeId:r.isFn.callType.id,callType:r.isFn.callType}),`(${H(h.resolvedConcreteType,n)}){}`}return"// Error: Impl(Fn(...)) without captures missing resolvedConcreteType"}}function hu(e,t,n){if(e.pendingDeferredDrops&&e.loopBodyDropsBaselineCount!==void 0){let r=e.loopBodyDropsBaselineCount,i=e.pendingDeferredDrops.length,o=e.pendingDeferredDrops.slice(0,i-r);for(let a of o){let s=G(a,t,n);s&&n.emitter.emitLine(`${t}${s};`)}}}function ra(e,t,n=""){var a,s,l,u,_,c,f,p,m,h,y,g,v,T,$,b,C,k,F,S,V,N,x,I,D,z,O,J,B;let r=t;if(e.token.value==="continue"){if(r.currentContinueLabel)return hu(r,n,t),`goto ${r.currentContinueLabel}`;if(r.currentLoopLabel)return hu(r,n,t),"continue";if(r.smWhileContinueInfo){if(r.smWhileContinueInfo.emitDropsBeforeGoto&&r.smWhileBodyDrops&&r.smWhileBodyDrops.length>0){let W=t.emitter;for(let q of r.smWhileBodyDrops){let X=G(q,n,t);X&&X.includes("sm->")&&W.emitLine(`${n}${X};`)}}if(r.smWhileContinueInfo.stepExpr){let W=t.emitter,q=G(r.smWhileContinueInfo.stepExpr,n,t);q&&W.emitLine(`${n}${q};`)}return`goto ${r.smWhileContinueInfo.label}`}return"continue"}if(e.token.value==="break"){if(r.currentLoopLabel)return hu(r,n,t),r.insideMatch?`goto ${r.currentLoopLabel}`:"break";if(r.smWhileBreakInfo){let{label:W,activeIndex:q}=r.smWhileBreakInfo;if(r.smWhileBodyDrops&&r.smWhileBodyDrops.length>0){let X=t.emitter;for(let _e of r.smWhileBodyDrops){let me=G(_e,n,t);me&&me.includes("sm->")&&X.emitLine(`${n}${me};`)}}return q!==void 0?(t.emitter.emitLine(`${n}sm->while_loop_${q}_active = false;`),`goto ${W}`):`goto ${W}`}return"break"}if(e.token.value==="return"){if(r.inAsyncStateMachine){let W=t.emitter,q=r.inAsyncStateMachine.futureType,_e=Cn(q).isFuture.outputType,me=Pe(_e);if((a=e.$)!=null&&a.deferredDropExpressions)for(let re of e.$.deferredDropExpressions){let se=G(re,n,t);se&&se.includes("sm->")&&W.emitLine(`${n}${se};`)}if(r.pendingDeferredDrops&&r.pendingDeferredDrops.length>0){W.emitLine(`${n}// Drop local variables before early completion`);for(let re of r.pendingDeferredDrops){let se=G(re,n,t);se&&se.includes("sm->")&&W.emitLine(`${n}${se};`)}}W.emitLine(`${n}// Early return - complete the result Future`);let Q=me?void 0:`(${H(_e,t)}){0}`;return ki({emitter:W,indent:n,resultCode:Q,debugLabel:t.currentFunctionName}),""}return"return"}if((s=e.$)!=null&&s.type&&Pe(e.$.type))return"";if((r.inAsyncStateMachine||r.inEffectStateMachine)&&r.stateMachineVariables){let W=e.token.value;if((l=r.localShadowedVariables)!=null&&l.has(W))return Ce(W);let q=!1;if((u=e.$)!=null&&u.env){let X=ce(e.$.env,W);if(X.length>0){let _e=X[X.length-1],me=_e.isOwningTheSameRcValueAs?_e.isOwningTheSameRcValueAs.id:_e.id;(_=r.variableIdRemapping)!=null&&_.has(me)&&(me=r.variableIdRemapping.get(me));let Q=r.stateMachineVariables.get(me);if(Q){let re=(c=r.stateMachineFieldAliases)==null?void 0:c.get(me);if(re)return q=!0,`sm->${re}`;let se=Q.kind==="outer"?`__capture.${W}`:`var_${Q.id}`;return q=!0,`sm->${se}`}}}if(!q){for(let[X,_e]of r.stateMachineVariables)if(_e.name===W){let me=(f=r.stateMachineFieldAliases)==null?void 0:f.get(X);if(me)return q=!0,`sm->${me}`;let Q=_e.kind==="outer"?`__capture.${W}`:`var_${X}`;return q=!0,`sm->${Q}`}}if((p=e.$)!=null&&p.env){let X=ce(e.$.env,W);if(X.length>0){let _e=X[X.length-1];if(_e.isOwningTheSameRcValueAs){let me=_e.isOwningTheSameRcValueAs.name,Q=_e.isOwningTheSameRcValueAs.id;for(let[re,se]of r.stateMachineVariables)if(se.name===me||re===Q)return`sm->${se.kind==="outer"?`__capture.${me}`:`var_${re}`}`}}}if(r.currentClosureCaptures&&r.currentClosureCaptures.includes(W)&&r.currentClosureCaptureFrameLevel!==void 0){let X=r.currentClosureCaptureTypeCName;return X?`((${X}*)closure_context)->${Ye(W,(m=e.$)==null?void 0:m.env)}`:`closure_context->${Ye(W,(h=e.$)==null?void 0:h.env)}`}if((y=e.$)!=null&&y.variableName){if((g=e.$)!=null&&g.env&&((v=e.$)!=null&&v.value)&&!Se(e.$.value)){let X=ce(e.$.env,e.$.variableName);if(X.length>0&&X[X.length-1].isCompileTimeOnly)return Gn(e.$.value,t,e)}return Ye(e.$.variableName,e.$.env)}}if((T=e.$)!=null&&T.variableName){if(($=e.$)!=null&&$.env&&((b=e.$)!=null&&b.value)&&!Se(e.$.value)){let W=ce(e.$.env,e.$.variableName);if(W.length>0&&W[W.length-1].isCompileTimeOnly)return Gn(e.$.value,t,e)}if(!(r.currentClosureCaptures&&r.currentClosureCaptures.includes(e.token.value)&&((C=e.$)!=null&&C.env)&&r.currentClosureCaptureFrameLevel!==void 0&&di(e.token.value,e.$.env,r.currentClosureCaptureFrameLevel)))return Ye(e.$.variableName,(k=e.$)==null?void 0:k.env)}if((F=e.$)!=null&&F.value&&!Se(e.$.value))return Gn(e.$.value,t,e);let i=(S=e.$)!=null&&S.env&&r.currentClosureCaptureFrameLevel!==void 0?di(e.token.value,e.$.env,r.currentClosureCaptureFrameLevel):!1;if(r.currentClosureCaptures&&r.currentClosureCaptures.includes(e.token.value)&&r.currentClosureCaptureFrameLevel!==void 0&&(!((V=e.$)!=null&&V.env)||i)){let W=r.currentClosureCaptureTypeCName;return W?`((${W}*)closure_context)->${Ye(e.token.value,(N=e.$)==null?void 0:N.env)}`:`closure_context->${Ye(e.token.value,(x=e.$)==null?void 0:x.env)}`}if(r.currentFunctionName&&!r.currentClosureCaptures){let W=Object.values(r.functions).find(q=>q.cName===r.currentFunctionName);if(W&&W.value.type.isClosure){let q=Object.values(r.types).find(X=>te(X.type)&&X.type.isClosure&&X.type===W.value.type);if(q)return`((${`${q.cName}_capture`}*)closure_context->data)->${Ye(e.token.value,(I=e.$)==null?void 0:I.env)}`}}if((D=e.$)!=null&&D.env){let W=ce(e.$.env,e.token.value);if(W.length>0){let q=W[W.length-1];if((z=q.value)!=null&&z[0]&&be(q.value[0])){let X=(O=t.functions[q.value[0].funcId])==null?void 0:O.cName;if(X)return X}else if(te(q.type)&&(Se((J=q.value)==null?void 0:J[0])||q.value===void 0)){let X=Object.entries(t.functions).find(([_e,me])=>me.value.funcName===e.token.value);if(X)return X[1].cName}}}return Ye(e.token.value,(B=e.$)==null?void 0:B.env)}function Yc(e,t,n){var y,g,v,T,$,b,C,k,F,S,V,N,x,I,D,z,O,J,B,W;let r;if(An(e)){let q=(g=(y=e.$)==null?void 0:y.runtimeArgExprsInOrder)==null?void 0:g[0],X=(v=q==null?void 0:q.$)==null?void 0:v.closureFunctionValue;X&&be(X)&&(r=X.body)}else r=e.args[0];if(!r)return"/* Error: async requires exactly 1 argument */";let i=(T=e.$)==null?void 0:T.type;if(!i||!nt(i))return"/* Error: async block must have Future type */";let o=Cn(i);if(!o)return"/* Error: Could not extract Future module type */";let a=(($=e.$)==null?void 0:$.variableName)||`async_block_${Date.now()}`,s=`${a}_state_t`,l=`${a}_resume`,u=`__yo_new_${a}`,_=`${a}_state_dispose`;n.types[i.id]={type:i,cName:s};let c=(b=e.$)==null?void 0:b.awaitAnalysis;if(!c)throw new Error("Missing await analysis for async block. This should have been computed during evaluation.");let f=o.isFuture.outputType;if(U(f))if(f.resolvedConcreteType)f=f.resolvedConcreteType;else{let q=(k=(C=e.$)==null?void 0:C.runtimeArgExprsInOrder)==null?void 0:k[0],X=(F=q==null?void 0:q.$)==null?void 0:F.closureFunctionValue;if(X&&be(X)){let _e=(V=(S=X.type)==null?void 0:S.return)==null?void 0:V.type;if(_e&&U(_e)&&_e.resolvedConcreteType)f=_e.resolvedConcreteType;else if((x=(N=X.body)==null?void 0:N.$)!=null&&x.type){let me=X.body.$.type;U(me)&&me.resolvedConcreteType?f=me.resolvedConcreteType:U(me)||(f=me)}}}let p=H(f,n),m=n.emitter;if(m.emitDeclarationLine(`void ${_}(void* sm_ptr); // Dispose function for state machine`),m.emitDeclarationLine(""),m.emitDeclarationLine(`void ${l}(${s}* sm);`),m.emitDeclarationLine(""),(I=e.$)!=null&&I.captureType){let q=e.$.captureType,X=Object.values(n.types).find(me=>me.type===q),_e=X?X.cName:`async_capture_${q.id}`;m.emitDeclarationLine(`${s}* ${u}(${_e} __capture);`)}else m.emitDeclarationLine(`${s}* ${u}();`);m.emitDeclarationLine(""),n.deferredAsyncBlocks||(n.deferredAsyncBlocks=[]),n.deferredAsyncBlocks.push({bodyExpr:r,asyncBlockId:a,structName:s,resumeFunctionName:l,constructorName:u,disposeFunctionName:_,futureType:i,futureModuleType:o,resultType:f,resultTypeCName:p,captureType:(D=e.$)==null?void 0:D.captureType,analysis:c});let h=(z=e.$)==null?void 0:z.captureType;if(h){let q=Object.values(n.types).find(ae=>ae.type===h),X=q?q.cName:`async_capture_${h.id}`,_e=n,me=_e.currentClosureCaptures!==void 0||_e.inAsyncStateMachine!==void 0||_e.inEffectStateMachine!==void 0,Q=!1,re=h.fields.map(ae=>{var de,he;if(ae.isEffectParam)return`.${ae.label} = NULL`;let Le;if(!me&&((de=e.$)!=null&&de.deferredDupExpressions))for(let xe of e.$.deferredDupExpressions){let it;if(A(xe)&&(xe.args.length>0&&j(xe.args[0])?it=xe.args[0].token.value:xe.args.length===0&&A(xe.func)&&E(xe.func,".")&&xe.func.args.length>=2&&j(xe.func.args[0])&&(it=xe.func.args[0].token.value)),it===ae.label){Le=xe;break}}if(Le)return Q=!0,(he=Le.$)!=null&&he.variableName?(G(Le,t,n),`.${ae.label} = ${Le.$.variableName}`):`.${ae.label} = ${G(Le,t,n)}`;let oe={tag:"Atom",token:ae.exprs.expr.token,$:ae.exprs.expr.$};return`.${ae.label} = ${ra(oe,n)}`}).join(", "),se=`(${X}){${re}}`;if(!Q){let ae=br(h,n);ae&&(se=`${ae}(${se})`)}let Me=((O=e.$)==null?void 0:O.variableName)||"async_result",Fe=`${u}(${se})`;if(Me&&((J=e.$)!=null&&J.type)){let ae=qt(e.$.type,Me,n);return n.emitter.emitLine(`${t}${ae} = ${Fe};`),Me}else return Fe}else{let q=((B=e.$)==null?void 0:B.variableName)||"async_result",X=`${u}()`;if(q&&((W=e.$)!=null&&W.type)){let _e=qt(e.$.type,q,n);return n.emitter.emitLine(`${t}${_e} = ${X};`),q}else return X}}function qc(e,t){var y;let n=t.emitter,{asyncBlockId:r,structName:i,resultType:o,resultTypeCName:a,captureType:s,analysis:l,crossBoundaryIds:u,awaitFutureTempVarAliases:_,overlappingSlotAliases:c,overlappingSlots:f}=e;if(n.emitDeclarationLine(`// State machine for async block ${r} - implements Future(${M(o)})`),n.emitDeclarationLine(`struct ${i}_struct {`),n.emitDeclarationLine(" __yo_ref_header_t header; // Reference counting header (must be first)"),n.emitDeclarationLine(" int state; // Current state (0 = cold, 1..N = intermediate, -1 = completed, -2 = aborted)"),Pe(o)?n.emitDeclarationLine(" uint8_t result; // Dummy result for unit type"):n.emitDeclarationLine(` ${a} result; // The result value of type ${M(o)}`),n.emitDeclarationLine(" void (*continuation_fn)(void*); // Resume function of awaiting task"),n.emitDeclarationLine(" void* continuation_sm; // State machine of awaiting task"),n.emitDeclarationLine(""),n.emitDeclarationLine(" void (*__yo_resume_fn)(void*); // Resume function pointer (for lazy start at await/spawn)"),n.emitDeclarationLine(""),s){let g=Object.values(t.types).find(T=>T.type===s),v=g?g.cName:`async_capture_${s.id}`;n.emitDeclarationLine(" // Captured variables from outer scope"),n.emitDeclarationLine(` ${v} __capture;`),n.emitDeclarationLine("")}let p=l.capturedVariables.filter(g=>g.kind!=="outer");if(u&&(p=p.filter(g=>u.has(g.id)&&!(_!=null&&_.has(g.id))&&!(c!=null&&c.has(g.id)))),p.length>0){n.emitDeclarationLine(" // Local variables");for(let g of p){let v=H(g.type,t),T=qn(g.id,"local");n.emitDeclarationLine(` ${v} ${T}; // ${g.name}`)}n.emitDeclarationLine("")}if(f&&f.length>0){n.emitDeclarationLine(" // Overlapping storage slots (Phase 2)");for(let g of f)n.emitDeclarationLine(` ${g.cType} ${g.fieldName}; // shared: ${g.variableNames.join(", ")}`);n.emitDeclarationLine("")}if(l.awaitPoints.length>0){let g=[];for(let v of l.awaitPoints)if(!(Pe(v.resultType)||U(v.resultType)&&!v.resultType.resolvedConcreteType)&&v.isInsideCond){let b=v.resultType;if(v.futureType){let k=Cn(v.futureType);k&&(b=k.isFuture.outputType)}let C=H(b,t);g.push(` ${C} await_result_${v.index};`)}if(g.length>0){n.emitDeclarationLine(" // Await result temporaries");for(let v of g)n.emitDeclarationLine(v);n.emitDeclarationLine("")}}if(l.awaitPoints.length>0){let g=l.awaitPoints.filter(v=>v.futureVariableId===void 0);if(g.length>0){n.emitDeclarationLine(" // Future references for awaits");for(let v of g){let T=v.expr;if(T.tag!=="FnCall")continue;let $=T.args[0],b=(y=$==null?void 0:$.$)==null?void 0:y.type;if(!b)throw new Error(`Internal error: await expression missing type info for future argument in async block ${r}`);let C=H(b,t);n.emitDeclarationLine(` ${C} await_future_${v.index};`)}n.emitDeclarationLine("")}}let m=l.awaitPoints.filter(g=>g.needsOwnCondBranchField);if(m.length>0){n.emitDeclarationLine(" // Branch tracking for cond expressions with await");for(let g of m)n.emitDeclarationLine(` int cond_branch_${g.index}; // Which branch was taken in cond with await ${g.index}`);n.emitDeclarationLine("")}let h=l.awaitPoints.filter(g=>g.isInsideWhile);if(h.length>0){n.emitDeclarationLine(" // Loop state tracking for while loops with await");let g=l.awaitPoints.length;for(let v of h){n.emitDeclarationLine(` _Bool while_loop_${v.index}_active; // Whether while loop ${v.index} should continue`);let T=(v.whileNestingDepth??1)-1;for(let $=0;$<T;$++)n.emitDeclarationLine(` _Bool while_loop_${g}_active; // Whether outer while loop ${g} should continue`),g++}n.emitDeclarationLine("")}n.emitDeclarationLine("};"),n.emitDeclarationLine("")}function vh(e){var l;if(!e.deferredAsyncBlocks||e.deferredAsyncBlocks.length===0)return;let t=e.deferredAsyncBlocks,n=new Map;for(let u of t)n.set(u.structName,u);let r=new Map,i=new Map;for(let u of t)r.set(u.structName,new Set),i.set(u.structName,0);for(let u of t){let _=c=>{let f=r.get(c);f.has(u.structName)||(f.add(u.structName),i.set(u.structName,(i.get(u.structName)??0)+1))};for(let c of u.analysis.capturedVariables){let f;try{f=H(c.type,e)}catch{continue}let p=n.get(f);p&&p.structName!==u.structName&&_(p.structName)}for(let c of u.analysis.awaitPoints){if(c.futureVariableId!==void 0)continue;let f=c.expr;if(f.tag!=="FnCall")continue;let p=f.args[0],m=(l=p==null?void 0:p.$)==null?void 0:l.type;if(!m)continue;let h;try{h=H(m,e)}catch{continue}let y=n.get(h);y&&y.structName!==u.structName&&_(y.structName)}}let o=[];for(let[u,_]of i.entries())_===0&&o.push(u);let a=[];for(;o.length>0;){let u=o.shift();a.push(u);let _=r.get(u);if(_)for(let c of _){let f=(i.get(c)??0)-1;i.set(c,f),f===0&&o.push(c)}}let s=a.length===t.length?a.map(u=>n.get(u)).filter(Boolean):t;for(let u of s){let{crossBoundaryIds:_,awaitFutureTempVarAliases:c,variableSegments:f}=zs(u.bodyExpr,u.analysis),{slotAliases:p,slots:m}=Us(_,f,u.analysis.capturedVariables,c,e);qc({asyncBlockId:u.asyncBlockId,structName:u.structName,resultType:u.resultType,resultTypeCName:u.resultTypeCName,captureType:u.captureType,analysis:u.analysis,crossBoundaryIds:_,awaitFutureTempVarAliases:c,overlappingSlotAliases:p,overlappingSlots:m},e)}}function Th(e,t,n,r,i,o,a,s,l,u){var c;let _=u.emitter;if(_.emitLine(`// Dispose function for async block ${e} state machine`),_.emitLine("// Called by __yo_decr_rc when refcount hits 0 - do NOT call __yo_free here"),_.emitLine(`void ${n}(void* sm_ptr) {`),_.emitLine(` ${t}* sm = (${t}*)sm_ptr;`),_.emitLine(` ASYNC_DEBUG("${n}: Disposing state machine\\n");`),_.emitLine(""),i&&ut(i)){let f=Object.values(u.types).find(p=>p.type===i);if(!f)_.emitLine(" /* Error: capture struct type not found in context */");else{let p=f.cName,m=i.trait.fields.find(h=>h.label===w.___drop[0]);if(m&&m.assignedValue&&be(m.assignedValue)){let h=(c=u.functions[m.assignedValue.funcId])==null?void 0:c.cName;h&&(_.emitLine(' ASYNC_DEBUG(" Dropping capture struct\\n");'),_.emitLine(` ${h}(sm->__capture);`))}else _.emitLine(` /* Warning: ___drop function not found for capture struct ${p} */`)}}if(_.emitLine(""),!Pe(r)&&ut(r)){let f=H(r,u);_.emitLine(" // Drop result field if it was set (state == -1 means completed)"),_.emitLine(" int final_state = sm->state;"),_.emitLine(" if (final_state == -1) {"),_.emitLine(' ASYNC_DEBUG(" Dropping result field\\n");');let p=fi(r,u);p?_.emitLine(` ${p}(sm->result);`):_.emitLine(` /* Warning: No ___drop function found for result type ${f} */`),_.emitLine(" }")}_.emitLine("");{let f=[];for(let p of o.capturedVariables){if(p.kind!=="local"||!s.has(p.id)||l.has(p.id)||p.isOwningTheSameRcValueAs!==void 0)continue;let h=`sm->${qn(p.id,"local")}`;if(at(p.type))f.push(` if ((${h}).data != NULL) { __yo_decr_rc((void*)(${h}).data); }`);else if(mn(p.type)||fn(p.type))f.push(` if (${h} != NULL) { __yo_decr_rc_atomic((void*)${h}); }`);else if(Qt(p.type)||U(p.type)&&Qn(p.type)){let y=fi(p.type,u);y?f.push(` if (${h} != NULL) { ${y}(${h}); }`):f.push(` if (${h} != NULL) { __yo_decr_rc((void*)${h}); }`)}else if(ut(p.type)){let y=fi(p.type,u);y&&f.push(` ${y}(${h});`)}}if(f.length>0){_.emitLine(" // Drop local variables on escape (state == -2)"),_.emitLine(" if (sm->state == -2) {");for(let p of f)_.emitLine(p);_.emitLine(" }")}}_.emitLine(" // Memory freed by __yo_decr_rc after this function returns"),_.emitLine("}")}function Eh(e,t,n,r,i,o,a,s,l,u){let _=u.emitter;if(l){let c=Object.values(u.types).find(p=>p.type===l),f=c?c.cName:`async_capture_${l.id}`;_.emitLine(`${t}* ${r}(${f} __capture) {`)}else _.emitLine(`${t}* ${r}() {`);if(_.emitLine(" // Allocate async block state machine (heap-backed, ref-counted)"),_.emitLine(` ${t}* sm = (${t}*)__yo_malloc(sizeof(${t}));`),_.emitLine(` memset(sm, 0, sizeof(${t}));`),_.emitLine(""),_.emitLine(" // Initialize reference counting header"),_.emitLine(" sm->header.ref_count = 1; // Caller owns initial reference"),_.emitLine(` GC_DEBUG("AsyncBlock ${t}: Created ptr=%p RC=1\\n", (void*)sm);`),u.needsCycleGC&&(_.emitLine(" sm->header.gc_flags = 0;"),_.emitLine(" sm->header.gc_mark = __YO_GC_UNMARKED;"),_.emitLine(" sm->header.gc_next = NULL;"),_.emitLine(" sm->header.gc_prev = NULL;")),u.needsCycleGC)_.emitLine(` sm->header.dispose_fn = (void(*)(void*))${i};`);else{u.disposeTypeIds||(u.disposeTypeIds=new Map,u.nextDisposeTypeId=1);let c=u.disposeTypeIds.get(i);c===void 0&&(c=u.nextDisposeTypeId,u.nextDisposeTypeId=c+1,u.disposeTypeIds.set(i,c)),_.emitLine(` sm->header.type_id = ${c};`)}u.needsCycleGC&&_.emitLine(" sm->header.traverse_fn = NULL; // TODO: Add traverse for cycle detection if needed"),_.emitLine(""),_.emitLine(" sm->state = 0;"),_.emitLine(" sm->continuation_fn = NULL;"),_.emitLine(" sm->continuation_sm = NULL;"),_.emitLine(""),l&&(_.emitLine(" // Initialize captured variables"),_.emitLine(" sm->__capture = __capture;"),_.emitLine("")),_.emitLine(" // Initialize result (will be set when async block completes)"),Pe(a)?_.emitLine(" // Result is unit type, no initialization needed"):_.emitLine(` memset(&sm->result, 0, sizeof(${s}));`),_.emitLine(""),_.emitLine(` sm->__yo_resume_fn = (void(*)(void*))${n};`),_.emitLine(""),_.emitLine(" return sm;"),_.emitLine("}"),_.emitLine("")}function Hc(e){if(!e.deferredAsyncBlocks||e.deferredAsyncBlocks.length===0)return;let t=e.emitter;vh(e),t.emitLine("// Deferred async block implementations");let n=0;for(;n<e.deferredAsyncBlocks.length;){let r=e.deferredAsyncBlocks[n],i=e.deferredAsyncBlocks.length,{bodyExpr:o,asyncBlockId:a,structName:s,resumeFunctionName:l,constructorName:u,disposeFunctionName:_,futureType:c,resultType:f,resultTypeCName:p,captureType:m,analysis:h}=r,y=e.stateMachineVariables,g=e.currentEvidenceParams,v=new Map,{crossBoundaryIds:T,awaitFutureTempVarAliases:$,variableSegments:b}=zs(o,h),{slotAliases:C}=Us(T,b,h.capturedVariables,$,e),k=h.capturedVariables.filter(x=>x.kind==="outer"||T.has(x.id)||$.has(x.id)||C.has(x.id)),F={...h,capturedVariables:k};for(let x of k)v.set(x.id,x);if(m)for(let x of m.fields)v.set(x.label,{id:x.label,name:x.label,type:x.type,kind:"outer",isOwningTheSameRcValueAs:void 0});e.stateMachineVariables=v;let S=e.stateMachineFieldAliases,V=new Map($);for(let[x,I]of C)V.set(x,I);e.stateMachineFieldAliases=V;let N=Rc(o,a,s,l,F,c,m,e);if(e.stateMachineVariables=y,e.currentEvidenceParams=g,e.stateMachineFieldAliases=S,t.emitLine(""),Th(a,s,_,f,m,F,N,T,$,e),t.emitLine(""),Eh(a,s,l,u,_,c,f,p,m,e),t.emitLine(""),e.deferredAsyncBlocks.length>i){let x=e.deferredAsyncBlocks.slice(i);for(let I of x){let{crossBoundaryIds:D,awaitFutureTempVarAliases:z,variableSegments:O}=zs(I.bodyExpr,I.analysis),{slotAliases:J,slots:B}=Us(D,O,I.analysis.capturedVariables,z,e);qc({asyncBlockId:I.asyncBlockId,structName:I.structName,resultType:I.resultType,resultTypeCName:I.resultTypeCName,captureType:I.captureType,analysis:I.analysis,crossBoundaryIds:D,awaitFutureTempVarAliases:z,overlappingSlotAliases:J,overlappingSlots:B},e)}}n++}}function jc(e){for(let t in e.functions){let{value:n}=e.functions[t];n.body&&Kc(n.body,e)}}var $h=["__yo_poll_","__yo_fs_event_","__yo_async_"];function bh(e){return $h.some(t=>e.startsWith(t))}function Kc(e,t){var n,r,i,o,a,s,l;if(e&&A(e)){let u=e;if(An(e)){t.usesAsync=!0;let _=(n=e.$)==null?void 0:n.type;if(_&&nt(_)&&Cn(_)){let p=`${((r=e.$)==null?void 0:r.variableName)||`async_block_${Date.now()}`}_state_t`;e.$&&(e.$.asyncStateMachineStructName=p),t.types[_.id]={type:_,cName:p},t.emitter.emitDeclarationLine(`typedef struct ${p}_struct ${p}; // Forward declaration for async state machine`)}}if(An(e)){let _=(i=e.$)==null?void 0:i.type;if(_&&nt(_)&&Cn(_)){let f=((o=e.$)==null?void 0:o.variableName)||`io_async_block_${Date.now()}`,p=!!((a=e.$)!=null&&a.awaitAnalysis),m=p?`${f}_state_t`:`${f}_sync_fut_t`;e.$&&(e.$.asyncStateMachineStructName=m),t.types[_.id]={type:_,cName:m},t.emitter.emitDeclarationLine(`typedef struct ${m}_struct ${m}; // Forward declaration for io.async ${p?"state machine":"sync future"}`)}}(ar(e)||ws(e))&&(t.usesAsync=!0);{let _=(s=u.func.$)==null?void 0:s.type;_&&"isExtern"in _&&_.isExtern==="yo"&&"externName"in _&&typeof _.externName=="string"&&bh(_.externName)&&(t.usesAsync=!0)}{let _=(l=u.func.$)==null?void 0:l.type;_&&"isExtern"in _&&_.isExtern==="yo"&&"externName"in _&&typeof _.externName=="string"&&(_.externName==="__yo_thread_spawn"||_.externName==="__yo_worker_spawn")&&(t.usesParallelism=!0)}for(let _ of u.args)Kc(_,t)}}function Xc(e,t,n){var k,F,S,V,N,x,I,D,z,O,J,B;let r=(k=e.$)==null?void 0:k.type;if(!r||!nt(r))return"/* Error: io.async must return a Future type */";let i=Cn(r);if(!i)return"/* Error: Could not extract Future module type */";let o=i.isFuture.outputType;if(U(o))if(o.resolvedConcreteType)o=o.resolvedConcreteType;else{let W=(S=(F=e.$)==null?void 0:F.runtimeArgExprsInOrder)==null?void 0:S[0],q=(V=W==null?void 0:W.$)==null?void 0:V.closureFunctionValue;if(q&&be(q)){let X=(x=(N=q.type)==null?void 0:N.return)==null?void 0:x.type;if(X&&U(X)&&X.resolvedConcreteType)o=X.resolvedConcreteType;else if((D=(I=q.body)==null?void 0:I.$)!=null&&D.type){let _e=q.body.$.type;U(_e)&&_e.resolvedConcreteType?o=_e.resolvedConcreteType:U(_e)||(o=_e)}}}let a=H(o,n),s=(z=e.$)==null?void 0:z.asyncStateMachineStructName;if(!s)return"/* Error: Missing sync future struct name */";let l=`${s}_dispose`,u=`${s}_resume`,_=n.emitter,c=(J=(O=e.$)==null?void 0:O.runtimeArgExprsInOrder)==null?void 0:J[0];if(!(c!=null&&c.$))return"/* Error: Missing closure argument for io.async */";let f=G(c,t,n),p=c.$.type,m,h;if(U(p)&&p.resolvedConcreteType){let W=p.resolvedConcreteType,q=n.implClosureCallMap.get(W.id);q&&(m=q.functionCName);let X=n.types[W.id];X&&(h=X.cName)}if(!m||!h)return"/* Error: no closure function or capture type for io.async sync path */";_.emitDeclarationLine(`struct ${s}_struct {`),_.emitDeclarationLine(" __yo_ref_header_t header;"),_.emitDeclarationLine(" int state;"),Pe(o)?_.emitDeclarationLine(" uint8_t result;"):_.emitDeclarationLine(` ${a} result;`),_.emitDeclarationLine(" void (*continuation_fn)(void*);"),_.emitDeclarationLine(" void* continuation_sm;"),_.emitDeclarationLine(" void (*__yo_resume_fn)(void*);"),_.emitDeclarationLine(` ${h} __capture;`),_.emitDeclarationLine("};"),_.emitDeclarationLine("");let y="";for(let W in n.functions){let q=n.functions[W];if(q.cName===m){let X=_n(q.value.type);X.length>0&&(y=", "+X.map(_e=>`(void*)sm->__capture.${_e.fieldPath.join(".")}`).join(", "));break}}_.emitDeclarationLine(`void ${u}(void* ptr) {`),_.emitDeclarationLine(` ${s}* sm = (${s}*)ptr;`),Pe(o)?_.emitDeclarationLine(` ${m}(&sm->__capture${y});`):_.emitDeclarationLine(` sm->result = ${m}(&sm->__capture${y});`),y&&(_.emitDeclarationLine(" if (__yo_effect_escaped) {"),_.emitDeclarationLine(" __yo_effect_escaped = 0;"),_.emitDeclarationLine(" sm->state = -2;"),_.emitDeclarationLine(" __yo_decr_rc(ptr);"),_.emitDeclarationLine(" return;"),_.emitDeclarationLine(" }")),_.emitDeclarationLine(" sm->state = -1;"),_.emitDeclarationLine(" void (*continuation)(void*) = sm->continuation_fn;"),_.emitDeclarationLine(" if (continuation) {"),_.emitDeclarationLine(" void* cont_sm = sm->continuation_sm;"),_.emitDeclarationLine(" continuation(cont_sm);"),_.emitDeclarationLine(" }"),_.emitDeclarationLine(" __yo_decr_rc(ptr);"),_.emitDeclarationLine("}"),_.emitDeclarationLine("");let g=c.$.captureType,v=g&&ut(g)?fi(g,n):void 0,T=g&&ut(g)?br(g,n):void 0,$=fi(o,n);_.emitDeclarationLine(`void ${l}(void* ptr) {`),(v||$)&&(_.emitDeclarationLine(` ${s}* sm = (${s}*)ptr;`),v&&(_.emitDeclarationLine(" // Drop captured variables (future owns its references)"),_.emitDeclarationLine(` ${v}(sm->__capture);`)),$&&(_.emitDeclarationLine(" if (sm->state == -1) {"),_.emitDeclarationLine(` ${$}(sm->result);`),_.emitDeclarationLine(" }"))),_.emitDeclarationLine("}"),_.emitDeclarationLine("");let b=((B=e.$)==null?void 0:B.variableName)||"__io_async_result",C=qt(r,b,n);if(_.emitLine(`${t}${C} = (${s}*)__yo_malloc(sizeof(${s}));`),_.emitLine(`${t}memset(${b}, 0, sizeof(${s}));`),_.emitLine(`${t}${b}->header.ref_count = 1;`),n.needsCycleGC&&(_.emitLine(`${t}${b}->header.gc_flags = 0;`),_.emitLine(`${t}${b}->header.gc_mark = __YO_GC_UNMARKED;`),_.emitLine(`${t}${b}->header.gc_next = NULL;`),_.emitLine(`${t}${b}->header.gc_prev = NULL;`)),n.needsCycleGC)_.emitLine(`${t}${b}->header.dispose_fn = (void(*)(void*))${l};`);else{n.disposeTypeIds||(n.disposeTypeIds=new Map,n.nextDisposeTypeId=1);let W=n.disposeTypeIds.get(l);W===void 0&&(W=n.nextDisposeTypeId,n.nextDisposeTypeId=W+1,n.disposeTypeIds.set(l,W)),_.emitLine(`${t}${b}->header.type_id = ${W};`)}return n.needsCycleGC&&_.emitLine(`${t}${b}->header.traverse_fn = NULL;`),_.emitLine(`${t}${b}->__capture = ${f};`),T&&_.emitLine(`${t}${b}->__capture = ${T}(${b}->__capture);`),_.emitLine(`${t}${b}->state = 0;`),_.emitLine(`${t}${b}->__yo_resume_fn = ${u};`),_.emitLine(`${t}${b}->continuation_fn = NULL;`),_.emitLine(`${t}${b}->continuation_sm = NULL;`),b}function Qc(e,t){for(let i=0;i<e.fields.length;i++){let o=e.fields[i];be(o)&&(Fi(o.type,t),Ui(o.body,t))}if(t.moduleLevelInitExprs)for(let i of t.moduleLevelInitExprs)Ui(i,t);let n=new Set,r=!0;for(;r;){r=!1;for(let i in t.functions){if(n.has(i))continue;n.add(i),r=!0;let o=t.functions[i];if(Fi(o.value.type,t),o.value.specializedType&&Fi(o.value.specializedType,t),Ui(o.value.body,t),o.value.calledComptimeFunctionCaches)for(let a of o.value.calledComptimeFunctionCaches)a.value&&a.value.type&&kn(a.value.type,t),Ui(a.body,t)}}}function Fi(e,t){for(let n of e.parameters)kn(n.type,t);for(let n of e.forallParameters)kn(n.type,t);kn(e.return.type,t)}function Ui(e,t){var n;if(e.$&&e.$.type&&kn(e.$.type,t),e.$&&e.$.value&&be(e.$.value)){let r=e.$.value;r.isControlFunction?(Fi(r.type,t),wn(r.body,t)):t.functions[r.funcId]||r.type.parameters.map(a=>a.type).some(a=>U(a)&&nt(a)&&!a.resolvedConcreteType)||(t.functions[r.funcId]={value:r,cName:Ce(r.funcId)},Fi(r.type,t),wn(r.body,t))}if(e.$&&e.$.deferredDropExpressions&&e.$.deferredDropExpressions.length>0)for(let r of e.$.deferredDropExpressions)Ui(r,t);if(e.$&&e.$.macroExpansion&&Ui(e.$.macroExpansion,t),e.$&&e.$.runtimeDestructurings)for(let{type:r}of e.$.runtimeDestructurings)kn(r,t);if(e.$&&e.$.captureType&&De(e.$.captureType)){let r=e.$.captureType;if(!t.types[r.id]){t.types[r.id]={type:r,cName:`__yo_${r.id}`};for(let i of r.fields)kn(i.type,t);for(let i of r.trait.fields)if(i.assignedValue&&be(i.assignedValue)){let o=i.assignedValue;t.functions[o.funcId]||(t.functions[o.funcId]={value:o,cName:o.funcId},Fi(o.type,t),wn(o.body,t))}}}switch(e.tag){case"FnCall":if(E(e,R.test))break;Ui(e.func,t);for(let r of e.args)Ui(r,t);break;case"Atom":(n=e.$)!=null&&n.value&&Y(e.$.value)&&kn(e.$.value.value,t);break}}function kn(e,t){if(!t.types[e.id]){if(U(e)&&Dn(e)){if(e.resolvedConcreteType){kn(e.resolvedConcreteType,t);return}let n=Yn(e);n&&kn(n,t);return}if(U(e)&&nt(e)){let n=Cn(e);n&&kn(n.isFuture.outputType,t);return}if(U(e)&&e.resolvedConcreteType){kn(e.resolvedConcreteType,t);return}if(!ze(e)){if(De(e)||Ot(e)||qe(e)||lt(e)||at(e)||Qe(e)||ft(e)||Ct(e)||mn(e)||fn(e)){let n=Ct(e)?H(e,t):e.isExtern==="c"&&e.externName?e.externName:`__yo_${e.id}`;if(t.types[e.id]={type:e,cName:n},De(e))for(let r of e.fields)kn(r.type,t);if(qe(e)){for(let r of e.variants)if(r.fields)for(let i of r.fields)kn(i.type,t)}if(Ot(e))for(let r of e.fields)kn(r.type,t);if(at(e)){let r=e;for(let i of r.requiredTraits)kn(i.traitType,t)}if(mn(e)){let r=e;kn(r.childType,t),H(r,t)}if(fn(e)){let r=e;kn(r.childType,t),H(r,t)}if(Ct(e)&&kn(e.childType,t),Qe(e)||ft(e)){for(let r of e.fields)kn(r.type,t);for(let r of e.fields)if(r.assignedValue&&be(r.assignedValue)){let i=r.assignedValue;t.functions[i.funcId]||(t.functions[i.funcId]={value:i,cName:Ce(i.funcId)},Fi(i.type,t),wn(i.body,t))}else if(r.assignedValue&&(bt(r.assignedValue)||tn(r.assignedValue))){let i=r.assignedValue;Ha(i,t,!1)}}}else if(tt(e)){let n=e,r=n.childType,i=n.length;if(Lt(i)){kn(r,t);let o=H(r,t),a=`Array_${Ce(o)}_${i.value}`;t.arrayStructTypes.has(a)||t.arrayStructTypes.set(a,{childType:o,length:typeof i.value=="bigint"?Number(i.value):i.value}),t.types[e.id]={type:e,cName:a}}}else if(Ze(e)){if(kn(e.childType,t),Ct(e.childType)){let r=e.childType.childType;kn(r,t);let i=H(r,t),o=`Slice_${Ce(i)}`;t.sliceStructTypes.has(o)||t.sliceStructTypes.set(o,{childType:i})}t.types[e.id]={type:e,cName:H(e,t)}}else Nc.has(e.tag)&&(t.types[e.id]={type:e,cName:H(e,t)});e.trait&&kn(e.trait,t)}}}function go(e){var t,n,r;if(e.$&&e.$.value&&Se(e.$.value)&&!(te(e.$.type)&&e.$.type.isExtern)){if(!Pe(e.$.type))return!0}if(A(e)){if(go(e.func))return!0;for(let i of e.args)if(!((t=i.$)!=null&&t.type&&Pe(i.$.type))&&go(i))return!0}if(e.$&&e.$.macroExpansion){if(e.$.type&&Pe(e.$.type))return!1;if(go(e.$.macroExpansion))return!0}if((n=e.$)!=null&&n.deferredDupExpressions){for(let i of e.$.deferredDupExpressions)if(go(i))return!0}if((r=e.$)!=null&&r.deferredDropExpressions){for(let i of e.$.deferredDropExpressions)if(go(i))return!0}return!1}function Ha(e,t,n=!0){for(let r=0;r<e.fields.length;r++){let i=e.fields[r],o=e.type.fields[r];if(be(i)){let a=o.label;if(a==="main")t.functions[i.funcId]={value:i,cName:"__yo_user_main"};else if(t.isLibrary)if(n&&t.currentModuleId&&i.funcId.startsWith(`fn_${t.currentModuleId}_`)){let l=Ce(a);Object.values(t.functions).some(_=>_.cName===l)?t.functions[i.funcId]={value:i,cName:Ce(i.funcId)}:(t.functions[i.funcId]={value:i,cName:l},t.exportedFunctionLabels||(t.exportedFunctionLabels=new Map),t.exportedFunctionLabels.set(i.funcId,a))}else t.functions[i.funcId]={value:i,cName:Ce(i.funcId)};else if(n&&t.currentModuleId&&i.funcId.startsWith(`fn_${t.currentModuleId}_`)){let l=Ce(a);Object.values(t.functions).some(_=>_.cName===l)?t.functions[i.funcId]={value:i,cName:Ce(i.funcId)}:(t.functions[i.funcId]={value:i,cName:l},t.exportedFunctionLabels||(t.exportedFunctionLabels=new Map),t.exportedFunctionLabels.set(i.funcId,a))}else t.functions[i.funcId]={value:i,cName:Ce(i.funcId)};wn(i.body,t)}}}function Zc(e,t){for(let n=0;n<e.fields.length;n++){let r=e.fields[n];r&&be(r)?t.functions[r.funcId]||(r.isModuleEffectMember=!0,t.functions[r.funcId]={value:r,cName:Ce(r.funcId)},wn(r.body,t)):r&&bt(r)&&Zc(r,t)}}function wn(e,t){var i,o,a,s,l,u,_,c,f,p,m,h;if((i=e.$)!=null&&i.value&&bt(e.$.value)){let y=e.$.value;Zc(y,t)}if(A(e)&&E(e,R.test)||A(e)&&E(e,w.comptime_expect_error))return;if(e.$&&e.$.macroExpansion&&wn(e.$.macroExpansion,t),(o=e.$)!=null&&o.effectAnalysis){let y=e.$.effectAnalysis.handlerValue;y&&be(y)&&wn(y.body,t)}if(e.$&&e.$.closureFunctionValue){let y=e.$.closureFunctionValue;t.functions[y.funcId]||(t.functions[y.funcId]={value:y,cName:Ce(y.funcId)},wn(y.body,t))}if((a=e.$)!=null&&a.indexMethodValue&&be(e.$.indexMethodValue)){let y=e.$.indexMethodValue;t.functions[y.funcId]||(t.functions[y.funcId]={value:y,cName:Ce(y.funcId)},wn(y.body,t))}if(A(e)&&e.$&&e.$.dynCallTraitValues&&e.$.dynCallTraitValues.length>0){let y=e.$.type,g=e.args[0];if(at(y)&&g&&((s=g.$)!=null&&s.type)){let v=g.$.type,T=e.$.dynCallTraitValues;if(T.length>0&&(Qt(v)||mr(v))){let $=mr(v)?v.fields[0].type:v,b=`${$.id}_${y.id}`;t.dynImpls.set(b,{dynType:y,concreteType:$,dataType:v,traitValues:T})}}}if(A(e)){let y=(l=e.func.$)==null?void 0:l.type,g=(u=e.func.$)==null?void 0:u.value;if(e.func.token.value==="?=")return;if(te(y)){if(be(g)&&g.isControlFunction){wn(g.body,t);for(let v of e.args)wn(v,t);return}if(be(g)){if(g.type.return.isCompileTimeOnly||ul(g)&&!g.specializedType)return;if(g.specializedType&&ti(g.specializedType)&&_n(g.specializedType).length===0){wn(e.func,t);for(let T of e.args)wn(T,t);return}if(!t.functions[g.funcId]){let v=!1;if(go(g.body)){let T=g.specializedType??g.type;if(v=T.implicitParameters.length>0&&(_n(T).length>0||!ti(g.type)&&g.type.implicitParameters.length>0),!v)return}if(!v&&!(_n(g.specializedType??g.type).length>0)&&(g.specializedType??g.type).parameters.map(C=>C.type).some(C=>U(C)&&nt(C)&&!C.resolvedConcreteType))return;t.functions[g.funcId]={value:g,cName:Ce(g.funcId)},wn(g.body,t)}}else if(y.isExtern==="c"){let v=y.externName?y.externName:j(e.func)?e.func.token.value:y.id;t.externFunctions[y.id]={type:y,cName:v}}else if(y.isExtern==="yo"){let v=y.externName;if(!(v&&v.startsWith("__yo_"))){let T=v?Ce(v):j(e.func)?Ce(e.func.token.value):Ce(y.id);t.externFunctions[y.id]={type:y,cName:T}}}}wn(e.func,t);for(let v of e.args)wn(v,t)}let n=(_=e.$)==null?void 0:_.type,r=(c=e.$)==null?void 0:c.value;if(te(n)){if(be(r)&&r.isControlFunction){if(r.isModuleEffectMember=!0,t.functions[r.funcId]||(t.functions[r.funcId]={value:r,cName:Ce(r.funcId)}),r.specializedFunctionCaches)for(let y of r.specializedFunctionCaches){let g=y.specializedFunction;g&&!t.functions[g.funcId]&&(g.isModuleEffectMember=!0,t.functions[g.funcId]={value:g,cName:Ce(g.funcId)},wn(g.body,t))}wn(r.body,t);return}if(be(r)){if(ul(r)&&!r.specializedFunctionCaches||t.functions[r.funcId])return;if(go(r.body))return;t.functions[r.funcId]={value:r,cName:Ce(r.funcId)},wn(r.body,t)}}if(Y((f=e.$)==null?void 0:f.value)&&kn(e.$.value.value,t),(p=e.$)!=null&&p.deferredDupExpressions)for(let y of e.$.deferredDupExpressions)wn(y,t);if((m=e.$)!=null&&m.deferredDropExpressions)for(let y of e.$.deferredDropExpressions)wn(y,t);if((h=e.$)!=null&&h.dynCallTraitValues)for(let y of e.$.dynCallTraitValues)Ha(y,t,!1)}function Jc(e){let t=w.dispose[0];for(let n in e.types){let{type:r}=e.types[n];if(!De(r)||!r.isReferenceSemantics)continue;let i=Ir({concreteType:r,methodName:t,env:r.env});for(let o of i)if(o.value&&be(o.value)){let a=o.value;if(e.functions[a.funcId])continue;a.funcName||(a.funcName=t),e.functions[a.funcId]={value:a,cName:Ce(a.funcId)},Fi(a.type,e),wn(a.body,e)}}}function ef(e){var r;let t=e.emitter,n=new Set;for(let[,i]of e.dynImpls){let o=((r=e.types[i.dynType.id])==null?void 0:r.cName)||`__yo_dyn_${i.dynType.id}`;n.has(o)||(n.add(o),t.emitLine(`${o} __yo_dup_${o}(${o} dyn) {`),t.emitLine(" if (dyn.data) {"),t.emitLine(" __yo_incr_rc(dyn.data);"),t.emitLine(" }"),t.emitLine(" return dyn;"),t.emitLine("}"),t.emitLine(""),t.emitLine(`void __yo_drop_${o}(${o} dyn) {`),t.emitLine(" if (dyn.data) {"),t.emitLine(" __yo_decr_rc(dyn.data);"),t.emitLine(" }"),t.emitLine("}"),t.emitLine(""))}}function tf(e){var r,i,o;let t=e.emitter;if(e.dynImpls.size===0)return;t.emitLine(""),t.emitLine("// === Dyn Box Functions ==="),t.emitLine("// Constructor and dispose functions for dyn boxes"),t.emitLine("");let n=new Set;for(let[,a]of e.dynImpls){let s=U(a.concreteType)&&a.concreteType.resolvedConcreteType?a.concreteType.resolvedConcreteType:a.concreteType,u=`__yo_dyn_box_${((r=e.types[s.id])==null?void 0:r.cName)||`unknown_${s.id}`}`;if(n.has(u))continue;n.add(u);let _=H(s,e);t.emitLine(`static ${u}* __yo_new_${u}(${_} value) {`),t.emitLine(` ${u}* box = (${u}*)__yo_malloc(sizeof(${u}));`),t.emitLine(" box->header.ref_count = 1;"),e.needsCycleGC&&(t.emitLine(" box->header.gc_flags = 0;"),t.emitLine(" box->header.gc_mark = __YO_GC_UNMARKED;"),t.emitLine(" box->header.gc_next = NULL;"),t.emitLine(" box->header.gc_prev = NULL;"));let c=`__yo_dispose_${u}`;if(e.needsCycleGC)t.emitLine(` box->header.dispose_fn = ${c};`);else{e.disposeTypeIds||(e.disposeTypeIds=new Map,e.nextDisposeTypeId=1);let m=e.disposeTypeIds.get(c);m===void 0&&(m=e.nextDisposeTypeId,e.nextDisposeTypeId=m+1,e.disposeTypeIds.set(c,m)),t.emitLine(` box->header.type_id = ${m};`)}e.needsCycleGC&&t.emitLine(" box->header.traverse_fn = NULL; // TODO: Set if value contains GC types"),t.emitLine(" box->value = value;"),t.emitLine(" return box;"),t.emitLine("}"),t.emitLine(""),t.emitLine(`static void __yo_dispose_${u}(void* ptr) {`),t.emitLine(` ${u}* box = (${u}*)ptr;`);let p=(i=(U(a.concreteType)&&a.concreteType.resolvedConcreteType?a.concreteType.resolvedConcreteType:a.concreteType).trait)==null?void 0:i.fields.find(m=>m.label===w.___drop[0]);if(p&&p.assignedValue&&be(p.assignedValue)){let m=(o=e.functions[p.assignedValue.funcId])==null?void 0:o.cName;m&&t.emitLine(` ${m}(box->value);`)}t.emitLine("}"),t.emitLine("")}}function nf(e){var n,r,i,o;let t=e.emitter;if(e.dynImpls.size!==0){t.emitDeclarationLine(""),t.emitDeclarationLine("// === Dyn Wrapper Functions ==="),t.emitDeclarationLine("// Wrappers that unwrap boxed values and call impl methods"),t.emitDeclarationLine("");for(let[a,s]of e.dynImpls){let l=s.dataType,u=new Set([w.___dup[0],w.___drop[0],w.___dispose[0],w.dispose[0]]);for(let{traitType:_}of s.dynType.requiredTraits){if(!dn(_))continue;let c=_.isFn.callType,f=H(c.return.type,e),p=`__yo_wrap_${a}_call`,m=["void* self_ptr"];for(let h=0;h<c.parameters.length;h++){let y=c.parameters[h],g=H(y.type,e);m.push(`${g} arg${h+1}`)}if(t.emitDeclarationLine(`static ${f} ${p}(${m.join(", ")}) {`),mr(l)){let h=((n=e.types[l.id])==null?void 0:n.cName)||`unknown_${l.id}`,y=Ce(l.fields[0].label);t.emitDeclarationLine(` ${h}* box = (${h}*)self_ptr;`);let g=l.fields[0].type,v=U(g)&&g.resolvedConcreteType?g.resolvedConcreteType:g,T=e.implClosureCallMap.get(v.id),$=(()=>{var C;if(T)return T.functionCName;for(let[,k]of Object.entries(e.functions)){let S=k.value.closureInfo;if(((C=S==null?void 0:S.captureType)==null?void 0:C.id)===v.id)return k.cName}})(),b=[];if($){b.push(`(void*)&box->${y}`);for(let C=0;C<c.parameters.length;C++)b.push(`arg${C+1}`);hi(c.return.type)?t.emitDeclarationLine(` ${$}(${b.join(", ")});`):t.emitDeclarationLine(` return ${$}(${b.join(", ")});`)}else{b.push(`box->${y}.data`);for(let C=0;C<c.parameters.length;C++)b.push(`arg${C+1}`);hi(c.return.type)?t.emitDeclarationLine(` box->${y}.call(${b.join(", ")});`):t.emitDeclarationLine(` return box->${y}.call(${b.join(", ")});`)}}else{t.emitDeclarationLine(" (void)self_ptr; /* Dyn(Fn): expected Box(...) data */");for(let h=0;h<c.parameters.length;h++)t.emitDeclarationLine(` (void)arg${h+1};`);hi(c.return.type)?t.emitDeclarationLine(" return;"):(t.emitDeclarationLine(` ${f} zero = (${f})0;`),t.emitDeclarationLine(" return zero;"))}t.emitDeclarationLine("}"),t.emitDeclarationLine("")}for(let _=0;_<s.dynType.requiredTraits.length;_++){let{traitType:c}=s.dynType.requiredTraits[_];if(dn(c))continue;let f=s.traitValues[_];if(!f){t.emitDeclarationLine(`/* Warning: Module value missing for module ${_} */`);continue}let m=f.type.fields;for(let h=0;h<m.length;h++){let y=m[h];if(y.label==="Self"||u.has(y.label))continue;let g=f.fields[h];if(!g||!be(g)){t.emitDeclarationLine(`/* Warning: Module field ${y.label} is not a function value */`);continue}let v=y.type;if(!te(v)){t.emitDeclarationLine(`/* Warning: Module field ${y.label} is not a function type */`);continue}let T=g.funcId,$=(r=e.functions[T])==null?void 0:r.cName;if(!$){t.emitDeclarationLine(`/* Warning: Impl function for ${y.label} not found */`);continue}let b=`__yo_wrap_${a}_${y.label}`,C=H(v.return.type,e),k=["void* self_ptr"];for(let N=1;N<v.parameters.length;N++){let x=v.parameters[N],I=H(x.type,e);k.push(`${I} arg${N}`)}t.emitDeclarationLine(`static ${C} ${b}(${k.join(", ")}) {`);let F=(i=v.parameters[0])==null?void 0:i.type,S;if(mr(l)){let N=((o=e.types[l.id])==null?void 0:o.cName)||`unknown_${l.id}`,x=Ce(l.fields[0].label);t.emitDeclarationLine(` ${N}* box = (${N}*)self_ptr;`),F&&Ze(F)?S=`&box->${x}`:S=`box->${x}`}else{let N=H(s.concreteType,e);t.emitDeclarationLine(` ${N} concrete_value = (${N})self_ptr;`),F&&Ze(F)?S="&concrete_value":S="concrete_value"}let V=[S];for(let N=1;N<v.parameters.length;N++)V.push(`arg${N}`);hi(v.return.type)?t.emitDeclarationLine(` ${$}(${V.join(", ")});`):t.emitDeclarationLine(` return ${$}(${V.join(", ")});`),t.emitDeclarationLine("}"),t.emitDeclarationLine("")}}}}}function rf(e){var r,i,o;let t=e.emitter;if(e.dynImpls.size===0)return;t.emitDeclarationLine(""),t.emitDeclarationLine("// === Dyn TypeId Statics ==="),t.emitDeclarationLine("// Unique static per concrete type \u2014 address is the runtime TypeId"),t.emitDeclarationLine("");let n=new Set;e.typeIdStatics||(e.typeIdStatics=new Map);for(let[,a]of e.dynImpls){let s=U(a.concreteType)&&a.concreteType.resolvedConcreteType?a.concreteType.resolvedConcreteType:a.concreteType,l=((r=e.types[s.id])==null?void 0:r.cName)||`unknown_${s.id}`,u=`__yo_typeid_${l}`;!n.has(u)&&!e.typeIdStatics.has(s.id)&&(n.add(u),e.typeIdStatics.set(s.id,u),t.emitDeclarationLine(`static const char ${u} = 0; // TypeId for ${l}`))}t.emitDeclarationLine(""),t.emitDeclarationLine("// === Dyn Static Vtables ==="),t.emitDeclarationLine("// Static vtables for dynamic dispatch"),t.emitDeclarationLine("");for(let[a,s]of e.dynImpls){let l=((i=e.types[s.dynType.id])==null?void 0:i.cName)||`__yo_dyn_${s.dynType.id}`,u=U(s.concreteType)&&s.concreteType.resolvedConcreteType?s.concreteType.resolvedConcreteType:s.concreteType,_=((o=e.types[u.id])==null?void 0:o.cName)||`unknown_${u.id}`,c=`__yo_vtable_${a}`,f=`${l}_vtable`,p=`__yo_typeid_${_}`;t.emitDeclarationLine(`// Vtable for impl(${_}, ${s.dynType.requiredTraits.map(({traitType:y})=>y.typeName||"?").join(" + ")})`),t.emitDeclarationLine(`static const ${f} ${c} = {`),t.emitDeclarationLine(` .__yo_type_id = (uintptr_t)&${p},`);let m=new Set,h=new Set([w.___dup[0],w.___drop[0],w.___dispose[0],w.dispose[0]]);for(let{traitType:y}of s.dynType.requiredTraits){if(dn(y)){let g=`__yo_wrap_${a}_call`;t.emitDeclarationLine(` .call = ${g},`),m.add("call");continue}for(let g of y.fields)if(g.label!=="Self"&&!h.has(g.label)&&!m.has(g.label)&&(m.add(g.label),te(g.type))){let v=g.type;if(v.parameters.length>0){let T=v.parameters[0];if(T&&T.label==="self"){let $=`__yo_wrap_${a}_${g.label}`;t.emitDeclarationLine(` .${Ce(g.label)} = ${$},`)}}}}t.emitDeclarationLine("};"),t.emitDeclarationLine("")}}function of(e,t){let r=In(t)?"__declspec(thread)":"_Thread_local";e.emitLine(`
|
|
196
196
|
// ============================================================================
|
|
197
197
|
// Async/Await Runtime - Per-Thread Cooperative Scheduler
|
|
198
198
|
// ============================================================================
|