فهرست منبع

+ import java.lang.Math in the system unit
+ include mathh.inc in the system unit, implement most routines based
on java.lang.Math, and use (an unmodified!) genmath for the rest
- removed now obsolete jmathh.inc (was partial copy of mathh.inc)
- removed commented out overrides for several math routines in
njvminl (doesn't make sense to handle them inline in the compiler)

git-svn-id: branches/jvmbackend@18742 -

Jonas Maebe 14 سال پیش
والد
کامیت
fe82e2481b
10فایلهای تغییر یافته به همراه227 افزوده شده و 102 حذف شده
  1. 1 1
      .gitattributes
  2. 0 13
      compiler/jvm/njvminl.pas
  3. 0 2
      rtl/java/compproc.inc
  4. 62 0
      rtl/java/java_sys.inc
  5. 6 1
      rtl/java/java_sysh.inc
  6. 6 62
      rtl/java/jdk15.inc
  7. 5 5
      rtl/java/jdk15.pas
  8. 114 0
      rtl/java/jmath.inc
  9. 0 17
      rtl/java/jmathh.inc
  10. 33 1
      rtl/java/system.pp

+ 1 - 1
.gitattributes

@@ -7363,7 +7363,7 @@ rtl/java/jdk15.inc svneol=native#text/plain
 rtl/java/jdk15.pas svneol=native#text/plain
 rtl/java/jdynarrh.inc svneol=native#text/plain
 rtl/java/jint64.inc svneol=native#text/plain
-rtl/java/jmathh.inc svneol=native#text/plain
+rtl/java/jmath.inc svneol=native#text/plain
 rtl/java/jpvar.inc svneol=native#text/plain
 rtl/java/jpvarh.inc svneol=native#text/plain
 rtl/java/jrec.inc svneol=native#text/plain

+ 0 - 13
compiler/jvm/njvminl.pas

@@ -51,29 +51,16 @@ interface
             so that the code generator will actually generate
             these nodes.
           }
-(*
-          function first_sqrt_real: tnode; override;
-          *)
           function first_sqr_real: tnode; override;
           function first_trunc_real: tnode; override;
-(*
-          function first_round_real: tnode; override;
-*)
           function first_new: tnode; override;
           function first_IncludeExclude: tnode; override;
           function first_setlength: tnode; override;
           function first_length: tnode; override;
 
           procedure second_length; override;
-(*
-          procedure second_sqrt_real; override;
-          procedure second_abs_real; override;
-*)
           procedure second_sqr_real; override;
           procedure second_trunc_real; override;
-(*
-          procedure second_round_real; override;
-*)
           procedure second_new; override;
           procedure second_setlength; override;
        protected

+ 0 - 2
rtl/java/compproc.inc

@@ -515,7 +515,6 @@ function fpc_shr_qword(value,shift : qword) : qword; compilerproc;
 function fpc_shl_int64(value,shift : int64) : int64; compilerproc;
 function fpc_shr_int64(value,shift : int64) : int64; compilerproc;
 {$endif  FPC_INCLUDE_SOFTWARE_SHIFT_INT64}
-(*
 {$ifndef FPUNONE}
 function fpc_abs_real(d : ValReal) : ValReal;compilerproc;
 function fpc_arctan_real(d : ValReal) : ValReal;compilerproc;{$ifdef MATHINLINE}inline;{$endif}
@@ -531,7 +530,6 @@ function fpc_sqrt_real(d : ValReal) : ValReal;compilerproc;
 function fpc_round_real(d : ValReal) : int64;compilerproc;
 function fpc_trunc_real(d : ValReal) : int64;compilerproc;
 {$endif}
-*)
 {$ifdef FPC_HAS_FEATURE_CLASSES}
 function fpc_do_is(aclass : tclass;aobject : tobject) : boolean; compilerproc;
 function fpc_do_as(aclass : tclass;aobject : tobject): tobject; compilerproc;

+ 62 - 0
rtl/java/java_sys.inc

@@ -44,6 +44,68 @@
     function iterator(): JUIterator; overload;
   end;
 
