@@ -102,6 +102,16 @@ STATIC uint32_t read4(msgpack_stream_t *s) {
102102    return  res ;
103103}
104104
105+ STATIC  uint64_t  read8 (msgpack_stream_t  * s ) {
106+     uint64_t  res  =  0 ;
107+     read (s , & res , 8 );
108+     int  n  =  1 ;
109+     if  (* (char  * )& n  ==  1 ) {
110+         res  =  __builtin_bswap64 (res );
111+     }
112+     return  res ;
113+ }
114+ 
105115STATIC  size_t  read_size (msgpack_stream_t  * s , uint8_t  len_index ) {
106116    size_t  res  =  0 ;
107117    switch  (len_index ) {
@@ -207,7 +217,7 @@ STATIC void pack_bin(msgpack_stream_t *s, const uint8_t *data, size_t len) {
207217    }
208218}
209219
210- STATIC  void    pack_ext (msgpack_stream_t  * s , int8_t  code , const  uint8_t  * data , size_t  len ) {
220+ STATIC  void  pack_ext (msgpack_stream_t  * s , int8_t  code , const  uint8_t  * data , size_t  len ) {
211221    if  (len  ==  1 ) {
212222        write1 (s , 0xd4 );
213223    } else  if  (len  ==  2 ) {
@@ -424,22 +434,39 @@ STATIC mp_obj_t unpack(msgpack_stream_t *s, mp_obj_t ext_hook, bool use_list) {
424434            return  unpack_bytes (s , read_size (s , code  -  0xc4 ));
425435        }
426436        case  0xcc : // uint8 
437+             return  MP_OBJ_NEW_SMALL_INT ((uint8_t )read1 (s ));
427438        case  0xd0 : // int8 
428439            return  MP_OBJ_NEW_SMALL_INT ((int8_t )read1 (s ));
429440        case  0xcd : // uint16 
441+             return  MP_OBJ_NEW_SMALL_INT ((uint16_t )read2 (s ));
430442        case  0xd1 : // int16 
431443            return  MP_OBJ_NEW_SMALL_INT ((int16_t )read2 (s ));
432444        case  0xce : // uint32 
445+             return  mp_obj_new_int_from_uint ((uint32_t )read4 (s ));
433446        case  0xd2 : // int32 
434-             return  MP_OBJ_NEW_SMALL_INT ((int32_t )read4 (s ));
435-         case  0xca : {
436-             union  Float  { mp_float_t  f ;
437-                           uint32_t  u ;
447+             return  mp_obj_new_int ((int32_t )read4 (s ));
448+         case  0xcf : // uint 64 
449+             return  mp_obj_new_int_from_ull ((uint64_t )read8 (s ));
450+         case  0xd3 : // int 64 
451+             return  mp_obj_new_int_from_ll ((int64_t )read8 (s ));
452+         case  0xca : { // float 
453+             union  Float  {
454+                 mp_float_t  f ;
455+                 uint32_t  u ;
438456            };
439457            union  Float  data ;
440458            data .u  =  read4 (s );
441459            return  mp_obj_new_float (data .f );
442460        }
461+         case  0xcb : { // double 
462+             union  Double  {
463+                 uint64_t  u ;
464+                 double  d ;
465+             };
466+             union  Double  data ;
467+             data .u  =  read8 (s );
468+             return  mp_obj_new_float_from_d (data .d );
469+         }
443470        case  0xd9 :
444471        case  0xda :
445472        case  0xdb : {
@@ -483,11 +510,8 @@ STATIC mp_obj_t unpack(msgpack_stream_t *s, mp_obj_t ext_hook, bool use_list) {
483510            // ext 8, 16, 32 
484511            return  unpack_ext (s , read_size (s , code  -  0xc7 ), ext_hook );
485512        case  0xc1 :      // never used 
486-         case  0xcb :      // float 64 
487-         case  0xcf :      // uint 64 
488-         case  0xd3 :      // int 64 
489513        default :
490-             mp_raise_NotImplementedError (translate ("64 bit types " ));
514+             mp_raise_ValueError (translate ("Invalid format " ));
491515    }
492516}
493517
0 commit comments