10000 Dispose PyObject instances after use. · pythonnet/pythonnet@796611a · GitHub
[go: up one dir, main page]

Skip to content

Commit 796611a

Browse files
committed
Dispose PyObject instances after use.
1 parent 42a7dca commit 796611a

File tree

3 files changed

+76
-40
lines changed

3 files changed

+76
-40
lines changed

src/runtime/classderived.cs

Lines changed: 39 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -388,7 +388,10 @@ private static void AddVirtualMethod(MethodInfo method, Type baseType, TypeBuild
388388
private static void AddPythonMethod(string methodName, PyObject func, TypeBuilder typeBuilder)
389389
{
390390
if (func.HasAttr("_clr_method_name_"))
391-
methodName = func.GetAttr("_clr_method_name_").ToString();
391+
{
392+
using (PyObject pyMethodName = func.GetAttr("_clr_method_name_"))
393+
methodName = pyMethodName.ToString();
394+
}
392395

393396
using (PyObject pyReturnType = func.GetAttr("_clr_return_type_"))
394397
using (PyObject pyArgTypes = func.GetAttr("_clr_arg_types_"))
@@ -477,37 +480,45 @@ private static void AddPythonProperty(string propertyName, PyObject func, TypeBu
477480
propertyType,
478481
null);
479482

480-
if (func.HasAttr("fget") && func.GetAttr("fget").IsTrue())
483+
if (func.HasAttr("fget"))
481484
{
482-
MethodBuilder methodBuilder = typeBuilder.DefineMethod("get_" + propertyName,
483-
methodAttribs,
484-
propertyType,
485-
null);
486-
487-
ILGenerator il = methodBuilder.GetILGenerator();
488-
il.Emit(OpCodes.Ldarg_0);
489-
il.Emit(OpCodes.Ldstr, propertyName);
490-
il.Emit(OpCodes.Call, typeof(PythonDerivedType).GetMethod("InvokeGetProperty").MakeGenericMethod(propertyType));
491-
il.Emit(OpCodes.Ret);
492-
493-
propertyBuilder.SetGetMethod(methodBuilder);
485+
using (PyObject pyfget = func.GetAttr("fget"))
486+
if (pyfget.IsTrue())
487+
{
488+
MethodBuilder methodBuilder = typeBuilder.DefineMethod("get_" + propertyName,
489+
methodAttribs,
490+
propertyType,
491+
null);
492+
493+
ILGenerator il = methodBuilder.GetILGenerator();
494+
il.Emit(OpCodes.Ldarg_0);
495+
il.Emit(OpCodes.Ldstr, propertyName);
496+
il.Emit(OpCodes.Call, typeof(PythonDerivedType).GetMethod("InvokeGetProperty").MakeGenericMethod(propertyType));
497+
il.Emit(OpCodes.Ret);
498+
499+
propertyBuilder.SetGetMethod(methodBuilder);
500+
}
494501
}
495502

496-
if (func.HasAttr("fset") && func.GetAttr("fset").IsTrue())
503+
if (func.HasAttr("fset"))
497504
{
498-
MethodBuilder methodBuilder = typeBuilder.DefineMethod("set_" + propertyName,
499-
methodAttribs,
500-
null,
501-
new Type[]{propertyType});
502-
503-
ILGenerator il = methodBuilder.GetILGenerator();
504-
il.Emit(OpCodes.Ldarg_0);
505-
il.Emit(OpCodes.Ldstr, propertyName);
506-
il.Emit(OpCodes.Ldarg_1);
507-
il.Emit(OpCodes.Call, typeof(PythonDerivedType).GetMethod("InvokeSetProperty").MakeGenericMethod(propertyType));
508-
il.Emit(OpCodes.Ret);
509-
510-
propertyBuilder.SetSetMethod(methodBuilder);
505+
using (PyObject pyset = func.GetAttr("fset"))
506+
if (pyset.IsTrue())
507+
{
508+
MethodBuilder methodBuilder = typeBuilder.DefineMethod("set_" + propertyName,
509+
methodAttribs,
510+
null,
511+
new Type[]{propertyType});
512+
513+
ILGenerator il = methodBuilder.GetILGenerator();
514+
il.Emit(OpCodes.Ldarg_0);
515+
il.Emit(OpCodes.Ldstr, propertyName);
516+
il.Emit(OpCodes.Ldarg_1);
517+
il.Emit(OpCodes.Call, typeof(PythonDerivedType).GetMethod("InvokeSetProperty").MakeGenericMethod(propertyType));
518+
il.Emit(OpCodes.Ret);
519+
520+
propertyBuilder.SetSetMethod(methodBuilder);
521+
}
511522
}
512523
}
513524
}

