Remove unneeded indirections for java.lang.Math

Change-Id: I8e0ca436daea541e720a280d746e5e6cc21d1873
diff --git a/user/super/com/google/gwt/emul/java/lang/Math.java b/user/super/com/google/gwt/emul/java/lang/Math.java
index 26bf8f2..1800381 100644
--- a/user/super/com/google/gwt/emul/java/lang/Math.java
+++ b/user/super/com/google/gwt/emul/java/lang/Math.java
@@ -17,6 +17,7 @@
 
 import static javaemul.internal.InternalPreconditions.checkCriticalArithmetic;
 
+import jsinterop.annotations.JsMethod;
 import jsinterop.annotations.JsPackage;
 import jsinterop.annotations.JsType;
 
@@ -46,29 +47,24 @@
   private static final double PI_OVER_180 = PI / 180.0;
   private static final double PI_UNDER_180 = 180.0 / PI;
 
-  public static double abs(double x) {
-    return NativeMath.abs(x);
-  }
+  @JsMethod(namespace = "Math")
+  public static native double abs(double x);
 
-  public static float abs(float x) {
-    return (float) NativeMath.abs(x);
-  }
+  @JsMethod(namespace = "Math")
+  public static native float abs(float x);
 
-  public static int abs(int x) {
-    return x < 0 ? -x : x;
-  }
+  @JsMethod(namespace = "Math")
+  public static native int abs(int x);
 
   public static long abs(long x) {
     return x < 0 ? -x : x;
   }
 
-  public static double acos(double x) {
-    return NativeMath.acos(x);
-  }
+  @JsMethod(namespace = "Math")
+  public static native double acos(double x);
 
-  public static double asin(double x) {
-    return NativeMath.asin(x);
-  }
+  @JsMethod(namespace = "Math")
+  public static native double asin(double x);
 
   public static int addExact(int x, int y) {
     double r = (double) x + (double) y;
@@ -83,24 +79,21 @@
     return r;
   }
 
-  public static double atan(double x) {
-    return NativeMath.atan(x);
-  }
+  @JsMethod(namespace = "Math")
+  public static native double atan(double x);
 
-  public static double atan2(double y, double x) {
-    return NativeMath.atan2(y, x);
-  }
+  @JsMethod(namespace = "Math")
+  public static native double atan2(double y, double x);
 
   public static double cbrt(double x) {
-    return x == 0 || !Double.isFinite(x) ? x : NativeMath.pow(x, 1.0 / 3.0);
+    return x == 0 || !Double.isFinite(x) ? x : pow(x, 1.0 / 3.0);
   }
 
-  public static double ceil(double x) {
-    return NativeMath.ceil(x);
-  }
+  @JsMethod(namespace = "Math")
+  public static native double ceil(double x);
 
   public static double copySign(double magnitude, double sign) {
-    return isNegative(sign) ? -NativeMath.abs(magnitude) : NativeMath.abs(magnitude);
+    return isNegative(sign) ? -abs(magnitude) : abs(magnitude);
   }
 
   private static boolean isNegative(double d) {
@@ -111,12 +104,11 @@
     return (float) copySign((double) magnitude, (double) sign);
   }
 
-  public static double cos(double x) {
-    return NativeMath.cos(x);
-  }
+  @JsMethod(namespace = "Math")
+  public static native double cos(double x);
 
   public static double cosh(double x) {
-    return (NativeMath.exp(x) + NativeMath.exp(-x)) / 2;
+    return (exp(x) + exp(-x)) / 2;
   }
 
   public static int decrementExact(int x) {
@@ -129,17 +121,15 @@
     return x - 1;
   }
 
-  public static double exp(double x) {
-    return NativeMath.exp(x);
-  }
+  @JsMethod(namespace = "Math")
+  public static native double exp(double x);
 
   public static double expm1(double d) {
-    return d == 0 ? d : NativeMath.exp(d) - 1;
+    return d == 0 ? d : exp(d) - 1;
   }
 
