From 92604cdb097df849b0d86f32184635062a599f8d Mon Sep 17 00:00:00 2001 From: Gabor Greif Date: Wed, 12 Nov 2025 12:00:09 +0100 Subject: [PATCH 01/27] tweaks --- rts/motoko-rts/src/idl.rs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/rts/motoko-rts/src/idl.rs b/rts/motoko-rts/src/idl.rs index bced1bd1e58..29ef8d4342b 100644 --- a/rts/motoko-rts/src/idl.rs +++ b/rts/motoko-rts/src/idl.rs @@ -1258,7 +1258,7 @@ pub(crate) unsafe fn sub( #[no_mangle] unsafe extern "C" fn idl_sub_buf_words(typtbl_size1: usize, typtbl_size2: usize) -> usize { - return BitRel::words(typtbl_size1, typtbl_size2); + BitRel::words(typtbl_size1, typtbl_size2) } #[no_mangle] @@ -1306,11 +1306,11 @@ unsafe extern "C" fn idl_sub( t1: i32, t2: i32, ) -> bool { - debug_assert!(rel_buf != (0 as *mut usize)); - debug_assert!(typtbl1 != (0 as *mut *mut u8)); - debug_assert!(typtbl2 != (0 as *mut *mut u8)); - debug_assert!(typtbl_end1 != (0 as *mut u8)); - debug_assert!(typtbl_end2 != (0 as *mut u8)); + debug_assert!(rel_buf != 0 as *mut usize); + debug_assert!(typtbl1 != 0 as *mut *mut u8); + debug_assert!(typtbl2 != 0 as *mut *mut u8); + debug_assert!(typtbl_end1 != 0 as *mut u8); + debug_assert!(typtbl_end2 != 0 as *mut u8); let rel = BitRel { ptr: rel_buf, @@ -1318,7 +1318,7 @@ unsafe extern "C" fn idl_sub( size1: typtbl_size1, size2: typtbl_size2, }; - debug_assert!(t1 < (typtbl_size1 as i32) && t2 < (typtbl_size2 as i32)); + debug_assert!(t1 < typtbl_size1 as i32 && t2 < typtbl_size2 as i32); return sub( &rel, true, From 267acddb90546f3755e312bb35390ea577fbc102 Mon Sep 17 00:00:00 2001 From: Gabor Greif Date: Wed, 12 Nov 2025 14:51:46 +0100 Subject: [PATCH 02/27] more tweaks --- src/codegen/compile_classical.ml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/codegen/compile_classical.ml b/src/codegen/compile_classical.ml index cc7c9871c73..337da634b8c 100644 --- a/src/codegen/compile_classical.ml +++ b/src/codegen/compile_classical.ml @@ -761,7 +761,7 @@ let compile_op_const op i = G.i (Binary (Wasm.Values.I32 op)) let compile_add_const = compile_op_const I32Op.Add let compile_sub_const = compile_op_const I32Op.Sub -let compile_mul_const = compile_op_const I32Op.Mul +let compile_mul_const = compile_op_const I32Op.Mul (* TODO: use shift: compile_mul_const 2l *) let compile_divU_const = compile_op_const I32Op.DivU let compile_shrU_const = compile_op_const I32Op.ShrU let compile_shrS_const = compile_op_const I32Op.ShrS @@ -783,7 +783,7 @@ let compile_op64_const op i = G.i (Binary (Wasm.Values.I64 op)) let compile_add64_const = compile_op64_const I64Op.Add let compile_sub64_const = compile_op64_const I64Op.Sub -let compile_mul64_const = compile_op64_const I64Op.Mul +let compile_mul64_const = compile_op64_const I64Op.Mul (* TODO: use shift: compile_mul_const 2l *) let _compile_divU64_const = compile_op64_const I64Op.DivU let compile_shrU64_const = function | 0L -> G.nop | n -> compile_op64_const I64Op.ShrU n @@ -7455,7 +7455,7 @@ module MakeSerialization (Strm : Stream) = struct comparison. *) let coercion_error_value env : int32 = - Tagged.shared_static_obj env Tagged.CoercionFailure [] + Tagged.(shared_static_obj env CoercionFailure []) (* See Note [Candid subtype checks] *) let with_rel_buf_opt env extended get_typtbl_size1 f = From 92a0895178138006d83e7280c5a8f9e099123999 Mon Sep 17 00:00:00 2001 From: Gabor Greif Date: Wed, 12 Nov 2025 15:17:56 +0100 Subject: [PATCH 03/27] WIP: limit parsing or the type table --- rts/motoko-rts/src/idl.rs | 7 +++++++ src/codegen/compile_classical.ml | 4 ++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/rts/motoko-rts/src/idl.rs b/rts/motoko-rts/src/idl.rs index 29ef8d4342b..907c5a25722 100644 --- a/rts/motoko-rts/src/idl.rs +++ b/rts/motoko-rts/src/idl.rs @@ -176,6 +176,7 @@ unsafe fn parse_idl_header( mem: &mut M, extended: bool, buf: *mut Buf, + typtbl_max: usize, typtbl_out: *mut *mut *mut u8, typtbl_size_out: *mut usize, main_types_out: *mut *mut u8, @@ -211,6 +212,9 @@ unsafe fn parse_idl_header( // Allocate the type table to be passed out let typtbl: *mut *mut u8 = alloc(mem, Words(n_types as usize)) as *mut _; + // Set up a limited buffer to detect absurd type tables + let full_end = buf.limit_size(typtbl_max); + // Go through the table for i in 0..n_types { *typtbl.add(i as usize) = (*buf).ptr; @@ -294,6 +298,9 @@ unsafe fn parse_idl_header( } } + // Restore limit + (*buf).end = full_end; + // Now that we have the indices, we can go through it again // and validate that all service method types are really function types // (We could not do that in the first run because of possible forward diff --git a/src/codegen/compile_classical.ml b/src/codegen/compile_classical.ml index 337da634b8c..f606656b12c 100644 --- a/src/codegen/compile_classical.ml +++ b/src/codegen/compile_classical.ml @@ -1072,7 +1072,7 @@ module RTS = struct let system_imports env = E.add_func_import env "rts" "memcmp" [I32Type; I32Type; I32Type] [I32Type]; E.add_func_import env "rts" "version" [] [I32Type]; - E.add_func_import env "rts" "parse_idl_header" [I32Type; I32Type; I32Type; I32Type; I32Type] []; + E.add_func_import env "rts" "parse_idl_header" [I32Type; I32Type; I32Type; I32Type; I32Type; I32Type] []; E.add_func_import env "rts" "idl_sub_buf_words" [I32Type; I32Type] [I32Type]; E.add_func_import env "rts" "idl_sub_buf_init" [I32Type; I32Type; I32Type] []; E.add_func_import env "rts" "idl_sub" @@ -8299,7 +8299,7 @@ module MakeSerialization (Strm : Stream) = struct ReadBuf.set_size get_ref_buf (get_refs_size ^^ compile_mul_const Heap.word_size) ^^ (* Go! *) - Bool.lit extended ^^ get_data_buf ^^ get_typtbl_ptr ^^ get_typtbl_size_ptr ^^ get_maintyps_ptr ^^ + Bool.lit extended ^^ get_data_buf ^^ compile_unboxed_const 26l(*FIXME*) ^^ get_typtbl_ptr ^^ get_typtbl_size_ptr ^^ get_maintyps_ptr ^^ E.call_import env "rts" "parse_idl_header" ^^ (* Allocate memo table, if necessary *) From 34c4371f3466d60ea8685b05b7e3f7ab3f488691 Mon Sep 17 00:00:00 2001 From: Gabor Greif Date: Wed, 12 Nov 2025 20:28:14 +0100 Subject: [PATCH 04/27] pass in an estimate --- rts/motoko-rts/src/buf.rs | 13 ++++++++++++- src/codegen/compile_classical.ml | 4 +++- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/rts/motoko-rts/src/buf.rs b/rts/motoko-rts/src/buf.rs index 40872b1682d..85d96ab8210 100644 --- a/rts/motoko-rts/src/buf.rs +++ b/rts/motoko-rts/src/buf.rs @@ -15,6 +15,17 @@ impl Buf { pub(crate) unsafe fn advance(self: *mut Self, n: usize) { advance(self, n) } + + /// Restrict the read area + #[cfg(feature = "ic")] + pub(crate) unsafe fn limit_size(self: *mut Self, lim: usize) -> *mut u8 { + let limit_ptr = (*self).ptr.add(lim); + let prev = (*self).end; + if limit_ptr < prev { + (*self).end = limit_ptr; + } + prev + } } /// Read a single byte @@ -35,7 +46,7 @@ pub(crate) unsafe fn read_word(buf: *mut Buf) -> u32 { // IDL buffer is still 32-bit-based. const WORD_SIZE: usize = core::mem::size_of::(); - if (*buf).ptr.add(WORD_SIZE - 1) >= (*buf).end { + if (*buf).ptr.add(WORD_SIZE - 1) >= (*buf).end { // TODO: use add(WORD_SIZE) and > idl_trap_with("word read out of buffer"); } diff --git a/src/codegen/compile_classical.ml b/src/codegen/compile_classical.ml index f606656b12c..2d636a1691c 100644 --- a/src/codegen/compile_classical.ml +++ b/src/codegen/compile_classical.ml @@ -8299,7 +8299,9 @@ module MakeSerialization (Strm : Stream) = struct ReadBuf.set_size get_ref_buf (get_refs_size ^^ compile_mul_const Heap.word_size) ^^ (* Go! *) - Bool.lit extended ^^ get_data_buf ^^ compile_unboxed_const 26l(*FIXME*) ^^ get_typtbl_ptr ^^ get_typtbl_size_ptr ^^ get_maintyps_ptr ^^ + let (tydesc, _, _) = type_desc env ts in + let tydesc_len = Int32.of_int (String.length tydesc) in (* FIXME: + 5 * 2 *) + Bool.lit extended ^^ get_data_buf ^^ compile_unboxed_const tydesc_len ^^ get_typtbl_ptr ^^ get_typtbl_size_ptr ^^ get_maintyps_ptr ^^ E.call_import env "rts" "parse_idl_header" ^^ (* Allocate memo table, if necessary *) From b8ff2c4935145aeda2db0ed072249612a8591363 Mon Sep 17 00:00:00 2001 From: Gabor Greif Date: Thu, 13 Nov 2025 12:09:21 +0100 Subject: [PATCH 05/27] WIP: this might pass --- src/codegen/compile_classical.ml | 2 +- src/codegen/compile_enhanced.ml | 8 +++++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/codegen/compile_classical.ml b/src/codegen/compile_classical.ml index 2d636a1691c..03e0c36413f 100644 --- a/src/codegen/compile_classical.ml +++ b/src/codegen/compile_classical.ml @@ -8299,7 +8299,7 @@ module MakeSerialization (Strm : Stream) = struct ReadBuf.set_size get_ref_buf (get_refs_size ^^ compile_mul_const Heap.word_size) ^^ (* Go! *) - let (tydesc, _, _) = type_desc env ts in + let tydesc, _, _ = type_desc env ts in let tydesc_len = Int32.of_int (String.length tydesc) in (* FIXME: + 5 * 2 *) Bool.lit extended ^^ get_data_buf ^^ compile_unboxed_const tydesc_len ^^ get_typtbl_ptr ^^ get_typtbl_size_ptr ^^ get_maintyps_ptr ^^ E.call_import env "rts" "parse_idl_header" ^^ diff --git a/src/codegen/compile_enhanced.ml b/src/codegen/compile_enhanced.ml index dfee7950ede..f54e11be8b8 100644 --- a/src/codegen/compile_enhanced.ml +++ b/src/codegen/compile_enhanced.ml @@ -844,7 +844,7 @@ let compile_op_const op i = G.i (Binary (Wasm_exts.Values.I64 op)) let compile_add_const = compile_op_const I64Op.Add let compile_sub_const = compile_op_const I64Op.Sub -let compile_mul_const = compile_op_const I64Op.Mul +let compile_mul_const = compile_op_const I64Op.Mul (* TODO: use shift: compile_mul_const 2l *) let compile_divU_const = compile_op_const I64Op.DivU let compile_shrU_const = compile_op_const I64Op.ShrU let compile_shrS_const = compile_op_const I64Op.ShrS @@ -1150,7 +1150,7 @@ module RTS = struct E.add_func_import env "rts" "get_upgrade_instructions" [] [I64Type]; E.add_func_import env "rts" "memcmp" [I64Type; I64Type; I64Type] [I32Type]; E.add_func_import env "rts" "version" [] [I64Type]; - E.add_func_import env "rts" "parse_idl_header" [I32Type; I64Type; I64Type; I64Type; I64Type] []; + E.add_func_import env "rts" "parse_idl_header" [I32Type; I64Type; I64Type; I64Type; I64Type; I64Type] []; E.add_func_import env "rts" "idl_alloc_typtbl" [I64Type; I64Type; I64Type; I64Type; I64Type] []; E.add_func_import env "rts" "idl_sub_buf_words" [I64Type; I64Type] [I64Type]; E.add_func_import env "rts" "idl_sub_buf_init" [I64Type; I64Type; I64Type] []; @@ -8781,7 +8781,9 @@ module Serialization = struct ReadBuf.set_size get_ref_buf (get_refs_size ^^ compile_mul_const Heap.word_size) ^^ (* Go! *) - Bool.lit extended ^^ Bool.to_rts_int32 ^^ get_data_buf ^^ get_typtbl_ptr ^^ get_typtbl_size_ptr ^^ get_maintyps_ptr ^^ + let tydesc, _, _ = type_desc env Candid ts in + let tydesc_len = Int64.of_int (String.length tydesc) in (* FIXME: + 5 * 2 *) + Bool.(lit extended ^^ to_rts_int32) ^^ get_data_buf ^^ compile_unboxed_const tydesc_len ^^ get_typtbl_ptr ^^ get_typtbl_size_ptr ^^ get_maintyps_ptr ^^ E.call_import env "rts" "parse_idl_header" ^^ (* Allocate global type type, if necessary for subtype checks *) From 66182be46435595588a48ca51d4352ccb5c97aad Mon Sep 17 00:00:00 2001 From: Gabor Greif Date: Thu, 13 Nov 2025 17:04:23 +0100 Subject: [PATCH 06/27] implement the linear rule --- src/codegen/compile_classical.ml | 2 +- src/codegen/compile_enhanced.ml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/codegen/compile_classical.ml b/src/codegen/compile_classical.ml index 03e0c36413f..0d0907c98d0 100644 --- a/src/codegen/compile_classical.ml +++ b/src/codegen/compile_classical.ml @@ -8300,7 +8300,7 @@ module MakeSerialization (Strm : Stream) = struct (* Go! *) let tydesc, _, _ = type_desc env ts in - let tydesc_len = Int32.of_int (String.length tydesc) in (* FIXME: + 5 * 2 *) + let tydesc_len = Int32.of_int (String.length tydesc * 2 + 100) in Bool.lit extended ^^ get_data_buf ^^ compile_unboxed_const tydesc_len ^^ get_typtbl_ptr ^^ get_typtbl_size_ptr ^^ get_maintyps_ptr ^^ E.call_import env "rts" "parse_idl_header" ^^ diff --git a/src/codegen/compile_enhanced.ml b/src/codegen/compile_enhanced.ml index f54e11be8b8..aac2973595b 100644 --- a/src/codegen/compile_enhanced.ml +++ b/src/codegen/compile_enhanced.ml @@ -8782,7 +8782,7 @@ module Serialization = struct (* Go! *) let tydesc, _, _ = type_desc env Candid ts in - let tydesc_len = Int64.of_int (String.length tydesc) in (* FIXME: + 5 * 2 *) + let tydesc_len = Int64.of_int (String.length tydesc * 2 + 100) in Bool.(lit extended ^^ to_rts_int32) ^^ get_data_buf ^^ compile_unboxed_const tydesc_len ^^ get_typtbl_ptr ^^ get_typtbl_size_ptr ^^ get_maintyps_ptr ^^ E.call_import env "rts" "parse_idl_header" ^^ From f703cca4bc23d03677255675ca1e44b1b9ac6400 Mon Sep 17 00:00:00 2001 From: Gabor Greif Date: Thu, 13 Nov 2025 18:04:14 +0100 Subject: [PATCH 07/27] tweak the linear rule to cover `run-drun/env-vars.mo` --- src/codegen/compile_classical.ml | 2 +- src/codegen/compile_enhanced.ml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/codegen/compile_classical.ml b/src/codegen/compile_classical.ml index 0d0907c98d0..67f7f2bd88f 100644 --- a/src/codegen/compile_classical.ml +++ b/src/codegen/compile_classical.ml @@ -8300,7 +8300,7 @@ module MakeSerialization (Strm : Stream) = struct (* Go! *) let tydesc, _, _ = type_desc env ts in - let tydesc_len = Int32.of_int (String.length tydesc * 2 + 100) in + let tydesc_len = Int32.of_int (String.length tydesc * 2 + 300) in Bool.lit extended ^^ get_data_buf ^^ compile_unboxed_const tydesc_len ^^ get_typtbl_ptr ^^ get_typtbl_size_ptr ^^ get_maintyps_ptr ^^ E.call_import env "rts" "parse_idl_header" ^^ diff --git a/src/codegen/compile_enhanced.ml b/src/codegen/compile_enhanced.ml index aac2973595b..33aa270214b 100644 --- a/src/codegen/compile_enhanced.ml +++ b/src/codegen/compile_enhanced.ml @@ -8782,7 +8782,7 @@ module Serialization = struct (* Go! *) let tydesc, _, _ = type_desc env Candid ts in - let tydesc_len = Int64.of_int (String.length tydesc * 2 + 100) in + let tydesc_len = Int64.of_int (String.length tydesc * 2 + 300) in Bool.(lit extended ^^ to_rts_int32) ^^ get_data_buf ^^ compile_unboxed_const tydesc_len ^^ get_typtbl_ptr ^^ get_typtbl_size_ptr ^^ get_maintyps_ptr ^^ E.call_import env "rts" "parse_idl_header" ^^ From c6a3d0872fc3f8249dcee10a476474efb59b1d75 Mon Sep 17 00:00:00 2001 From: Gabor Greif Date: Thu, 13 Nov 2025 18:09:54 +0100 Subject: [PATCH 08/27] format --- rts/motoko-rts/src/buf.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/rts/motoko-rts/src/buf.rs b/rts/motoko-rts/src/buf.rs index 85d96ab8210..127626e7f59 100644 --- a/rts/motoko-rts/src/buf.rs +++ b/rts/motoko-rts/src/buf.rs @@ -46,7 +46,8 @@ pub(crate) unsafe fn read_word(buf: *mut Buf) -> u32 { // IDL buffer is still 32-bit-based. const WORD_SIZE: usize = core::mem::size_of::(); - if (*buf).ptr.add(WORD_SIZE - 1) >= (*buf).end { // TODO: use add(WORD_SIZE) and > + if (*buf).ptr.add(WORD_SIZE - 1) >= (*buf).end { + // TODO: use add(WORD_SIZE) and > idl_trap_with("word read out of buffer"); } From efb98d5978bd807dbbbe17ca5c86bad290cce3bd Mon Sep 17 00:00:00 2001 From: Cycle and memory benchmark updater <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 13 Nov 2025 17:28:18 +0000 Subject: [PATCH 09/27] Updating `test/bench` numbers --- test/bench/ok/bignum.drun-run.ok | 2 +- test/bench/ok/candid-subtype-cost.drun-run.ok | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/test/bench/ok/bignum.drun-run.ok b/test/bench/ok/bignum.drun-run.ok index 75f1f8afc85..ef8b5c7059d 100644 --- a/test/bench/ok/bignum.drun-run.ok +++ b/test/bench/ok/bignum.drun-run.ok @@ -2,6 +2,6 @@ ingress Completed: Reply: 0x4449444c016c01b3c4b1f204680100010a000000000000000001 ingress Completed: Reply: 0x4449444c0000 debug.print: {cycles = 2_509_532; size = +25_528} ingress Completed: Reply: 0x4449444c0000 -debug.print: {cycles = 54_921_553; size = +830_464} +debug.print: {cycles = 54_921_579; size = +830_464} ingress Completed: Reply: 0x4449444c0000 ingress Completed: Reply: 0x4449444c0000 diff --git a/test/bench/ok/candid-subtype-cost.drun-run.ok b/test/bench/ok/candid-subtype-cost.drun-run.ok index 668377d7689..331aafd86c9 100644 --- a/test/bench/ok/candid-subtype-cost.drun-run.ok +++ b/test/bench/ok/candid-subtype-cost.drun-run.ok @@ -1,5 +1,5 @@ ingress Completed: Reply: 0x4449444c016c01b3c4b1f204680100010a00000000000000000101 ingress Completed: Reply: 0x4449444c0000 -debug.print: {cycles = 1_121_619; heap_bytes = +33_888} +debug.print: {cycles = 1_121_645; heap_bytes = +33_888} ingress Completed: Reply: 0x4449444c0000 ingress Completed: Reply: 0x4449444c0000 From 0c0dd98f86aa4510911127a9e37bc36fea764215 Mon Sep 17 00:00:00 2001 From: Gabor Greif Date: Mon, 17 Nov 2025 15:09:46 +0100 Subject: [PATCH 10/27] Update rts/motoko-rts/src/buf.rs --- rts/motoko-rts/src/buf.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/rts/motoko-rts/src/buf.rs b/rts/motoko-rts/src/buf.rs index 127626e7f59..030c835c7bc 100644 --- a/rts/motoko-rts/src/buf.rs +++ b/rts/motoko-rts/src/buf.rs @@ -46,8 +46,7 @@ pub(crate) unsafe fn read_word(buf: *mut Buf) -> u32 { // IDL buffer is still 32-bit-based. const WORD_SIZE: usize = core::mem::size_of::(); - if (*buf).ptr.add(WORD_SIZE - 1) >= (*buf).end { - // TODO: use add(WORD_SIZE) and > + if (*buf).ptr.add(WORD_SIZE) > (*buf).end { idl_trap_with("word read out of buffer"); } From 7835f377a60b090f18177b6d806cbe0d609b892a Mon Sep 17 00:00:00 2001 From: Cycle and memory benchmark updater <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 17 Nov 2025 14:27:12 +0000 Subject: [PATCH 11/27] Updating `test/bench` numbers --- test/bench/ok/bignum.drun-run.ok | 2 +- test/bench/ok/candid-subtype-cost.drun-run.ok | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/test/bench/ok/bignum.drun-run.ok b/test/bench/ok/bignum.drun-run.ok index ef8b5c7059d..549c8bee7b6 100644 --- a/test/bench/ok/bignum.drun-run.ok +++ b/test/bench/ok/bignum.drun-run.ok @@ -2,6 +2,6 @@ ingress Completed: Reply: 0x4449444c016c01b3c4b1f204680100010a000000000000000001 ingress Completed: Reply: 0x4449444c0000 debug.print: {cycles = 2_509_532; size = +25_528} ingress Completed: Reply: 0x4449444c0000 -debug.print: {cycles = 54_921_579; size = +830_464} +debug.print: {cycles = 54_921_577; size = +830_464} ingress Completed: Reply: 0x4449444c0000 ingress Completed: Reply: 0x4449444c0000 diff --git a/test/bench/ok/candid-subtype-cost.drun-run.ok b/test/bench/ok/candid-subtype-cost.drun-run.ok index 331aafd86c9..5ec3afeaf67 100644 --- a/test/bench/ok/candid-subtype-cost.drun-run.ok +++ b/test/bench/ok/candid-subtype-cost.drun-run.ok @@ -1,5 +1,5 @@ ingress Completed: Reply: 0x4449444c016c01b3c4b1f204680100010a00000000000000000101 ingress Completed: Reply: 0x4449444c0000 -debug.print: {cycles = 1_121_645; heap_bytes = +33_888} +debug.print: {cycles = 1_121_643; heap_bytes = +33_888} ingress Completed: Reply: 0x4449444c0000 ingress Completed: Reply: 0x4449444c0000 From b3dc0a57e478541e71f0ba30aa4c9fe0c289df3c Mon Sep 17 00:00:00 2001 From: Gabor Greif Date: Mon, 17 Nov 2025 15:45:18 +0100 Subject: [PATCH 12/27] tweak and add more explanation --- src/codegen/compile_classical.ml | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/codegen/compile_classical.ml b/src/codegen/compile_classical.ml index 67f7f2bd88f..c6228937eb1 100644 --- a/src/codegen/compile_classical.ml +++ b/src/codegen/compile_classical.ml @@ -8267,10 +8267,11 @@ module MakeSerialization (Strm : Stream) = struct let name = (* TODO(#3185): this specialization on `extended` seems redundant, removing it might simplify things *and* share more code in binaries. - The only tricky bit might be the conditional Stack.dynamic_with_words bit... *) - if extended - then "@deserialize_extended<" ^ ts_name ^ ">" - else "@deserialize<" ^ ts_name ^ ">" in + The only tricky bit might be the conditional Stack.dynamic_with_words bit... + Also consider #5642! OTOH, I expect the `ts` of stable data to be well apart + from messages', so sharing would be very rare, if at all. + *) + "@deserialize" ^ (if extended then "_extended<" else "<") ^ ts_name ^ ">" in Func.share_code2 Func.Always env name (("blob", I32Type), ("can_recover", I32Type)) (List.map (fun _ -> I32Type) ts) (fun env get_blob get_can_recover -> let (set_data_size, get_data_size) = new_local env "data_size" in let (set_refs_size, get_refs_size) = new_local env "refs_size" in From df2393b0527428b7e6092c76f7147470ece2b771 Mon Sep 17 00:00:00 2001 From: Gabor Greif Date: Tue, 18 Nov 2025 15:26:17 +0100 Subject: [PATCH 13/27] add `get/setCandidTypeLimits` --- src/codegen/compile_classical.ml | 30 +++++++++++++++++++++++++++++- src/codegen/compile_enhanced.ml | 2 +- src/mo_values/prim.ml | 10 ++++++++-- src/prelude/prim.mo | 18 ++++++++++++++++++ test/run-drun/typtbl.bin | Bin 0 -> 2091997 bytes 5 files changed, 56 insertions(+), 4 deletions(-) create mode 100644 test/run-drun/typtbl.bin diff --git a/src/codegen/compile_classical.ml b/src/codegen/compile_classical.ml index c6228937eb1..d5e280891e2 100644 --- a/src/codegen/compile_classical.ml +++ b/src/codegen/compile_classical.ml @@ -6766,6 +6766,8 @@ module MakeSerialization (Strm : Stream) = struct let idl_value_numerator = 1l let idl_value_denominator = 1l let idl_value_bias = 1024l + let idl_type_scaler = 3l + let idl_type_bias = 1024l let register_globals env = E.add_global32 env "@@rel_buf_opt" Mutable 0l; @@ -6777,7 +6779,9 @@ module MakeSerialization (Strm : Stream) = struct E.add_global32 env "@@value_denominator" Mutable idl_value_denominator; E.add_global32 env "@@value_numerator" Mutable idl_value_numerator; E.add_global32 env "@@value_bias" Mutable idl_value_bias; - E.add_global64 env "@@value_quota" Mutable 0L + E.add_global64 env "@@value_quota" Mutable 0L; + E.add_global32 env "@@type_scaler" Mutable idl_type_scaler; + E.add_global32 env "@@type_bias" Mutable idl_type_bias let get_rel_buf_opt env = G.i (GlobalGet (nr (E.get_global env "@@rel_buf_opt"))) @@ -6829,6 +6833,16 @@ module MakeSerialization (Strm : Stream) = struct let set_value_bias env = G.i (GlobalSet (nr (E.get_global env "@@value_bias"))) + let get_type_scaler env = + G.i (GlobalGet (nr (E.get_global env "@@type_scaler"))) + let set_type_scaler env = + G.i (GlobalSet (nr (E.get_global env "@@type_scaler"))) + + let get_type_bias env = + G.i (GlobalGet (nr (E.get_global env "@@type_bias"))) + let set_type_bias env = + G.i (GlobalSet (nr (E.get_global env "@@type_bias"))) + let reset_value_limit env get_blob get_rel_buf_opt = get_rel_buf_opt ^^ G.if0 @@ -12369,6 +12383,20 @@ and compile_prim_invocation (env : E.t) ae p es at = Serialization.Registers.get_value_bias env ^^ BoxedSmallWord.box env Type.Nat32 + | OtherPrim "setCandidTypeLimits", [e1; e2] -> + SR.unit, + compile_exp_as env ae (SR.UnboxedWord32 Type.Nat32) e1 ^^ + Serialization.Registers.set_type_scaler env ^^ + compile_exp_as env ae (SR.UnboxedWord32 Type.Nat32) e2 ^^ + Serialization.Registers.set_type_bias env + + | OtherPrim "getCandidTypeLimits", [] -> + SR.UnboxedTuple 2, + Serialization.Registers.get_type_scaler env ^^ + BoxedSmallWord.box env Type.Nat32 ^^ + Serialization.Registers.get_type_bias env ^^ + BoxedSmallWord.box env Type.Nat32 + (* Coercions for abstract types *) | CastPrim (_,_), [e] -> compile_exp env ae e diff --git a/src/codegen/compile_enhanced.ml b/src/codegen/compile_enhanced.ml index 33aa270214b..452eb34c7a0 100644 --- a/src/codegen/compile_enhanced.ml +++ b/src/codegen/compile_enhanced.ml @@ -8782,7 +8782,7 @@ module Serialization = struct (* Go! *) let tydesc, _, _ = type_desc env Candid ts in - let tydesc_len = Int64.of_int (String.length tydesc * 2 + 300) in + let tydesc_len = Int64.of_int (String.length tydesc * 2 + 3000000) in Bool.(lit extended ^^ to_rts_int32) ^^ get_data_buf ^^ compile_unboxed_const tydesc_len ^^ get_typtbl_ptr ^^ get_typtbl_size_ptr ^^ get_maintyps_ptr ^^ E.call_import env "rts" "parse_idl_header" ^^ diff --git a/src/mo_values/prim.ml b/src/mo_values/prim.ml index c89c8bd7933..b11a882f569 100644 --- a/src/mo_values/prim.ml +++ b/src/mo_values/prim.ml @@ -443,8 +443,14 @@ let prim trap = | "setCandidLimits" -> fun _ v k -> k unit | "getCandidLimits" -> - fun _ v k -> k (Tup [ - Nat32 Numerics.Nat32.zero; Nat32 Numerics.Nat32.zero; Nat32 Numerics.Nat32.zero]) + fun _ v k -> k (Tup Numerics.Nat32.[ + Nat32 zero; Nat32 zero; Nat32 zero]) + + | "setCandidTypeLimits" -> + fun _ v k -> k unit + | "getCandidTypeLimits" -> + fun _ v k -> k (Tup Numerics.Nat32.[ + Nat32 zero; Nat32 zero]) | "alloc_weak_ref" -> fun _ v k -> diff --git a/src/prelude/prim.mo b/src/prelude/prim.mo index d1c5a062b6c..afc50c23d24 100644 --- a/src/prelude/prim.mo +++ b/src/prelude/prim.mo @@ -824,6 +824,24 @@ func getCandidLimits() : { }; }; +func setCandidTypeLimits({ + scaler : Nat32; + bias : Nat32; +}) { + (prim "setCandidTypeLimits" : (Nat32, Nat32) -> ())(scaler, bias); +}; + +func getCandidTypeLimits() : { + scaler : Nat32; + bias : Nat32; +} { + let (scaler, bias) = (prim "getCandidTypeLimits" : () -> (Nat32, Nat32))(); + { + scaler; + bias; + }; +}; + // predicates for motoko-san func forall(f : T -> Bool) : Bool { diff --git a/test/run-drun/typtbl.bin b/test/run-drun/typtbl.bin new file mode 100644 index 0000000000000000000000000000000000000000..30787b150bea6c11b6813e5ed229056a99849bc7 GIT binary patch literal 2091997 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 literal 0 HcmV?d00001 From f536cc73067830fff8581143161d452e9ccd78a4 Mon Sep 17 00:00:00 2001 From: Gabor Greif Date: Tue, 18 Nov 2025 15:36:53 +0100 Subject: [PATCH 14/27] compute! --- src/codegen/compile_classical.ml | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/codegen/compile_classical.ml b/src/codegen/compile_classical.ml index d5e280891e2..37eeaae2ed1 100644 --- a/src/codegen/compile_classical.ml +++ b/src/codegen/compile_classical.ml @@ -8315,8 +8315,12 @@ module MakeSerialization (Strm : Stream) = struct (* Go! *) let tydesc, _, _ = type_desc env ts in - let tydesc_len = Int32.of_int (String.length tydesc * 2 + 300) in - Bool.lit extended ^^ get_data_buf ^^ compile_unboxed_const tydesc_len ^^ get_typtbl_ptr ^^ get_typtbl_size_ptr ^^ get_maintyps_ptr ^^ + let tydesc_len = Int32.of_int (String.length tydesc) in + let tydesc_tolerance = + compile_unboxed_const tydesc_len ^^ + Registers.get_type_scaler env ^^ G.i (Binary (Wasm.Values.I32 I32Op.Mul)) ^^ + Registers.get_type_bias env ^^ G.i (Binary (Wasm.Values.I32 I32Op.Add)) in + Bool.lit extended ^^ get_data_buf ^^ tydesc_tolerance ^^ get_typtbl_ptr ^^ get_typtbl_size_ptr ^^ get_maintyps_ptr ^^ E.call_import env "rts" "parse_idl_header" ^^ (* Allocate memo table, if necessary *) From 8d2aec201c9ff20c0ed00f6573e5928acc70db3c Mon Sep 17 00:00:00 2001 From: Gabor Greif Date: Fri, 28 Nov 2025 16:31:36 +0100 Subject: [PATCH 15/27] add benchmarks --- test/bench/messages/msg1024x1.bin | Bin 0 -> 4046 bytes test/bench/messages/msg256x1.bin | Bin 0 -> 974 bytes test/bench/messages/msg256x2.bin | Bin 0 -> 1233 bytes test/bench/messages/msg512x1.bin | Bin 0 -> 1998 bytes test/bench/messages/msg768x1.bin | Bin 0 -> 3022 bytes test/bench/typtbl.mo | 34 ++++++++++++++++++++++++++++++ 6 files changed, 34 insertions(+) create mode 100644 test/bench/messages/msg1024x1.bin create mode 100644 test/bench/messages/msg256x1.bin create mode 100644 test/bench/messages/msg256x2.bin create mode 100644 test/bench/messages/msg512x1.bin create mode 100644 test/bench/messages/msg768x1.bin create mode 100644 test/bench/typtbl.mo diff --git a/test/bench/messages/msg1024x1.bin b/test/bench/messages/msg1024x1.bin new file mode 100644 index 0000000000000000000000000000000000000000..6c1c93f022f03ffbbe0d317072d1192cee697842 GIT binary patch literal 4046 zcmeI!)!HC>SwQjs+nW#!5Cla~K`9B922b{h&*P=AuE3M&?(XjH?)av=zUl7np27QI zuS@tHtxx~w)Bo-I$sa`o#c+b8_=L~#dA`6G`3t_pm-$QniofP>_zGX;Z}}Qu=kNFi z-{kN42foEW@@>AuKk?7}3*Y5?{44*)_xS-oX*)vvI3&yK$#+w{fp=zww~) zu<@wzxbdX%wDGL*yz!#(vhk|%y78v*w(+jMXz6NU>TgptB1VYDzt7%Pku#tRdKiNYjdvM@!MDohim3p0e7 z!YpC7Fh`gx%oFAd3xtKjB4M$xL|7^;6P61rgq6Z7VYRSESSzd()(abijlw2jv#>?j zDr^(B3p<3JLWi(R*e&c4_6qxi{lWp^pm0byEF2Mz3de-w!U^G|a7ySDP77y*v%)#y zyl_FdC|nXQ3s;1z!ZqQ#a6`B$+!AgJcZ9pbJ>kCaKzJxT5*`argr~wY;kocacqzOR zUJGx8x57K&z3@T!D0ES}D&3UsN)M%{(o5;B^ildM{gnR70A-*uNExgQQHCnRl;O$< zWu!7n8Lf;_#wz2K@yY~cqB2RDtV~g+D$|td$_!x8S*@&5)++0i^~wfiqq0fatZY%XD%+Ip$_{0x(xL29b}M_7y~;ji zzj8o1s2oxbD@T;0$}#1*azZ(&oKiZK)5;m;ta45{uUt?rDwmYY$`$3Ra!t9e+)!>R zx0Kt;9p$caPr0u=P#!9el*h^w<*D*ad9J)rUMjDY*UB5^t@2KJuY6EGDqW1OMmM9o z(ZlFz^fG!IeT=?FKcl}fz!+!@G6ow%jG@LbW4JNG7-@_$MjK;{vBo%KyfML;XiPFD z8&iy_#x!HPF~gW?%ra&hbBwvhJY&AGz*uN3G8P+4jHSjhW4W=ySZS;>RvT-KwZ=MQ zy|KaAXlybz8(WO6#x`TSvBTJDbQrsg-Nqhcud&bAZyYcV8i$O-#u4MFam+YwoG?xr zr;JYHv~k8bYn(IA8yAd=#wFvjamBc5Tr;j4H;kLcE#tOv$GB_UGwvG?jEBY}~MBE z9nLOix3kCD>+Ey(I|rPD&LQWpbHq979CMC4C!CYcDW}sp?VNGWI_I48&IRY9bIG~v zTyd^C*PQFl4d zmBFfDb+9H_8>|b~2OENo!KPqyuqD_UYzwvrJA$1-N3bi{9qbAA2K$2j!GYjla40w& z90`sF$AaU*iQr^#D(DPO2WNt_!MWgka3Q!DTna7+SAwg-wcvViBe)sd3T_8?g1f=J z;C}ERco;ki9tTf?r@^z}dGI258N3Q!2XBJ6!Mosn@FDmZbV<4<-IDG}kECbPE9sr| zN%|)JlK#nnWMDEV8JrABh9<+3;mL?(WHKrlos3DwCgYOv$%JHLGAWsyOi89D(~{}Q zjAUjqE18|lN#-W=lKIJkWMQ%>S)43MmL|)R<;jXx2ExDfDNNy&#lH19hY4^tT37mAC;rQ&jNrMOyLE3Owe zikro);&ySTxLe#S?iUY=hsC4faq*;hT0ASB7cYvJ#jE0V@uqlNyer-pABvAfmrwXV TY5#xmpY@r*X99nw0-yW|`_iXf literal 0 HcmV?d00001 diff --git a/test/bench/messages/msg256x1.bin b/test/bench/messages/msg256x1.bin new file mode 100644 index 0000000000000000000000000000000000000000..02d0fb2fe405ca7447700122e4c8a518d1c8bb41 GIT binary patch literal 974 zcmd_oRkjcW07cPz9wOb{Eh*g~{P4qC423fSerQx01(8;|8|i*@cXxMp&ci*1-KTG# zeuE170~T1sA1vyR7PGh|ENLlATgI}Mv%D3oXeBFK#i~}bx;3n6Eo)oHy4JJ44Qyy5 z8{5R6Y-%%`+rpN%@@HGy#@U-38m9Y^9Q9F1deERMtRI065_KXD>X!oP4b{*6;`Do(@cI0I+mEc^%m z#o0Iq=i)q^j|*@iF2cpQ1efA6T#hSnC9cBNxCYnaI{XjU;|AP_n{YF3!L7Irx8n}n ziMwz&7UCY9Zm2oK{CJc`HgIG(_hcnVMB89a;U@H}3?i+Bky;}yJ$*YG;t zz?*mrZ{r=ji}&z8KEQ|g2p{7Ue2UNTIljP`_zGX+8+?oJ@I8LOkN62c;}`sj0}C8L KzAye?EB+08))6EC literal 0 HcmV?d00001 diff --git a/test/bench/messages/msg256x2.bin b/test/bench/messages/msg256x2.bin new file mode 100644 index 0000000000000000000000000000000000000000..d63d32997d36bc0445d4fe6236f6196ba71a26b0 GIT binary patch literal 1233 zcmd_lXS)vs0Egk<^CwPZ&mxf#GD{KB8*f~fkK*|Ry|GtT*$NG1XRpXU_OZvY_c`Wq z>^(k+`y1T-2lO8}q%f!e1uR&_s(xTKt6SuU*081@S3AldjpyR| zcp+Ylm*VAkC0>o!;`LY-%j1oBGv11~XU;GTx65;=}kTK8{b~)A%etk1yiO z_$t1RZ{piH7>D3c9EQVj1dhZ}I2y;`So{gc;dq>Y6LAv$jKAPyoPtwv8cxRv04A zhZ}Jd{*Rk+3vR`2xE*)kPAtY{d6AcRnSbyKukue` z<8|KPP2S>d-r-%|<9$BhLq6hTKH*b7<6nHv7ktTAe9bp}%Xj>n@A(fu@L&GNk1Q+} z6^n}{#nNI~vAkGOtSnX)tBW#nIwealANDoGeZir;9Vi+2UMrzPM0aEG`w7iz~&|;#zUNxKZ3J zZWXtSJH_4NUU9#8P&5>cL}SrJG!@N6bJ0Sy6s<&S(MGft?L>RgL39+IL}$@ObQRr1 zchN)i6um@m(MR+Z{X~B;KnxUv#9%Q*3>Cw~a4|xR6r;pwF-D9P%@AoL2MM8 z#AdNYY!%zYcCkb36uZQ3u}AC``^0{6KpYf@#9?tn92LjJadASN6sN>#aYmdK=frt& zL0lA<#AR_sTou>Eb#X)76t~1}aYx)0_r!hiKr}RsOk>l;G&RjkbJN1KG_6c))5f$l z?M!>q!E`j8OlQ-@bT!>fchkf4G`&o3)5r8R{Y-x|zzj5l%wRLb3^l{da5KV;G^5OD zGscWH&$wy!E7{}%x1I2Y&F}=cC*9mG`q}hv&ZZ;`^%#i5A#4nr!sf6gYz^DO_OK)D478EH47bAV ba3|ai_rm?~AT(^iZ>s-a{LlWt0+0L-)QLei literal 0 HcmV?d00001 diff --git a/test/bench/messages/msg768x1.bin b/test/bench/messages/msg768x1.bin new file mode 100644 index 0000000000000000000000000000000000000000..fb6acd6a176aeb47d81ded40e00dc14faa4f5f98 GIT binary patch literal 3022 zcmeI!!+IcS8bIOyQ%{d=+ctaCn|YqOlsQ*0o1|>pw(W{lajIfF72CJ)ZXz#{pD0KaCW;cpiIT*tL}{WdQJ$zsR3@qt)rp$K>%^NxZK5twpJ+%l zCYln>iIzlbqAk&$=ty)Xx)R-qoAxiVTZ6&*d^>1 z_6U20eZqd>fN)SaBpeow2uFou!g1k*a8fuWoEFXqXN7aZdEtU^QMe>r7On_ag=@lf z;f8QixFy^c?g)2?gRT|&3eBlHS= zLccH|ycGt8Az@e;5k`eEVO*FHCWR?sT9^@Lg*jnfSP&M4C1F`u5mto^B~w|WtX0-2 z>y-`4MrD(-S=pj&RkkVHl^x1XWtXyB*`w@L_9^?71Ij_=kaAc#q8wF@DaVx)%1Pyv za#}f~oK?;#=amb}MdgxmS-GNIRjw)5l^e=U<(6_=xue`w?kV?`2g*a`k@8r1qC8ce zDbJM`%1b3n$yRcdTqRG*R|=FurAR4ON|aYhsZyqtD-}wmQl(TYHOgz{jZ&-BDfLQ& z(x@~k%}R^XsUsChLmAtL>X1alyPN3nN+5fX=O&4 zRpyj=WkFd~mXu{>MOjrcj7(#VvDR2;tT#3o8;woIW@C%7)!1fiH+C31ja|lWV~?@d z*k|lF4j2cGL&jm_h;h_7W*j$87$=QW#%be>an?9zoHs5Q7mZ8CW#fu*)wpI{H*Od= zja$ZT|17&3;95o6RCGscYxW73#1ri~e6)|fNqjRj-TSTdH46=T)Na59}W&RS=kv)j*Ip7?04mpRNBhFFhm~-4Y;hc0%Ij5a7 z&ROT2bKbe&Ty!oumz^ulRp**>-MQi1bZ$AfojcB5=bm%ldEh*B9yyPlC(cvnne*Iv z;kXlsaWjxl`d(I#o`!Q{%jL-Z-^Rom1~LIE_w| z)9kc3txlWM?sPbvPM6c|^frTZ3)E_FzY_GuRdE4)z3lgMGpN z;6QLNI20TXjs!=8W5My@L~t@V6`T&v1ZRVD!TI1qa51 = [[[[[[[[[[[[[[[[T]]]]]]]]]]]]]]]]; + type H2 = H1>>>>>>>>>>>>>>>; + + type Nested256 = H2; + type Nested512 = H2>; + type Nested768 = H2>>; + type Nested1024 = H2>>>; + + func measure(f : () -> ?T) { + let p0 = performanceCounter(0); + ignore f(); + let p1 = performanceCounter(0); + debugPrint(debug_show { cycles = p1 - p0 }); + }; + // irrelevant type table + measure<()>(func() = from_candid msg256x1); + // relevant type table + measure(func() = from_candid msg256x1); + measure(func() = from_candid msg512x1); + measure(func() = from_candid msg768x1); + measure(func() = from_candid msg1024x1); + // relevant tuple type table + measure<(Nested256, Nested256)>(func() = from_candid msg256x2); +} From 6e0c64568b4d192a1653b5485e53e6d462e73d14 Mon Sep 17 00:00:00 2001 From: Gabor Greif Date: Sun, 30 Nov 2025 22:42:11 +0100 Subject: [PATCH 16/27] add the primitives to enhanced too --- src/codegen/compile_enhanced.ml | 33 ++++++++++++++++++++++++++++++--- 1 file changed, 30 insertions(+), 3 deletions(-) diff --git a/src/codegen/compile_enhanced.ml b/src/codegen/compile_enhanced.ml index 50a443d8fd0..bdce3121dbe 100644 --- a/src/codegen/compile_enhanced.ml +++ b/src/codegen/compile_enhanced.ml @@ -7097,6 +7097,8 @@ module Serialization = struct let idl_value_numerator = 1L let idl_value_denominator = 1L let idl_value_bias = 1024L + let idl_type_scaler = 3L + let idl_type_bias = 1024L let register_globals env = E.add_global64 env "@@rel_buf_opt" Mutable 0L; @@ -7111,7 +7113,9 @@ module Serialization = struct E.add_global64 env "@@value_denominator" Mutable idl_value_denominator; E.add_global64 env "@@value_numerator" Mutable idl_value_numerator; E.add_global64 env "@@value_bias" Mutable idl_value_bias; - E.add_global64 env "@@value_quota" Mutable 0L + E.add_global64 env "@@value_quota" Mutable 0L; + E.add_global64 env "@@type_scaler" Mutable idl_type_scaler; + E.add_global64 env "@@type_bias" Mutable idl_type_bias let get_rel_buf_opt env = G.i (GlobalGet (nr (E.get_global env "@@rel_buf_opt"))) @@ -7244,6 +7248,16 @@ module Serialization = struct G.nop end + let get_type_scaler env = + G.i (GlobalGet (nr (E.get_global env "@@type_scaler"))) + let set_type_scaler env = + G.i (GlobalSet (nr (E.get_global env "@@type_scaler"))) + + let get_type_bias env = + G.i (GlobalGet (nr (E.get_global env "@@type_bias"))) + let set_type_bias env = + G.i (GlobalSet (nr (E.get_global env "@@type_bias"))) + let define_idl_limit_check env = Func.define_built_in env "idl_limit_check" [("decrement", I32Type); ("count", I64Type)] [] (fun env -> @@ -8786,8 +8800,12 @@ module Serialization = struct (* Go! *) let tydesc, _, _ = type_desc env Candid ts in - let tydesc_len = Int64.of_int (String.length tydesc * 2 + 3000000) in - Bool.(lit extended ^^ to_rts_int32) ^^ get_data_buf ^^ compile_unboxed_const tydesc_len ^^ get_typtbl_ptr ^^ get_typtbl_size_ptr ^^ get_maintyps_ptr ^^ + let tydesc_len = Int64.of_int (String.length tydesc) in + let tydesc_tolerance = + compile_unboxed_const tydesc_len ^^ + Registers.get_type_scaler env ^^ G.i (Binary (Wasm_exts.Values.I64 I64Op.Mul)) ^^ + Registers.get_type_bias env ^^ G.i (Binary (Wasm_exts.Values.I64 I64Op.Add)) in + Bool.(lit extended ^^ to_rts_int32) ^^ get_data_buf ^^ tydesc_tolerance ^^ get_typtbl_ptr ^^ get_typtbl_size_ptr ^^ get_maintyps_ptr ^^ E.call_import env "rts" "parse_idl_header" ^^ (* Allocate global type type, if necessary for subtype checks *) @@ -12701,6 +12719,15 @@ and compile_prim_invocation (env : E.t) ae p es at = TaggedSmallWord.msb_adjust Type.Nat32 ^^ TaggedSmallWord.tag env Type.Nat32 + | OtherPrim "getCandidTypeLimits", [] -> + SR.UnboxedTuple 2, + Serialization.Registers.get_type_scaler env ^^ + TaggedSmallWord.msb_adjust Type.Nat32 ^^ + TaggedSmallWord.tag env Type.Nat32 ^^ + Serialization.Registers.get_type_bias env ^^ + TaggedSmallWord.msb_adjust Type.Nat32 ^^ + TaggedSmallWord.tag env Type.Nat32 + (* Coercions for abstract types *) | CastPrim (_,_), [e] -> compile_exp env ae e From 4020a77645a0d2d88724f41bbe6644dd82532158 Mon Sep 17 00:00:00 2001 From: Gabor Greif Date: Sun, 30 Nov 2025 22:43:12 +0100 Subject: [PATCH 17/27] limits --- test/bench/typtbl.mo | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/test/bench/typtbl.mo b/test/bench/typtbl.mo index 71ccd0d6b7a..1b66c071229 100644 --- a/test/bench/typtbl.mo +++ b/test/bench/typtbl.mo @@ -1,4 +1,4 @@ -import { debugPrint; performanceCounter } = "mo:â›”"; +import { debugPrint; performanceCounter; getCandidTypeLimits } = "mo:â›”"; // various sizes import msg256x1 = "blob:file:messages/msg256x1.bin"; @@ -16,6 +16,8 @@ actor Decoding { type Nested768 = H2>>; type Nested1024 = H2>>>; + debugPrint(debug_show getCandidTypeLimits()); + func measure(f : () -> ?T) { let p0 = performanceCounter(0); ignore f(); From 0a3be085eb8bd3740d3eb69052110c4e803bd627 Mon Sep 17 00:00:00 2001 From: Gabor Greif Date: Mon, 1 Dec 2025 13:57:38 +0100 Subject: [PATCH 18/27] implement setter --- src/codegen/compile_enhanced.ml | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/codegen/compile_enhanced.ml b/src/codegen/compile_enhanced.ml index bdce3121dbe..5aa74617f09 100644 --- a/src/codegen/compile_enhanced.ml +++ b/src/codegen/compile_enhanced.ml @@ -8801,14 +8801,14 @@ module Serialization = struct (* Go! *) let tydesc, _, _ = type_desc env Candid ts in let tydesc_len = Int64.of_int (String.length tydesc) in - let tydesc_tolerance = + let tydesc_tolerance =Printf.printf "tydesc_len: %d\n" (String.length tydesc); compile_unboxed_const tydesc_len ^^ Registers.get_type_scaler env ^^ G.i (Binary (Wasm_exts.Values.I64 I64Op.Mul)) ^^ Registers.get_type_bias env ^^ G.i (Binary (Wasm_exts.Values.I64 I64Op.Add)) in Bool.(lit extended ^^ to_rts_int32) ^^ get_data_buf ^^ tydesc_tolerance ^^ get_typtbl_ptr ^^ get_typtbl_size_ptr ^^ get_maintyps_ptr ^^ E.call_import env "rts" "parse_idl_header" ^^ - (* Allocate global type type, if necessary for subtype checks *) + (* Allocate global type table, if necessary for subtype checks *) (if extended then G.nop else begin @@ -12719,6 +12719,15 @@ and compile_prim_invocation (env : E.t) ae p es at = TaggedSmallWord.msb_adjust Type.Nat32 ^^ TaggedSmallWord.tag env Type.Nat32 + | OtherPrim "setCandidTypeLimits", [e1; e2] -> + SR.unit, + compile_exp_as env ae (SR.UnboxedWord64 Type.Nat32) e1 ^^ + TaggedSmallWord.lsb_adjust Type.Nat32 ^^ + Serialization.Registers.set_type_scaler env ^^ + compile_exp_as env ae (SR.UnboxedWord64 Type.Nat32) e2 ^^ + TaggedSmallWord.lsb_adjust Type.Nat32 ^^ + Serialization.Registers.set_type_bias env + | OtherPrim "getCandidTypeLimits", [] -> SR.UnboxedTuple 2, Serialization.Registers.get_type_scaler env ^^ From 63bad6ef4e77834cf7ca9b2a18a40b280048534f Mon Sep 17 00:00:00 2001 From: Gabor Greif Date: Mon, 1 Dec 2025 15:16:24 +0100 Subject: [PATCH 19/27] set the limit --- test/bench/typtbl.mo | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/test/bench/typtbl.mo b/test/bench/typtbl.mo index 1b66c071229..65d5c65f65b 100644 --- a/test/bench/typtbl.mo +++ b/test/bench/typtbl.mo @@ -1,4 +1,4 @@ -import { debugPrint; performanceCounter; getCandidTypeLimits } = "mo:â›”"; +import { debugPrint; performanceCounter; getCandidTypeLimits; setCandidTypeLimits } = "mo:â›”"; // various sizes import msg256x1 = "blob:file:messages/msg256x1.bin"; @@ -16,6 +16,8 @@ actor Decoding { type Nested768 = H2>>; type Nested1024 = H2>>>; + debugPrint(debug_show getCandidTypeLimits()); + setCandidTypeLimits{bias = 300; scaler = 1}; debugPrint(debug_show getCandidTypeLimits()); func measure(f : () -> ?T) { From 169428589e1b454e808f756372790ffb151c5501 Mon Sep 17 00:00:00 2001 From: Gabor Greif Date: Mon, 1 Dec 2025 15:56:39 +0100 Subject: [PATCH 20/27] add test to verify cutoffs --- test/run-drun/ok/typtbl.drun-run.ok | 7 +++++++ test/run-drun/ok/typtbl.tc.ok | 11 +++++++++++ test/run-drun/typtbl.mo | 19 +++++++++++++++++++ 3 files changed, 37 insertions(+) create mode 100644 test/run-drun/ok/typtbl.drun-run.ok create mode 100644 test/run-drun/ok/typtbl.tc.ok create mode 100644 test/run-drun/typtbl.mo diff --git a/test/run-drun/ok/typtbl.drun-run.ok b/test/run-drun/ok/typtbl.drun-run.ok new file mode 100644 index 00000000000..d4dfeccc437 --- /dev/null +++ b/test/run-drun/ok/typtbl.drun-run.ok @@ -0,0 +1,7 @@ +ingress Completed: Reply: 0x4449444c016c01b3c4b1f204680100010a00000000000000000101 +debug.print: {bias = 1_024; scaler = 3} +debug.print: {bias = 0; scaler = 1} +debug.print: worked +debug.print: {bias = 1; scaler = 0} +ingress Err: IC0503: Error from Canister rwlgt-iiaaa-aaaaa-aaaaa-cai: Canister called `ic0.trap` with message: 'IDL error: byte read out of buffer'. +Consider gracefully handling failures from this canister or altering the canister to handle exceptions. See documentation: https://internetcomputer.org/docs/current/references/execution-errors#trapped-explicitly diff --git a/test/run-drun/ok/typtbl.tc.ok b/test/run-drun/ok/typtbl.tc.ok new file mode 100644 index 00000000000..1218e5e3b3b --- /dev/null +++ b/test/run-drun/ok/typtbl.tc.ok @@ -0,0 +1,11 @@ +typtbl.mo:8.7-8.16: warning [M0145], this pattern of type + ?() +does not cover value + null +typtbl.mo:13.7-13.9: warning [M0145], this pattern of type + ?() +does not cover value + null +typtbl.mo:5.3-5.47: warning [M0195], this function call implicitly requires `system` capability and may perform undesired actions (please review the call and provide a type instantiation `` to suppress this warning) +typtbl.mo:11.3-11.47: warning [M0195], this function call implicitly requires `system` capability and may perform undesired actions (please review the call and provide a type instantiation `` to suppress this warning) +typtbl.mo:8.8-8.16: warning [M0194], unused identifier contents (delete or rename to wildcard `_` or `_contents`) diff --git a/test/run-drun/typtbl.mo b/test/run-drun/typtbl.mo new file mode 100644 index 00000000000..fcd5111ce32 --- /dev/null +++ b/test/run-drun/typtbl.mo @@ -0,0 +1,19 @@ +import { getCandidTypeLimits; setCandidTypeLimits; debugPrint } = "mo:â›”"; + +actor { + debugPrint (debug_show (getCandidTypeLimits())); + setCandidTypeLimits { scaler = 1; bias = 0 }; + debugPrint (debug_show (getCandidTypeLimits())); + + let ?contents : ?() = from_candid "DIDL\00\00"; + debugPrint "worked"; + + setCandidTypeLimits { scaler = 0; bias = 1 }; + debugPrint (debug_show (getCandidTypeLimits())); + let ?_ : ?() = from_candid "DIDL\01\6d\00\00"; + debugPrint "shouldn't appear"; +} + +//SKIP run +//SKIP run-ir +//SKIP run-low From 06080044ec9af25542d9440eab9ec4df50be9f7d Mon Sep 17 00:00:00 2001 From: Gabor Greif Date: Mon, 1 Dec 2025 16:06:02 +0100 Subject: [PATCH 21/27] cleanup --- src/codegen/compile_enhanced.ml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/codegen/compile_enhanced.ml b/src/codegen/compile_enhanced.ml index 5aa74617f09..d151e8e5c4e 100644 --- a/src/codegen/compile_enhanced.ml +++ b/src/codegen/compile_enhanced.ml @@ -8801,7 +8801,7 @@ module Serialization = struct (* Go! *) let tydesc, _, _ = type_desc env Candid ts in let tydesc_len = Int64.of_int (String.length tydesc) in - let tydesc_tolerance =Printf.printf "tydesc_len: %d\n" (String.length tydesc); + let tydesc_tolerance = compile_unboxed_const tydesc_len ^^ Registers.get_type_scaler env ^^ G.i (Binary (Wasm_exts.Values.I64 I64Op.Mul)) ^^ Registers.get_type_bias env ^^ G.i (Binary (Wasm_exts.Values.I64 I64Op.Add)) in From af3945b83c657baed3c0bfa57ae909cb339763cd Mon Sep 17 00:00:00 2001 From: Gabor Greif Date: Mon, 1 Dec 2025 16:20:47 +0100 Subject: [PATCH 22/27] not needed --- test/bench/ok/typtbl.drun-run.ok | 9 +++++++++ test/bench/ok/typtbl.tc.ok | 1 + test/bench/typtbl.mo | 2 -- test/run-drun/typtbl.bin | Bin 2091997 -> 0 bytes 4 files changed, 10 insertions(+), 2 deletions(-) create mode 100644 test/bench/ok/typtbl.drun-run.ok create mode 100644 test/bench/ok/typtbl.tc.ok delete mode 100644 test/run-drun/typtbl.bin diff --git a/test/bench/ok/typtbl.drun-run.ok b/test/bench/ok/typtbl.drun-run.ok new file mode 100644 index 00000000000..2ab17cd7be5 --- /dev/null +++ b/test/bench/ok/typtbl.drun-run.ok @@ -0,0 +1,9 @@ +ingress Completed: Reply: 0x4449444c016c01b3c4b1f204680100010a00000000000000000101 +debug.print: {bias = 1_024; scaler = 3} +debug.print: {cycles = 175_163} +debug.print: {cycles = 175_424} +debug.print: {cycles = 353_600} +debug.print: {cycles = 531_776} +debug.print: {cycles = 709_952} +debug.print: {cycles = 261_584} +ingress Completed: Reply: 0x4449444c0000 diff --git a/test/bench/ok/typtbl.tc.ok b/test/bench/ok/typtbl.tc.ok new file mode 100644 index 00000000000..50d8cf669ee --- /dev/null +++ b/test/bench/ok/typtbl.tc.ok @@ -0,0 +1 @@ +typtbl.mo:1.63-1.82: warning [M0198], unused field setCandidTypeLimits in object pattern (delete or rewrite as `setCandidTypeLimits = _`) diff --git a/test/bench/typtbl.mo b/test/bench/typtbl.mo index 65d5c65f65b..05a6e2b7bf6 100644 --- a/test/bench/typtbl.mo +++ b/test/bench/typtbl.mo @@ -16,8 +16,6 @@ actor Decoding { type Nested768 = H2>>; type Nested1024 = H2>>>; - debugPrint(debug_show getCandidTypeLimits()); - setCandidTypeLimits{bias = 300; scaler = 1}; debugPrint(debug_show getCandidTypeLimits()); func measure(f : () -> ?T) { diff --git a/test/run-drun/typtbl.bin b/test/run-drun/typtbl.bin deleted file mode 100644 index 30787b150bea6c11b6813e5ed229056a99849bc7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2091997 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 From 15e86dc64402868b8ff9a038c788ee9dd8929a32 Mon Sep 17 00:00:00 2001 From: Gabor Greif Date: Fri, 5 Dec 2025 13:59:18 +0100 Subject: [PATCH 23/27] amend the `Changelog.md` --- Changelog.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Changelog.md b/Changelog.md index 2e87216170e..7486857f469 100644 --- a/Changelog.md +++ b/Changelog.md @@ -72,6 +72,8 @@ `/// @deprecated M0235`. (allowed by default, warn with `-W 0235`). + * Add privileged primitive for setting Candid type table cutoff (#5642). + * Experimental support for `implicit` argument declarations (#5517). * Experimental support for Mixins (#5459). From 61c525b3b9260a66b2afd381bfaf877848be17ea Mon Sep 17 00:00:00 2001 From: Gabor Greif Date: Tue, 9 Dec 2025 11:23:27 +0100 Subject: [PATCH 24/27] renamin --- src/codegen/compile_classical.ml | 8 ++++---- src/codegen/compile_enhanced.ml | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/codegen/compile_classical.ml b/src/codegen/compile_classical.ml index 8180afa20eb..6e669ea752a 100644 --- a/src/codegen/compile_classical.ml +++ b/src/codegen/compile_classical.ml @@ -6776,8 +6776,8 @@ module MakeSerialization (Strm : Stream) = struct let idl_value_numerator = 1l let idl_value_denominator = 1l let idl_value_bias = 1024l - let idl_type_scaler = 3l - let idl_type_bias = 1024l + let idl_typetbl_scaler = 3l + let idl_typetbl_bias = 1024l let register_globals env = E.add_global32 env "@@rel_buf_opt" Mutable 0l; @@ -6790,8 +6790,8 @@ module MakeSerialization (Strm : Stream) = struct E.add_global32 env "@@value_numerator" Mutable idl_value_numerator; E.add_global32 env "@@value_bias" Mutable idl_value_bias; E.add_global64 env "@@value_quota" Mutable 0L; - E.add_global32 env "@@type_scaler" Mutable idl_type_scaler; - E.add_global32 env "@@type_bias" Mutable idl_type_bias + E.add_global32 env "@@type_scaler" Mutable idl_typetbl_scaler; + E.add_global32 env "@@type_bias" Mutable idl_typetbl_bias let get_rel_buf_opt env = G.i (GlobalGet (nr (E.get_global env "@@rel_buf_opt"))) diff --git a/src/codegen/compile_enhanced.ml b/src/codegen/compile_enhanced.ml index d151e8e5c4e..1d26916761c 100644 --- a/src/codegen/compile_enhanced.ml +++ b/src/codegen/compile_enhanced.ml @@ -7097,8 +7097,8 @@ module Serialization = struct let idl_value_numerator = 1L let idl_value_denominator = 1L let idl_value_bias = 1024L - let idl_type_scaler = 3L - let idl_type_bias = 1024L + let idl_typetbl_scaler = 3L + let idl_typetbl_bias = 1024L let register_globals env = E.add_global64 env "@@rel_buf_opt" Mutable 0L; @@ -7114,8 +7114,8 @@ module Serialization = struct E.add_global64 env "@@value_numerator" Mutable idl_value_numerator; E.add_global64 env "@@value_bias" Mutable idl_value_bias; E.add_global64 env "@@value_quota" Mutable 0L; - E.add_global64 env "@@type_scaler" Mutable idl_type_scaler; - E.add_global64 env "@@type_bias" Mutable idl_type_bias + E.add_global64 env "@@type_scaler" Mutable idl_typetbl_scaler; + E.add_global64 env "@@type_bias" Mutable idl_typetbl_bias let get_rel_buf_opt env = G.i (GlobalGet (nr (E.get_global env "@@rel_buf_opt"))) From 8fca5105af386f17dc9e295859827ffce33b3546 Mon Sep 17 00:00:00 2001 From: Gabor Greif Date: Tue, 9 Dec 2025 11:30:56 +0100 Subject: [PATCH 25/27] Apply suggestions from code review by @crusso --- src/codegen/compile_classical.ml | 2 +- src/codegen/compile_enhanced.ml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/codegen/compile_classical.ml b/src/codegen/compile_classical.ml index 6e669ea752a..de8e6c66636 100644 --- a/src/codegen/compile_classical.ml +++ b/src/codegen/compile_classical.ml @@ -6776,7 +6776,7 @@ module MakeSerialization (Strm : Stream) = struct let idl_value_numerator = 1l let idl_value_denominator = 1l let idl_value_bias = 1024l - let idl_typetbl_scaler = 3l + let idl_typetbl_scaler = 16l let idl_typetbl_bias = 1024l let register_globals env = diff --git a/src/codegen/compile_enhanced.ml b/src/codegen/compile_enhanced.ml index 1d26916761c..40b608e5128 100644 --- a/src/codegen/compile_enhanced.ml +++ b/src/codegen/compile_enhanced.ml @@ -7097,7 +7097,7 @@ module Serialization = struct let idl_value_numerator = 1L let idl_value_denominator = 1L let idl_value_bias = 1024L - let idl_typetbl_scaler = 3L + let idl_typetbl_scaler = 16L let idl_typetbl_bias = 1024L let register_globals env = From 6230ee67602306d48ab98c4a1eda9b391dd2c073 Mon Sep 17 00:00:00 2001 From: Gabor Greif Date: Tue, 9 Dec 2025 16:43:40 +0100 Subject: [PATCH 26/27] accept --- test/fail/ok/no-timer-canc.tc.ok | 2 ++ test/fail/ok/no-timer-set.tc.ok | 2 ++ test/fail/ok/suggest-long-ai.tc.ok | 2 ++ test/fail/ok/suggest-short-ai.tc.ok | 2 ++ test/fail/ok/suggest-short.tc.ok | 2 +- test/run-drun/ok/typtbl.drun-run.ok | 2 +- 6 files changed, 10 insertions(+), 2 deletions(-) diff --git a/test/fail/ok/no-timer-canc.tc.ok b/test/fail/ok/no-timer-canc.tc.ok index ea27fb23436..543d64b100c 100644 --- a/test/fail/ok/no-timer-canc.tc.ok +++ b/test/fail/ok/no-timer-canc.tc.ok @@ -159,6 +159,7 @@ no-timer-canc.mo:3.10-3.21: type error [M0119], object field cancelTimer is not forall : (f : T -> Bool) -> Bool; getCandidLimits : () -> {bias : Nat32; denominator : Nat32; numerator : Nat32}; + getCandidTypeLimits : () -> {bias : Nat32; scaler : Nat32}; getCertificate : () -> ?Blob; getDeadBlobs : () -> ?[Blob]; getSelfPrincipal : () -> Principal; @@ -271,6 +272,7 @@ no-timer-canc.mo:3.10-3.21: type error [M0119], object field cancelTimer is not rts_version : () -> Text; setCandidLimits : {bias : Nat32; denominator : Nat32; numerator : Nat32} -> (); + setCandidTypeLimits : {bias : Nat32; scaler : Nat32} -> (); setCertifiedData : (data : Blob) -> (); shiftLeft : (x : Nat, shift : Nat32) -> Nat; shiftRight : (x : Nat, shift : Nat32) -> Nat; diff --git a/test/fail/ok/no-timer-set.tc.ok b/test/fail/ok/no-timer-set.tc.ok index 03b288f8cb4..6592f4cca1e 100644 --- a/test/fail/ok/no-timer-set.tc.ok +++ b/test/fail/ok/no-timer-set.tc.ok @@ -159,6 +159,7 @@ no-timer-set.mo:3.10-3.18: type error [M0119], object field setTimer is not cont forall : (f : T -> Bool) -> Bool; getCandidLimits : () -> {bias : Nat32; denominator : Nat32; numerator : Nat32}; + getCandidTypeLimits : () -> {bias : Nat32; scaler : Nat32}; getCertificate : () -> ?Blob; getDeadBlobs : () -> ?[Blob]; getSelfPrincipal : () -> Principal; @@ -271,6 +272,7 @@ no-timer-set.mo:3.10-3.18: type error [M0119], object field setTimer is not cont rts_version : () -> Text; setCandidLimits : {bias : Nat32; denominator : Nat32; numerator : Nat32} -> (); + setCandidTypeLimits : {bias : Nat32; scaler : Nat32} -> (); setCertifiedData : (data : Blob) -> (); shiftLeft : (x : Nat, shift : Nat32) -> Nat; shiftRight : (x : Nat, shift : Nat32) -> Nat; diff --git a/test/fail/ok/suggest-long-ai.tc.ok b/test/fail/ok/suggest-long-ai.tc.ok index 1b6da83c767..3efef0e4c7c 100644 --- a/test/fail/ok/suggest-long-ai.tc.ok +++ b/test/fail/ok/suggest-long-ai.tc.ok @@ -160,6 +160,7 @@ suggest-long-ai.mo:4.6-4.13: type error [M0072], field stableM does not exist in forall : (f : T -> Bool) -> Bool; getCandidLimits : () -> {bias : Nat32; denominator : Nat32; numerator : Nat32}; + getCandidTypeLimits : () -> {bias : Nat32; scaler : Nat32}; getCertificate : () -> ?Blob; getDeadBlobs : () -> ?[Blob]; getSelfPrincipal : () -> Principal; @@ -272,6 +273,7 @@ suggest-long-ai.mo:4.6-4.13: type error [M0072], field stableM does not exist in rts_version : () -> Text; setCandidLimits : {bias : Nat32; denominator : Nat32; numerator : Nat32} -> (); + setCandidTypeLimits : {bias : Nat32; scaler : Nat32} -> (); setCertifiedData : (data : Blob) -> (); setTimer : (delayNanos : Nat64, recurring : Bool, job : () -> async ()) -> diff --git a/test/fail/ok/suggest-short-ai.tc.ok b/test/fail/ok/suggest-short-ai.tc.ok index 408f1a72cb7..7772a674da8 100644 --- a/test/fail/ok/suggest-short-ai.tc.ok +++ b/test/fail/ok/suggest-short-ai.tc.ok @@ -160,6 +160,7 @@ suggest-short-ai.mo:4.6-4.7: type error [M0072], field s does not exist in type: forall : (f : T -> Bool) -> Bool; getCandidLimits : () -> {bias : Nat32; denominator : Nat32; numerator : Nat32}; + getCandidTypeLimits : () -> {bias : Nat32; scaler : Nat32}; getCertificate : () -> ?Blob; getDeadBlobs : () -> ?[Blob]; getSelfPrincipal : () -> Principal; @@ -272,6 +273,7 @@ suggest-short-ai.mo:4.6-4.7: type error [M0072], field s does not exist in type: rts_version : () -> Text; setCandidLimits : {bias : Nat32; denominator : Nat32; numerator : Nat32} -> (); + setCandidTypeLimits : {bias : Nat32; scaler : Nat32} -> (); setCertifiedData : (data : Blob) -> (); setTimer : (delayNanos : Nat64, recurring : Bool, job : () -> async ()) -> diff --git a/test/fail/ok/suggest-short.tc.ok b/test/fail/ok/suggest-short.tc.ok index 6faa4765c22..b5bee738939 100644 --- a/test/fail/ok/suggest-short.tc.ok +++ b/test/fail/ok/suggest-short.tc.ok @@ -1,2 +1,2 @@ suggest-short.mo:3.6-3.7: type error [M0072], field s does not exist in module. -Did you mean field sin, setTimer, shiftLeft, shiftRight, stableVarQuery, setCandidLimits, setCertifiedData, stableMemoryGrow, stableMemorySize, stableMemoryLoadBlob, stableMemoryLoadInt8, stableMemoryLoadNat8, stableMemoryLoadFloat, stableMemoryLoadInt16, stableMemoryLoadInt32, stableMemoryLoadInt64, stableMemoryLoadNat16, stableMemoryLoadNat32, stableMemoryLoadNat64, stableMemoryStoreBlob, stableMemoryStoreInt8, stableMemoryStoreNat8, stableMemoryStoreFloat, stableMemoryStoreInt16, stableMemoryStoreInt32, stableMemoryStoreInt64, stableMemoryStoreNat16, stableMemoryStoreNat32 or stableMemoryStoreNat64? +Did you mean field sin, setTimer, shiftLeft, shiftRight, stableVarQuery, setCandidLimits, setCertifiedData, stableMemoryGrow, stableMemorySize, setCandidTypeLimits, stableMemoryLoadBlob, stableMemoryLoadInt8, stableMemoryLoadNat8, stableMemoryLoadFloat, stableMemoryLoadInt16, stableMemoryLoadInt32, stableMemoryLoadInt64, stableMemoryLoadNat16, stableMemoryLoadNat32, stableMemoryLoadNat64, stableMemoryStoreBlob, stableMemoryStoreInt8, stableMemoryStoreNat8, stableMemoryStoreFloat, stableMemoryStoreInt16, stableMemoryStoreInt32, stableMemoryStoreInt64, stableMemoryStoreNat16, stableMemoryStoreNat32 or stableMemoryStoreNat64? diff --git a/test/run-drun/ok/typtbl.drun-run.ok b/test/run-drun/ok/typtbl.drun-run.ok index d4dfeccc437..15601328f77 100644 --- a/test/run-drun/ok/typtbl.drun-run.ok +++ b/test/run-drun/ok/typtbl.drun-run.ok @@ -1,5 +1,5 @@ ingress Completed: Reply: 0x4449444c016c01b3c4b1f204680100010a00000000000000000101 -debug.print: {bias = 1_024; scaler = 3} +debug.print: {bias = 1_024; scaler = 16} debug.print: {bias = 0; scaler = 1} debug.print: worked debug.print: {bias = 1; scaler = 0} From 87a21c4abd56f4ca723e56c95e76008d0d41a48d Mon Sep 17 00:00:00 2001 From: Cycle and memory benchmark updater <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 9 Dec 2025 16:28:16 +0000 Subject: [PATCH 27/27] Updating `test/bench` numbers --- test/bench/ok/bignum.drun-run.ok | 2 +- test/bench/ok/candid-subtype-cost.drun-run.ok | 2 +- test/bench/ok/typtbl.drun-run.ok | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/test/bench/ok/bignum.drun-run.ok b/test/bench/ok/bignum.drun-run.ok index 7bb36c0d068..cf9edb30f77 100644 --- a/test/bench/ok/bignum.drun-run.ok +++ b/test/bench/ok/bignum.drun-run.ok @@ -2,6 +2,6 @@ ingress Completed: Reply: 0x4449444c016c01b3c4b1f204680100010a000000000000000001 ingress Completed: Reply: 0x4449444c0000 debug.print: {cycles = 2_504_499; size = +25_528} ingress Completed: Reply: 0x4449444c0000 -debug.print: {cycles = 54_912_153; size = +830_464} +debug.print: {cycles = 54_912_190; size = +830_464} ingress Completed: Reply: 0x4449444c0000 ingress Completed: Reply: 0x4449444c0000 diff --git a/test/bench/ok/candid-subtype-cost.drun-run.ok b/test/bench/ok/candid-subtype-cost.drun-run.ok index bc59780c568..c68c4594aca 100644 --- a/test/bench/ok/candid-subtype-cost.drun-run.ok +++ b/test/bench/ok/candid-subtype-cost.drun-run.ok @@ -1,5 +1,5 @@ ingress Completed: Reply: 0x4449444c016c01b3c4b1f204680100010a00000000000000000101 ingress Completed: Reply: 0x4449444c0000 -debug.print: {cycles = 1_114_852; heap_bytes = +33_888} +debug.print: {cycles = 1_115_013; heap_bytes = +33_888} ingress Completed: Reply: 0x4449444c0000 ingress Completed: Reply: 0x4449444c0000 diff --git a/test/bench/ok/typtbl.drun-run.ok b/test/bench/ok/typtbl.drun-run.ok index 2ab17cd7be5..cbf95c9ab37 100644 --- a/test/bench/ok/typtbl.drun-run.ok +++ b/test/bench/ok/typtbl.drun-run.ok @@ -1,5 +1,5 @@ ingress Completed: Reply: 0x4449444c016c01b3c4b1f204680100010a00000000000000000101 -debug.print: {bias = 1_024; scaler = 3} +debug.print: {bias = 1_024; scaler = 16} debug.print: {cycles = 175_163} debug.print: {cycles = 175_424} debug.print: {cycles = 353_600}