diff --git a/src/llv8-inl.h b/src/llv8-inl.h index cfe60957..8eefb4ea 100644 --- a/src/llv8-inl.h +++ b/src/llv8-inl.h @@ -240,6 +240,29 @@ inline bool JSObject::IsObjectType(LLV8* v8, int64_t type) { type == v8->types()->kJSSpecialAPIObjectType; } +inline std::string JSObject::GetName(Error& err) { + v8::HeapObject map_obj = GetMap(err); + if (err.Fail()) return std::string(); + + v8::Map map(map_obj); + v8::HeapObject constructor_obj = map.Constructor(err); + if (err.Fail()) return std::string(); + + int64_t constructor_type = constructor_obj.GetType(err); + if (err.Fail()) return std::string(); + + if (constructor_type != v8()->types()->kJSFunctionType) { + return "no constructor"; + } + + v8::JSFunction constructor(constructor_obj); + + std::string name = constructor.Name(err); + if (err.Fail()) return std::string(); + + return name; +} + template inline T JSObject::GetInObjectValue(int64_t size, int index, Error& err) { return LoadFieldValue(size + index * v8()->common()->kPointerSize, err); diff --git a/src/llv8.h b/src/llv8.h index 6fc92d52..f6d46aa6 100644 --- a/src/llv8.h +++ b/src/llv8.h @@ -237,6 +237,8 @@ class JSObject : public HeapObject { */ std::vector> Entries(Error& err); + inline std::string GetName(Error& err); + Value GetProperty(std::string key_name, Error& err); int64_t GetArrayLength(Error& err); Value GetArrayElement(int64_t pos, Error& err); diff --git a/src/printer.cc b/src/printer.cc index ad8dec79..5ee67004 100644 --- a/src/printer.cc +++ b/src/printer.cc @@ -537,42 +537,28 @@ std::string Printer::Stringify(v8::Map map, Error& err) { } template <> -std::string Printer::StringifyAllProperties(v8::JSObject js_object, - Error& err) { - std::string res = std::string(); +std::string Printer::Stringify(v8::JSError js_error, Error& err) { + std::string name = js_error.GetName(err); + if (err.Fail()) return std::string(); + + std::stringstream output; + + output << rang::fg::yellow << " -std::string Printer::StringifyAllProperties(v8::JSError js_error, Error& err) { - std::string res = StringifyAllProperties(v8::JSObject(js_error), err); if (options_.detailed) { PrinterOptions simple; @@ -586,20 +572,23 @@ std::string Printer::StringifyAllProperties(v8::JSError js_error, Error& err) { if (err.Fail()) { Error::PrintInDebugMode( "Couldn't find a symbol property in the Error object."); - return res; + output << rang::fg::yellow << ">" << rang::fg::reset; + return output.str(); } int64_t type = v8::HeapObject(maybe_stack).GetType(err); if (err.Fail()) { Error::PrintInDebugMode("Symbol property references an invalid object."); - return res; + output << rang::fg::yellow << ">" << rang::fg::reset; + return output.str(); } // NOTE (mmarchini): The stack is stored as a JSArray if (type != llv8_->types()->kJSArrayType) { Error::PrintInDebugMode("Symbol property doesn't have the right type."); - return res; + output << rang::fg::yellow << ">" << rang::fg::reset; + return output.str(); } v8::JSArray arr(maybe_stack); @@ -609,7 +598,8 @@ std::string Printer::StringifyAllProperties(v8::JSError js_error, Error& err) { if (err.Fail()) { Error::PrintInDebugMode( "Couldn't get the first element from the stack array"); - return res; + output << rang::fg::yellow << ">" << rang::fg::reset; + return output.str(); } int64_t stack_len = v8::Smi(maybe_stack_len).GetValue(); @@ -627,7 +617,8 @@ std::string Printer::StringifyAllProperties(v8::JSError js_error, Error& err) { "JSArray doesn't look like a Stack Frames array. stack_len: %lld " "array_len: %lld", stack_len, arr.GetArrayLength(err)); - return res; + output << rang::fg::yellow << ">" << rang::fg::reset; + return output.str(); } stack_len = (arr.GetArrayLength(err) - 1) / multiplier; } @@ -651,39 +642,38 @@ std::string Printer::StringifyAllProperties(v8::JSError js_error, Error& err) { << std::endl; } error_stack << " }"; - res += error_stack.str(); + output << error_stack.str(); } - return res; + + output << rang::fg::yellow << ">" << rang::fg::reset; + return output.str(); } -template -std::string Printer::Stringify(T js_object, Error& err) { - v8::HeapObject map_obj = js_object.GetMap(err); +template <> +std::string Printer::Stringify(v8::JSObject js_object, Error& err) { + std::string name = js_object.GetName(err); if (err.Fail()) return std::string(); - v8::Map map(map_obj); - v8::HeapObject constructor_obj = map.Constructor(err); - if (err.Fail()) return std::string(); + std::stringstream output; - int64_t constructor_type = constructor_obj.GetType(err); - if (err.Fail()) return std::string(); + output << rang::fg::yellow << "types()->kJSFunctionType) { - output << rang::fg::yellow << "" << rang::fg::reset; - return output.str(); - } + // Print properties in detailed mode + if (options_.detailed) { + output << rang::fg::reset << " " << StringifyProperties(js_object, err); + if (err.Fail()) return std::string(); - v8::JSFunction constructor(constructor_obj); + std::string fields = StringifyInternalFields(js_object, err); + if (err.Fail()) return std::string(); - output << rang::fg::yellow << "" << rang::fg::reset; - // Print properties in detailed mode - output << StringifyAllProperties(js_object, err) << rang::fg::yellow - << ">" << rang::fg::reset; return output.str(); } @@ -788,7 +778,7 @@ std::string Printer::Stringify(v8::HeapObject heap_object, Error& err) { if (heap_object.IsJSErrorType(err)) { v8::JSError error(heap_object); - return pre + Stringify(error, err); + return pre + Stringify(error, err); } if (v8::JSObject::IsObjectType(llv8_, type)) { diff --git a/src/printer.h b/src/printer.h index 5a2581e8..e0b946a4 100644 --- a/src/printer.h +++ b/src/printer.h @@ -48,9 +48,6 @@ class Printer { std::string StringifyInternalFields(v8::JSObject js_obj, Error& err); std::string StringifyProperties(v8::JSObject js_obj, Error& err); - template - std::string StringifyAllProperties(T value, Error& err); - std::string StringifyElements(v8::JSObject js_obj, Error& err); std::string StringifyElements(v8::JSObject js_obj, int64_t length, Error& err);