+  JLMath = class sealed external 'java.lang' name 'Math' (JLObject)
+  public
+    const
+      E = jdouble(2.718281828459045);
+      PI = jdouble(3.141592653589793);
+  public
+    class function sin(para1: jdouble): jdouble; static; overload;
+    class function cos(para1: jdouble): jdouble; static; overload;
+    class function tan(para1: jdouble): jdouble; static; overload;
+    class function asin(para1: jdouble): jdouble; static; overload;
+    class function acos(para1: jdouble): jdouble; static; overload;
+    class function atan(para1: jdouble): jdouble; static; overload;
+    class function toRadians(para1: jdouble): jdouble; static; overload;
+    class function toDegrees(para1: jdouble): jdouble; static; overload;
+    class function exp(para1: jdouble): jdouble; static; overload;
+    class function log(para1: jdouble): jdouble; static; overload;
+    class function log10(para1: jdouble): jdouble; static; overload;
+    class function sqrt(para1: jdouble): jdouble; static; overload;
+    class function cbrt(para1: jdouble): jdouble; static; overload;
+    class function IEEEremainder(para1: jdouble; para2: jdouble): jdouble; static; overload;
+    class function ceil(para1: jdouble): jdouble; static; overload;
+    class function floor(para1: jdouble): jdouble; static; overload;
+    class function rint(para1: jdouble): jdouble; static; overload;
+    class function atan2(para1: jdouble; para2: jdouble): jdouble; static; overload;
+    class function pow(para1: jdouble; para2: jdouble): jdouble; static; overload;
+    class function round(para1: jfloat): jint; static; overload;
+    class function round(para1: jdouble): jlong; static; overload;
+    class function random(): jdouble; static; overload;
+    class function abs(para1: jint): jint; static; overload;
+    class function abs(para1: jlong): jlong; static; overload;
+    class function abs(para1: jfloat): jfloat; static; overload;
+    class function abs(para1: jdouble): jdouble; static; overload;
+    class function max(para1: jint; para2: jint): jint; static; overload;
+    class function max(para1: jlong; para2: jlong): jlong; static; overload;
+    class function max(para1: jfloat; para2: jfloat): jfloat; static; overload;
+    class function max(para1: jdouble; para2: jdouble): jdouble; static; overload;
+    class function min(para1: jint; para2: jint): jint; static; overload;
+    class function min(para1: jlong; para2: jlong): jlong; static; overload;
+    class function min(para1: jfloat; para2: jfloat): jfloat; static; overload;
+    class function min(para1: jdouble; para2: jdouble): jdouble; static; overload;
+    class function ulp(para1: jdouble): jdouble; static; overload;
+    class function ulp(para1: jfloat): jfloat; static; overload;
+    class function signum(para1: jdouble): jdouble; static; overload;
+    class function signum(para1: jfloat): jfloat; static; overload;
+    class function sinh(para1: jdouble): jdouble; static; overload;
+    class function cosh(para1: jdouble): jdouble; static; overload;
+    class function tanh(para1: jdouble): jdouble; static; overload;
+    class function hypot(para1: jdouble; para2: jdouble): jdouble; static; overload;
+    class function expm1(para1: jdouble): jdouble; static; overload;
+    class function log1p(para1: jdouble): jdouble; static; overload;
+    class function copySign(para1: jdouble; para2: jdouble): jdouble; static; overload;
+    class function copySign(para1: jfloat; para2: jfloat): jfloat; static; overload;
+    class function getExponent(para1: jfloat): jint; static; overload;
+    class function getExponent(para1: jdouble): jint; static; overload;
+    class function nextAfter(para1: jdouble; para2: jdouble): jdouble; static; overload;
+    class function nextAfter(para1: jfloat; para2: jdouble): jfloat; static; overload;
+    class function nextUp(para1: jdouble): jdouble; static; overload;
+    class function nextUp(para1: jfloat): jfloat; static; overload;
+    class function scalb(para1: jdouble; para2: jint): jdouble; static; overload;
+    class function scalb(para1: jfloat; para2: jint): jfloat; static; overload;
+  end;
+
   JLSystem = class sealed external 'java.lang' name 'System' (JLObject)
   public
     final class var

+ 6 - 1
rtl/java/java_sysh.inc

