From df1d3fbd7b1eb63c6e41d748ee9c197207ce30b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mi=C5=A1ko=20Hevery?= Date: Wed, 15 May 2019 16:24:29 -0700 Subject: [PATCH] perf(ivy): minor cleanup; prevent sparse arrays (#30495) PR Close #30495 --- packages/core/src/render3/instructions/listener.ts | 3 ++- packages/core/src/render3/instructions/shared.ts | 5 ++++- packages/core/src/render3/query.ts | 5 ++--- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/packages/core/src/render3/instructions/listener.ts b/packages/core/src/render3/instructions/listener.ts index ee61c22680..a9d50aae1f 100644 --- a/packages/core/src/render3/instructions/listener.ts +++ b/packages/core/src/render3/instructions/listener.ts @@ -9,6 +9,7 @@ import {assertDataInRange} from '../../util/assert'; import {isObservable} from '../../util/lang'; +import {EMPTY_OBJ} from '../empty'; import {PropertyAliasValue, TNode, TNodeFlags, TNodeType} from '../interfaces/node'; import {GlobalTargetResolver, RElement, Renderer3, isProceduralRenderer} from '../interfaces/renderer'; import {CLEANUP, FLAGS, LView, LViewFlags, RENDERER, TVIEW} from '../interfaces/view'; @@ -115,7 +116,7 @@ function listenerInternal( // add native event listener - applicable to elements only if (tNode.type === TNodeType.Element) { const native = getNativeByTNode(tNode, lView) as RElement; - const resolved = eventTargetResolver ? eventTargetResolver(native) : {} as any; + const resolved = eventTargetResolver ? eventTargetResolver(native) : EMPTY_OBJ as any; const target = resolved.target || native; const renderer = loadRendererFn ? loadRendererFn(tNode, lView) : lView[RENDERER]; const lCleanup = getCleanup(lView); diff --git a/packages/core/src/render3/instructions/shared.ts b/packages/core/src/render3/instructions/shared.ts index 6d5f7797ea..869e16e88f 100644 --- a/packages/core/src/render3/instructions/shared.ts +++ b/packages/core/src/render3/instructions/shared.ts @@ -1322,7 +1322,10 @@ function setInputsFromAttrs( function generateInitialInputs( directiveIndex: number, inputs: {[key: string]: string}, tNode: TNode): InitialInputData { const initialInputData: InitialInputData = tNode.initialInputs || (tNode.initialInputs = []); - initialInputData[directiveIndex] = null; + // Ensure that we don't create sparse arrays + for (let i = initialInputData.length; i <= directiveIndex; i++) { + initialInputData.push(null); + } const attrs = tNode.attrs !; let i = 0; diff --git a/packages/core/src/render3/query.ts b/packages/core/src/render3/query.ts index 82d5572526..d8e07dab95 100644 --- a/packages/core/src/render3/query.ts +++ b/packages/core/src/render3/query.ts @@ -330,10 +330,9 @@ function add( function addMatch(query: LQuery, matchingValue: any, insertBeforeViewMatches: boolean): void { // Views created in constructors may have their container values created too early. In this case, - // ensure template node results are spliced before container results. Otherwise, results inside + // ensure template node results are unshifted before container results. Otherwise, results inside // embedded views will appear before results on parent template nodes when flattened. - insertBeforeViewMatches ? query.values.splice(-1, 0, matchingValue) : - query.values.push(matchingValue); + insertBeforeViewMatches ? query.values.unshift(matchingValue) : query.values.push(matchingValue); query.list.setDirty(); }