diff options
author | tromey <tromey@138bc75d-0d04-0410-961f-82ee72b054a4> | 2002-02-08 20:00:40 +0000 |
---|---|---|
committer | tromey <tromey@138bc75d-0d04-0410-961f-82ee72b054a4> | 2002-02-08 20:00:40 +0000 |
commit | 7fc4b007c77ef5865871a3cf9e20ccf121028be1 (patch) | |
tree | 68980faa9a6e4cf34d64664961a7a86bd989bd2b /libjava/interpret.cc | |
parent | 668e259a0d354c73a023589ed88bfea371a908df (diff) | |
download | gcc-7fc4b007c77ef5865871a3cf9e20ccf121028be1.tar.gz |
* 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.cc | 41 |
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: |