--- a/JavaVM.st Sun Dec 16 21:05:45 2012 +0100
+++ b/JavaVM.st Sun Dec 16 23:29:06 2012 +0100
@@ -7566,31 +7566,73 @@
* @since 1.3
*/
"
- | f |
+ | f b |
f := aJavaContext argAt:1.
- f class == Float ifFalse:[ ^self throwIllegalArgumentException: 'Not a float'].
-%{
- __int64__ *i = &(__floatVal(f));
- RETURN (__MKINT64( i ));
-%}.
- self primitiveFailed.
+ (f = 0.0) ifTrue:[^0].
+ (f = -0.0) ifTrue:[^(1 bitShift: 63)].
+
+ b := ByteArray streamContents:[:s|Float storeBinaryIEEEDouble:f on:s].
+ ^ LargeInteger digitBytes: b MSB: UninterpretedBytes isBigEndian not.
+
+
+"/ | f |
+"/ f := aJavaContext argAt:1.
+"/ f class == Float ifFalse:[ ^self throwIllegalArgumentException: 'Not a float'].
+"/%{
+"/ __int64__ *i = &(__floatVal(f));
+"/ RETURN (__MKINT64( i ));
+"/%}.
+"/ self primitiveFailed.
"Created: / 10-11-2010 / 14:48:46 / Jan Vrany <jan.vrany@fit.cvut.cz>"
- "Modified: / 15-12-2012 / 14:40:43 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+ "Modified: / 16-12-2012 / 23:23:14 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
_java_lang_Double_longBitsToDouble: nativeContext
<javanative: 'java/lang/Double' name: 'longBitsToDouble'>
- | i f|
+ |i aFloat|
i := nativeContext argAt:1.
- f := Float new.
-%{
- __floatVal(f) = (double)(__longIntVal(i));
-%}.
- ^f
+
+ aFloat := Float new.
+ UninterpretedBytes isBigEndian ifTrue:[
+ aFloat basicAt:1 put:((i bitShift:-56) bitAnd:16rFF).
+ aFloat basicAt:2 put:((i bitShift:-48) bitAnd:16rFF).
+ aFloat basicAt:3 put:((i bitShift:-40) bitAnd:16rFF).
+ aFloat basicAt:4 put:((i bitShift:-32) bitAnd:16rFF).
+ aFloat basicAt:5 put:((i bitShift:-24) bitAnd:16rFF).
+ aFloat basicAt:6 put:((i bitShift:-16) bitAnd:16rFF).
+ aFloat basicAt:7 put:((i bitShift:-8) bitAnd:16rFF).
+ aFloat basicAt:8 put:(i bitAnd:16rFF).
+ ] ifFalse:[
+ aFloat basicAt:1 put:(i bitAnd:16rFF).
+ aFloat basicAt:2 put:((i bitShift:-8) bitAnd:16rFF).
+ aFloat basicAt:3 put:((i bitShift:-16) bitAnd:16rFF).
+ aFloat basicAt:4 put:((i bitShift:-24) bitAnd:16rFF).
+ aFloat basicAt:5 put:((i bitShift:-32) bitAnd:16rFF).
+ aFloat basicAt:6 put:((i bitShift:-40) bitAnd:16rFF).
+ aFloat basicAt:7 put:((i bitShift:-48) bitAnd:16rFF).
+ aFloat basicAt:8 put:((i bitShift:-56) bitAnd:16rFF).
+ ].
+
+ ^ aFloat.
+
+
+"/ | i f|
+"/
+"/ i := nativeContext argAt:1.
+"/ f := Float new.
+"/%{
+"/ long long l;
+"/ l = __longIntVal(i);
+"/ double *d = &l;
+"/ __floatVal(f) = *d;
+"/%}.
+"/ ^f
+
+ "Modified: / 16-12-2012 / 23:24:07 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
_java_lang_Float_floatToRawIntBits: aJavaContext
@@ -10468,55 +10510,6 @@
"Modified: / 27.1.2000 / 02:53:55 / cg"
!
-_Double_doubleToLongBits:nativeContext
- |f i|
-
- f := nativeContext argAt:1.
-
- UninterpretedBytes isBigEndian ifTrue:[
- i := f basicAt:8.
- i := i bitOr:((f basicAt:7) bitShift:8).
- i := i bitOr:((f basicAt:6) bitShift:16).
- i := i bitOr:((f basicAt:5) bitShift:24).
- i := i bitOr:((f basicAt:4) bitShift:32).
- i := i bitOr:((f basicAt:3) bitShift:40).
- i := i bitOr:((f basicAt:2) bitShift:48).
- i := i bitOr:((f basicAt:1) bitShift:56).
- ] ifFalse:[
- i := f basicAt:1.
- i := i bitOr:((f basicAt:2) bitShift:8).
- i := i bitOr:((f basicAt:3) bitShift:16).
- i := i bitOr:((f basicAt:4) bitShift:24).
- i := i bitOr:((f basicAt:5) bitShift:32).
- i := i bitOr:((f basicAt:6) bitShift:40).
- i := i bitOr:((f basicAt:7) bitShift:48).
- i := i bitOr:((f basicAt:8) bitShift:56).
- ].
-
- ^ i.
-
- "Created: / 4.1.1998 / 01:39:12 / cg"
-!
-
-_Double_valueOf0:nativeContext
- |s d|
-
- s := nativeContext argAt:1.
- s notNil ifTrue:[
- s := Java as_ST_String:s.
- d := Float readFrom:s onError:nil.
- ].
- d isNil ifTrue:[
- self throwNumberFormatException.
- "/ not reached
- ].
-
- ^ d
-
- "Modified: / 8.8.1997 / 12:03:55 / cg"
- "Created: / 7.1.1998 / 11:09:43 / cg"
-!
-
_Field_get:nativeContext
"/ java.lang.Object get (java.lang.Object)