forked from I2P_Developers/i2p.i2p
CPUID: Clear ECX register to ensure it will work with EAX=7
Tested on linux only Add nativeJcpuidVersion() Only call getCPUVendorID() once in getInfo() Change all @since to 0.9.25 in hopes it will come true Tab removal Javadoc tweaks
This commit is contained in:
@@ -1,5 +1,27 @@
|
|||||||
#include "jcpuid.h"
|
#include "jcpuid.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Versions:
|
||||||
|
*
|
||||||
|
* 1: Original version
|
||||||
|
*
|
||||||
|
* 2: (I2P 0.8.7)
|
||||||
|
* Add PIC-compatibility
|
||||||
|
*
|
||||||
|
* 3: (I2P 0.9.25)
|
||||||
|
* Added:
|
||||||
|
* nativeJcpuidVersion()
|
||||||
|
* Set ECX to 0 to support function 7
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#define JCPUID_VERSION 3
|
||||||
|
|
||||||
|
/* since version 3 */
|
||||||
|
JNIEXPORT jint JNICALL Java_net_i2p_util_NativeBigInteger_nativeJcpuidVersion
|
||||||
|
(JNIEnv* env, jclass cls) {
|
||||||
|
return (jint) JCPUID_VERSION;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
||||||
From: http://sam.zoy.org/blog/2007-04-13-shlib-with-non-pic-code-have-inline-assembly-and-pic-mix-well
|
From: http://sam.zoy.org/blog/2007-04-13-shlib-with-non-pic-code-have-inline-assembly-and-pic-mix-well
|
||||||
@@ -52,6 +74,8 @@ JNIEXPORT jobject JNICALL Java_freenet_support_CPUInformation_CPUID_doCPUID
|
|||||||
_asm
|
_asm
|
||||||
{
|
{
|
||||||
mov eax, iFunction
|
mov eax, iFunction
|
||||||
|
// When iFunction is 7, ECX must be 0, just set it all the time
|
||||||
|
mov ecx, 0
|
||||||
cpuid
|
cpuid
|
||||||
mov a, eax
|
mov a, eax
|
||||||
mov b, ebx
|
mov b, ebx
|
||||||
@@ -76,7 +100,8 @@ JNIEXPORT jobject JNICALL Java_freenet_support_CPUInformation_CPUID_doCPUID
|
|||||||
/* 64 bit */
|
/* 64 bit */
|
||||||
: "=a" (a), "=b" (b), "=c" (c), "=d" (d)
|
: "=a" (a), "=b" (b), "=c" (c), "=d" (d)
|
||||||
#endif
|
#endif
|
||||||
:"a"(iFunction)
|
/* When iFunction is 7, ECX must be 0, just set it all the time */
|
||||||
|
:"a"(iFunction), "c"(0)
|
||||||
: "cc"
|
: "cc"
|
||||||
);
|
);
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -204,7 +204,7 @@ public class CPUID {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @since 0.9.24
|
* @since 0.9.25
|
||||||
*/
|
*/
|
||||||
static int getExtendedEBXFeatureFlags()
|
static int getExtendedEBXFeatureFlags()
|
||||||
{
|
{
|
||||||
@@ -217,7 +217,7 @@ public class CPUID {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* There's almost nothing in here.
|
* There's almost nothing in here.
|
||||||
* @since 0.9.24
|
* @since 0.9.25
|
||||||
*/
|
*/
|
||||||
static int getExtendedECXFeatureFlags()
|
static int getExtendedECXFeatureFlags()
|
||||||
{
|
{
|
||||||
@@ -274,15 +274,16 @@ public class CPUID {
|
|||||||
{
|
{
|
||||||
if(!_nativeOk)
|
if(!_nativeOk)
|
||||||
throw new UnknownCPUException("Failed to read CPU information from the system. Please verify the existence of the jcpuid dll/so.");
|
throw new UnknownCPUException("Failed to read CPU information from the system. Please verify the existence of the jcpuid dll/so.");
|
||||||
if(getCPUVendorID().equals("CentaurHauls"))
|
String id = getCPUVendorID();
|
||||||
|
if(id.equals("CentaurHauls"))
|
||||||
return new VIAInfoImpl();
|
return new VIAInfoImpl();
|
||||||
if(!isX86)
|
if(!isX86)
|
||||||
throw new UnknownCPUException("Failed to read CPU information from the system. The CPUID instruction exists on x86 CPU's only");
|
throw new UnknownCPUException("Failed to read CPU information from the system. The CPUID instruction exists on x86 CPU's only");
|
||||||
if(getCPUVendorID().equals("AuthenticAMD"))
|
if(id.equals("AuthenticAMD"))
|
||||||
return new AMDInfoImpl();
|
return new AMDInfoImpl();
|
||||||
if(getCPUVendorID().equals("GenuineIntel"))
|
if(id.equals("GenuineIntel"))
|
||||||
return new IntelInfoImpl();
|
return new IntelInfoImpl();
|
||||||
throw new UnknownCPUException("Unknown CPU type: '"+getCPUVendorID()+"'");
|
throw new UnknownCPUException("Unknown CPU type: '" + id + '\'');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -48,7 +48,7 @@ public class CPUIDCPUInfo implements CPUInfo
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @return true iff the CPU supports the AVX instruction set.
|
* @return true iff the CPU supports the AVX instruction set.
|
||||||
* @since 0.9.21
|
* @since 0.9.25
|
||||||
*/
|
*/
|
||||||
public boolean hasAVX()
|
public boolean hasAVX()
|
||||||
{
|
{
|
||||||
@@ -59,7 +59,7 @@ public class CPUIDCPUInfo implements CPUInfo
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @return true iff the CPU supports the AVX2 instruction set.
|
* @return true iff the CPU supports the AVX2 instruction set.
|
||||||
* @since 0.9.21
|
* @since 0.9.25
|
||||||
*/
|
*/
|
||||||
public boolean hasAVX2() {
|
public boolean hasAVX2() {
|
||||||
return (CPUID.getExtendedEBXFeatureFlags() & (1 << 5)) != 0; //Extended EBX Feature Bit 5
|
return (CPUID.getExtendedEBXFeatureFlags() & (1 << 5)) != 0; //Extended EBX Feature Bit 5
|
||||||
@@ -77,7 +77,7 @@ public class CPUIDCPUInfo implements CPUInfo
|
|||||||
* ref: https://en.wikipedia.org/wiki/AVX-512
|
* ref: https://en.wikipedia.org/wiki/AVX-512
|
||||||
*
|
*
|
||||||
* @return true iff the CPU supports the AVX-512 Foundation instruction set.
|
* @return true iff the CPU supports the AVX-512 Foundation instruction set.
|
||||||
* @since 0.9.21
|
* @since 0.9.25
|
||||||
*/
|
*/
|
||||||
public boolean hasAVX512()
|
public boolean hasAVX512()
|
||||||
{
|
{
|
||||||
@@ -86,7 +86,7 @@ public class CPUIDCPUInfo implements CPUInfo
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @return true iff the CPU supports the ADX instruction set.
|
* @return true iff the CPU supports the ADX instruction set.
|
||||||
* @since 0.9.21
|
* @since 0.9.25
|
||||||
*/
|
*/
|
||||||
public boolean hasADX()
|
public boolean hasADX()
|
||||||
{
|
{
|
||||||
@@ -95,7 +95,7 @@ public class CPUIDCPUInfo implements CPUInfo
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @return true iff the CPU supports TBM.
|
* @return true iff the CPU supports TBM.
|
||||||
* @since 0.9.21
|
* @since 0.9.25
|
||||||
*/
|
*/
|
||||||
public boolean hasTBM()
|
public boolean hasTBM()
|
||||||
{
|
{
|
||||||
@@ -112,7 +112,7 @@ public class CPUIDCPUInfo implements CPUInfo
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @return true iff the CPU supports the 64-bit support
|
* @return true iff the CPU supports the 64-bit support
|
||||||
* @since 0.9.21
|
* @since 0.9.25
|
||||||
*/
|
*/
|
||||||
public boolean hasX64() {
|
public boolean hasX64() {
|
||||||
return (CPUID.getExtendedEDXCPUFlags() & (1 << 29)) != 0; //Extended EDX Bit 29
|
return (CPUID.getExtendedEDXCPUFlags() & (1 << 29)) != 0; //Extended EDX Bit 29
|
||||||
@@ -120,7 +120,7 @@ public class CPUIDCPUInfo implements CPUInfo
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @return true iff the CPU supports the BMI1 instruction set.
|
* @return true iff the CPU supports the BMI1 instruction set.
|
||||||
* @since 0.9.24
|
* @since 0.9.25
|
||||||
*/
|
*/
|
||||||
public boolean hasBMI1() {
|
public boolean hasBMI1() {
|
||||||
return (CPUID.getExtendedEBXFeatureFlags() & (1 << 3)) != 0; // Extended EBX Feature Bit 3
|
return (CPUID.getExtendedEBXFeatureFlags() & (1 << 3)) != 0; // Extended EBX Feature Bit 3
|
||||||
@@ -128,7 +128,7 @@ public class CPUIDCPUInfo implements CPUInfo
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @return true iff the CPU supports the BMI2 instruction set.
|
* @return true iff the CPU supports the BMI2 instruction set.
|
||||||
* @since 0.9.24
|
* @since 0.9.25
|
||||||
*/
|
*/
|
||||||
public boolean hasBMI2() {
|
public boolean hasBMI2() {
|
||||||
return (CPUID.getExtendedEBXFeatureFlags() & (1 << 8)) != 0; // Extended EBX Feature Bit 8
|
return (CPUID.getExtendedEBXFeatureFlags() & (1 << 8)) != 0; // Extended EBX Feature Bit 8
|
||||||
@@ -136,7 +136,7 @@ public class CPUIDCPUInfo implements CPUInfo
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @return true iff the CPU supports the FMA3 instruction set.
|
* @return true iff the CPU supports the FMA3 instruction set.
|
||||||
* @since 0.9.24
|
* @since 0.9.25
|
||||||
*/
|
*/
|
||||||
public boolean hasFMA3() {
|
public boolean hasFMA3() {
|
||||||
return (CPUID.getECXCPUFlags() & (1 << 12)) != 0; // ECX Bit 12
|
return (CPUID.getECXCPUFlags() & (1 << 12)) != 0; // ECX Bit 12
|
||||||
@@ -144,22 +144,23 @@ public class CPUIDCPUInfo implements CPUInfo
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @return true iff the CPU supports the MOVBE instruction set.
|
* @return true iff the CPU supports the MOVBE instruction set.
|
||||||
* @since 0.9.24
|
* @since 0.9.25
|
||||||
*/
|
*/
|
||||||
public boolean hasMOVBE() {
|
public boolean hasMOVBE() {
|
||||||
return (CPUID.getECXCPUFlags() & (1 << 22)) != 0; // ECX Bit 22
|
return (CPUID.getECXCPUFlags() & (1 << 22)) != 0; // ECX Bit 22
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* Also known as LZCNT
|
||||||
* @return true iff the CPU supports the ABM instruction set.
|
* @return true iff the CPU supports the ABM instruction set.
|
||||||
* @since 0.9.24
|
* @since 0.9.25
|
||||||
*/
|
*/
|
||||||
public boolean hasABM() {
|
public boolean hasABM() {
|
||||||
return (CPUID.getExtendedECXCPUFlags() & (1 << 5)) != 0; // Extended EBX Bit 5
|
return (CPUID.getExtendedECXCPUFlags() & (1 << 5)) != 0; // Extended ECX Bit 5
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getCPUModelString() throws UnknownCPUException {
|
public String getCPUModelString() throws UnknownCPUException {
|
||||||
throw new UnknownCPUException("Class CPUIDCPUInfo cannot indentify CPUs");
|
throw new UnknownCPUException("Class CPUIDCPUInfo cannot indentify CPUs");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -71,13 +71,13 @@ public interface CPUInfo
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @return true iff the CPU supports the AVX instruction set.
|
* @return true iff the CPU supports the AVX instruction set.
|
||||||
* @since 0.9.21
|
* @since 0.9.25
|
||||||
*/
|
*/
|
||||||
public boolean hasAVX();
|
public boolean hasAVX();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return true iff the CPU supports the AVX2 instruction set.
|
* @return true iff the CPU supports the AVX2 instruction set.
|
||||||
* @since 0.9.21
|
* @since 0.9.25
|
||||||
*/
|
*/
|
||||||
public boolean hasAVX2();
|
public boolean hasAVX2();
|
||||||
|
|
||||||
@@ -93,19 +93,19 @@ public interface CPUInfo
|
|||||||
* ref: https://en.wikipedia.org/wiki/AVX-512
|
* ref: https://en.wikipedia.org/wiki/AVX-512
|
||||||
*
|
*
|
||||||
* @return true iff the CPU supports the AVX-512 Foundation instruction set.
|
* @return true iff the CPU supports the AVX-512 Foundation instruction set.
|
||||||
* @since 0.9.21
|
* @since 0.9.25
|
||||||
*/
|
*/
|
||||||
public boolean hasAVX512();
|
public boolean hasAVX512();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return true iff the CPU supports the ADX instruction set.
|
* @return true iff the CPU supports the ADX instruction set.
|
||||||
* @since 0.9.21
|
* @since 0.9.25
|
||||||
*/
|
*/
|
||||||
public boolean hasADX();
|
public boolean hasADX();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return true iff the CPU supports TBM.
|
* @return true iff the CPU supports TBM.
|
||||||
* @since 0.9.21
|
* @since 0.9.25
|
||||||
*/
|
*/
|
||||||
public boolean hasTBM();
|
public boolean hasTBM();
|
||||||
|
|
||||||
@@ -117,37 +117,38 @@ public interface CPUInfo
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @return true iff the CPU supports the 64-bit support
|
* @return true iff the CPU supports the 64-bit support
|
||||||
* @since 0.9.21
|
* @since 0.9.25
|
||||||
*/
|
*/
|
||||||
public boolean hasX64();
|
public boolean hasX64();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return true iff the CPU supports the BMI1 instruction set.
|
* @return true iff the CPU supports the BMI1 instruction set.
|
||||||
* @since 0.9.24
|
* @since 0.9.25
|
||||||
*/
|
*/
|
||||||
public boolean hasBMI1();
|
public boolean hasBMI1();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return true iff the CPU supports the BMI2 instruction set.
|
* @return true iff the CPU supports the BMI2 instruction set.
|
||||||
* @since 0.9.24
|
* @since 0.9.25
|
||||||
*/
|
*/
|
||||||
public boolean hasBMI2();
|
public boolean hasBMI2();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return true iff the CPU supports the FMA3 instruction set.
|
* @return true iff the CPU supports the FMA3 instruction set.
|
||||||
* @since 0.9.24
|
* @since 0.9.25
|
||||||
*/
|
*/
|
||||||
public boolean hasFMA3();
|
public boolean hasFMA3();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return true iff the CPU supports the MOVBE instruction set.
|
* @return true iff the CPU supports the MOVBE instruction set.
|
||||||
* @since 0.9.24
|
* @since 0.9.25
|
||||||
*/
|
*/
|
||||||
public boolean hasMOVBE();
|
public boolean hasMOVBE();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* Also known as LZCNT
|
||||||
* @return true iff the CPU supports the ABM instruction set.
|
* @return true iff the CPU supports the ABM instruction set.
|
||||||
* @since 0.9.24
|
* @since 0.9.25
|
||||||
*/
|
*/
|
||||||
public boolean hasABM();
|
public boolean hasABM();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -79,6 +79,7 @@ public interface IntelCPUInfo extends CPUInfo {
|
|||||||
* Supports the AVX 1 instructions.
|
* Supports the AVX 1 instructions.
|
||||||
* In general, this requires 32nm or smaller process.
|
* In general, this requires 32nm or smaller process.
|
||||||
* @return true if the CPU implements at least a SandyBridge level instruction/feature set.
|
* @return true if the CPU implements at least a SandyBridge level instruction/feature set.
|
||||||
|
* @since 0.9.25
|
||||||
*/
|
*/
|
||||||
public boolean IsSandyCompatible();
|
public boolean IsSandyCompatible();
|
||||||
|
|
||||||
@@ -92,6 +93,7 @@ public interface IntelCPUInfo extends CPUInfo {
|
|||||||
* Ivy Bridge is a successor to Sandy Bridge, so use IsSandyCompatible().
|
* Ivy Bridge is a successor to Sandy Bridge, so use IsSandyCompatible().
|
||||||
*
|
*
|
||||||
* @return true if the CPU implements at least a IvyBridge level instruction/feature set.
|
* @return true if the CPU implements at least a IvyBridge level instruction/feature set.
|
||||||
|
* @since 0.9.25
|
||||||
*/
|
*/
|
||||||
public boolean IsIvyCompatible();
|
public boolean IsIvyCompatible();
|
||||||
|
|
||||||
@@ -113,6 +115,7 @@ public interface IntelCPUInfo extends CPUInfo {
|
|||||||
*
|
*
|
||||||
* In general, this requires 22nm or smaller process.
|
* In general, this requires 22nm or smaller process.
|
||||||
* @return true if the CPU implements at least a Haswell level instruction/feature set.
|
* @return true if the CPU implements at least a Haswell level instruction/feature set.
|
||||||
|
* @since 0.9.25
|
||||||
*/
|
*/
|
||||||
public boolean IsHaswellCompatible();
|
public boolean IsHaswellCompatible();
|
||||||
|
|
||||||
@@ -126,6 +129,7 @@ public interface IntelCPUInfo extends CPUInfo {
|
|||||||
* so we do not distribute any. However, this is called from NativeBigInteger.
|
* so we do not distribute any. However, this is called from NativeBigInteger.
|
||||||
*
|
*
|
||||||
* @return true if the CPU implements at least a Broadwell level instruction/feature set.
|
* @return true if the CPU implements at least a Broadwell level instruction/feature set.
|
||||||
|
* @since 0.9.25
|
||||||
*/
|
*/
|
||||||
public boolean IsBroadwellCompatible();
|
public boolean IsBroadwellCompatible();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -376,9 +376,9 @@ class IntelInfoImpl extends CPUIDCPUInfo implements IntelCPUInfo
|
|||||||
case 0x3f:
|
case 0x3f:
|
||||||
case 0x45:
|
case 0x45:
|
||||||
case 0x46:
|
case 0x46:
|
||||||
CPUIDCPUInfo c = new CPUIDCPUInfo();
|
CPUIDCPUInfo c = new CPUIDCPUInfo();
|
||||||
if (c.hasAVX2() && c.hasBMI1() && c.hasBMI2() &&
|
if (c.hasAVX2() && c.hasBMI1() && c.hasBMI2() &&
|
||||||
c.hasFMA3() && c.hasMOVBE() && c.hasABM()) {
|
c.hasFMA3() && c.hasMOVBE() && c.hasABM()) {
|
||||||
isSandyCompatible = true;
|
isSandyCompatible = true;
|
||||||
isIvyCompatible = true;
|
isIvyCompatible = true;
|
||||||
isHaswellCompatible = true;
|
isHaswellCompatible = true;
|
||||||
|
|||||||
@@ -156,10 +156,10 @@ public class NativeBigInteger extends BigInteger {
|
|||||||
/** all libjbibi builds are identical to pentium3, case handled in getMiddleName2() */
|
/** all libjbibi builds are identical to pentium3, case handled in getMiddleName2() */
|
||||||
private final static String JBIGI_OPTIMIZATION_VIAC32 = "viac32";
|
private final static String JBIGI_OPTIMIZATION_VIAC32 = "viac32";
|
||||||
/**
|
/**
|
||||||
* The optimization levels defined here are since 0.9.21. Each of the 32-bit processors below
|
* The optimization levels defined here are since 0.9.25. Each of the 32-bit processors below
|
||||||
* needs an explicit fallback in getResourceList() or getMiddleName2().
|
* needs an explicit fallback in getResourceList() or getMiddleName2().
|
||||||
* 64-bit processors will fallback to athlon64 and athlon in getResourceList().
|
* 64-bit processors will fallback to athlon64 and athlon in getResourceList().
|
||||||
* @since 0.9.21
|
* @since 0.9.25
|
||||||
*/
|
*/
|
||||||
private final static String JBIGI_OPTIMIZATION_COREI_SBR = "coreisbr";
|
private final static String JBIGI_OPTIMIZATION_COREI_SBR = "coreisbr";
|
||||||
private final static String JBIGI_OPTIMIZATION_COREI_HWL = "coreihwl";
|
private final static String JBIGI_OPTIMIZATION_COREI_HWL = "coreihwl";
|
||||||
@@ -179,7 +179,7 @@ public class NativeBigInteger extends BigInteger {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* ARM
|
* ARM
|
||||||
* @since 0.9.21
|
* @since 0.9.25
|
||||||
*/
|
*/
|
||||||
private final static String JBIGI_OPTIMIZATION_ARM_ARMV5 = "armv5";
|
private final static String JBIGI_OPTIMIZATION_ARM_ARMV5 = "armv5";
|
||||||
private final static String JBIGI_OPTIMIZATION_ARM_ARMV6 = "armv6";
|
private final static String JBIGI_OPTIMIZATION_ARM_ARMV6 = "armv6";
|
||||||
@@ -192,7 +192,7 @@ public class NativeBigInteger extends BigInteger {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* None, no optimizations. The default fallback for x86.
|
* None, no optimizations. The default fallback for x86.
|
||||||
* @since 0.9.21
|
* @since 0.9.25
|
||||||
*/
|
*/
|
||||||
private final static String JBIGI_OPTIMIZATION_X86 = "none";
|
private final static String JBIGI_OPTIMIZATION_X86 = "none";
|
||||||
|
|
||||||
@@ -561,7 +561,7 @@ public class NativeBigInteger extends BigInteger {
|
|||||||
/**
|
/**
|
||||||
* Set the jbigi and libgmp versions. Call after loading.
|
* Set the jbigi and libgmp versions. Call after loading.
|
||||||
* Sets _jbigiVersion, _nativeOk3, and _libGMPVersion.
|
* Sets _jbigiVersion, _nativeOk3, and _libGMPVersion.
|
||||||
* @since 0.9.21
|
* @since 0.9.25
|
||||||
*/
|
*/
|
||||||
private static void setVersions() {
|
private static void setVersions() {
|
||||||
_jbigiVersion = fetchJbigiVersion();
|
_jbigiVersion = fetchJbigiVersion();
|
||||||
@@ -1001,12 +1001,12 @@ public class NativeBigInteger extends BigInteger {
|
|||||||
_loadStatus = s;
|
_loadStatus = s;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @since 0.9.21 */
|
/** @since 0.9.25 */
|
||||||
private static void error(String s) {
|
private static void error(String s) {
|
||||||
error(s, null);
|
error(s, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @since 0.9.21 */
|
/** @since 0.9.25 */
|
||||||
private static void error(String s, Throwable t) {
|
private static void error(String s, Throwable t) {
|
||||||
if(_doLog) {
|
if(_doLog) {
|
||||||
System.err.println("ERROR: " + s);
|
System.err.println("ERROR: " + s);
|
||||||
|
|||||||
Reference in New Issue
Block a user