@@ -1885,43 +1885,27 @@ export class Relooper {
1885
1885
}
1886
1886
}
1887
1887
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
+
1888
1907
export 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 ;
1925
1909
}
1926
1910
1927
1911
// helpers
0 commit comments