-  public static double floor(double x) {
-    return NativeMath.floor(x);
-  }
+  @JsMethod(namespace = "Math")
+  public static native double floor(double x);
 
   public static int floorDiv(int dividend, int divisor) {
     checkCriticalArithmetic(divisor != 0);
@@ -165,7 +155,7 @@
 
   public static double hypot(double x, double y) {
     return Double.isInfinite(x) || Double.isInfinite(y) ?
-        Double.POSITIVE_INFINITY : NativeMath.sqrt(x * x + y * y);
+        Double.POSITIVE_INFINITY : sqrt(x * x + y * y);
   }
 
   public static int incrementExact(int x) {
@@ -178,45 +168,38 @@
     return x + 1;
   }
 
-  public static double log(double x) {
-    return NativeMath.log(x);
-  }
+  @JsMethod(namespace = "Math")
+  public static native double log(double x);
 
   public static double log10(double x) {
-    return NativeMath.log(x) * NativeMath.LOG10E;
+    return log(x) * NativeMath.LOG10E;
   }
 
   public static double log1p(double x) {
-    return x == 0 ? x : NativeMath.log(x + 1);
+    return x == 0 ? x : log(x + 1);
   }
 
-  public static double max(double x, double y) {
-    return NativeMath.max(x, y);
-  }
+  @JsMethod(namespace = "Math")
+  public static native double max(double x, double y);
 
-  public static float max(float x, float y) {
-    return (float) NativeMath.max(x, y);
-  }
+  @JsMethod(namespace = "Math")
+  public static native float max(float x, float y);
 
-  public static int max(int x, int y) {
-    return x > y ? x : y;
-  }
+  @JsMethod(namespace = "Math")
+  public static native int max(int x, int y);
 
   public static long max(long x, long y) {
     return x > y ? x : y;
   }
 
-  public static double min(double x, double y) {
-    return NativeMath.min(x, y);
-  }
+  @JsMethod(namespace = "Math")
+  public static native double min(double x, double y);
 
-  public static float min(float x, float y) {
-    return (float) NativeMath.min(x, y);
-  }
+  @JsMethod(namespace = "Math")
+  public static native float min(float x, float y);
 
-  public static int min(int x, int y) {
-    return x < y ? x : y;
-  }
+  @JsMethod(namespace = "Math")
+  public static native int min(int x, int y);
 
   public static long min(long x, long y) {
     return x < y ? x : y;
@@ -250,24 +233,22 @@
     return -x;
   }
 
-  public static double pow(double x, double exp) {
-    return NativeMath.pow(x, exp);
-  }
+  @JsMethod(namespace = "Math")
+  public static native double pow(double x, double exp);
 
-  public static double random() {
-    return NativeMath.random();
-  }
+  @JsMethod(namespace = "Math")
+  public static native double random();
 
   public static double rint(double x) {
     // Floating point has a mantissa with an accuracy of 52 bits so
     // any number bigger than 2^52 is effectively a finite integer value.
     // This case also filters out NaN and infinite values.
-    if (NativeMath.abs(x) < (double) (1L << 52)) {
+    if (abs(x) < (double) (1L << 52)) {
       double mod2 = x % 2;
       if ((mod2 == -1.5) || (mod2 == 0.5)) {
-        x = NativeMath.floor(x);
+        x = floor(x);
       } else {
-        x = NativeMath.round(x);
+        x = round(x);
       }
     }
     return x;
@@ -297,7 +278,7 @@
 
   public static double scalb(double d, int scaleFactor) {
     if (scaleFactor >= 31 || scaleFactor <= -31) {
-      return d * NativeMath.pow(2, scaleFactor);
+      return d * pow(2, scaleFactor);
     } else if (scaleFactor > 0) {
       return d * (1 << scaleFactor);
     } else if (scaleFactor == 0) {
@@ -323,21 +304,18 @@
     return (float) signum((double) f);
   }
 
-  public static double sin(double x) {
-    return NativeMath.sin(x);
-  }
+  @JsMethod(namespace = "Math")
+  public static native double sin(double x);
 
   public static double sinh(double x) {
-    return x == 0 ? x : (NativeMath.exp(x) - NativeMath.exp(-x)) / 2;
+    return x == 0 ? x : (exp(x) - exp(-x)) / 2;
   }
 
-  public static double sqrt(double x) {
-    return NativeMath.sqrt(x);
-  }
+  @JsMethod(namespace = "Math")
+  public static native double sqrt(double x);
 
-  public static double tan(double x) {
-    return NativeMath.tan(x);
-  }
+  @JsMethod(namespace = "Math")
+  public static native double tan(double x);
 
   public static double tanh(double x) {
     if (x == 0.0) {
@@ -345,7 +323,7 @@
     } else if (Double.isInfinite(x)) {
       return signum(x);
     } else {
-      double e2x = NativeMath.exp(2 * x);
+      double e2x = exp(2 * x);
       return (e2x - 1) / (e2x + 1);
     }
   }
@@ -371,23 +349,6 @@
   @JsType(isNative = true, name = "Math", namespace = JsPackage.GLOBAL)
   private static class NativeMath {
     public static double LOG10E;
-    public static native double abs(double x);
-    public static native double acos(double x);
-    public static native double asin(double x);
-    public static native double atan(double x);
-    public static native double atan2(double y, double x);
-    public static native double ceil(double x);
-    public static native double cos(double x);
-    public static native double exp(double x);
-    public static native double floor(double x);
-    public static native double log(double x);
-    public static native double max(double x, double y);
-    public static native double min(double x, double y);
-    public static native double pow(double x, double exp);
-    public static native double random();
     public static native double round(double x);
-    public static native double sin(double x);
-    public static native double sqrt(double x);
-    public static native double tan(double x);
   }
 }