From f1727c58c38c0b7327eba932c8e92767b6bd6602 Mon Sep 17 00:00:00 2001 From: yury Date: Mon, 28 Apr 2014 14:59:21 +0000 Subject: [PATCH] * pas2jni: Type cast support. nil objects support. git-svn-id: trunk@27684 - --- utils/pas2jni/writer.pas | 38 +++++++++++++++++++++++++++++++++++--- 1 file changed, 35 insertions(+), 3 deletions(-) diff --git a/utils/pas2jni/writer.pas b/utils/pas2jni/writer.pas index 81287f5090..2d07f1fa7a 100644 --- a/utils/pas2jni/writer.pas +++ b/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)));');