Skip to content

Commit 99b6cb7

Browse files
committed
Fixed a error “Program crash after function call with too much parameters”
1 parent d389143 commit 99b6cb7

File tree

8 files changed

+186
-75
lines changed

8 files changed

+186
-75
lines changed

src/MsieJavaScriptEngine/Helpers/ReflectionHelpers.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,9 +113,15 @@ public static void FixPropertyValueType(ref object value, PropertyInfo property)
113113
public static void FixArgumentTypes(ref object[] argValues, ParameterInfo[] parameters)
114114
{
115115
int argCount = argValues.Length;
116+
int parameterCount = parameters.Length;
116117

117118
for (int argIndex = 0; argIndex < argCount; argIndex++)
118119
{
120+
if (argIndex >= parameterCount)
121+
{
122+
break;
123+
}
124+
119125
object argValue = argValues[argIndex];
120126
if (argValue == null)
121127
{

src/MsieJavaScriptEngine/HostObject.cs

Lines changed: 34 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -28,13 +28,10 @@ internal sealed class HostObject : HostItemBase
2828
public HostObject(object target, JsEngineMode engineMode)
2929
: base(target.GetType(), target, engineMode, true)
3030
{
31-
if (_engineMode == JsEngineMode.Classic)
31+
var del = _target as Delegate;
32+
if (del != null)
3233
{
33-
var del = _target as Delegate;
34-
if (del != null)
35-
{
36-
_delegateParameterCount = del.Method.GetParameters().Length;
37-
}
34+
_delegateParameterCount = del.Method.GetParameters().Length;
3835
}
3936
}
4037

@@ -50,15 +47,40 @@ protected override object InnerInvokeMember(string name, BindingFlags invokeAttr
5047
if (name == SpecialMemberName.Default && processedTarget is Delegate)
5148
{
5249
var del = (Delegate)processedTarget;
53-
object[] processedArgs = args;
50+
int argCount = args.Length;
51+
int skippedArgCount = 0;
52+
int parameterCount = _delegateParameterCount;
53+
54+
if (_engineMode == JsEngineMode.Classic && argCount > 0
55+
&& (argCount - parameterCount) > 0)
56+
{
57+
skippedArgCount = 1;
58+
}
59+
60+
int processedArgCount = argCount;
61+
if (processedArgCount >= skippedArgCount)
62+
{
63+
processedArgCount -= skippedArgCount;
64+
}
65+
if (processedArgCount > parameterCount)
66+
{
67+
processedArgCount = parameterCount;
68+
}
5469

55-
if (_engineMode == JsEngineMode.Classic
56-
&& processedArgs.Length > 0
57-
&& (processedArgs.Length - _delegateParameterCount) == 1)
70+
object[] processedArgs;
71+
if (processedArgCount > 0)
72+
{
73+
processedArgs = args
74+
.Skip(skippedArgCount)
75+
.Take(processedArgCount)
76+
.Select(TypeMappingHelpers.MapToHostType)
77+
.ToArray()
78+
;
79+
}
80+
else
5881
{
59-
processedArgs = processedArgs.Skip(1).ToArray();
82+
processedArgs = new object[0];
6083
}
61-
processedArgs = TypeMappingHelpers.MapToHostType(processedArgs);
6284

6385
result = del.DynamicInvoke(processedArgs);
6486
}

src/MsieJavaScriptEngine/JsRt/Edge/EdgeTypeMapper.cs

Lines changed: 31 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -217,9 +217,9 @@ private EdgeEmbeddedObject CreateEmbeddedFunction(Delegate del)
217217
{
218218
EdgeJsNativeFunction nativeFunction = (callee, isConstructCall, args, argCount, callbackData) =>
219219
{
220-
object[] processedArgs = GetHostItemMemberArguments(args);
221220
MethodInfo method = del.GetMethodInfo();
222221
ParameterInfo[] parameters = method.GetParameters();
222+
object[] processedArgs = GetHostItemMemberArguments(args, parameters.Length);
223223

224224
ReflectionHelpers.FixArgumentTypes(ref processedArgs, parameters);
225225

@@ -231,6 +231,7 @@ private EdgeEmbeddedObject CreateEmbeddedFunction(Delegate del)
231231
}
232232
catch (Exception e)
233233
{
234+
EdgeJsValue undefinedValue = EdgeJsValue.Undefined;
234235
Exception exception = UnwrapException(e);
235236
var wrapperException = exception as WrapperException;
236237
EdgeJsValue errorValue = wrapperException != null ?
@@ -241,7 +242,7 @@ private EdgeEmbeddedObject CreateEmbeddedFunction(Delegate del)
241242
;
242243
EdgeJsContext.SetException(errorValue);
243244

244-
return EdgeJsValue.Undefined;
245+
return undefinedValue;
245246
}
246247

247248
EdgeJsValue resultValue = MapToScriptType(result);
@@ -283,10 +284,12 @@ protected override EdgeEmbeddedType CreateEmbeddedType(Type type)
283284
return resultValue;
284285
}
285286

287+
EdgeJsValue undefinedValue = EdgeJsValue.Undefined;
288+
286289
if (constructors.Length == 0)
287290
{
288291
CreateAndSetError(string.Format(NetCoreStrings.Runtime_HostTypeConstructorNotFound, typeName));
289-
return EdgeJsValue.Undefined;
292+
return undefinedValue;
290293
}
291294

292295
var bestFitConstructor = (ConstructorInfo)ReflectionHelpers.GetBestFitMethod(
@@ -295,7 +298,7 @@ protected override EdgeEmbeddedType CreateEmbeddedType(Type type)
295298
{
296299
CreateAndSetReferenceError(string.Format(
297300
NetCoreStrings.Runtime_SuitableConstructorOfHostTypeNotFound, typeName));
298-
return EdgeJsValue.Undefined;
301+
return undefinedValue;
299302
}
300303

301304
ReflectionHelpers.FixArgumentTypes(ref processedArgs, bestFitConstructor.GetParameters());
@@ -316,7 +319,7 @@ protected override EdgeEmbeddedType CreateEmbeddedType(Type type)
316319
;
317320
EdgeJsContext.SetException(errorValue);
318321

319-
return EdgeJsValue.Undefined;
322+
return undefinedValue;
320323
}
321324

322325
resultValue = MapToScriptType(result);
@@ -364,11 +367,13 @@ private void ProjectFields(EdgeEmbeddedItem externalItem)
364367

365368
EdgeJsNativeFunction nativeGetFunction = (callee, isConstructCall, args, argCount, callbackData) =>
366369
{
370+
EdgeJsValue undefinedValue = EdgeJsValue.Undefined;
371+
367372
if (instance && obj == null)
368373
{
369374
CreateAndSetTypeError(string.Format(
370375
NetCoreStrings.Runtime_InvalidThisContextForHostObjectField, fieldName));
371-
return EdgeJsValue.Undefined;
376+
return undefinedValue;
372377
}
373378

374379
object result;
@@ -400,7 +405,7 @@ private void ProjectFields(EdgeEmbeddedItem externalItem)
400405
}
401406
EdgeJsContext.SetException(errorValue);
402407

403-
return EdgeJsValue.Undefined;
408+
return undefinedValue;
404409
}
405410

406411
EdgeJsValue resultValue = MapToScriptType(result);
@@ -414,11 +419,13 @@ private void ProjectFields(EdgeEmbeddedItem externalItem)
414419

415420
EdgeJsNativeFunction nativeSetFunction = (callee, isConstructCall, args, argCount, callbackData) =>
416421
{
422+
EdgeJsValue undefinedValue = EdgeJsValue.Undefined;
423+
417424
if (instance && obj == null)
418425
{
419426
CreateAndSetTypeError(string.Format(
420427
NetCoreStrings.Runtime_InvalidThisContextForHostObjectField, fieldName));
421-
return EdgeJsValue.Undefined;
428+
return undefinedValue;
422429
}
423430

424431
object value = MapToHostType(args[1]);
@@ -451,10 +458,10 @@ private void ProjectFields(EdgeEmbeddedItem externalItem)
451458
}
452459
EdgeJsContext.SetException(errorValue);
453460

454-
return EdgeJsValue.Undefined;
461+
return undefinedValue;
455462
}
456463

457-
return EdgeJsValue.Undefined;
464+
return undefinedValue;
458465
};
459466
nativeFunctions.Add(nativeSetFunction);
460467

@@ -488,11 +495,13 @@ private void ProjectProperties(EdgeEmbeddedItem externalItem)
488495
{
489496
EdgeJsNativeFunction nativeGetFunction = (callee, isConstructCall, args, argCount, callbackData) =>
490497
{
498+
EdgeJsValue undefinedValue = EdgeJsValue.Undefined;
499+
491500
if (instance && obj == null)
492501
{
493502
CreateAndSetTypeError(string.Format(
494503
NetCoreStrings.Runtime_InvalidThisContextForHostObjectProperty, propertyName));
495-
return EdgeJsValue.Undefined;
504+
return undefinedValue;
496505
}
497506

498507
object result;
@@ -524,7 +533,7 @@ private void ProjectProperties(EdgeEmbeddedItem externalItem)
524533
}
525534
EdgeJsContext.SetException(errorValue);
526535

527-
return EdgeJsValue.Undefined;
536+
return undefinedValue;
528537
}
529538

530539
EdgeJsValue resultValue = MapToScriptType(result);
@@ -541,11 +550,13 @@ private void ProjectProperties(EdgeEmbeddedItem externalItem)
541550
{
542551
EdgeJsNativeFunction nativeSetFunction = (callee, isConstructCall, args, argCount, callbackData) =>
543552
{
553+
EdgeJsValue undefinedValue = EdgeJsValue.Undefined;
554+
544555
if (instance && obj == null)
545556
{
546557
CreateAndSetTypeError(string.Format(
547558
NetCoreStrings.Runtime_InvalidThisContextForHostObjectProperty, propertyName));
548-
return EdgeJsValue.Undefined;
559+
return undefinedValue;
549560
}
550561

551562
object value = MapToHostType(args[1]);
@@ -578,10 +589,10 @@ private void ProjectProperties(EdgeEmbeddedItem externalItem)
578589
}
579590
EdgeJsContext.SetException(errorValue);
580591

581-
return EdgeJsValue.Undefined;
592+
return undefinedValue;
582593
}
583594

584-
return EdgeJsValue.Undefined;
595+
return undefinedValue;
585596
};
586597
nativeFunctions.Add(nativeSetFunction);
587598