@@ -1,4 +1,4 @@
-{ Imports for Java packages/classes: java.io.Serializable, java.lang.AbstractStringBuilder, java.lang.Appendable, java.lang.Boolean, java.lang.Byte, java.lang.CharSequence, java.lang.Character, java.lang.Class, java.lang.Cloneable, java.lang.Comparable, java.lang.Double, java.lang.Enum, java.lang.Error, java.lang.Exception, java.lang.Float, java.lang.IllegalArgumentException, java.lang.IndexOutOfBoundsException, java.lang.Integer, java.lang.Iterable, java.lang.LinkageError, java.lang.Long, java.lang.NoSuchMethodException, java.lang.Number, java.lang.Object, java.lang.RuntimeException, java.lang.Short, java.lang.String, java.lang.StringBuffer, java.lang.StringBuilder, java.lang.System, java.lang.Throwable, java.lang.reflect.AccessibleObject, java.lang.reflect.AnnotatedElement, java.lang.reflect.Array, java.lang.reflect.GenericDeclaration, java.lang.reflect.Member, java.lang.reflect.Method, java.lang.reflect.Type, java.text.Collator, java.util.AbstractCollection, java.util.AbstractMap, java.util.AbstractSet, java.util.Arrays, java.util.BitSet, java.util.Collection, java.util.Comparator, java.util.EnumSet, java.util.HashMap, java.util.Iterator, java.util.Map, java.util.Set }
+{ Imports for Java packages/classes: java.io.Serializable, java.lang.AbstractStringBuilder, java.lang.Appendable, java.lang.Boolean, java.lang.Byte, java.lang.CharSequence, java.lang.Character, java.lang.Class, java.lang.Cloneable, java.lang.Comparable, java.lang.Double, java.lang.Enum, java.lang.Error, java.lang.Exception, java.lang.Float, java.lang.IllegalArgumentException, java.lang.IndexOutOfBoundsException, java.lang.Integer, java.lang.Iterable, java.lang.LinkageError, java.lang.Long, java.lang.Math, java.lang.NoSuchMethodException, java.lang.Number, java.lang.Object, java.lang.RuntimeException, java.lang.Short, java.lang.String, java.lang.StringBuffer, java.lang.StringBuilder, java.lang.System, java.lang.Throwable, java.lang.reflect.AccessibleObject, java.lang.reflect.AnnotatedElement, java.lang.reflect.Array, java.lang.reflect.GenericDeclaration, java.lang.reflect.Member, java.lang.reflect.Method, java.lang.reflect.Type, java.text.Collator, java.util.AbstractCollection, java.util.AbstractMap, java.util.AbstractSet, java.util.Arrays, java.util.BitSet, java.util.Collection, java.util.Comparator, java.util.EnumSet, java.util.HashMap, java.util.Iterator, java.util.Map, java.util.Set }
 type
   JLNoSuchMethodException = class;
   Arr1JLNoSuchMethodException = array of JLNoSuchMethodException;
@@ -65,6 +65,11 @@ type
   Arr2JLLong = array of Arr1JLLong;
   Arr3JLLong = array of Arr2JLLong;
 
+  JLMath = class;
+  Arr1JLMath = array of JLMath;
+  Arr2JLMath = array of Arr1JLMath;
+  Arr3JLMath = array of Arr2JLMath;
+
   JLShort = class;
   Arr1JLShort = array of JLShort;
   Arr2JLShort = array of Arr1JLShort;

+ 6 - 62
rtl/java/jdk15.inc

@@ -1849,68 +1849,6 @@
 
   end;
 
