This is the mail archive of the java-patches@gcc.gnu.org mailing list for the Java project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Patch: FYI: interpreter bug fix


I'm checking this in.

This fixes the bug with real->integral conversion operators in the
interpreter.

Tom

Index: ChangeLog
from  Tom Tromey  <tromey@redhat.com>

	* interpret.cc (convert): New function.
	(continue1) [insn_d2i, insn_d2l, insn_f2i, insn_f2l]: Use
	convert.
	Include Long.h.

Index: interpret.cc
===================================================================
RCS file: /cvs/gcc/gcc/libjava/interpret.cc,v
retrieving revision 1.29
diff -u -r1.29 interpret.cc
--- interpret.cc 2002/01/12 00:19:05 1.29
+++ interpret.cc 2002/02/08 19:45:05
@@ -21,6 +21,7 @@
 #include <java/lang/System.h>
 #include <java/lang/String.h>
 #include <java/lang/Integer.h>
+#include <java/lang/Long.h>
 #include <java/lang/StringBuffer.h>
 #include <java/lang/Class.h>
 #include <java/lang/reflect/Modifier.h>
@@ -67,6 +68,22 @@
   
 };
 
+// Used to convert from floating types to integral types.
+template<typename TO, typename FROM>
+static inline TO
+convert (FROM val, TO min, TO max)
+{
+  TO ret;
+  if (val >= (FROM) max)
+    ret = max;
+  else if (val <= (FROM) min)
+    ret = min;
+  else if (val != val)
+    ret = 0;
+  else
+    ret = (TO) val;
+  return ret;
+}
 
 #define PUSHA(V)  (sp++)->o = (V)
 #define PUSHI(V)  (sp++)->i = (V)
@@ -1534,11 +1551,19 @@
       NEXT_INSN;
 
      insn_f2i:
-      { jint value = (jint)POPF (); PUSHI(value); }
+      {
+	using namespace java::lang;
+	jint value = convert (POPF (), Integer::MIN_VALUE, Integer::MAX_VALUE);
+	PUSHI(value);
+      }
       NEXT_INSN;
 
      insn_f2l:
-      { jlong value = (jlong)POPF (); PUSHL(value); }
+      {
+	using namespace java::lang;
+	jlong value = convert (POPF (), Long::MIN_VALUE, Long::MAX_VALUE);
+	PUSHI(value);
+      }
       NEXT_INSN;
 
      insn_f2d:
@@ -1546,11 +1571,19 @@
       NEXT_INSN;
 
      insn_d2i:
-      { jint value = (jint)POPD (); PUSHI(value); }
+      {
+	using namespace java::lang;
+	jint value = convert (POPD (), Integer::MIN_VALUE, Integer::MAX_VALUE);
+	PUSHI(value);
+      }
       NEXT_INSN;
 
      insn_d2l:
-      { jlong value = (jlong)POPD (); PUSHL(value); }
+      {
+	using namespace java::lang;
+	jlong value = convert (POPD (), Long::MIN_VALUE, Long::MAX_VALUE);
+	PUSHL(value);
+      }
       NEXT_INSN;
 
      insn_d2f:


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]