@@ -65,7 +65,8 @@ impl KCLModule {
6565 let free = instance. get_typed_func :: < ( i32 , i32 ) , ( ) > ( & mut store, "kcl_free" ) ?;
6666 let run = instance. get_typed_func :: < ( i32 , i32 ) , i32 > ( & mut store, "kcl_run" ) ?;
6767 let fmt = instance. get_typed_func :: < i32 , i32 > ( & mut store, "kcl_fmt" ) ?;
68- let runtime_err = instance. get_typed_func :: < ( i32 , i32 ) , i32 > ( & mut store, "kcl_runtime_err" ) ?;
68+ let runtime_err =
69+ instance. get_typed_func :: < ( i32 , i32 ) , i32 > ( & mut store, "kcl_runtime_err" ) ?;
6970 Ok ( KCLModule {
7071 instance,
7172 store,
@@ -85,25 +86,35 @@ impl KCLModule {
8586 let ( source_ptr, source_len) =
8687 copy_string_to_wasm_memory ( & mut self . store , & self . malloc , self . memory , & opts. source ) ?;
8788 let runtime_err_len = 1024 ;
88- let ( runtime_err_ptr, _) = malloc_bytes_from_wasm_memory ( & mut self . store , & self . malloc , runtime_err_len) ?;
89+ let ( runtime_err_ptr, _) =
90+ malloc_bytes_from_wasm_memory ( & mut self . store , & self . malloc , runtime_err_len) ?;
8991 let result_str = match self . run . call ( & mut self . store , ( filename_ptr, source_ptr) ) {
9092 Ok ( result_ptr) => {
9193 let ( result_str, result_len) =
9294 copy_cstr_from_wasm_memory ( & mut self . store , self . memory , result_ptr as usize ) ?;
9395 free_memory ( & mut self . store , & self . free , result_ptr, result_len) ?;
9496 result_str
95- } ,
97+ }
9698 Err ( err) => {
97- self . runtime_err . call ( & mut self . store , ( runtime_err_ptr, runtime_err_len) ) ?;
98- let ( runtime_err_str, runtime_err_len) =
99- copy_cstr_from_wasm_memory ( & mut self . store , self . memory , runtime_err_ptr as usize ) ?;
100- free_memory ( & mut self . store , & self . free , runtime_err_ptr, runtime_err_len) ?;
99+ self . runtime_err
100+ . call ( & mut self . store , ( runtime_err_ptr, runtime_err_len) ) ?;
101+ let ( runtime_err_str, runtime_err_len) = copy_cstr_from_wasm_memory (
102+ & mut self . store ,
103+ self . memory ,
104+ runtime_err_ptr as usize ,
105+ ) ?;
106+ free_memory (
107+ & mut self . store ,
108+ & self . free ,
109+ runtime_err_ptr,
110+ runtime_err_len,
111+ ) ?;
101112 if runtime_err_str. is_empty ( ) {
102- return Err ( err)
113+ return Err ( err) ;
103114 } else {
104115 runtime_err_str
105116 }
106- } ,
117+ }
107118 } ;
108119 free_memory ( & mut self . store , & self . free , filename_ptr, filename_len) ?;
109120 free_memory ( & mut self . store , & self . free , source_ptr, source_len) ?;
@@ -133,21 +144,25 @@ fn copy_string_to_wasm_memory<T>(
133144 let bytes = string. as_bytes ( ) ;
134145 let length = bytes. len ( ) ;
135146
136- let ptr = malloc. call ( & mut * store, length as i32 ) ?;
147+ // C str '\0'
148+ let ptr = malloc. call ( & mut * store, length as i32 + 1 ) ?;
137149
138150 let data = memory. data_mut ( & mut * store) ;
139151 data[ ptr as usize ..( ptr as usize + length as usize ) ] . copy_from_slice ( bytes) ;
152+ // C str '\0'
153+ data[ ptr as usize + length] = 0 ;
140154
141- Ok ( ( ptr, length as usize ) )
155+ Ok ( ( ptr, length as usize + 1 ) )
142156}
143157
144158fn malloc_bytes_from_wasm_memory < T > (
145159 store : & mut Store < T > ,
146160 malloc : & TypedFunc < i32 , i32 > ,
147161 length : i32 ,
148162) -> Result < ( i32 , usize ) > {
149- let ptr = malloc. call ( & mut * store, length) ?;
150- Ok ( ( ptr, length as usize ) )
163+ // C str '\0'
164+ let ptr = malloc. call ( & mut * store, length + 1 ) ?;
165+ Ok ( ( ptr, length as usize + 1 ) )
151166}
152167
153168fn copy_cstr_from_wasm_memory < T > (
0 commit comments