corda/classpath/java/lang/Math.java
Joel Dice 9b2a02e92b avoid calling unrelated JNI methods during class initialization
The main goal here is to avoid making JNI calls from code that really
shouldn't need JNI (e.g. before this patch, ArrayList.add called
Math.max, which called Math.<clinit>, which called Random.<init>,
which called System.currentTimeMillis).

Besides following the "pay for only what you need" principle, this
change ensures we can call LambdaMetaFactory methods during AOT
compilation with a minimal VM (i.e. without compiling in JNI methods
we don't need).
2015-09-12 19:58:50 -06:00

125 lines
2.7 KiB
Java

/* Copyright (c) 2008-2015, Avian Contributors
Permission to use, copy, modify, and/or distribute this software
for any purpose with or without fee is hereby granted, provided
that the above copyright notice and this permission notice appear
in all copies.
There is NO WARRANTY for this software. See license.txt for
details. */
package java.lang;
import java.util.Random;
public final class Math {
public static final double E = 2.718281828459045;
public static final double PI = 3.141592653589793;
private static class Static {
public static final Random random = new Random();
}
private Math() { }
public static double max(double a, double b) {
return (a < b ? b : a);
}
public static double min(double a, double b) {
return (a > b ? b : a);
}
public static float max(float a, float b) {
return (a < b ? b : a);
}
public static float min(float a, float b) {
return (a > b ? b : a);
}
public static long max(long a, long b) {
return (a < b ? b : a);
}
public static long min(long a, long b) {
return (a > b ? b : a);
}
public static int max(int a, int b) {
return (a < b ? b : a);
}
public static int min(int a, int b) {
return (a > b ? b : a);
}
public static int abs(int v) {
return (v < 0 ? -v : v);
}
public static long abs(long v) {
return (v < 0 ? -v : v);
}
public static float abs(float v) {
return (v < 0 ? -v : v);
}
public static double abs(double v) {
return (v < 0 ? -v : v);
}
public static long round(double v) {
return (long) Math.floor(v + 0.5);
}
public static int round(float v) {
return (int) Math.floor(v + 0.5);
}
public static double signum(double d) {
return d > 0 ? +1.0 : d < 0 ? -1.0 : 0;
}
public static float signum(float f) {
return f > 0 ? +1.0f : f < 0 ? -1.0f : 0;
}
public static double random() {
return Static.random.nextDouble();
}
public static native double floor(double v);
public static native double ceil(double v);
public static native double exp(double v);
public static native double log(double v);
public static native double cos(double v);
public static native double sin(double v);
public static native double tan(double v);
public static native double cosh(double v);
public static native double sinh(double v);
public static native double tanh(double v);
public static native double acos(double v);
public static native double asin(double v);
public static native double atan(double v);
public static native double atan2(double y, double x);
public static native double sqrt(double v);
public static native double pow(double v, double e);
}