Răsfoiți Sursa

* pas2jni: Type cast support. nil objects support.

git-svn-id: trunk@27684 -
yury 11 ani în urmă
părinte
comite
f1727c58c3
1 a modificat fișierele cu 35 adăugiri și 3 ștergeri
  1. 35 3
      utils/pas2jni/writer.pas

+ 35 - 3
utils/pas2jni/writer.pas

@@ -485,8 +485,28 @@ var
     end;
   end;
 
+  procedure WriteTypeCast(const AName: string; SecondPass: boolean);
+  var
+    s, ss: string;
+  begin
+    if d.DefType <> dtClass then
+      exit;
+    with TClassDef(d) do begin
+      if (AncestorClass = nil) and not (SecondPass and HasReplacedItems) then
+        // TObject
+        s:='_pasobj=obj._pasobj'
+      else
+        s:='super(obj)';
+      if HasReplacedItems and not SecondPass then
+        ss:='protected'
+      else
+        ss:='public';
+      Fjs.WriteLn(Format('%s %s(PascalObject obj) { %s; }', [ss, AName, s]))
+    end;
+  end;
+
 var
-  s, ss: string;
+  s, ss, n: string;
   RegularClass: boolean;
 begin
   if PreInfo then begin
@@ -528,7 +548,8 @@ begin
       s:='';
   end;
   WriteComment(d, s);
-  s:='public static class ' + GetJavaClassName(d, nil) + ' extends ';
+  n:=GetJavaClassName(d, nil);
+  s:='public static class ' + n + ' extends ';
   if d.DefType = dtClass then
     with TClassDef(d) do begin
       if AncestorClass <> nil then begin
@@ -551,6 +572,8 @@ begin
     Fjs.WriteLn(Format('public int Size() { return %d; }', [TRecordDef(d).Size]));
   end;
 
+  WriteTypeCast(n, False);
+
   WrittenItems:=TList.Create;
   try
     RegularClass:=(d.DefType = dtClass) and not TClassDef(d).HasReplacedItems;
@@ -571,6 +594,7 @@ begin
       Fjs.WriteLn(Format('public static class %s extends __%0:s {', [d.AliasName]));
       Fjs.IncI;
 
+      WriteTypeCast(d.AliasName, True);
       WriteConstructors;
       WriteItems(False, True, True);
 
@@ -1196,6 +1220,7 @@ procedure TWriter.WriteUnit(u: TUnitDef);
 var
   d: TDef;
   i: integer;
+  HasSystem: boolean;
 begin
   if u.Processed then
     exit;
@@ -1214,11 +1239,17 @@ begin
   Fjs:=TTextOutStream.Create(IncludeTrailingPathDelimiter(FPkgDir) + u.Name + '.java', fmCreate);
   try
     Fjs.WriteLn(Format('package %s;', [JavaPackage]));
+    HasSystem:=False;
     if Length(u.UsedUnits) > 0 then begin
       Fjs.WriteLn;
       for i:=0 to High(u.UsedUnits) do
-        if u.UsedUnits[i].IsUsed then
+        if u.UsedUnits[i].IsUsed then begin
           Fjs.WriteLn(Format('import %s.%s.*;', [JavaPackage, LowerCase(u.UsedUnits[i].Name)]));
+          if AnsiCompareText(u.UsedUnits[i].Name, 'system') = 0 then
+            HasSystem:=True;
+        end;
+      if not HasSystem then
+        Fjs.WriteLn(Format('import %s.system.*;', [JavaPackage]));
     end;
     Fjs.WriteLn;
     Fjs.WriteLn('public class ' + u.Name + ' {');
@@ -1971,6 +2002,7 @@ begin
     Fps.WriteLn('begin');
     Fps.IncI;
     Fps.WriteLn('Result:=nil;');
+    Fps.WriteLn('if PasObj = nil then exit;');
     Fps.WriteLn('Result:=env^^.AllocObject(env, ci.ClassRef);');
     Fps.WriteLn('if Result = nil then exit;');
     Fps.WriteLn('env^^.SetLongField(env, Result, ci.ObjFieldId, Int64(ptruint(PasObj)));');