Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit08ea6f3

Browse files
committed
refactoring in CreateSubType
1 parent44a36dc commit08ea6f3

File tree

3 files changed

+26
-31
lines changed

3 files changed

+26
-31
lines changed

‎src/runtime/converter.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -313,7 +313,9 @@ internal static bool ToManaged(IntPtr value, Type type,
313313
returnConverter.ToManagedValue(value,type,outresult,setError);
314314
}
315315

316-
316+
internalstaticboolToManagedValue(BorrowedReferencevalue,TypeobType,
317+
outobjectresult,boolsetError)
318+
=>ToManagedValue(value.DangerousGetAddress(),obType,outresult,setError);
317319
internalstaticboolToManagedValue(IntPtrvalue,TypeobType,
318320
outobjectresult,boolsetError)
319321
{

‎src/runtime/runtime.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1641,6 +1641,8 @@ internal static bool PyDict_Check(IntPtr ob)
16411641
/// </summary>
16421642
[DllImport(_PythonDll, CallingConvention= CallingConvention.Cdecl)]
16431643
internalstaticextern IntPtr PyDict_GetItem(IntPtr pointer, IntPtr key);
1644+
[DllImport(_PythonDll, CallingConvention= CallingConvention.Cdecl)]
1645+
internalstaticextern BorrowedReference PyDict_GetItemWithError(BorrowedReference pointer, BorrowedReference key);
16441646

16451647
/// <summary>
16461648
/// Return value: Borrowed reference.

‎src/runtime/typemanager.cs

Lines changed: 21 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
usingSystem.Runtime.InteropServices;
77
usingSystem.Diagnostics;
88
usingPython.Runtime.Slots;
9+
usingstaticPython.Runtime.PythonException;
910

1011
namespacePython.Runtime
1112
{
@@ -302,6 +303,7 @@ internal static IntPtr CreateType(ManagedType impl, Type clrType)
302303

303304
internalstaticIntPtrCreateSubType(IntPtrpy_name,IntPtrpy_base_type,IntPtrpy_dict)
304305
{
306+
vardictRef=newBorrowedReference(py_dict);
305307
// Utility to create a subtype of a managed type with the ability for the
306308
// a python subtype able to override the managed implementation
307309
stringname=Runtime.GetManagedString(py_name);
@@ -311,40 +313,29 @@ internal static IntPtr CreateSubType(IntPtr py_name, IntPtr py_base_type, IntPtr
311313
objectassembly=null;
312314
objectnamespaceStr=null;
313315

314-
vardisposeList=newList<PyObject>();
315-
try
316+
using(varassemblyKey=newPyString("__assembly__"))
316317
{
317-
varassemblyKey=newPyObject(Converter.ToPython("__assembly__",typeof(string)));
318-
disposeList.Add(assemblyKey);
319-
if(0!=Runtime.PyMapping_HasKey(py_dict,assemblyKey.Handle))
318+
varassemblyPtr=Runtime.PyDict_GetItemWithError(dictRef,assemblyKey.Reference);
319+
if(assemblyPtr.IsNull)
320320
{
321-
varpyAssembly=newPyObject(Runtime.PyDict_GetItem(py_dict,assemblyKey.Handle));
322-
Runtime.XIncref(pyAssembly.Handle);
323-
disposeList.Add(pyAssembly);
324-
if(!Converter.ToManagedValue(pyAssembly.Handle,typeof(string),outassembly,false))
325-
{
326-
thrownewInvalidCastException("Couldn't convert __assembly__ value to string");
327-
}
321+
if(Exceptions.ErrorOccurred())returnIntPtr.Zero;
322+
}
323+
elseif(!Converter.ToManagedValue(assemblyPtr,typeof(string),outassembly,false))
324+
{
325+
returnExceptions.RaiseTypeError("Couldn't convert __assembly__ value to string");
328326
}
329327

330-
varnamespaceKey=newPyObject(Converter.ToPythonImplicit("__namespace__"));
331-
disposeList.Add(namespaceKey);
332-
if(0!=Runtime.PyMapping_HasKey(py_dict,namespaceKey.Handle))
328+
using(varnamespaceKey=newPyString("__namespace__"))
333329
{
334-
varpyNamespace=newPyObject(Runtime.PyDict_GetItem(py_dict,namespaceKey.Handle));
335-
Runtime.XIncref(pyNamespace.Handle);
336-
disposeList.Add(pyNamespace);
337-
if(!Converter.ToManagedValue(pyNamespace.Handle,typeof(string),outnamespaceStr,false))
330+
varpyNamespace=Runtime.PyDict_GetItemWithError(dictRef,namespaceKey.Reference);
331+
if(pyNamespace.IsNull)
338332
{
339-
thrownewInvalidCastException("Couldn't convert __namespace__ value to string");
333+
if(Exceptions.ErrorOccurred())returnIntPtr.Zero;
334+
}
335+
elseif(!Converter.ToManagedValue(pyNamespace,typeof(string),outnamespaceStr,false))
336+
{
337+
returnExceptions.RaiseTypeError("Couldn't convert __namespace__ value to string");
340338
}
341-
}
342-
}
343-
finally
344-
{
345-
foreach(PyObjectoindisposeList)
346-
{
347-
o.Dispose();
348339
}
349340
}
350341

@@ -370,14 +361,14 @@ internal static IntPtr CreateSubType(IntPtr py_name, IntPtr py_base_type, IntPtr
370361
// by default the class dict will have all the C# methods in it, but as this is a
371362
// derived class we want the python overrides in there instead if they exist.
372363
IntPtrcls_dict=Marshal.ReadIntPtr(py_type,TypeOffset.tp_dict);
373-
Runtime.PyDict_Update(cls_dict,py_dict);
364+
ThrowIfIsNotZero(Runtime.PyDict_Update(cls_dict,py_dict));
374365
Runtime.XIncref(py_type);
375366
// Update the __classcell__ if it exists
376367
varcell=newBorrowedReference(Runtime.PyDict_GetItemString(cls_dict,"__classcell__"));
377368
if(!cell.IsNull)
378369
{
379-
Runtime.PyCell_Set(cell,py_type);
380-
Runtime.PyDict_DelItemString(cls_dict,"__classcell__");
370+
ThrowIfIsNotZero(Runtime.PyCell_Set(cell,py_type));
371+
ThrowIfIsNotZero(Runtime.PyDict_DelItemString(cls_dict,"__classcell__"));
381372
}
382373

383374
returnpy_type;

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp