summaryrefslogtreecommitdiffstats
path: root/libjava/interpret.cc
diff options
context:
space:
mode:
authortromey <tromey@138bc75d-0d04-0410-961f-82ee72b054a4>2002-02-08 20:00:40 +0000
committertromey <tromey@138bc75d-0d04-0410-961f-82ee72b054a4>2002-02-08 20:00:40 +0000
commit7fc4b007c77ef5865871a3cf9e20ccf121028be1 (patch)
tree68980faa9a6e4cf34d64664961a7a86bd989bd2b /libjava/interpret.cc
parent668e259a0d354c73a023589ed88bfea371a908df (diff)
downloadppe42-gcc-7fc4b007c77ef5865871a3cf9e20ccf121028be1.tar.gz
ppe42-gcc-7fc4b007c77ef5865871a3cf9e20ccf121028be1.zip
* interpret.cc (convert): New function.
(continue1) [insn_d2i, insn_d2l, insn_f2i, insn_f2l]: Use convert. Include Long.h. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@49621 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libjava/interpret.cc')
-rw-r--r--libjava/interpret.cc41
1 files changed, 37 insertions, 4 deletions
diff --git a/libjava/interpret.cc b/libjava/interpret.cc
index 7a847c5c363..6f93bc69994 100644
--- a/libjava/interpret.cc
+++ b/libjava/interpret.cc
@@ -21,6 +21,7 @@ details. */
#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 @@ static inline void dupx (_Jv_word *sp, int n, int x)
};
+// 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 @@ void _Jv_InterpMethod::continue1 (_Jv_InterpMethodInvocation *inv)
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 @@ void _Jv_InterpMethod::continue1 (_Jv_InterpMethodInvocation *inv)
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:
OpenPOWER on IntegriCloud