@@ -614,11 +625,13 @@ private void ProjectMethods(EdgeEmbeddedItem externalItem)
614625

615626
EdgeJsNativeFunction nativeFunction = (callee, isConstructCall, args, argCount, callbackData) =>
616627
{
628+
EdgeJsValue undefinedValue = EdgeJsValue.Undefined;
629+
617630
if (instance && obj == null)
618631
{
619632
CreateAndSetTypeError(string.Format(
620633
NetCoreStrings.Runtime_InvalidThisContextForHostObjectMethod, methodName));
621-
return EdgeJsValue.Undefined;
634+
return undefinedValue;
622635
}
623636

624637
object[] processedArgs = GetHostItemMemberArguments(args);
@@ -629,7 +642,7 @@ private void ProjectMethods(EdgeEmbeddedItem externalItem)
629642
{
630643
CreateAndSetReferenceError(string.Format(
631644
NetCoreStrings.Runtime_SuitableMethodOfHostObjectNotFound, methodName));
632-
return EdgeJsValue.Undefined;
645+
return undefinedValue;
633646
}
634647

635648
ReflectionHelpers.FixArgumentTypes(ref processedArgs, bestFitMethod.GetParameters());
@@ -663,7 +676,7 @@ private void ProjectMethods(EdgeEmbeddedItem externalItem)
663676
}
664677
EdgeJsContext.SetException(errorValue);
665678

666-
return EdgeJsValue.Undefined;
679+
return undefinedValue;
667680
}
668681

669682
EdgeJsValue resultValue = MapToScriptType(result);

0 commit comments

Comments
 (0)