Skip to content

Commit 59c57e6

Browse files
fix(bindgen): async stream record lowering impl
1 parent 169bf33 commit 59c57e6

3 files changed

Lines changed: 45 additions & 49 deletions

File tree

crates/js-component-bindgen/src/intrinsics/lift.rs

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -633,8 +633,9 @@ impl LiftIntrinsic {
633633
return [val, ctx];
634634
}}
635635
636-
const start = new DataView(ctx.memory.buffer).getUint32(ctx.storagePtr, true);
637-
const codeUnits = new DataView(ctx.memory.buffer).getUint32(ctx.storagePtr + 4, true);
636+
const dv = new DataView(ctx.memory.buffer);
637+
const start = dv.getUint32(ctx.storagePtr, true);
638+
const codeUnits = dv.getUint32(ctx.storagePtr + 4, true);
638639
val = {decoder}.decode(new Uint8Array(ctx.memory.buffer, start, codeUnits));
639640
640641
ctx.storagePtr += 8;
@@ -690,16 +691,14 @@ impl LiftIntrinsic {
690691
691692
if (ctx.useDirectParams) {{
692693
ctx.storagePtr = ctx.params[0];
694+
ctx.params = ctx.params.slice(1);
693695
}}
694696
695697
const res = {{}};
696-
for (const [key, liftFn, _size32, align32] of keysAndLiftFns) {{
698+
for (const [key, liftFn, _size32, _align32] of keysAndLiftFns) {{
697699
let [val, newCtx] = liftFn(ctx);
698700
res[key] = val;
699701
ctx = newCtx;
700-
701-
const rem = ctx.storagePtr % align32;
702-
if (rem !== 0) {{ ctx.storagePtr += align32 - rem; }}
703702
}}
704703
705704
return [res, ctx];

crates/js-component-bindgen/src/intrinsics/lower.rs

Lines changed: 39 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -328,13 +328,13 @@ impl LowerIntrinsic {
328328
throw new Error(`unexpected number [${{ctx.vals.length}}] of core vals (expected 1)`);
329329
}}
330330
331+
const rem = ctx.storagePtr % 2;
332+
if (rem !== 0) {{ ctx.storagePtr += (2 - rem); }}
333+
331334
{require_valid_numeric_primitive_fn}.bind('s16', ctx.vals[0]);
332335
new DataView(ctx.memory.buffer).setInt16(ctx.storagePtr, ctx.vals[0], true);
333336
334337
ctx.storagePtr += 2;
335-
336-
const rem = ctx.storagePtr % 2;
337-
if (rem !== 0) {{ ctx.storagePtr += (2 - rem); }}
338338
}}
339339
"#));
340340
}
@@ -354,13 +354,13 @@ impl LowerIntrinsic {
354354
throw new Error(`unexpected number [${{ctx.vals.length}}] of core vals (expected 1)`);
355355
}}
356356
357+
const rem = ctx.storagePtr % 2;
358+
if (rem !== 0) {{ ctx.storagePtr += (2 - rem); }}
359+
357360
{require_valid_numeric_primitive_fn}.bind('u16', ctx.vals[0]);
358361
new DataView(ctx.memory.buffer).setUint16(ctx.storagePtr, ctx.vals[0], true);
359362
360363
ctx.storagePtr += 2;
361-
362-
const rem = ctx.storagePtr % 2;
363-
if (rem !== 0) {{ ctx.storagePtr += (2 - rem); }}
364364
}}
365365
"#));
366366
}
@@ -378,14 +378,14 @@ impl LowerIntrinsic {
378378
if (ctx.vals.length !== 1) {{
379379
throw new Error(`unexpected number [${{ctx.vals.length}}] of core vals (expected 1)`);
380380
}}
381-
{require_valid_numeric_primitive_fn}.bind('s32', ctx.vals[0]);
382381
382+
const rem = ctx.storagePtr % 4;
383+
if (rem !== 0) {{ ctx.storagePtr += (4 - rem); }}
384+
385+
{require_valid_numeric_primitive_fn}.bind('s32', ctx.vals[0]);
383386
new DataView(ctx.memory.buffer).setInt32(ctx.storagePtr, ctx.vals[0], true);
384387
385388
ctx.storagePtr += 4;
386-
387-
const rem = ctx.storagePtr % 4;
388-
if (rem !== 0) {{ ctx.storagePtr += (4 - rem); }}
389389
}}
390390
"#));
391391
}
@@ -407,13 +407,13 @@ impl LowerIntrinsic {
407407
throw new Error(`expected single value to lower, got [${{ctx.vals.length}}]`);
408408
}}
409409
410+
const rem = ctx.storagePtr % 4;
411+
if (rem !== 0) {{ ctx.storagePtr += (4 - rem); }}
412+
410413
{require_valid_numeric_primitive_fn}.bind('u32', ctx.vals[0]);
411414
new DataView(ctx.memory.buffer).setUint32(ctx.storagePtr, ctx.vals[0], true);
412415
413416
ctx.storagePtr += 4;
414-
415-
const rem = ctx.storagePtr % 4;
416-
if (rem !== 0) {{ ctx.storagePtr += (4 - rem); }}
417417
}}
418418
"#));
419419
}
@@ -430,13 +430,14 @@ impl LowerIntrinsic {
430430
431431
if (ctx.vals.length !== 1) {{ throw new Error('unexpected number of core vals'); }}
432432
433+
const rem = ctx.storagePtr % 8;
434+
if (rem !== 0) {{ ctx.storagePtr += (8 - rem); }}
435+
433436
{require_valid_numeric_primitive_fn}.bind('s64', ctx.vals[0]);
434437
new DataView(ctx.memory.buffer).setBigInt64(ctx.storagePtr, ctx.vals[0], true);
435438
436-
ctx.storagePtr += 8;
437439
438-
const rem = ctx.storagePtr % 8;
439-
if (rem !== 0) {{ ctx.storagePtr += (8 - rem); }}
440+
ctx.storagePtr += 8;
440441
}}
441442
"));
442443
}
@@ -453,13 +454,13 @@ impl LowerIntrinsic {
453454
454455
if (ctx.vals.length !== 1) {{ throw new Error('unexpected number of core vals'); }}
455456
457+
const rem = ctx.storagePtr % 8;
458+
if (rem !== 0) {{ ctx.storagePtr += (8 - rem); }}
459+
456460
{require_valid_numeric_primitive_fn}.bind('u64', ctx.vals[0]);
457461
new DataView(ctx.memory.buffer).setBigUint64(ctx.storagePtr, ctx.vals[0], true);
458462
459463
ctx.storagePtr += 8;
460-
461-
const rem = ctx.storagePtr % 8;
462-
if (rem !== 0) {{ ctx.storagePtr += (8 - rem); }}
463464
}}
464465
"));
465466
}
@@ -476,13 +477,13 @@ impl LowerIntrinsic {
476477
477478
if (ctx.vals.length !== 1) {{ throw new Error('unexpected number of core vals'); }}
478479
480+
const rem = ctx.storagePtr % 8;
481+
if (rem !== 0) {{ ctx.storagePtr += (8 - rem); }}
482+
479483
{require_valid_numeric_primitive_fn}.bind('f32', ctx.vals[0]);
480484
new DataView(ctx.memory.buffer).setFloat32(ctx.storagePtr, ctx.vals[0], true);
481485
482486
ctx.storagePtr += 8;
483-
484-
const rem = ctx.storagePtr % 8;
485-
if (rem !== 0) {{ ctx.storagePtr += (8 - rem); }}
486487
}}
487488
"));
488489
}
@@ -499,13 +500,13 @@ impl LowerIntrinsic {
499500
500501
if (vals.length !== 1) {{ throw new Error('unexpected number of core vals'); }}
501502
503+
const rem = ctx.storagePtr % 8;
504+
if (rem !== 0) {{ ctx.storagePtr += (8 - rem); }}
505+
502506
{require_valid_numeric_primitive_fn}.bind('f64', ctx.vals[0]);
503507
new DataView(ctx.memory.buffer).setFloat64(ctx.storagePtr, ctx.vals[0], true);
504508
505509
ctx.storagePtr += 8;
506-
507-
const rem = ctx.storagePtr % 8;
508-
if (rem !== 0) {{ ctx.storagePtr += (8 - rem); }}
509510
}}
510511
"));
511512
}
@@ -517,13 +518,13 @@ impl LowerIntrinsic {
517518
function _lowerFlatChar(ctx) {{
518519
{debug_log_fn}('[_lowerFlatChar()] args', {{ ctx }});
519520
521+
const rem = ctx.storagePtr % 4;
522+
if (rem !== 0) {{ ctx.storagePtr += (4 - rem); }}
523+
520524
if (ctx.vals.length !== 1) {{ throw new Error('unexpected number of core vals'); }}
521525
new DataView(ctx.memory.buffer).setUint32(ctx.storagePtr, {i32_to_char_fn}(ctx.vals[0]), true);
522526
523527
ctx.storagePtr += 4;
524-
525-
const rem = ctx.storagePtr % 4;
526-
if (rem !== 0) {{ ctx.storagePtr += (4 - rem); }}
527528
}}
528529
"));
529530
}
@@ -603,23 +604,19 @@ impl LowerIntrinsic {
603604
let debug_log_fn = Intrinsic::DebugLog.name();
604605
let lower_flat_record_fn = self.name();
605606

606-
output.push_str(&format!("
607+
output.push_str(&format!(r#"
607608
function {lower_flat_record_fn}(fieldMetas) {{
608609
return function {lower_flat_record_fn}Inner(ctx) {{
609610
{debug_log_fn}('[{lower_flat_record_fn}()] args', {{ ctx }});
610611
611-
const [start] = vals;
612-
if (ctx.storageLen !== undefined && size !== undefined && size > ctx.storageLen) {{
613-
throw new Error('not enough storage remaining for record flat lower');
612+
const r = ctx.vals[0];
613+
for (const [tag, lowerFn, size32, align32 ] of fieldMetas) {{
614+
ctx.vals = [r[tag]];
615+
lowerFn(ctx);
614616
}}
615-
616-
const data = new Uint8Array(ctx.memory.buffer, start, size);
617-
new Uint8Array(ctx.memory.buffer, ctx.storagePtr, size).set(data);
618-
619-
ctx.storagePtr += data.byteLength;
620617
}}
621618
}}
622-
"));
619+
"#));
623620
}
624621

625622
Self::LowerFlatVariant => {
@@ -637,7 +634,7 @@ impl LowerIntrinsic {
637634
const {{ tag, val }} = ctx.vals[0];
638635
const disc = lowerMetas.findIndex(m => m[0] === tag);
639636
if (disc === -1) {{
640-
throw new Error(`invalid variant tag/discriminant [${{tag}}] (valid tags: ${{variantMetas.map(m => m[0])}})`);
637+
throw new Error(`invalid variant tag/discriminant [${{tag}}] (valid tags: ${{lowerMetas.map(m => m[0])}})`);
641638
}}
642639
643640
const [ _tag, lowerFn, size32, align32, payloadOffset32 ] = lowerMetas[disc];
@@ -763,13 +760,13 @@ impl LowerIntrinsic {
763760
function {lower_flat_flags_fn}(ctx) {{
764761
{debug_log_fn}('[{lower_flat_flags_fn}()] args', {{ ctx }});
765762
763+
const rem = ctx.storagePtr % 4;
764+
if (rem !== 0) {{ ctx.storagePtr += (4 - rem); }}
765+
766766
if (ctx.vals.length !== 1) {{ throw new Error('unexpected number of core vals'); }}
767767
new DataView(ctx.memory.buffer).setInt32(ctx.storagePtr, ctx.vals[0], true);
768768
769769
ctx.storagePtr += 4;
770-
771-
const rem = ctx.storagePtr % 4;
772-
if (rem !== 0) {{ ctx.storagePtr += (4 - rem); }}
773770
}}
774771
"));
775772
}

crates/js-component-bindgen/src/transpile_bindgen.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5071,7 +5071,7 @@ pub fn gen_flat_lower_fn_js_expr(intrinsic_mgr: &mut Instantiator, ty: &Interfac
50715071
));
50725072
}
50735073
keys_and_lowers_expr.push(']');
5074-
format!("{lower_fn}.bind(null, {keys_and_lowers_expr})")
5074+
format!("{lower_fn}({keys_and_lowers_expr})")
50755075
}
50765076

50775077
InterfaceType::Variant(ty_idx) => {

0 commit comments

Comments
 (0)