@@ -19,6 +19,7 @@ impl OsCallback for WasmOsCallback {
1919 while nanos > 0 {
2020 let amt = core:: cmp:: min ( i64:: MAX as u128 , nanos) ;
2121 let mut x = 0 ;
22+ // memory_atomic_wait32 returns 2 on timeout; loop until elapsed.
2223 let val = unsafe { core:: arch:: wasm32:: memory_atomic_wait32 ( & mut x, 0 , amt as i64 ) } ;
2324 debug_assert_eq ! ( val, 2 ) ;
2425 nanos -= amt;
@@ -30,6 +31,7 @@ impl OsCallback for WasmOsCallback {
3031
3132 fn random ( buf : & mut [ u8 ] ) {
3233 fn fallback ( buf : & mut [ u8 ] ) {
34+ // Non-cryptographic fallback when crypto.getRandomValues is unavailable.
3335 for b in buf {
3436 * b = ( Math :: random ( ) * 255000.0 ) as u32 as u8 ;
3537 }
@@ -92,6 +94,7 @@ fn yday_from_date(date: &Date) -> u32 {
9294/// https://github.com/emscripten-core/emscripten/blob/df69e2ccc287beab6f580f33b33e6b5692f5d20b/system/lib/libc/emscripten_internal.h#L42
9395///
9496/// https://github.com/sqlite/sqlite-wasm/blob/7c1b309c3bd07d8e6d92f82344108cebbd14f161/sqlite-wasm/jswasm/sqlite3-bundler-friendly.mjs#L3404
97+ // Mirrors emscripten/sqlite-wasm localtime handling, including DST logic.
9598unsafe fn localtime_js ( t : c_time_t , tm : * mut tm ) {
9699 let date = Date :: new ( & Number :: from ( ( t * 1000 ) as f64 ) . into ( ) ) ;
97100
@@ -105,15 +108,14 @@ unsafe fn localtime_js(t: c_time_t, tm: *mut tm) {
105108 ( * tm) . tm_yday = yday_from_date ( & date) as _ ;
106109
107110 let start = Date :: new_with_year_month_day ( date. get_full_year ( ) , 0 , 1 ) ;
111+ let tz_offset = date. get_timezone_offset ( ) ;
108112 let summer_offset =
109113 Date :: new_with_year_month_day ( date. get_full_year ( ) , 6 , 1 ) . get_timezone_offset ( ) ;
110114 let winter_offset = start. get_timezone_offset ( ) ;
111- ( * tm) . tm_isdst = i32:: from (
112- summer_offset != winter_offset
113- && date. get_timezone_offset ( ) == winter_offset. min ( summer_offset) ,
114- ) ;
115+ ( * tm) . tm_isdst =
116+ i32:: from ( summer_offset != winter_offset && tz_offset == winter_offset. min ( summer_offset) ) ;
115117
116- ( * tm) . tm_gmtoff = -( date . get_timezone_offset ( ) * 60.0 ) as _ ;
118+ ( * tm) . tm_gmtoff = -( tz_offset * 60.0 ) as _ ;
117119}
118120
119121/// https://github.com/emscripten-core/emscripten/blob/df69e2ccc287beab6f580f33b33e6b5692f5d20b/system/lib/libc/musl/include/time.h#L40
@@ -179,6 +181,7 @@ pub unsafe extern "C" fn rust_sqlite_wasm_abort() {
179181/// See <https://github.com/emscripten-core/emscripten/blob/089590d17eeb705424bf32f8a1afe34a034b4682/system/lib/libc/mktime.c#L28>.
180182#[ no_mangle]
181183pub unsafe extern "C" fn rust_sqlite_wasm_localtime ( t : * const c_time_t ) -> * mut tm {
184+ // Single shared buffer, matches libc behavior; assumes no concurrent callers.
182185 static mut TM : tm = tm {
183186 tm_sec : 0 ,
184187 tm_min : 0 ,
@@ -207,13 +210,15 @@ pub unsafe extern "C" fn rust_sqlite_wasm_malloc(size: c_size_t) -> *mut c_void
207210 if ptr. is_null ( ) {
208211 return ptr:: null_mut ( ) ;
209212 }
213+ // Store size for free/realloc; pointer returned is offset by ALIGN.
210214 * ptr. cast :: < usize > ( ) = size;
211215
212216 ptr. add ( ALIGN ) . cast ( )
213217}
214218
215219#[ no_mangle]
216220pub unsafe extern "C" fn rust_sqlite_wasm_free ( ptr : * mut c_void ) {
221+ // Only accepts pointers allocated by rust_sqlite_wasm_malloc/realloc.
217222 let ptr: * mut u8 = ptr. sub ( ALIGN ) . cast ( ) ;
218223 let size = * ( ptr. cast :: < usize > ( ) ) ;
219224
@@ -226,6 +231,7 @@ pub unsafe extern "C" fn rust_sqlite_wasm_realloc(
226231 ptr : * mut c_void ,
227232 new_size : c_size_t ,
228233) -> * mut c_void {
234+ // Only accepts pointers allocated by rust_sqlite_wasm_malloc/realloc.
229235 let ptr: * mut u8 = ptr. sub ( ALIGN ) . cast ( ) ;
230236 let size = * ( ptr. cast :: < usize > ( ) ) ;
231237
0 commit comments