@ -199,10 +199,10 @@ export default class Renderer {
? x ` $ $ self. $ $ .dirty `
? x ` $ $ self. $ $ .dirty `
: x ` #dirty ` ) as Identifier | MemberExpression ;
: x ` #dirty ` ) as Identifier | MemberExpression ;
const get_bitmask = ( ) = > names . reduce ( ( bit s, name ) = > {
const get_bitmask = ( ) = > names . reduce ( ( bit ma sk , name ) = > {
const member = renderer . context_lookup . get ( name ) ;
const member = renderer . context_lookup . get ( name ) ;
if ( ! member ) return bit s;
if ( ! member ) return bit ma sk ;
if ( member . index . value === - 1 ) {
if ( member . index . value === - 1 ) {
throw new Error ( ` unset index ` ) ;
throw new Error ( ` unset index ` ) ;
@ -210,12 +210,15 @@ export default class Renderer {
const value = member . index . value as number ;
const value = member . index . value as number ;
const i = ( value / 31 ) | 0 ;
const i = ( value / 31 ) | 0 ;
const j = 1 << ( value % 31 ) ;
const n = 1 << ( value % 31 ) ;
bits [ i ] |= j ;
if ( ! bitmask [ i ] ) bitmask [ i ] = { n : 0 , names : [ ] } ;
return bits ;
bitmask [ i ] . n |= n ;
} , Array ( ( this . context . length / 31 ) | 0 ) . fill ( 0 ) ) ;
bitmask [ i ] . names . push ( name ) ;
return bitmask ;
} , Array ( ( this . context . length / 31 ) | 0 ) . fill ( null ) ) ;
let operator ;
let operator ;
let left ;
let left ;
@ -233,14 +236,14 @@ export default class Renderer {
if ( renderer . context_overflow ) {
if ( renderer . context_overflow ) {
const expression = bitmask
const expression = bitmask
. map ( ( b its , i ) = > ( { b its , i } ) )
. map ( ( b , i ) = > ( { b , i } ) )
. filter ( ( { b its } ) = > b its )
. filter ( ( { b } ) = > b )
. map ( ( { b its , i } ) = > x ` ${ dirty } [ ${ i } ] & ${ bits } ` )
. map ( ( { b , i } ) = > x ` ${ dirty } [ ${ i } ] & /* ${ b . names . join ( ', ' ) } */ ${ b . n } ` )
. reduce ( ( lhs , rhs ) = > x ` ${ lhs } | ${ rhs } ` ) ;
. reduce ( ( lhs , rhs ) = > x ` ${ lhs } | ${ rhs } ` ) ;
( { operator , left , right } = expression ) ;
( { operator , left , right } = expression ) ;
} else {
} else {
( { operator , left , right } = x ` ${ dirty } & ${ bitmask [ 0 ] || 0 } ` as BinaryExpression ) ; // TODO the `|| 0` case should never apply
( { operator , left , right } = x ` ${ dirty } & /* ${ names . join ( ', ' ) } */ ${ bitmask [ 0 ] ? bitmask [ 0 ] . n : 0 } ` as BinaryExpression ) ; // TODO the `: 0` case should never apply
}
}
return 'BinaryExpression' ;
return 'BinaryExpression' ;