src/JavaClass.st
branchjk_new_structure
changeset 1794 62fa0da29e54
parent 1793 6537437f04a7
child 1795 11b68a35cfe5
--- a/src/JavaClass.st	Fri Nov 02 21:30:25 2012 +0000
+++ b/src/JavaClass.st	Fri Nov 02 21:55:57 2012 +0000
@@ -1535,22 +1535,28 @@
     
     | newJavaObject  
       sz            "{ Class: SmallInteger }" 
-      finalizeM |
+      offs          "{ Class: SmallInteger }"
+    |
 
     (accessFlags bitAnd: ACX_ABSTRACT_OR_INTERFACE) ~~ 0 ifTrue: [ 
         JavaVM throwInstantiationExceptionFor: self.
         ^ nil 
     ].            
     newJavaObject := super basicNew.
-    initValues notNil ifTrue: [ sz := self instSize.
-        1 to: sz do: [:i | newJavaObject instVarAt: i put: (initValues at: i) ].
+    offs := JavaObject instSize.
+    offs > 0 ifTrue:[
+        "Assume first is lockword"
+        newJavaObject instVarAt: 1 put: 0.
     ].
-    JavaVM finalizationEnabled ifTrue:[
-        finalizeM := self lookupMethodFor: #'finalize()V'.
-        finalizeM byteCode = #[177] "See Object#finalize()" ifFalse:[
-            newJavaObject registerForFinalization.
-        ].
+    initValues notNil ifTrue: [ 
+        sz := self instSize.
+        offs to: sz do: [:i | newJavaObject instVarAt: i put: (initValues at: i - offs) ].
     ].
+    self hasFinalize ifTrue:[
+        newJavaObject registerForFinalization
+    ].
+
+
     ^ newJavaObject
 
     "
@@ -1933,7 +1939,7 @@
 !
 
 setFields:f
-    |vals|
+    | nignored nvals vals names |
 
     JavaClass setInstanceVariableStringFromFields:f in:self.
 
@@ -1945,23 +1951,25 @@
         field setIndex: superclass instSize + index.
     ].
 
-    vals := self allInstVarNames
-                collect:[:nm |
-                            self initValueFor:nm
-                        ].
-    vals isEmpty ifTrue:[
-        initValues := nil
-    ] ifFalse:[
-        (vals detect:[:el | el notNil] ifNone:nil) isNil ifTrue:[
-            initValues := nil
-        ] ifFalse:[
-            initValues := vals asArray
-        ]
+    "Now, collect initValues. Ignore the lockword, if any"
+    nignored := JavaObject instSize. "/except possible instvars in JavaObject (lockword)
+    nvals := self instSize - nignored. 
+    nvals > 0 ifTrue:[
+        vals := Array new: nvals.
+        names := self allInstVarNames.
+        JavaObject instSize + 1 to: names size do:[:i|
+            | val |
+            val := self initValueFor: (names at: i).
+            val notNil ifTrue:[
+                vals at: i - nignored put: val.
+                initValues := vals.
+            ]
+        ].
     ]
 
     "Created: / 15-04-1996 / 16:42:52 / cg"
     "Modified: / 06-11-1998 / 01:53:01 / cg"
-    "Modified: / 27-07-2011 / 09:26:43 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 02-11-2012 / 21:49:16 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 setFullName:aString
@@ -2077,6 +2085,12 @@
     "Created: / 02-03-2011 / 23:01:14 / Marcel Hlopko <hlopik@gmail.com>"
 !
 
+hasFinalize
+    ^ (accessFlags bitAnd:ACX_HASFINALIZE) ~~ 0
+
+    "Created: / 02-11-2012 / 18:50:26 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
 hasInterface:aJavaInterface
     "return true, if I respond to all methods as
      required by the argument, an aJavaInterface"