JavaVM.st
branchdevelopment
changeset 1902 7edd54d4c29a
parent 1885 32d39c55b8b0
child 1926 32f3cef32ca5
--- 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)