-  JLMath = class sealed external 'java.lang' name 'Math' (JLObject)
-  public
-    const
-      E = jdouble(2.718281828459045);
-      PI = jdouble(3.141592653589793);
-  public
-    class function sin(para1: jdouble): jdouble; static; overload;
-    class function cos(para1: jdouble): jdouble; static; overload;
-    class function tan(para1: jdouble): jdouble; static; overload;
-    class function asin(para1: jdouble): jdouble; static; overload;
-    class function acos(para1: jdouble): jdouble; static; overload;
-    class function atan(para1: jdouble): jdouble; static; overload;
-    class function toRadians(para1: jdouble): jdouble; static; overload;
-    class function toDegrees(para1: jdouble): jdouble; static; overload;
-    class function exp(para1: jdouble): jdouble; static; overload;
-    class function log(para1: jdouble): jdouble; static; overload;
-    class function log10(para1: jdouble): jdouble; static; overload;
-    class function sqrt(para1: jdouble): jdouble; static; overload;
-    class function cbrt(para1: jdouble): jdouble; static; overload;
-    class function IEEEremainder(para1: jdouble; para2: jdouble): jdouble; static; overload;
-    class function ceil(para1: jdouble): jdouble; static; overload;
-    class function floor(para1: jdouble): jdouble; static; overload;
-    class function rint(para1: jdouble): jdouble; static; overload;
-    class function atan2(para1: jdouble; para2: jdouble): jdouble; static; overload;
-    class function pow(para1: jdouble; para2: jdouble): jdouble; static; overload;
-    class function round(para1: jfloat): jint; static; overload;
-    class function round(para1: jdouble): jlong; static; overload;
-    class function random(): jdouble; static; overload;
-    class function abs(para1: jint): jint; static; overload;
-    class function abs(para1: jlong): jlong; static; overload;
-    class function abs(para1: jfloat): jfloat; static; overload;
-    class function abs(para1: jdouble): jdouble; static; overload;
-    class function max(para1: jint; para2: jint): jint; static; overload;
-    class function max(para1: jlong; para2: jlong): jlong; static; overload;
-    class function max(para1: jfloat; para2: jfloat): jfloat; static; overload;
-    class function max(para1: jdouble; para2: jdouble): jdouble; static; overload;
-    class function min(para1: jint; para2: jint): jint; static; overload;
-    class function min(para1: jlong; para2: jlong): jlong; static; overload;
-    class function min(para1: jfloat; para2: jfloat): jfloat; static; overload;
-    class function min(para1: jdouble; para2: jdouble): jdouble; static; overload;
-    class function ulp(para1: jdouble): jdouble; static; overload;
-    class function ulp(para1: jfloat): jfloat; static; overload;
-    class function signum(para1: jdouble): jdouble; static; overload;
-    class function signum(para1: jfloat): jfloat; static; overload;
-    class function sinh(para1: jdouble): jdouble; static; overload;
-    class function cosh(para1: jdouble): jdouble; static; overload;
-    class function tanh(para1: jdouble): jdouble; static; overload;
-    class function hypot(para1: jdouble; para2: jdouble): jdouble; static; overload;
-    class function expm1(para1: jdouble): jdouble; static; overload;
-    class function log1p(para1: jdouble): jdouble; static; overload;
-    class function copySign(para1: jdouble; para2: jdouble): jdouble; static; overload;
-    class function copySign(para1: jfloat; para2: jfloat): jfloat; static; overload;
-    class function getExponent(para1: jfloat): jint; static; overload;
-    class function getExponent(para1: jdouble): jint; static; overload;
-    class function nextAfter(para1: jdouble; para2: jdouble): jdouble; static; overload;
-    class function nextAfter(para1: jfloat; para2: jdouble): jfloat; static; overload;
-    class function nextUp(para1: jdouble): jdouble; static; overload;
-    class function nextUp(para1: jfloat): jfloat; static; overload;
-    class function scalb(para1: jdouble; para2: jint): jdouble; static; overload;
-    class function scalb(para1: jfloat; para2: jint): jfloat; static; overload;
-  end;
-
   JLProcess = class abstract external 'java.lang' name 'Process' (JLObject)
   public
     constructor create(); overload;
@@ -16189,6 +16127,12 @@
     constructor create(para1: JLString); overload;
   end;
 
+  JLNoSuchMethodException = class external 'java.lang' name 'NoSuchMethodException' (JLException)
+  public
+    constructor create(); overload;
+    constructor create(para1: JLString); overload;
+  end;
+
   JLIIllegalClassFormatException = class external 'java.lang.instrument' name 'IllegalClassFormatException' (JLException)
   public
     constructor create(); overload;

+ 5 - 5
rtl/java/jdk15.pas

