@@ -1885,43 +1885,27 @@ export class Relooper {
18851885 }
18861886}
18871887
1888+ export enum SideEffects {
1889+ None = 0 /* _BinaryenSideEffectNone */ ,
1890+ Branches = 1 /* _BinaryenSideEffectBranches */ ,
1891+ Calls = 2 /* _BinaryenSideEffectCalls */ ,
1892+ ReadsLocal = 4 /* _BinaryenSideEffectReadsLocal */ ,
1893+ WritesLocal = 8 /* _BinaryenSideEffectWritesLocal */ ,
1894+ ReadsGlobal = 16 /* _BinaryenSideEffectReadsGlobal */ ,
1895+ WritesGlobal = 32 /* _BinaryenSideEffectWritesGlobal */ ,
1896+ ReadsMemory = 64 /* _BinaryenSideEffectReadsMemory */ ,
1897+ WritesMemory = 128 /* _BinaryenSideEffectWritesMemory */ ,
1898+ ImplicitTrap = 256 /* _BinaryenSideEffectImplicitTrap */ ,
1899+ IsAtomic = 512 /* _BinaryenSideEffectIsAtomic */ ,
1900+ Any = 1023 /* _BinaryenSideEffectAny */ ,
1901+ }
1902+
1903+ export function getSideEffects ( expr : ExpressionRef ) : SideEffects {
1904+ return binaryen . _BinaryenExpressionGetSideEffects ( expr ) ;
1905+ }
1906+
18881907export function hasSideEffects ( expr : ExpressionRef ) : bool {
1889- // TODO: there's more
1890- switch ( binaryen . _BinaryenExpressionGetId ( expr ) ) {
1891- case ExpressionId . LocalGet :
1892- case ExpressionId . GlobalGet :
1893- case ExpressionId . Const :
1894- case ExpressionId . Nop : {
1895- return false ;
1896- }
1897- case ExpressionId . Block : {
1898- for ( let i = 0 , k = binaryen . _BinaryenBlockGetNumChildren ( expr ) ; i < k ; ++ i ) {
1899- if ( hasSideEffects ( binaryen . _BinaryenBlockGetChild ( expr , i ) ) ) return true ;
1900- }
1901- return false ;
1902- }
1903- case ExpressionId . If : {
1904- return hasSideEffects ( binaryen . _BinaryenIfGetCondition ( expr ) )
1905- || hasSideEffects ( binaryen . _BinaryenIfGetIfTrue ( expr ) )
1906- || hasSideEffects ( binaryen . _BinaryenIfGetIfFalse ( expr ) ) ;
1907- }
1908- case ExpressionId . Unary : {
1909- return hasSideEffects ( binaryen . _BinaryenUnaryGetValue ( expr ) ) ;
1910- }
1911- case ExpressionId . Binary : {
1912- return hasSideEffects ( binaryen . _BinaryenBinaryGetLeft ( expr ) )
1913- || hasSideEffects ( binaryen . _BinaryenBinaryGetRight ( expr ) ) ;
1914- }
1915- case ExpressionId . Drop : {
1916- return hasSideEffects ( binaryen . _BinaryenDropGetValue ( expr ) ) ;
1917- }
1918- case ExpressionId . Select : {
1919- return hasSideEffects ( binaryen . _BinaryenSelectGetIfTrue ( expr ) )
1920- || hasSideEffects ( binaryen . _BinaryenSelectGetIfFalse ( expr ) )
1921- || hasSideEffects ( binaryen . _BinaryenSelectGetCondition ( expr ) ) ;
1922- }
1923- }
1924- return true ;
1908+ return getSideEffects ( expr ) != SideEffects . None ;
19251909}
19261910
19271911// helpers
0 commit comments