[jsscripting] Refactor log formatting & Respect toString polyfills (#13844)
* [jsscripting] Refactor log formatting & Respect toString polyfills * [jsscripting] Catch errors in log formatting & Improve handling of Java obj * [jsscripting] Update log format failure message Signed-off-by: Florian Hotze <florianh_dev@icloud.com>
This commit is contained in:
parent
d0b1458e89
commit
bf48eccf8c
@ -19,51 +19,47 @@
|
|||||||
|
|
||||||
function stringify (value) {
|
function stringify (value) {
|
||||||
try {
|
try {
|
||||||
if (Java.isJavaObject(value) || value instanceof Error) {
|
if (typeof value === 'string') return value;
|
||||||
return value.toString();
|
|
||||||
} else {
|
|
||||||
// special cases
|
// special cases
|
||||||
if (value === undefined) {
|
if (value === undefined) {
|
||||||
return 'undefined';
|
return 'undefined';
|
||||||
}
|
}
|
||||||
if (typeof value === 'function') {
|
if (value === null) {
|
||||||
return '[Function]';
|
return 'null';
|
||||||
}
|
}
|
||||||
if (value instanceof RegExp) {
|
// JSON.stringify all objects that do not polyfill toString()
|
||||||
return value.toString();
|
const str = value.toString();
|
||||||
}
|
if (typeof value === 'object' && (str === '[object Object]') || str === '[object Java]') {
|
||||||
// fallback to JSON
|
|
||||||
return JSON.stringify(value, null, 2);
|
return JSON.stringify(value, null, 2);
|
||||||
}
|
}
|
||||||
|
return str;
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
return '[Circular: ' + e + ']';
|
return 'Error: failed to format log message: ' + e;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function format (f) {
|
function format (f) {
|
||||||
if (typeof f !== 'string') {
|
try {
|
||||||
const objects = [];
|
|
||||||
for (let index = 0; index < arguments.length; index++) {
|
|
||||||
objects.push(stringify(arguments[index]));
|
|
||||||
}
|
|
||||||
return objects.join(' ');
|
|
||||||
}
|
|
||||||
|
|
||||||
if (arguments.length === 1) return f;
|
|
||||||
|
|
||||||
let i = 1;
|
|
||||||
const args = arguments;
|
const args = arguments;
|
||||||
const len = args.length;
|
|
||||||
let str = String(f).replace(formatRegExp, function (x) {
|
// If there is only one argument, stringify and return it
|
||||||
|
if (args.length === 1) return stringify(f);
|
||||||
|
|
||||||
|
// Else if the first arg is string, do regex string formatting
|
||||||
|
// the number of args after the formatted string must match the number of % placeholder
|
||||||
|
let str;
|
||||||
|
let i = 1;
|
||||||
|
if (typeof f === 'string') {
|
||||||
|
str = String(f).replace(formatRegExp, function (x) {
|
||||||
if (x === '%%') return '%';
|
if (x === '%%') return '%';
|
||||||
if (i >= len) return x;
|
if (i >= args.length) return x;
|
||||||
switch (x) {
|
switch (x) {
|
||||||
case '%s': return String(args[i++]);
|
case '%s': return String(args[i++]);
|
||||||
case '%d': return Number(args[i++]);
|
case '%d': return Number(args[i++]);
|
||||||
case '%j':
|
case '%j':
|
||||||
try {
|
try {
|
||||||
return stringify(args[i++]);
|
return stringify(args[i++]);
|
||||||
} catch (_) {
|
} catch (e) {
|
||||||
return '[Circular]';
|
return '[Circular]';
|
||||||
}
|
}
|
||||||
// falls through
|
// falls through
|
||||||
@ -71,14 +67,15 @@
|
|||||||
return x;
|
return x;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
for (let x = args[i]; i < len; x = args[++i]) {
|
}
|
||||||
if (x === null || (typeof x !== 'object' && typeof x !== 'symbol')) {
|
// Else stringify and join all args
|
||||||
str += ' ' + x;
|
for (let x = args[i]; i < args.length; x = args[++i]) {
|
||||||
} else {
|
|
||||||
str += ' ' + stringify(x);
|
str += ' ' + stringify(x);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
return str;
|
return str;
|
||||||
|
} catch (e) {
|
||||||
|
return 'Error: failed to format log message: ' + e;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const counters = {};
|
const counters = {};
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user