refactor(ivy): simplify differentiation of LView, RNode, LView, LContainer, StylingContext (#28947)

For efficiency reasons we often put several different data types (`RNode`, `LView`, `LContainer`,
`StylingContext`) in same location in `LView`. This is because we don't want to pre-allocate
space
for it because the storage is sparse. This file contains utilities for dealing with such data
types.
How do we know what is stored at a given location in `LView`.
- `Array.isArray(value) === false` => `RNode` (The normal storage value)
- `Array.isArray(value) === true` => than the `value[0]` represents the wrapped value.
  - `typeof value[TYPE] === 'object'` => `LView`
     - This happens when we have a component at a given location
  - `typeof value[TYPE] === 'number'` => `StylingContext`
     - This happens when we have style/class binding at a given location.
  - `typeof value[TYPE] === true` => `LContainer`
     - This happens when we have `LContainer` binding at a given location.
NOTE: it is assumed that `Array.isArray` and `typeof` operations are very efficient.

PR Close #28947
This commit is contained in:
Misko Hevery
2019-02-23 11:14:35 -08:00
committed by Miško Hevery
parent bd65f58784
commit 3cb497c6ac
19 changed files with 225 additions and 112 deletions

View File

@ -16,7 +16,7 @@ import {getUrlSanitizer, sanitizeHtml, sanitizeResourceUrl, sanitizeScript, sani
import {SecurityContext} from '../../src/sanitization/security';
function fakeLView(): LView {
return Array.from({length: HEADER_OFFSET}) as LView;
return [null, {}] as LView;
}
describe('sanitization', () => {