@@ -467,9 +467,7 @@ std::string Printer::Stringify(v8::JSArrayBufferView js_array_buffer_view,
467467
468468template <>
469469std::string Printer::Stringify (v8::Map map, Error& err) {
470- v8::HeapObject descriptors_obj = map.InstanceDescriptors (err);
471- if (err.Fail ()) return std::string ();
472-
470+ // TODO(mmarchini): don't fail if can't load NumberOfOwnDescriptors
473471 int64_t own_descriptors_count = map.NumberOfOwnDescriptors (err);
474472 if (err.Fail ()) return std::string ();
475473
@@ -492,25 +490,41 @@ std::string Printer::Stringify(v8::Map map, Error& err) {
492490 char tmp[256 ];
493491 std::stringstream ss;
494492 ss << rang::fg::yellow
495- << " <Map own_descriptors=%d %s=%d instance_size=%d "
496- " descriptors=0x%016" PRIx64
497- << rang::fg::reset;
493+ << " <Map own_descriptors=%d %s=%d instance_size=%d descriptors=" ;
494+
495+ // TODO(mmarchini): this should be a reusable method
496+ std::string descriptors_str = " ???" ;
497+ v8::HeapObject descriptors_obj = map.InstanceDescriptors (err);
498+ if (descriptors_obj.Check ()) {
499+ char descriptors_raw[50 ];
500+ snprintf (descriptors_raw, 50 , " 0x%016" PRIx64, descriptors_obj.raw ());
501+ ss << descriptors_raw;
502+ } else {
503+ PRINT_DEBUG (" Failed to load InstanceDescriptors" );
504+ ss << rang::fg::red << " ???" ;
505+ }
506+
507+ ss << rang::fg::reset;
498508
499509 snprintf (tmp, sizeof (tmp), ss.str ().c_str (),
500510 static_cast <int >(own_descriptors_count),
501511 in_object_properties_or_constructor.c_str (),
502512 static_cast <int >(in_object_properties_or_constructor_index),
503- static_cast <int >(instance_size), descriptors_obj. raw () );
513+ static_cast <int >(instance_size));
504514
505515 if (!options_.detailed ) {
506516 return std::string (tmp) + " >" ;
507517 }
508518
509- v8::DescriptorArray descriptors (descriptors_obj);
510- if (err.Fail ()) return std::string ();
519+ if (descriptors_obj.Check ()) {
520+ v8::DescriptorArray descriptors (descriptors_obj);
521+ if (err.Fail ()) return std::string ();
511522
512- return std::string (tmp) + " :" + Stringify<v8::FixedArray>(descriptors, err) +
513- " >" ;
523+ return std::string (tmp) + " :" + Stringify<v8::FixedArray>(descriptors, err) +
524+ " >" ;
525+ } else {
526+ std::string (tmp) + " >" ;
527+ }
514528}
515529
516530template <>
@@ -965,7 +979,7 @@ std::string Printer::StringifyDictionary(v8::JSObject js_object, Error& err) {
965979std::string Printer::StringifyDescriptors (v8::JSObject js_object, v8::Map map,
966980 Error& err) {
967981 v8::HeapObject descriptors_obj = map.InstanceDescriptors (err);
968- if (err. Fail ()) return std::string ();
982+ RETURN_IF_INVALID (descriptors_obj, std::string () );
969983
970984 v8::DescriptorArray descriptors (descriptors_obj);
971985 int64_t own_descriptors_count = map.NumberOfOwnDescriptors (err);
@@ -987,21 +1001,31 @@ std::string Printer::StringifyDescriptors(v8::JSObject js_object, v8::Map map,
9871001 std::string res;
9881002 std::stringstream ss;
9891003 for (int64_t i = 0 ; i < own_descriptors_count; i++) {
990- v8::Smi details = descriptors.GetDetails (i, err);
991- if (err.Fail ()) return std::string ();
1004+ if (!res.empty ()) res += " ,\n " ;
9921005
9931006 v8::Value key = descriptors.GetKey (i, err);
994- if (err.Fail ()) return std::string ();
995-
996- if (!res.empty ()) res += " ,\n " ;
9971007
9981008 ss.str (" " );
9991009 ss.clear ();
1000- ss << rang::style::bold << rang::fg::yellow << " ." + key.ToString (err)
1001- << rang::fg::reset << rang::style::reset;
1010+ ss << rang::style::bold << rang::fg::yellow << " ." ;
1011+ if (key.Check ()) {
1012+ ss << key.ToString (err);
1013+ } else {
1014+ PRINT_DEBUG (" Failed to get key for index %ld" , i);
1015+ ss << " ???" ;
1016+ }
1017+ ss << rang::fg::reset << rang::style::reset;
1018+
10021019 res += ss.str () + " =" ;
10031020 if (err.Fail ()) return std::string ();
10041021
1022+ v8::Smi details = descriptors.GetDetails (i);
1023+ if (!details.Check ()) {
1024+ PRINT_DEBUG (" Failed to get details for index %ld" , i);
1025+ res += " ???" ;
1026+ continue ;
1027+ }
1028+
10051029 if (descriptors.IsConstFieldDetails (details) ||
10061030 descriptors.IsDescriptorDetails (details)) {
10071031 v8::Value value;
0 commit comments