Skip to content

Commit 3d371d6

Browse files
Tweaked MarshalNullAsDispatch behavior, added ScriptEngine.DisableTypeRestriction, added explicit disposal of cached V8 objects to fix Issue ClearFoundry#48.
1 parent 5f66ce5 commit 3d371d6

30 files changed

Lines changed: 317 additions & 131 deletions

ClearScript.sln.DotSettings

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
22
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=ConvertIfStatementToConditionalTernaryExpression/@EntryIndexedValue">DO_NOT_SHOW</s:String>
33
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=ConvertIfStatementToNullCoalescingExpression/@EntryIndexedValue">DO_NOT_SHOW</s:String>
4+
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=ImpureMethodCallOnReadonlyValueField/@EntryIndexedValue">DO_NOT_SHOW</s:String>
45
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=LoopCanBeConvertedToQuery/@EntryIndexedValue">DO_NOT_SHOW</s:String>
56
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=ParameterTypeCanBeEnumerable_002ELocal/@EntryIndexedValue">DO_NOT_SHOW</s:String>
67
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=RemoveConstuctorInvocation/@EntryIndexedValue">SUGGESTION</s:String>

ClearScript/ByRefArg.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -132,14 +132,14 @@ public override string[] GetAuxPropertyNames(BindingFlags bindFlags)
132132
return target.GetAuxPropertyNames(bindFlags);
133133
}
134134

135-
public override bool TryInvokeAuxMember(string name, BindingFlags invokeFlags, object[] args, object[] bindArgs, out object result)
135+
public override bool TryInvokeAuxMember(ScriptEngine engine, string name, BindingFlags invokeFlags, object[] args, object[] bindArgs, out object result)
136136
{
137-
return target.TryInvokeAuxMember(name, invokeFlags, args, bindArgs, out result);
137+
return target.TryInvokeAuxMember(engine, name, invokeFlags, args, bindArgs, out result);
138138
}
139139

140-
public override bool TryInvoke(BindingFlags invokeFlags, object[] args, object[] bindArgs, out object result)
140+
public override bool TryInvoke(ScriptEngine engine, BindingFlags invokeFlags, object[] args, object[] bindArgs, out object result)
141141
{
142-
return target.TryInvoke(invokeFlags, args, bindArgs, out result);
142+
return target.TryInvoke(engine, invokeFlags, args, bindArgs, out result);
143143
}
144144

145145
#endregion

ClearScript/HostFunctions.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,7 @@ public object newObj(IDynamicMetaObjectProvider target, params object[] args)
169169
MiscHelpers.VerifyNonNullArgument(target, "target");
170170

171171
object result;
172-
if (target.GetMetaObject(Expression.Constant(target)).TryCreateInstance(args, out result))
172+
if (target.GetMetaObject(Expression.Constant(target)).TryCreateInstance(GetEngine(), args, out result))
173173
{
174174
return result;
175175
}

ClearScript/HostIndexedProperty.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ public override string[] GetAuxMethodNames(BindingFlags bindFlags)
119119
return auxMethodNames;
120120
}
121121

