Browse Source

Include error message in the stack property. Closes #442.

Dmitry Panov 2 years ago
parent
commit
3b8a68ca89
3 changed files with 41 additions and 34 deletions
  1. 39 5
      builtin_error.go
  2. 0 28
      runtime.go
  3. 2 1
      runtime_test.go

+ 39 - 5
builtin_error.go

@@ -12,12 +12,11 @@ type errorObject struct {
 
 func (e *errorObject) formatStack() valueString {
 	var b valueStringBuilder
-	if name := e.getStr("name", nil); name != nil {
-		b.WriteString(name.toString())
-		b.WriteRune('\n')
-	} else {
-		b.WriteASCII("Error\n")
+	val := writeErrorString(&b, e.val)
+	if val != nil {
+		b.WriteString(val)
 	}
+	b.WriteRune('\n')
 
 	for _, frame := range e.stack {
 		b.WriteASCII("\tat ")
@@ -142,6 +141,41 @@ func (r *Runtime) builtin_AggregateError(args []Value, proto *Object) *Object {
 	return obj.val
 }
 
+func writeErrorString(sb *valueStringBuilder, obj *Object) valueString {
+	var nameStr, msgStr valueString
+	name := obj.self.getStr("name", nil)
+	if name == nil || name == _undefined {
+		nameStr = asciiString("Error")
+	} else {
+		nameStr = name.toString()
+	}
+	msg := obj.self.getStr("message", nil)
+	if msg == nil || msg == _undefined {
+		msgStr = stringEmpty
+	} else {
+		msgStr = msg.toString()
+	}
+	if nameStr.length() == 0 {
+		return msgStr
+	}
+	if msgStr.length() == 0 {
+		return nameStr
+	}
+	sb.WriteString(nameStr)
+	sb.WriteString(asciiString(": "))
+	sb.WriteString(msgStr)
+	return nil
+}
+
+func (r *Runtime) error_toString(call FunctionCall) Value {
+	var sb valueStringBuilder
+	val := writeErrorString(&sb, r.toObject(call.This))
+	if val != nil {
+		return val
+	}
+	return sb.String()
+}
+
 func (r *Runtime) createErrorPrototype(name valueString) *Object {
 	o := r.newBaseObject(r.global.ErrorPrototype, classObject)
 	o._putProp("message", stringEmpty, true, false, true)

+ 0 - 28
runtime.go

@@ -870,34 +870,6 @@ func (r *Runtime) builtin_newBoolean(args []Value, proto *Object) *Object {
 	return r.newPrimitiveObject(v, proto, classBoolean)
 }
 
-func (r *Runtime) error_toString(call FunctionCall) Value {
-	var nameStr, msgStr valueString
-	obj := r.toObject(call.This)
-	name := obj.self.getStr("name", nil)
-	if name == nil || name == _undefined {
-		nameStr = asciiString("Error")
-	} else {
-		nameStr = name.toString()
-	}
-	msg := obj.self.getStr("message", nil)
-	if msg == nil || msg == _undefined {
-		msgStr = stringEmpty
-	} else {
-		msgStr = msg.toString()
-	}
-	if nameStr.length() == 0 {
-		return msgStr
-	}
-	if msgStr.length() == 0 {
-		return nameStr
-	}
-	var sb valueStringBuilder
-	sb.WriteString(nameStr)
-	sb.WriteString(asciiString(": "))
-	sb.WriteString(msgStr)
-	return sb.String()
-}
-
 func (r *Runtime) builtin_new(construct *Object, args []Value) *Object {
 	return r.toConstructor(construct)(args, nil)
 }

+ 2 - 1
runtime_test.go

@@ -2479,7 +2479,8 @@ func TestErrorStack(t *testing.T) {
 	if (Reflect.ownKeys(err)[0] !== "stack") {
 		throw new Error("property order");
 	}
-	if (err.stack !== "Error\n\tat test.js:2:14(3)\n") {
+	const stack = err.stack;
+	if (stack !== "Error: test\n\tat test.js:2:14(3)\n") {
 		throw new Error(stack);
 	}
 	delete err.stack;