@@ -167,6 +167,19 @@ export function serializeToString(data: any): string {
167167 ) ;
168168}
169169
170+ function safeToString ( val : any ) : string {
171+ try {
172+ return String ( val ) ;
173+ } catch ( err ) {
174+ if ( typeof val === 'object' ) {
175+ // An object with no prototype and no `[Symbol.toPrimitive]()`, `toString()`, and `valueOf()` methods would throw.
176+ // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String#string_coercion
177+ return '[ object Object ] ';
178+ }
179+ throw err ;
180+ }
181+ }
182+
170183// based on https://github.com/tmpfs/format-util/blob/0e62d430efb0a1c51448709abd3e2406c14d8401/format.js#L1
171184// based on https://developer.mozilla.org/en-US/docs/Web/API/console#Using_string_substitutions
172185// Implements s, d, i and f placeholders
@@ -176,7 +189,7 @@ export function formatConsoleArgumentsToSingleString(
176189) : string {
177190 const args = inputArgs . slice ( ) ;
178191
179- let formatted : string = String ( maybeMessage ) ;
192+ let formatted : string = safeToString ( maybeMessage ) ;
180193
181194 // If the first argument is a string, check for substitutions.
182195 if ( typeof maybeMessage === 'string' ) {
@@ -211,14 +224,14 @@ export function formatConsoleArgumentsToSingleString(
211224 // Arguments that remain after formatting.
212225 if ( args . length ) {
213226 for ( let i = 0 ; i < args . length ; i ++ ) {
214- formatted += ' ' + String ( args [ i ] ) ;
227+ formatted += ' ' + safeToString ( args [ i ] ) ;
215228 }
216229 }
217230
218231 // Update escaped %% values.
219232 formatted = formatted . replace ( / % { 2 , 2 } / g, '%' ) ;
220233
221- return String ( formatted ) ;
234+ return String ( ) ;
222235}
223236
224237export function isSynchronousXHRSupported ( ) : boolean {
0 commit comments