Browse Source

* pas2jni: Fixed ref counting of method pointers.

git-svn-id: trunk@32669 -
yury 9 years ago
parent
commit
2248805082
1 changed files with 8 additions and 8 deletions
  1. 8 8
      utils/pas2jni/writer.pas

+ 8 - 8
utils/pas2jni/writer.pas

@@ -1542,18 +1542,19 @@ begin
       WriteClassInfoVar(d);
       WriteClassInfoVar(d);
 
 
       Fps.WriteLn;
       Fps.WriteLn;
-      Fps.WriteLn('procedure _TMethodPtrInfo_Init(env: PJNIEnv; _self, JavaObj: JObject; AMethodName, AMethodSig: jstring);' + JniCaliing);
+      Fps.WriteLn('procedure _TMethodPtrInfo_Init(env: PJNIEnv; _self, JavaObj: JObject; AMethodName, AMethodSig: jstring; IncRef: jboolean);' + JniCaliing);
       Fps.WriteLn('var mpi: _TMethodPtrInfo;');
       Fps.WriteLn('var mpi: _TMethodPtrInfo;');
       Fps.WriteLn('begin');
       Fps.WriteLn('begin');
       Fps.IncI;
       Fps.IncI;
       EHandlerStart;
       EHandlerStart;
       Fps.WriteLn('mpi:=_TMethodPtrInfo.Create(env, JavaObj, ansistring(_StringFromJString(env, AMethodName)), ansistring(_StringFromJString(env, AMethodSig)));');
       Fps.WriteLn('mpi:=_TMethodPtrInfo.Create(env, JavaObj, ansistring(_StringFromJString(env, AMethodName)), ansistring(_StringFromJString(env, AMethodSig)));');
+      Fps.WriteLn('if IncRef <> 0 then InterlockedIncrement(mpi.RefCnt);');
       Fps.WriteLn(Format('env^^.SetLongField(env, _self, %s.ObjFieldId, Int64(ptruint(mpi)));', [GetTypeInfoVar(d)]));
       Fps.WriteLn(Format('env^^.SetLongField(env, _self, %s.ObjFieldId, Int64(ptruint(mpi)));', [GetTypeInfoVar(d)]));
       EHandlerEnd('env');
       EHandlerEnd('env');
       Fps.DecI;
       Fps.DecI;
       Fps.WriteLn('end;');
       Fps.WriteLn('end;');
 
 
-      AddNativeMethod(d, '_TMethodPtrInfo_Init', '__Init', Format('(Ljava/lang/Object;%s%s)V', [JNITypeSig[btString], JNITypeSig[btString]]));
+      AddNativeMethod(d, '_TMethodPtrInfo_Init', '__Init', Format('(Ljava/lang/Object;%s%sZ)V', [JNITypeSig[btString], JNITypeSig[btString]]));
 
 
       Fps.WriteLn;
       Fps.WriteLn;
       Fps.WriteLn('procedure _TMethodPtrInfo_Release(env: PJNIEnv; _self: JObject);' + JniCaliing);
       Fps.WriteLn('procedure _TMethodPtrInfo_Release(env: PJNIEnv; _self: JObject);' + JniCaliing);
@@ -1570,12 +1571,12 @@ begin
       Fjs.WriteLn;
       Fjs.WriteLn;
       Fjs.WriteLn('public static class MethodPtr extends PascalObjectEx {');
       Fjs.WriteLn('public static class MethodPtr extends PascalObjectEx {');
       Fjs.IncI;
       Fjs.IncI;
-      Fjs.WriteLn('private native void __Init(Object Obj, String MethodName, String MethodSignature);');
+      Fjs.WriteLn('private native void __Init(Object Obj, String MethodName, String MethodSignature, boolean IncRef);');
       Fjs.WriteLn('private native void __Destroy();');
       Fjs.WriteLn('private native void __Destroy();');
       Fjs.WriteLn('protected Object mObject;');
       Fjs.WriteLn('protected Object mObject;');
       Fjs.WriteLn('protected String mName;');
       Fjs.WriteLn('protected String mName;');
       Fjs.WriteLn('protected String mSignature;');
       Fjs.WriteLn('protected String mSignature;');
-      Fjs.WriteLn('protected void Init() { __Init(mObject, mName, mSignature); }');
+      Fjs.WriteLn('protected void Init() { __Init(mObject, mName, mSignature, this != mObject); }');
       Fjs.WriteLn('protected MethodPtr() { _cleanup=true; _pasobj=-1; }');
       Fjs.WriteLn('protected MethodPtr() { _cleanup=true; _pasobj=-1; }');
       Fjs.WriteLn('public void __Release() { if (_pasobj > 0) __Destroy(); }');
       Fjs.WriteLn('public void __Release() { if (_pasobj > 0) __Destroy(); }');
       Fjs.DecI;
       Fjs.DecI;
@@ -2481,10 +2482,9 @@ begin
     Fps.WriteLn('_MethodPointersCS.Enter;');
     Fps.WriteLn('_MethodPointersCS.Enter;');
     Fps.WriteLn('try');
     Fps.WriteLn('try');
     Fps.IncI;
     Fps.IncI;
-    Fps.WriteLn('Dec(Index);');
-    Fps.WriteLn('_MethodPointers[Index]:=nil;');
-    Fps.WriteLn('Index:=Length(_MethodPointers);');
-    Fps.WriteLn('while (Index > 0) and (_MethodPointers[Index] = nil) do Dec(Index);');
+    Fps.WriteLn('_MethodPointers[Index-1]:=nil;');
+    Fps.WriteLn('Index:=High(_MethodPointers);');
+    Fps.WriteLn('while (Index >= 0) and (_MethodPointers[Index] = nil) do Dec(Index);');
     Fps.WriteLn('SetLength(_MethodPointers, Index + 1);');
     Fps.WriteLn('SetLength(_MethodPointers, Index + 1);');
     Fps.WriteLn('finally', -1);
     Fps.WriteLn('finally', -1);
     Fps.WriteLn('_MethodPointersCS.Leave;');
     Fps.WriteLn('_MethodPointersCS.Leave;');