Skip to content

Commit

Permalink
fixup! feat(ivy): memoize array literals in render3
Browse files Browse the repository at this point in the history
  • Loading branch information
kara committed Feb 1, 2018
1 parent 02b6bd8 commit b4793f2
Show file tree
Hide file tree
Showing 7 changed files with 359 additions and 263 deletions.
20 changes: 11 additions & 9 deletions packages/core/src/render3/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -37,15 +37,6 @@ export {
bind8 as b8,
bindV as bV,

memoize1 as mo1,
memoize2 as mo2,
memoize3 as mo3,
memoize4 as mo4,
memoize5 as mo5,
memoize6 as mo6,
memoize7 as mo7,
memoize8 as mo8,

componentRefresh as r,

container as C,
Expand Down Expand Up @@ -78,6 +69,17 @@ export {
query as Q,
queryRefresh as qR,
} from './query';
export {
objectLiteral1 as o1,
objectLiteral2 as o2,
objectLiteral3 as o3,
objectLiteral4 as o4,
objectLiteral5 as o5,
objectLiteral6 as o6,
objectLiteral7 as o7,
objectLiteral8 as o8,
} from './object_literal';


// clang-format on

Expand Down
222 changes: 6 additions & 216 deletions packages/core/src/render3/instructions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -698,7 +698,8 @@ function createTNode(
initialInputs: undefined,
inputs: undefined,
outputs: undefined,
data: data
data: data,
objectLiterals: null
};
}

Expand Down Expand Up @@ -1832,221 +1833,6 @@ export function bind8(
NO_CHANGE;
}

/**
* Updates an expression in an array literal if the expression has changed.
* Used in memoize instructions.
*
* @param arr Array to update
* @param index Index to set in array
* @param exp Expression to set at index
* @returns Whether or not there has been a change
*/
function updateArrBinding(arr: any[], index: number, exp: any): boolean {
if (bind(exp) !== NO_CHANGE) {
arr[index] = exp;
return true;
}
return false;
}

/** Updates two expressions in an array literal if they have changed. */
function updateBinding2(arr: any[], index1: number, exp1: any, index2: number, exp2: any): boolean {
let different = updateArrBinding(arr, index1, exp1);
return updateArrBinding(arr, index2, exp2) || different;
}

/** Updates four expressions in an array literal if they have changed. */
function updateBinding4(
arr: any[], index1: number, exp1: any, index2: number, exp2: any, index3: number, exp3: any,
index4: number, exp4: any): boolean {
let different = updateBinding2(arr, index1, exp1, index2, exp2);
return updateBinding2(arr, index3, exp3, index4, exp4) || different;
}

/**
* Updates the expression in the given array if it has changed and returns a copy of the array. Or,
* if the expression hasn't changed, returns NO_CHANGE.
*
* @param arr Array to update
* @param index Index to set in array
* @param exp Expression to set at index
* @returns A copy of the array or NO_CHANGE
*/
export function memoize1(arr: any[], index: number, exp: any): any[]|NO_CHANGE {
if (bind(exp) === NO_CHANGE) {
return NO_CHANGE;
} else {
arr[index] = exp;
// Must slice to change identity when binding changes
return arr.slice();
}
}

/**
* Updates the expressions in the given array if they have changed and returns a copy of the array.
* Or if no expressions have changed, returns NO_CHANGE.
* @param arr
* @param index1
* @param exp1
* @param index2
* @param exp2
* @returns A copy of the array or NO_CHANGE
*/
export function memoize2(arr: any[], index1: number, exp1: any, index2: number, exp2: any): any[]|
NO_CHANGE {
return updateBinding2(arr, index1, exp1, index2, exp2) ? arr.slice() : NO_CHANGE;
}

/**
* Updates the expressions in the given array if they have changed and returns a copy of the array.
* Or if no expressions have changed, returns NO_CHANGE.
* @param arr
* @param index1
* @param exp1
* @param index2
* @param exp2
* @param index3
* @param exp3
* @returns A copy of the array or NO_CHANGE
*/
export function memoize3(
arr: any[], index1: number, exp1: any, index2: number, exp2: any, index3: number,
exp3: any): any[]|NO_CHANGE {
let different = updateBinding2(arr, index1, exp1, index2, exp2);
return updateArrBinding(arr, index3, exp3) || different ? arr.slice() : NO_CHANGE;
}

/**
* Updates the expressions in the given array if they have changed and returns a copy of the array.
* Or if no expressions have changed, returns NO_CHANGE.
* @param arr
* @param index1
* @param exp1
* @param index2
* @param exp2
* @param index3
* @param exp3
* @param index4
* @param exp4
* @returns A copy of the array or NO_CHANGE
*/
export function memoize4(
arr: any[], index1: number, exp1: any, index2: number, exp2: any, index3: number, exp3: any,
index4: number, exp4: any): any[]|NO_CHANGE {
return updateBinding4(arr, index1, exp1, index2, exp2, index3, exp3, index4, exp4) ? arr.slice() :
NO_CHANGE;
}