@@ -1025,11 +1025,6 @@ type
   Arr2JSJSplitPane = array of Arr1JSJSplitPane;
   Arr3JSJSplitPane = array of Arr2JSJSplitPane;
 
-  JLMath = class;
-  Arr1JLMath = array of JLMath;
-  Arr2JLMath = array of Arr1JLMath;
-  Arr3JLMath = array of Arr2JLMath;
-
   JXWHolder = class;
   Arr1JXWHolder = array of JXWHolder;
   Arr2JXWHolder = array of Arr1JXWHolder;
@@ -7380,6 +7375,11 @@ type
   Arr2JSRSSerialRef = array of Arr1JSRSSerialRef;
   Arr3JSRSSerialRef = array of Arr2JSRSSerialRef;
 
+  JLNoSuchMethodException = class;
+  Arr1JLNoSuchMethodException = array of JLNoSuchMethodException;
+  Arr2JLNoSuchMethodException = array of Arr1JLNoSuchMethodException;
+  Arr3JLNoSuchMethodException = array of Arr2JLNoSuchMethodException;
+
   JSDefaultListModel = class;
   Arr1JSDefaultListModel = array of JSDefaultListModel;
   Arr2JSDefaultListModel = array of Arr1JSDefaultListModel;

+ 114 - 0
rtl/java/jmath.inc

@@ -0,0 +1,114 @@
+{
+    This file is part of the Free Pascal run time library.
+    Copyright (c) 2011 by Jonas Maebe,
+    members of the Free Pascal development team.
+
+    This file implements Java math routines
+
+    See the file COPYING.FPC, included in this distribution,
+    for details about the copyright.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+ **********************************************************************}
+
+{$define FPC_SYSTEM_HAS_ARCTAN}
+function fpc_arctan_real(d : ValReal) : ValReal;compilerproc;{$ifdef MATHINLINE}inline;{$endif}
+  begin
+    result:=JLMath.atan(d);
+  end;
+
+
+{$define FPC_SYSTEM_HAS_COS}
+function fpc_cos_real(d : ValReal) : ValReal;compilerproc;{$ifdef MATHINLINE}inline;{$endif}
+  begin
+    result:=JLMath.cos(d);
+  end;
+
+
+{$define FPC_SYSTEM_HAS_EXP}
+function fpc_exp_real(d : ValReal) : ValReal;compilerproc;{$ifdef MATHINLINE}inline;{$endif}
+  begin
+    result:=JLMath.exp(d);
+  end;
+
+
+{$define FPC_SYSTEM_HAS_INT}
+function fpc_int_real(d : ValReal) : ValReal;compilerproc;{$ifdef MATHINLINE}inline;{$endif}
+  begin
+    if d>=0 then
+      result:=JLMath.floor(d)
+    else
+      result:=JLMath.ceil(d);
+  end;
+
+
+{$define FPC_SYSTEM_HAS_LN}
+function fpc_ln_real(d : ValReal) : ValReal;compilerproc;{$ifdef MATHINLINE}inline;{$endif}
+  begin
+    result:=JLMath.log(d);
+  end;
+
+
+{$define FPC_SYSTEM_HAS_SIN}
+function fpc_sin_real(d : ValReal) : ValReal;compilerproc;{$ifdef MATHINLINE}inline;{$endif}
+  begin
+    result:=JLMath.sin(d);
+  end;
+
+{$define FPC_SYSTEM_HAS_SQR}
+{ handled in the code generator }
+function fpc_sqr_real(d : ValReal) : ValReal;compilerproc;{$ifdef MATHINLINE}inline;{$endif}
+  begin
+    HandleError(219);
+  end;
+
+
+{$define FPC_SYSTEM_HAS_SQRT}
+function fpc_sqrt_real(d : ValReal) : ValReal;compilerproc;
+  begin
+    result:=JLMath.sqrt(d);
+  end;
+
+{$define FPC_SYSTEM_HAS_TRUNC}
+{ handled in the code generator }
+function fpc_trunc_real(d : ValReal) : int64;compilerproc;
+  begin
+    HandleError(219);
+  end;
+
+
+{$define FPC_SYSTEM_HAS_REAL2DOUBLE}
+function real2double(r : real48) : double;
+  var
+     res : jlong;
+     exponent : word;
+  begin
+     { check for zero }
+     if r[0]=0 then
+       begin
+         real2double:=0.0;
+         exit;
+       end;
+
+     { copy mantissa }
+     res:=(r[1] shl 5) shl 8;
+     res:=res or (((r[1] shr 3) or (r[2] shl 5)) shl 16);
+     res:=res or (((r[2] shr 3) or (r[3] shl 5)) shl 24);
+     res:=res or (((r[3] shr 3) or (r[4] shl 5)) shl 32);
+     res:=res or (((r[4] shr 3) or (r[5] and $7f) shl 5) shl 40);
+     res:=res or (((r[5] and $7f) shr 3) shl 48);
+
+     { copy exponent }
+     { correct exponent: }
+     exponent:=(word(r[0])+(1023-129));
+     res:=res or (((exponent and $f) shl 4) shl 48);
+     res:=res or ((exponent shr 4) shl 56);
+
+     { set sign }
+     res:=res or (r[5] and $80) shl 56;
+     real2double:=JLDouble.longBitsToDouble(res);
+  end;
+

