@@ -378,10 +378,12 @@ export namespace Buffer {
378378 }
379379
380380 export namespace BASE64 {
381-
381+ // @ts -ignore: Decorators!
382+ @inline
382383 function charCodeFromByte ( value : i32 ) : u64 {
383384 if ( i32 ( value >= 0 ) & i32 ( value < 26 ) ) return value + 0x41 ;
384- else if ( i32 ( value >= 26 ) & i32 ( value < 51 ) ) return value + 0x61 ;
385+ else if ( i32 ( value >= 26 ) & i32 ( value < 52 ) ) return value + 0x47 ;
386+ else if ( i32 ( value >= 52 ) & i32 ( value < 62 ) ) return value - 0x4 ;
385387 else return select ( 0x2B , 0x2F , value == 62 ) ;
386388 }
387389
@@ -401,20 +403,20 @@ export namespace Buffer {
401403 return decodeUnsafe ( changetype < usize > ( buffer ) , buffer . byteLength ) ;
402404 }
403405
404- export function decodeUnsafe ( pointer : usize , length : i32 ) : string {
406+ export function decodeUnsafe ( sourcePointer : usize , length : i32 ) : string {
405407 if ( length == 0 ) return "" ;
406408 let iterations = < i32 > Math . floor ( length / 3 ) ;
407409 let leftoverBytes = length % 3 ;
408- let stringLength = ( iterations << 2 ) + select ( 4 , 0 , leftoverBytes ) ;
410+ let stringLength = ( iterations << 2 ) + select ( 4 , 0 , leftoverBytes != 0 ) ;
409411 let output = __alloc ( stringLength << 1 , idof < String > ( ) ) ;
410412
411413 for ( let i = 0 ; i < iterations ; i ++ ) {
412- let bytes = bswap < u32 > ( load < u32 > ( pointer + < usize > i * 3 ) ) >>> 8 ;
414+ let bytes = bswap < u32 > ( load < u32 > ( sourcePointer + < usize > i * 3 ) ) >>> 8 ;
415+
413416 let value1 = ( bytes & 0b111111000000000000000000 ) >> 18 ; // first 6 bits
414417 let value2 = ( bytes & 0b111111000000000000 ) >> 12 ; // second 6 bits
415418 let value3 = ( bytes & 0b111111000000 ) >> 6 ; // third 6 bits
416419 let value4 = ( bytes & 0b111111 ) ; // fourth 6 bits
417-
418420 let chars : u64 = charCodeFromByte ( value1 )
419421 | ( charCodeFromByte ( value2 ) << 16 )
420422 | ( charCodeFromByte ( value3 ) << 32 )
@@ -425,7 +427,7 @@ export namespace Buffer {
425427 // A is 0x61
426428 // = is 0x3D
427429 if ( leftoverBytes == 2 ) {
428- let bytes = < u32 > bswap < u16 > ( load < u16 > ( pointer + < usize > ( iterations * 3 ) ) ) << 2 ;
430+ let bytes = < u32 > bswap < u16 > ( load < u16 > ( sourcePointer + < usize > ( iterations * 3 ) ) ) << 2 ;
429431 let value1 = ( bytes & 0b111111000000000000 ) >> 12 ; // first 6 bits
430432 let value2 = ( bytes & 0b111111000000 ) >> 6 ; // second 6 bits
431433 let value3 = ( bytes & 0b111111 ) >> 0 ; // third 6 bits
@@ -435,9 +437,14 @@ export namespace Buffer {
435437 | < u64 > 0x3D000000000000 ;
436438 store < u64 > ( output + ( < usize > iterations << alignof < u64 > ( ) ) , chars ) ;
437439 } else if ( leftoverBytes == 1 ) {
438- let bytes = < i32 > load < u8 > ( pointer + < usize > ( iterations * 3 ) ) >> 2 ;
439- let chars : u64 = charCodeFromByte ( bytes & 0b111111 )
440- | < u64 > 0x3D003D00410000 ;
440+ let bytes = < i32 > load < u8 > ( sourcePointer + < usize > ( iterations * 3 ) ) ;
441+ trace ( "bytes" , 1 , bytes ) ;
442+ let value1 = ( bytes & 0b11111100 ) >> 2 ;
443+ let value2 = ( bytes & 0b11 ) << 4 ;
444+ let chars : u64 = charCodeFromByte ( value1 )
445+ | < u64 > ( charCodeFromByte ( value2 ) << 16 )
446+ | < u64 > 0x3D003D00000000 ;
447+
441448 store < u64 > ( output + ( < usize > iterations << alignof < u64 > ( ) ) , chars ) ;
442449 }
443450
0 commit comments