Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 10 additions & 3 deletions src/ScriptEngine/Machine/Contexts/COMWrapperContext.cs
Original file line number Diff line number Diff line change
Expand Up @@ -115,8 +115,14 @@ protected static (object[] values, ParameterModifier[] flags) MarshalArguments(I
var flags = new ParameterModifier(arguments.Length);
for (int i = 0; i < arguments.Length; i++)
{
values[i] = MarshalIValue(arguments[i]);
flags[i] = arguments[i] is IVariable;
if (arguments[i] is IVariable v)
{
values[i] = new System.Runtime.InteropServices.VariantWrapper(MarshalIValue(v.Value));
flags[i] = true;
}
else
values[i] = MarshalIValue(arguments[i]);

}

flagsArray[0] = flags;
Expand Down Expand Up @@ -146,7 +152,7 @@ public static object MarshalIValue(IValue val)
}
else
{
retValue = ContextValuesMarshaller.ConvertToCLRObject(val) ?? Missing.Value;
retValue = ContextValuesMarshaller.ConvertToCLRObject(val);
}

return retValue;
Expand Down Expand Up @@ -200,6 +206,7 @@ public static IValue CreateIValue(object objParam)
return ValueFactory.Create();

var type = objParam.GetType();
Console.WriteLine($"objt={type.FullName} isI:{objParam is IValue} A:{type.IsArray} asg:{typeof(IValue).IsAssignableFrom(type)} nP:{!type.IsPrimitive} ");
if (typeof(IValue).IsAssignableFrom(type))
{
return (IValue)objParam;
Expand Down
17 changes: 7 additions & 10 deletions src/ScriptEngine/Machine/Contexts/ContextValuesMarshaller.cs
Original file line number Diff line number Diff line change
Expand Up @@ -251,19 +251,16 @@ public static object ConvertToCLRObject(IValue val)
case DataType.Number: return val.AsNumber();
case DataType.String: return val.AsString();
case DataType.Undefined: return null;
case DataType.NotAValidValue: return Missing.Value;
}

object result;

if (val.GetRawValue() is IObjectWrapper wrapped)
return wrapped.UnderlyingObject;

if (val.DataType == DataType.Object)
result = val.AsObject();

if (val.GetRawValue() is IObjectWrapper wrapped)
result = wrapped.UnderlyingObject;
else
throw ValueMarshallingException.NoConversionToCLR(val.GetType());

return result;
return val.AsObject();

throw ValueMarshallingException.NoConversionToCLR(val.GetType());
}

public static T CastToCLRObject<T>(IValue val)
Expand Down
9 changes: 6 additions & 3 deletions src/ScriptEngine/Machine/MachineInstance.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1020,7 +1020,7 @@ private void CallContext(IRuntimeContextInstance instance, int index, ref Method
IValue[] realArgs;
if (instance.DynamicMethodSignatures)
{
realArgs = PrepareDynamicArgs(argValues);
realArgs = PrepareDynamicArgs(instance, argValues);
}
else
{
Expand Down Expand Up @@ -1053,8 +1053,11 @@ private void CallContext(IRuntimeContextInstance instance, int index, ref Method
NextInstruction();
}

private static IValue[] PrepareDynamicArgs(IValue[] factArgs)
private static IValue[] PrepareDynamicArgs(IRuntimeContextInstance context, IValue[] factArgs)
{
if (context is COMWrapperContext)
return factArgs;

var realArgs = new IValue[factArgs.Length];
for (int i = 0; i < factArgs.Length; i++)
{
Expand Down Expand Up @@ -1161,7 +1164,7 @@ private void PrepareContextCallArguments(int arg, out IRuntimeContextInstance co

if (context.DynamicMethodSignatures)
{
argValues = PrepareDynamicArgs(factArgs);
argValues = PrepareDynamicArgs(context, factArgs);
}
else
{
Expand Down