src/runtime/pyobject.cs

Lines changed: 33 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -434,7 +434,9 @@ public virtual void SetItem(string key, PyObject value) {
434434
/// </remarks>
435435

436436
public virtual void SetItem(int index, PyObject value) {
437-
SetItem(new PyInt(index), value);
437+
using (PyInt pyindex = new PyInt(index)) {
438+
SetItem(pyindex, value);
439+
}
438440
}
439441

440442

@@ -483,7 +485,8 @@ public virtual void DelItem(string key) {
483485
/// </remarks>
484486

485487
public virtual void DelItem(int index) {
486-
DelItem(new PyInt(index));
488+
using (PyInt pyindex = new PyInt(index))
489+
DelItem(pyindex);
487490
}
488491

489492

@@ -962,10 +965,20 @@ public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, o
962965
{
963966
if (this.HasAttr(binder.Name) && this.GetAttr(binder.Name).IsCallable())
964967
{
965-
PyTuple pyargs;
966-
PyDict kwargs;
967-
GetArgs(args, out pyargs, out kwargs);
968-
result = InvokeMethod(binder.Name, pyargs, kwargs);
968+
PyTuple pyargs = null;
969+
PyDict kwargs = null;
970+
try
971+
{
972+
GetArgs(args, out pyargs, out kwargs);
973+
result = InvokeMethod(binder.Name, pyargs, kwargs);
974+
}
975+
finally
976+
{
977+
if (null != pyargs)
978+
pyargs.Dispose();
979+
if (null != kwargs)
980+
kwargs.Dispose();
981+
}
969982
return true;
970983
}
971984
else
@@ -976,10 +989,20 @@ public override bool TryInvoke(InvokeBinder binder, object[] args, out object re
976989
{
977990
if (this.IsCallable())
978991
{
979-
PyTuple pyargs;
980-
PyDict kwargs;
981-
GetArgs(args, out pyargs, out kwargs);
982-
result = Invoke(pyargs, kwargs);
992+
PyTuple pyargs = null;
993+
PyDict kwargs = null;
994+
try
995+
{
996+
GetArgs(args, out pyargs, out kwargs);
997+
result = Invoke(pyargs, kwargs);
998+
}
999+
finally
1000+
{
1001+
if (null != pyargs)
1002+
pyargs.Dispose();
1003+
if (null != kwargs)
1004+
kwargs.Dispose();
1005+
}
9831006
return true;
9841007
}
9851008
else

src/runtime/pythonexception.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,10 @@ public PythonException() : base()
3535
if ((_pyType != IntPtr.Zero) && (_pyValue != IntPtr.Zero))
3636
{
3737
string type;
38-
using (PyObject pyType = new PyObject(_pyType)) {
39-
type = pyType.GetAttr("__name__").ToString();
38+
using (PyObject pyType = new PyObject(_pyType))
39+
using (PyObject pyTypeName = pyType.GetAttr("__name__"))
40+
{
41+
type = pyTypeName.ToString();
4042
}
4143
string message = Runtime.GetManagedString(_pyValue);
4244
_message = type + " : " + message;

0 commit comments

Comments
 (0)
0