Skip to content

Commit 6b5ae3d

Browse files
twastvedtGitHub Enterprise
authored andcommitted
Fix infinite loop, add list marshaling (#12)
1 parent 27fbe41 commit 6b5ae3d

File tree

1 file changed

+28
-11
lines changed

1 file changed

+28
-11
lines changed

DSPythonNet3/DSPythonNet3Evaluator.cs

Lines changed: 28 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -494,7 +494,7 @@ private static void InitializeEncoders()
494494
[SupressImportIntoVM]
495495
internal override void RegisterHostDataMarshalers()
496496
{
497-
DataMarshaler dataMarshalerToUse = HostDataMarshaler as DataMarshaler;
497+
DataMarshaler? dataMarshalerToUse = HostDataMarshaler as DataMarshaler;
498498
dataMarshalerToUse?.RegisterMarshaler((PyObject pyObj) =>
499499
{
500500
try
@@ -503,20 +503,37 @@ internal override void RegisterHostDataMarshalers()
503503
{
504504
if (PyDict.IsDictType(pyObj))
505505
{
506-
using (var pyDict = new PyDict(pyObj))
506+
using var pyDict = new PyDict(pyObj);
507+
var dict = new PyDict();
508+
foreach (PyObject item in pyDict.Items())
507509
{
508-
var dict = new PyDict();
509-
foreach (PyObject item in pyDict.Items())
510-
{
511-
dict.SetItem(
512-
ConverterExtension.ToPython(dataMarshalerToUse.Marshal(item.GetItem(0))),
513-
ConverterExtension.ToPython(dataMarshalerToUse.Marshal(item.GetItem(1)))
514-
);
515-
}
516-
return dict;
510+
dict.SetItem(
511+
ConverterExtension.ToPython(dataMarshalerToUse.Marshal(item.GetItem(0))),
512+
ConverterExtension.ToPython(dataMarshalerToUse.Marshal(item.GetItem(1)))
513+
);
514+
}
515+
return dict;
516+
}
517+
518+
if (PyList.IsListType(pyObj))
519+
{
520+
using var inputList = new PyList(pyObj);
521+
var outputList = new PyList();
522+
foreach (PyObject item in inputList)
523+
{
524+
outputList.Append(ConverterExtension.ToPython(dataMarshalerToUse.Marshal(item)));
517525
}
526+
return outputList;
518527
}
528+
519529
var unmarshalled = pyObj.AsManagedObject(typeof(object));
530+
531+
// Avoid calling this marshaler infinitely.
532+
if (unmarshalled is PyObject)
533+
{
534+
return unmarshalled;
535+
}
536+
520537
return dataMarshalerToUse.Marshal(unmarshalled);
521538
}
522539
}

0 commit comments

Comments
 (0)