@@ -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 }
0 commit comments