+ 0 - 17
rtl/java/jmathh.inc

@@ -1,17 +0,0 @@
-{
-    This file is part of the Free Pascal run time library.
-    Copyright (c) 2011 by Jonas Maebe
-    member of the Free Pascal development team
-
-    See the file COPYING.FPC, included in this distribution,
-    for details about the copyright.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-
- **********************************************************************}
-
-function sqr(d : ValReal) : ValReal;[internproc:fpc_in_sqr_real];
-function trunc(d : ValReal) : int64;[internproc:fpc_in_trunc_real];
-

+ 33 - 1
rtl/java/system.pp

@@ -50,7 +50,12 @@ Type
   PtrInt   = Longint;
   PtrUInt  = Longint;
 
+  {$define DEFAULT_DOUBLE}
+  {$define SUPPORT_SINGLE}
+  {$define SUPPORT_DOUBLE}
+
   ValReal = Double;
+  Real = type Double;
 
   AnsiChar    = Char;
   UnicodeChar = WideChar;
@@ -127,13 +132,13 @@ type
   end;
 
 {$i innr.inc}
-{$i jmathh.inc}
 {$i jrech.inc}
 {$i jseth.inc}
 {$i sstringh.inc}
 {$i jpvarh.inc}
 {$i jdynarrh.inc}
 {$i astringh.inc}
+{$i mathh.inc}
 
 
 {$ifndef nounsupported}
@@ -280,6 +285,8 @@ function min(a,b : longint) : longint;
   end;
 
 
+Procedure HandleError (Errno : longint); forward;
+
 {$i sstrings.inc}
 {$i astrings.inc}
 {$i ustrings.inc}
@@ -288,6 +295,8 @@ function min(a,b : longint) : longint;
 {$i jset.inc}
 {$i jint64.inc}
 {$i jpvar.inc}
+{$i jmath.inc}
+{$i genmath.inc}
 
 { copying helpers }
 
@@ -654,6 +663,29 @@ function fpc_dynarray_copy(src: JLObject; start, len: longint; ndim: longint; el
 
 {i jdynarr.inc end}
 
+{*****************************************************************************
+                       Things from system.inc
+*****************************************************************************}
+
+Procedure HandleError (Errno : longint);[public,alias : 'FPC_HANDLEERROR'];
+{
+  Procedure to handle internal errors, i.e. not user-invoked errors
+  Internal function should ALWAYS call HandleError instead of RunError.
+
+  For now this one cannot be intercepted in Java and always simply raise an
+  exception.
+}
+begin
+  raise JLException.Create('Runtime error '+UnicodeString(JLInteger.valueOf(Errno).toString));
+end;
+
+{$ifdef SUPPORT_DOUBLE}
+operator := (b:real48) d:double;{$ifdef SYSTEMINLINE}inline;{$endif}
+begin
+ D:=real2double(b);
+end;
+{$endif SUPPORT_DOUBLE}
+
 
 
 {*****************************************************************************