瀏覽代碼

* changed TObject from an alias for JLObject into a derived class from
JLObject with the method "Free" and a virtual destructor "Destroy"
(and Free is automatically called from the "finalize" method,
which in turn is called by the JVM when the instance is collected;
note that there is no final collection before the JVM shuts down,
so it may never be called if you don't call Free explicitly yourself)
* if you don't specify an explicit ancestor for a Java class, set
the parent to TObject instead of to JLObject (for better compatibility
with regular Pascal code)

git-svn-id: branches/jvmbackend@18466 -

Jonas Maebe 14 年之前
父節點
當前提交
03af03e696
共有 3 個文件被更改,包括 53 次插入23 次删除
  1. 4 1
      compiler/pdecobj.pas
  2. 1 1
      compiler/symdef.pas
  3. 48 21
      rtl/java/system.pp

+ 4 - 1
compiler/pdecobj.pas

@@ -627,8 +627,9 @@ implementation
               odt_objcclass:
                 CGMessage(parser_h_no_objc_parent);
               odt_javaclass:
+                { inherit from TObject by default for compatibility }
                 if current_objectdef<>java_jlobject then
-                  childof:=java_jlobject;
+                  childof:=class_tobject;
             end;
           end;
 
@@ -1284,6 +1285,8 @@ implementation
                       class_tobject:=current_objectdef;
                   odt_javaclass:
                     begin
+                      if (current_structdef.objname^='TOBJECT') then
+                        class_tobject:=current_objectdef;
                       if (current_objectdef.objname^='JLOBJECT') then
                         java_jlobject:=current_objectdef;
                       if (current_objectdef.objname^='JLTHROWABLE') then

+ 1 - 1
compiler/symdef.pas

@@ -4680,7 +4680,7 @@ implementation
          { the last TOBJECT which is loaded gets }
          { it !                                  }
          if (childof=nil) and
-            (objecttype=odt_class) and
+            (objecttype in [odt_class,odt_javaclass]) and
             (objname^='TOBJECT') then
            class_tobject:=self;
          if (childof=nil) and

+ 48 - 21
rtl/java/system.pp

@@ -93,7 +93,14 @@ const
 {$i java_sys.inc}
 
 type
-  TObject = JLObject;
+  TObject = class(JLObject)
+   strict private
+    DestructorCalled: Boolean;
+   public
+    procedure Free;
+    destructor Destroy; virtual;
+    procedure finalize; override;
+  end;
 
 {$i innr.inc}
 {$i jmathh.inc}
@@ -366,65 +373,65 @@ function fpc_setlength_dynarr_multidim(aorg, anew: TJObjectArray; deepcopy: bool
           FPCJDynArrTypeJByte:
             begin
               for i:=low(result) to partdone do
-                result[i]:=TObject(fpc_setlength_dynarr_jbyte(TJByteArray(aorg[i]),TJByteArray(anew[i]),deepcopy));
+                result[i]:=JLObject(fpc_setlength_dynarr_jbyte(TJByteArray(aorg[i]),TJByteArray(anew[i]),deepcopy));
               for i:=succ(partdone) to high(result) do
-                result[i]:=TObject(fpc_setlength_dynarr_jbyte(nil,TJByteArray(anew[i]),deepcopy));
+                result[i]:=JLObject(fpc_setlength_dynarr_jbyte(nil,TJByteArray(anew[i]),deepcopy));
             end;
           FPCJDynArrTypeJShort:
             begin
               for i:=low(result) to partdone do
-                result[i]:=TObject(fpc_setlength_dynarr_jshort(TJShortArray(aorg[i]),TJShortArray(anew[i]),deepcopy));
+                result[i]:=JLObject(fpc_setlength_dynarr_jshort(TJShortArray(aorg[i]),TJShortArray(anew[i]),deepcopy));
               for i:=succ(partdone) to high(result) do
-                result[i]:=TObject(fpc_setlength_dynarr_jshort(nil,TJShortArray(anew[i]),deepcopy));
+                result[i]:=JLObject(fpc_setlength_dynarr_jshort(nil,TJShortArray(anew[i]),deepcopy));
             end;
           FPCJDynArrTypeJInt:
             begin
               for i:=low(result) to partdone do
-                result[i]:=TObject(fpc_setlength_dynarr_jint(TJIntArray(aorg[i]),TJIntArray(anew[i]),deepcopy));
+                result[i]:=JLObject(fpc_setlength_dynarr_jint(TJIntArray(aorg[i]),TJIntArray(anew[i]),deepcopy));
               for i:=succ(partdone) to high(result) do
-                result[i]:=TObject(fpc_setlength_dynarr_jint(nil,TJIntArray(anew[i]),deepcopy));
+                result[i]:=JLObject(fpc_setlength_dynarr_jint(nil,TJIntArray(anew[i]),deepcopy));
             end;
           FPCJDynArrTypeJLong:
             begin
               for i:=low(result) to partdone do
-                result[i]:=TObject(fpc_setlength_dynarr_jlong(TJLongArray(aorg[i]),TJLongArray(anew[i]),deepcopy));
+                result[i]:=JLObject(fpc_setlength_dynarr_jlong(TJLongArray(aorg[i]),TJLongArray(anew[i]),deepcopy));
               for i:=succ(partdone) to high(result) do
-                result[i]:=TObject(fpc_setlength_dynarr_jlong(nil,TJLongArray(anew[i]),deepcopy));
+                result[i]:=JLObject(fpc_setlength_dynarr_jlong(nil,TJLongArray(anew[i]),deepcopy));
             end;
           FPCJDynArrTypeJChar:
             begin
               for i:=low(result) to partdone do
-                result[i]:=TObject(fpc_setlength_dynarr_jchar(TJCharArray(aorg[i]),TJCharArray(anew[i]),deepcopy));
+                result[i]:=JLObject(fpc_setlength_dynarr_jchar(TJCharArray(aorg[i]),TJCharArray(anew[i]),deepcopy));
               for i:=succ(partdone) to high(result) do
-                result[i]:=TObject(fpc_setlength_dynarr_jchar(nil,TJCharArray(anew[i]),deepcopy));
+                result[i]:=JLObject(fpc_setlength_dynarr_jchar(nil,TJCharArray(anew[i]),deepcopy));
             end;
           FPCJDynArrTypeJFloat:
             begin
               for i:=low(result) to partdone do
-                result[i]:=TObject(fpc_setlength_dynarr_jfloat(TJFloatArray(aorg[i]),TJFloatArray(anew[i]),deepcopy));
+                result[i]:=JLObject(fpc_setlength_dynarr_jfloat(TJFloatArray(aorg[i]),TJFloatArray(anew[i]),deepcopy));
               for i:=succ(partdone) to high(result) do
-                result[i]:=TObject(fpc_setlength_dynarr_jfloat(nil,TJFloatArray(anew[i]),deepcopy));
+                result[i]:=JLObject(fpc_setlength_dynarr_jfloat(nil,TJFloatArray(anew[i]),deepcopy));
             end;
           FPCJDynArrTypeJDouble:
             begin
               for i:=low(result) to partdone do
-                result[i]:=TObject(fpc_setlength_dynarr_jdouble(TJDoubleArray(aorg[i]),TJDoubleArray(anew[i]),deepcopy));
+                result[i]:=JLObject(fpc_setlength_dynarr_jdouble(TJDoubleArray(aorg[i]),TJDoubleArray(anew[i]),deepcopy));
               for i:=succ(partdone) to high(result) do
-                result[i]:=TObject(fpc_setlength_dynarr_jdouble(nil,TJDoubleArray(anew[i]),deepcopy));
+                result[i]:=JLObject(fpc_setlength_dynarr_jdouble(nil,TJDoubleArray(anew[i]),deepcopy));
             end;
           FPCJDynArrTypeJObject:
             begin
               for i:=low(result) to partdone do
-                result[i]:=TObject(fpc_setlength_dynarr_jobject(TJObjectArray(aorg[i]),TJObjectArray(anew[i]),deepcopy,true));
+                result[i]:=JLObject(fpc_setlength_dynarr_jobject(TJObjectArray(aorg[i]),TJObjectArray(anew[i]),deepcopy,true));
               for i:=succ(partdone) to high(result) do
-                result[i]:=TObject(fpc_setlength_dynarr_jobject(nil,TJObjectArray(anew[i]),deepcopy,true));
+                result[i]:=JLObject(fpc_setlength_dynarr_jobject(nil,TJObjectArray(anew[i]),deepcopy,true));
             end;
           FPCJDynArrTypeRecord:
             begin
               for i:=low(result) to partdone do
-                result[i]:=TObject(fpc_setlength_dynarr_jrecord(TJRecordArray(aorg[i]),TJRecordArray(anew[i]),deepcopy));
+                result[i]:=JLObject(fpc_setlength_dynarr_jrecord(TJRecordArray(aorg[i]),TJRecordArray(anew[i]),deepcopy));
               for i:=succ(partdone) to high(result) do
-                result[i]:=TObject(fpc_setlength_dynarr_jrecord(nil,TJRecordArray(anew[i]),deepcopy));
+                result[i]:=JLObject(fpc_setlength_dynarr_jrecord(nil,TJRecordArray(anew[i]),deepcopy));
           end;
         end;
       end
@@ -432,9 +439,9 @@ function fpc_setlength_dynarr_multidim(aorg, anew: TJObjectArray; deepcopy: bool
       begin
         { recursively handle the next dimension }
         for i:=low(result) to partdone do
-          result[i]:=TObject(fpc_setlength_dynarr_multidim(TJObjectArray(aorg[i]),TJObjectArray(anew[i]),deepcopy,pred(ndim),eletype));
+          result[i]:=JLObject(fpc_setlength_dynarr_multidim(TJObjectArray(aorg[i]),TJObjectArray(anew[i]),deepcopy,pred(ndim),eletype));
         for i:=succ(partdone) to high(result) do
-          result[i]:=TObject(fpc_setlength_dynarr_multidim(nil,TJObjectArray(anew[i]),deepcopy,pred(ndim),eletype));
+          result[i]:=JLObject(fpc_setlength_dynarr_multidim(nil,TJObjectArray(anew[i]),deepcopy,pred(ndim),eletype));
       end;
   end;
 
@@ -448,6 +455,26 @@ function fpc_setlength_dynarr_multidim(aorg, anew: TJObjectArray; deepcopy: bool
                        Misc. System Dependent Functions
 *****************************************************************************}
 
+  procedure TObject.Free;
+    begin
+      if not DestructorCalled then
+        begin
+          DestructorCalled:=true;
+          Destroy;
+        end;
+    end;
+
+
+  destructor TObject.Destroy;
+    begin
+    end;
+
+
+  procedure TObject.Finalize;
+    begin
+      Free;
+    end;
+
 {*****************************************************************************
                          SystemUnit Initialization
 *****************************************************************************}