@@ -370,8 +370,14 @@ const defaultMethods = {
370370 compile : ( data , buildState ) => {
371371 if ( ! Array . isArray ( data ) || ! data . length ) return false
372372 let res
373+
373374 try {
374- res = buildState . compile `((context, above) => { try { return ${ data [ 0 ] } } catch(err) { above = [null, context, above]; context = { type: err.type || err.message || err.toString() }; `
375+ // This is a very specific optimization to speed up the common case of trying to coerce a value to a number, and falling back to a different value.
376+ if ( '+' in data [ 0 ] && data . length > 1 ) {
377+ res = buildState . compile `((context, above) => { try { const precoerceNumber = a => a; return Number.isNaN(prev = ${ data [ 0 ] } ) ? ${ data [ 1 ] } : prev } catch(err) { above = [null, context, above]; context = { type: err.type || err.message || err.toString() }; `
378+ } else {
379+ res = buildState . compile `((context, above) => { try { return ${ data [ 0 ] } } catch(err) { above = [null, context, above]; context = { type: err.type || err.message || err.toString() }; `
380+ }
375381 } catch ( err ) {
376382 // eslint-disable-next-line no-ex-assign
377383 if ( Number . isNaN ( err ) ) err = { type : 'NaN' }
@@ -1019,7 +1025,7 @@ defaultMethods['+'].compile = function (data, buildState) {
10191025 return `precoerceNumber(${ data . map ( i => numberCoercion ( i , buildState ) ) . join ( ' + ' ) } )`
10201026 }
10211027 if ( typeof data === 'string' || typeof data === 'number' || typeof data === 'boolean' ) return `precoerceNumber(+${ buildString ( data , buildState ) } )`
1022- return buildState . compile `(Array.isArray(prev = ${ data } ) ? prev.reduce((a,b) => (+a)+(+precoerceNumber(b)), 0) : + precoerceNumber(prev))`
1028+ return buildState . compile `(Array.isArray(prev = ${ data } ) ? prev.reduce((a,b) => (+a)+(+precoerceNumber(b)), 0) : precoerceNumber(+ prev))`
10231029}
10241030
10251031// @ts -ignore Allow custom attribute
@@ -1044,7 +1050,7 @@ defaultMethods['-'].compile = function (data, buildState) {
10441050 return `${ data . length === 1 ? '-' : '' } precoerceNumber(${ data . map ( i => numberCoercion ( i , buildState ) ) . join ( ' - ' ) } )`
10451051 }
10461052 if ( typeof data === 'string' || typeof data === 'number' ) return `(-${ buildString ( data , buildState ) } )`
1047- return buildState . compile `(Array.isArray(prev = ${ data } ) ? prev.length === 1 ? -precoerceNumber(prev[0]) : assertSize(prev, 1).reduce((a,b) => (+precoerceNumber(a))-(+precoerceNumber(b))) : -precoerceNumber(prev))`
1053+ return buildState . compile `(Array.isArray(prev = ${ data } ) ? prev.length === 1 ? -precoerceNumber(prev[0]) : assertSize(prev, 1).reduce((a,b) => (+precoerceNumber(a))-(+precoerceNumber(b))) : -precoerceNumber(+ prev))`
10481054}
10491055// @ts -ignore Allow custom attribute
10501056defaultMethods [ '/' ] . compile = function ( data , buildState ) {
0 commit comments