Skip to content

Commit 3ad795c

Browse files
authored
Fix implicit casting when calling a host method with object typed arguments (ClearFoundry#265)
* added test for invalid implicit casting * fix invalid implicit casting * fix whitespace changes
1 parent 7f7cc4e commit 3ad795c

File tree

4 files changed

+12
-1
lines changed

4 files changed

+12
-1
lines changed

ClearScript/Util/TypeHelpers.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,7 @@ public static bool IsAssignableFrom(this Type type, ref object value)
183183
}
184184

185185
var valueType = value.GetType();
186-
if (valueType == type)
186+
if (valueType == type || type.IsAssignableFrom(valueType))
187187
{
188188
return true;
189189
}

ClearScriptTest/BaseMemberAccessTest.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -282,6 +282,14 @@ public void BaseMemberAccess_BindTestMethod_BaseClass()
282282
Assert.AreEqual(testObject.BaseBindTestMethod(arg), engine.Evaluate("testObject.BaseBindTestMethod(arg)"));
283283
}
284284

285+
[TestMethod, TestCategory("BaseMemberAccess")]
286+
public void BaseMemberAccess_ObjectTypedArgMethod()
287+
{
288+
var arg = new TestArg() as BaseTestArg;
289+
engine.AddRestrictedHostObject("arg", arg);
290+
Assert.AreEqual(testObject.ObjectTypedArgMethod(arg), engine.Evaluate("testObject.ObjectTypedArgMethod(arg)"));
291+
}
292+
285293
[TestMethod, TestCategory("BaseMemberAccess")]
286294
public void BaseMemberAccess_BindTestMethod_Interface()
287295
{

ClearScriptTest/BaseTestObject.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,8 @@ public double BaseBindTestMethod<T>(T arg)
4646
return TestUtil.CalcTestValue(new Guid("c0f52143-a775-4b71-b206-a759285a35a5"), this, typeof(T), arg);
4747
}
4848

49+
public object ObjectTypedArgMethod(object arg) => arg;
50+
4951
#region Implementation of IBaseTestInterface
5052

5153
public int[] BaseInterfaceProperty { get; set; }

ClearScriptTest/Misc.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ public interface ITestArg
2424

2525
public class TestArg : BaseTestArg, ITestArg
2626
{
27+
public static implicit operator string(TestArg arg) => "";
2728
}
2829

2930
public enum TestEnum : short

0 commit comments

Comments
 (0)