@@ -29,18 +29,15 @@ public class PyScope : DynamicObject, IDisposable
2929/// <summary>
3030/// the python Module object the scope associated with.
3131/// </summary>
32- internal IntPtr obj ;
33- internal BorrowedReference Reference => new BorrowedReference ( obj ) ;
32+ readonly PyObject obj ;
33+ internal BorrowedReference Reference => obj . Reference ;
3434
3535/// <summary>
36- /// the variable dict of the scope.
36+ /// the variable dict of the scope. Borrowed.
3737/// </summary>
3838internal readonly IntPtr variables ;
3939internal BorrowedReference VarsRef => new BorrowedReference ( variables ) ;
4040
41- private bool _isDisposed ;
42- private bool _finalized = false ;
43-
4441/// <summary>
4542/// The Manager this scope associated with.
4643/// It provides scopes this scope can import.
@@ -65,7 +62,7 @@ internal PyScope(ref NewReference ptr, PyScopeManager manager)
6562throw new PyScopeException ( "object is not a module" ) ;
6663}
6764Manager = manager ?? PyScopeManager . Global ;
68- obj = ptr . DangerousMoveToPointer ( ) ;
65+ obj = ptr . MoveToPyObject ( ) ;
6966//Refcount of the variables not increase
7067variables = Runtime . PyModule_GetDict ( Reference ) . DangerousGetAddress ( ) ;
7168PythonException . ThrowIfIsNull ( variables ) ;
@@ -81,7 +78,6 @@ internal PyScope(ref NewReference ptr, PyScopeManager manager)
8178/// <summary>
8279/// return the variable dict of the scope.
8380/// </summary>
84- /// <returns></returns>
8581public PyDict Variables ( )
8682{
8783Runtime . XIncref ( variables ) ;
@@ -136,7 +132,7 @@ public dynamic Import(string name, string asname = null)
136132/// </remarks>
137133public void Import ( PyScope scope , string asname )
138134{
139- this . Set ( asname , scope . obj ) ;
135+ this . SetPyValue ( asname , scope . obj . Handle ) ;
140136}
141137
142138/// <summary>
@@ -335,11 +331,11 @@ private void Exec(string code, BorrowedReference _globals, BorrowedReference _lo
335331public void Set ( string name , object value )
336332{
337333IntPtr _value = Converter . ToPython ( value , value ? . GetType ( ) ) ;
338- Set ( name , _value ) ;
334+ SetPyValue ( name , _value ) ;
339335Runtime . XDecref ( _value ) ;
340336}
341337
342- private void Set ( string name , IntPtr value )
338+ private void SetPyValue ( string name , IntPtr value )
343339{
344340Check ( ) ;
345341using ( var pyKey = new PyString ( name ) )
@@ -507,31 +503,16 @@ public override bool TrySetMember(SetMemberBinder binder, object value)
507503
508504private void Check ( )
509505{
510- if ( _isDisposed )
506+ if ( this . obj . IsDisposed )
511507{
512508throw new PyScopeException ( $ "The scope of name '{ Name } ' object has been disposed") ;
513509}
514510}
515511
516512public void Dispose ( )
517513{
518- if ( _isDisposed )
519- {
520- return ;
521- }
522- _isDisposed = true ;
523- Runtime . XDecref ( obj ) ;
524514this . OnDispose ? . Invoke ( this ) ;
525- }
526-
527- ~ PyScope ( )
528- {
529- if ( _finalized || _isDisposed )
530- {
531- return ;
532- }
533- _finalized = true ;
534- Finalizer . Instance . AddFinalizedObject ( ref obj ) ;
515+ this . obj . Dispose ( ) ;
535516}
536517}
537518