122-
public override bool TryInvokeAuxMember(string memberName, BindingFlags invokeFlags, object[] args, object[] bindArgs, out object result)
122+
public override bool TryInvokeAuxMember(ScriptEngine engine, string memberName, BindingFlags invokeFlags, object[] args, object[] bindArgs, out object result)
123123
{
124124
if (invokeFlags.HasFlag(BindingFlags.InvokeMethod))
125125
{
@@ -140,7 +140,7 @@ public override bool TryInvokeAuxMember(string memberName, BindingFlags invokeFl
140140
return false;
141141
}
142142

143-
public override bool TryInvoke(BindingFlags invokeFlags, object[] args, object[] bindArgs, out object result)
143+
public override bool TryInvoke(ScriptEngine engine, BindingFlags invokeFlags, object[] args, object[] bindArgs, out object result)
144144
{
145145
result = target.InvokeMember(name, invokeFlags.HasFlag(BindingFlags.SetField) ? BindingFlags.SetProperty : BindingFlags.GetProperty, args, bindArgs, null);
146146
return true;

ClearScript/HostItem.InvokeMethod.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -393,7 +393,7 @@ public override object Invoke(ScriptEngine engine)
393393
engine.CheckReflection();
394394
}
395395

396-
return InvokeHelpers.InvokeMethod(hostTarget.InvokeTarget, method, args);
396+
return InvokeHelpers.InvokeMethod(engine, hostTarget.InvokeTarget, method, args);
397397
}
398398

399399
#endregion

ClearScript/HostItem.cs

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -215,7 +215,7 @@ public object InvokeMember(string name, BindingFlags invokeFlags, object[] args,
215215
AdjustInvokeFlags(ref invokeFlags);
216216

217217
object result;
218-
if (target.TryInvokeAuxMember(name, invokeFlags, args, bindArgs, out result))
218+
if (target.TryInvokeAuxMember(engine, name, invokeFlags, args, bindArgs, out result))
219219
{
220220
if (target is IHostVariable)
221221
{
@@ -668,7 +668,7 @@ private object InvokePropertyBagMember(string name, BindingFlags invokeFlags, ob
668668
}
669669

670670
object result;
671-
if (InvokeHelpers.TryInvokeObject(value, invokeFlags, args, bindArgs, true, out result))
671+
if (InvokeHelpers.TryInvokeObject(engine, value, invokeFlags, args, bindArgs, true, out result))
672672
{
673673
return result;
674674
}
@@ -710,7 +710,7 @@ private object InvokeListElement(int index, BindingFlags invokeFlags, object[] a
710710
if (invokeFlags.HasFlag(BindingFlags.InvokeMethod))
711711
{
712712
object result;
713-
if (InvokeHelpers.TryInvokeObject(targetList[index], invokeFlags, args, bindArgs, true, out result))
713+
if (InvokeHelpers.TryInvokeObject(engine, targetList[index], invokeFlags, args, bindArgs, true, out result))
714714
{
715715
return result;
716716
}
@@ -761,7 +761,7 @@ private object InvokeHostMember(string name, BindingFlags invokeFlags, object[]
761761
// ReSharper disable CoVariantArrayConversion
762762

763763
object result;
764-
if (hostType.TryInvoke(BindingFlags.InvokeMethod, typeArgs, typeArgs, out result))
764+
if (hostType.TryInvoke(engine, BindingFlags.InvokeMethod, typeArgs, typeArgs, out result))
765765
{
766766
hostType = result as HostType;
767767
if (hostType != null)
@@ -805,7 +805,7 @@ private object InvokeHostMember(string name, BindingFlags invokeFlags, object[]
805805
if (targetDynamicMetaObject != null)
806806
{
807807
object result;
808-
if (targetDynamicMetaObject.TryCreateInstance(args, out result))
808+
if (targetDynamicMetaObject.TryCreateInstance(engine, args, out result))
809809
{
810810
return result;
811811
}
@@ -820,7 +820,7 @@ private object InvokeHostMember(string name, BindingFlags invokeFlags, object[]
820820
if (name == SpecialMemberNames.Default)
821821
{
822822
object result;
823-
if (InvokeHelpers.TryInvokeObject(target, invokeFlags, args, bindArgs, targetDynamicMetaObject != null, out result))
823+
if (InvokeHelpers.TryInvokeObject(engine, target, invokeFlags, args, bindArgs, targetDynamicMetaObject != null, out result))
824824
{
825825
return result;
826826
}
@@ -836,7 +836,7 @@ private object InvokeHostMember(string name, BindingFlags invokeFlags, object[]
836836
if ((targetDynamicMetaObject != null) && (targetDynamicMetaObject.GetDynamicMemberNames().Contains(name)))
837837
{
838838
object result;
839-
if (targetDynamicMetaObject.TryInvokeMember(name, invokeFlags, args, out result))
839+
if (targetDynamicMetaObject.TryInvokeMember(engine, name, invokeFlags, args, out result))
840840
{
841841
return result;
842842
}
@@ -851,14 +851,14 @@ private object InvokeHostMember(string name, BindingFlags invokeFlags, object[]
851851
if ((property != null) && (typeof(Delegate).IsAssignableFrom(property.PropertyType)))
852852
{
853853
var del = (Delegate)property.GetValue(target.InvokeTarget, invokeFlags | BindingFlags.GetProperty, Type.DefaultBinder, MiscHelpers.GetEmptyArray<object>(), culture);
854-
return InvokeHelpers.InvokeDelegate(del, args);
854+
return InvokeHelpers.InvokeDelegate(engine, del, args);
855855
}
856856

857857
var field = target.Type.GetScriptableField(name, GetCommonBindFlags());
858858
if ((field != null) && (typeof(Delegate).IsAssignableFrom(field.FieldType)))
859859
{
860860
var del = (Delegate)field.GetValue(target.InvokeTarget);
861-
return InvokeHelpers.InvokeDelegate(del, args);
861+
return InvokeHelpers.InvokeDelegate(engine, del, args);
862862
}
863863

864864
if (invokeFlags.HasFlag(BindingFlags.GetField))
@@ -911,7 +911,7 @@ private object GetHostProperty(string name, BindingFlags invokeFlags, object[] a
911911
if (property != null)
912912
{
913913
var result = property.GetValue(target.InvokeTarget, invokeFlags, Type.DefaultBinder, args, culture);
914-
return property.IsRestrictedForScript() ? HostObject.WrapResult(result, property.PropertyType) : result;
914+
return engine.PrepareResult(result, property.PropertyType, property.IsRestrictedForScript());
915915
}
916916

917917
if (target.Type.GetScriptableProperties(name, invokeFlags).Any())
@@ -935,7 +935,7 @@ private object GetHostProperty(string name, BindingFlags invokeFlags, object[] a
935935
if (field != null)
936936
{
937937
var result = field.GetValue(target.InvokeTarget);
938-
return field.IsRestrictedForScript() ? HostObject.WrapResult(result, field.FieldType) : result;
938+
return engine.PrepareResult(result, field.FieldType, field.IsRestrictedForScript());
939939
}
940940

941941
var eventInfo = target.Type.GetScriptableEvent(name, invokeFlags);
@@ -973,7 +973,7 @@ private object SetHostProperty(string name, BindingFlags invokeFlags, object[] a
973973
// special case to enable JScript/VBScript "x(a) = b" syntax when x is a host indexed property
974974

975975
object result;
976-
if (InvokeHelpers.TryInvokeObject(target, invokeFlags, args, bindArgs, false, out result))
976+
if (InvokeHelpers.TryInvokeObject(engine, target, invokeFlags, args, bindArgs, false, out result))
977977
{
978978
return result;
979979
}

ClearScript/HostMethod.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ public override HostTargetFlags Flags
112112
get { return HostTargetFlags.None; }
113113
}
114114

115-
public override bool TryInvoke(BindingFlags invokeFlags, object[] args, object[] bindArgs, out object result)
115+
public override bool TryInvoke(ScriptEngine engine, BindingFlags invokeFlags, object[] args, object[] bindArgs, out object result)
116116
{
117117
result = target.InvokeMember(name, invokeFlags, args, bindArgs, null);
118118
return true;

ClearScript/HostObject.cs

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -88,11 +88,6 @@ public static HostObject Wrap(object target, Type type)
8888
return (target != null) ? new HostObject(target, type) : null;
8989
}
9090

91-
public static object WrapResult<T>(T result)
92-
{
93-
return WrapResult(result, typeof(T));
94-
}
95-
9691
public static object WrapResult(object result, Type type)
9792
{
9893
if (result == null)

ClearScript/HostTarget.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -87,13 +87,13 @@ public virtual string[] GetAuxPropertyNames(BindingFlags bindFlags)
8787
return MiscHelpers.GetEmptyArray<string>();
8888
}
8989

90-
public virtual bool TryInvokeAuxMember(string name, BindingFlags invokeFlags, object[] args, object[] bindArgs, out object result)
90+
public virtual bool TryInvokeAuxMember(ScriptEngine engine, string name, BindingFlags invokeFlags, object[] args, object[] bindArgs, out object result)
9191
{
9292
result = null;
9393
return false;
9494
}
9595

96-
public virtual bool TryInvoke(BindingFlags invokeFlags, object[] args, object[] bindArgs, out object result)
96+
public virtual bool TryInvoke(ScriptEngine engine, BindingFlags invokeFlags, object[] args, object[] bindArgs, out object result)
9797
{
9898
result = null;
9999
return false;

ClearScript/HostType.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -228,7 +228,7 @@ public override string[] GetAuxPropertyNames(BindingFlags bindFlags)
228228
return MiscHelpers.GetEmptyArray<string>();
229229
}
230230

231-
public override bool TryInvokeAuxMember(string name, BindingFlags invokeFlags, object[] args, object[] bindArgs, out object result)
231+
public override bool TryInvokeAuxMember(ScriptEngine engine, string name, BindingFlags invokeFlags, object[] args, object[] bindArgs, out object result)
232232
{
233233
var type = GetSpecificTypeNoThrow();
234234
if (type != null)
@@ -239,7 +239,7 @@ public override bool TryInvokeAuxMember(string name, BindingFlags invokeFlags, o
239239
var tempResult = Wrap(nestedTypes.Select(testType => testType.ApplyTypeArguments(type.GetGenericArguments())).ToArray());
240240
if (invokeFlags.HasFlag(BindingFlags.InvokeMethod))
241241
{
242-
return tempResult.TryInvoke(invokeFlags, args, bindArgs, out result);
242+
return tempResult.TryInvoke(engine, invokeFlags, args, bindArgs, out result);
243243
}
244244

245245
result = tempResult;
@@ -251,7 +251,7 @@ public override bool TryInvokeAuxMember(string name, BindingFlags invokeFlags, o
251251
return false;
252252
}
253253

254-
public override bool TryInvoke(BindingFlags invokeFlags, object[] args, object[] bindArgs, out object result)
254+
public override bool TryInvoke(ScriptEngine engine, BindingFlags invokeFlags, object[] args, object[] bindArgs, out object result)
255255
{
256256
if (!invokeFlags.HasFlag(BindingFlags.InvokeMethod) || (args.Length < 1))
257257
{

0 commit comments

Comments
 (0)