@@ -374,13 +374,17 @@ decode_map(mrb_state* mrb, Reader* r, mrb_value src,
374374 mrb_value hash = mrb_hash_new (mrb );
375375 int idx = mrb_gc_arena_save (mrb );
376376
377+ // assign an ID to this hash for logging
378+ mrb_int hid = mrb_obj_id (hash );
379+
377380 if (reg && mrb_array_p (sharedrefs )) {
378381 mrb_ary_push (mrb , sharedrefs , hash );
379382 }
380383
381384 for (mrb_int i = 0 ; i < len ; i ++ ) {
382385 mrb_value key = decode_value (mrb , r , src , sharedrefs );
383386 mrb_value val = decode_value (mrb , r , src , sharedrefs );
387+
384388 mrb_hash_set (mrb , hash , key , val );
385389 mrb_gc_arena_restore (mrb , idx );
386390 }
@@ -760,7 +764,7 @@ decode_value(mrb_state* mrb, Reader* r, mrb_value src, mrb_value sharedrefs)
760764 result = decode_unhandled_tag (mrb , r , src , sharedrefs , tag );
761765 } break ;
762766
763- case 7 :
767+ case 7 : {
764768 if (info < 20 ) { result = mrb_nil_value (); break ; }
765769 switch (info ) {
766770 case 20 : result = mrb_false_value (); break ;
@@ -778,14 +782,18 @@ decode_value(mrb_state* mrb, Reader* r, mrb_value src, mrb_value sharedrefs)
778782 } break ;
779783 if (unlikely (mrb_undef_p (result )))
780784 mrb_raise (mrb , E_RUNTIME_ERROR , "invalid simple/float" );
781- break ;
785+ } break ;
782786
783787 default :
784788 mrb_raisef (mrb , E_NOTIMP_ERROR , "Not implemented major type %d" , major );
785789 }
786790
787791 r -> depth -- ;
788- return result ;
792+ if (likely (!mrb_undef_p (result ))) {
793+ return result ;
794+ } else {
795+ mrb_raise (mrb , E_RUNTIME_ERROR , "CBOR internal error: failed to decode value" );
796+ }
789797}
790798
791799static void
0 commit comments