/**
* Updates the expressions in the given array if they have changed and returns a copy of the array.
* Or if no expressions have changed, returns NO_CHANGE.
* @param arr
* @param index1
* @param exp1
* @param index2
* @param exp2
* @param index3
* @param exp3
* @param index4
* @param exp4
* @param index5
* @param exp5
* @returns A copy of the array or NO_CHANGE
*/
export function memoize5(
arr: any[], index1: number, exp1: any, index2: number, exp2: any, index3: number, exp3: any,
index4: number, exp4: any, index5: number, exp5: any): any[]|NO_CHANGE {
let different = updateBinding4(arr, index1, exp1, index2, exp2, index3, exp3, index4, exp4);
return updateArrBinding(arr, index5, exp5) || different ? arr.slice() : NO_CHANGE;
}

/**
* Updates the expressions in the given array if they have changed and returns a copy of the array.
* Or if no expressions have changed, returns NO_CHANGE.
* @param arr
* @param index1
* @param exp1
* @param index2
* @param exp2
* @param index3
* @param exp3
* @param index4
* @param exp4
* @param index5
* @param exp5
* @param index6
* @param exp6
* @returns A copy of the array or NO_CHANGE
*/
export function memoize6(
arr: any[], index1: number, exp1: any, index2: number, exp2: any, index3: number, exp3: any,
index4: number, exp4: any, index5: number, exp5: any, index6: number, exp6: any): any[]|
NO_CHANGE {
let different = updateBinding4(arr, index1, exp1, index2, exp2, index3, exp3, index4, exp4);
return updateBinding2(arr, index5, exp5, index6, exp6) || different ? arr.slice() : NO_CHANGE;
}

/**
* Updates the expressions in the given array if they have changed and returns a copy of the array.
* Or if no expressions have changed, returns NO_CHANGE.
* @param arr
* @param index1
* @param exp1
* @param index2
* @param exp2
* @param index3
* @param exp3
* @param index4
* @param exp4
* @param index5
* @param exp5
* @param index6
* @param exp6
* @param index7
* @param exp7
* @returns A copy of the array or NO_CHANGE
*/
export function memoize7(
arr: any[], index1: number, exp1: any, index2: number, exp2: any, index3: number, exp3: any,
index4: number, exp4: any, index5: number, exp5: any, index6: number, exp6: any, index7: number,
exp7: any): any[]|NO_CHANGE {
let different = updateBinding4(arr, index1, exp1, index2, exp2, index3, exp3, index4, exp4);
different = updateBinding2(arr, index5, exp5, index6, exp6) || different;
return updateArrBinding(arr, index7, exp7) || different ? arr.slice() : NO_CHANGE;
}

/**
* Updates the expressions in the given array if they have changed and returns a copy of the array.
* Or if no expressions have changed, returns NO_CHANGE.
* @param arr
* @param index1
* @param exp1
* @param index2
* @param exp2
* @param index3
* @param exp3
* @param index4
* @param exp4
* @param index5
* @param exp5
* @param index6
* @param exp6
* @param index7
* @param exp7
* @param index8
* @param exp8
* @returns A copy of the array or NO_CHANGE
*/
export function memoize8(
arr: any[], index1: number, exp1: any, index2: number, exp2: any, index3: number, exp3: any,
index4: number, exp4: any, index5: number, exp5: any, index6: number, exp6: any, index7: number,
exp7: any, index8: number, exp8: any): any[]|NO_CHANGE {
let different = updateBinding4(arr, index1, exp1, index2, exp2, index3, exp3, index4, exp4);
return updateBinding4(arr, index5, exp5, index6, exp6, index7, exp7, index8, exp8) || different ?
arr.slice() :
NO_CHANGE;
}

export function memory<T>(index: number, value?: T): T {
return valueInData<T>(data, index, value);
}
Expand Down Expand Up @@ -2078,6 +1864,10 @@ export function getRenderer(): Renderer3 {
return renderer;
}

export function getTNode(index: number): TNode {
return tData[index] as TNode;
}

export function getDirectiveInstance<T>(instanceOrArray: T | [T]): T {
// Directives with content queries store an array in data[directiveIndex]
// with the instance as the first index
Expand Down
7 changes: 7 additions & 0 deletions packages/core/src/render3/interfaces/node.ts
Original file line number Diff line number Diff line change
Expand Up @@ -274,6 +274,13 @@ export interface TNode {
* If this TNode corresponds to an LElementNode, data will be null.
*/
data: TContainer|null;

/**
* Contains copies of array literals that were passed as bindings for this node.
*
* Note on name: will soon contain both object and array literals.
*/
objectLiterals: any[][]|null;
}

/** Static data for an LElementNode */
Expand Down

0 comments on commit b4793f2

Please sign in to comment.