Selaa lähdekoodia

Don't convert JsValue parameters

Sebastien Ros 11 vuotta sitten
vanhempi
commit
020dcb0806

+ 14 - 6
Jint/Runtime/Descriptors/Specialized/ClrDataDescriptor.cs

@@ -1,5 +1,4 @@
-using System;
-using System.Globalization;
+using System.Globalization;
 using System.Reflection;
 using Jint.Native;
 
@@ -29,11 +28,20 @@ namespace Jint.Runtime.Descriptors.Specialized
 
             set
             {
-                // attempt to convert the JsValue to the target type
-                var obj = value.GetValueOrDefault().ToObject();
-                if (obj.GetType() != _propertyInfo.PropertyType)
+                var currentValue = value.GetValueOrDefault();
+                object obj;
+                if (_propertyInfo.PropertyType == typeof (JsValue))
                 {
-                    obj = _engine.Options.GetTypeConverter().Convert(obj, _propertyInfo.PropertyType, CultureInfo.InvariantCulture);
+                    obj = currentValue;
+                }
+                else
+                {
+                    // attempt to convert the JsValue to the target type
+                    obj = currentValue.ToObject();
+                    if (obj.GetType() != _propertyInfo.PropertyType)
+                    {
+                        obj = _engine.Options.GetTypeConverter().Convert(obj, _propertyInfo.PropertyType, CultureInfo.InvariantCulture);
+                    }
                 }
                 
                 _propertyInfo.SetValue(_item, obj, null);

+ 28 - 5
Jint/Runtime/Interop/DelegateWrapper.cs

@@ -21,16 +21,39 @@ namespace Jint.Runtime.Interop
 
         public override JsValue Call(JsValue thisObject, JsValue[] arguments)
         {
+            var parameterInfos = _d.Method.GetParameters();
+
             // convert parameter to expected types
-            var parameters = new object[arguments.Length];
+            var parameters = new object[parameterInfos.Length];
             for (var i = 0; i < arguments.Length; i++)
             {
-                parameters[i] = Engine.Options.GetTypeConverter().Convert(
-                    arguments[i].ToObject(),
-                    _d.Method.GetParameters()[i].ParameterType,
-                    CultureInfo.InvariantCulture);
+                var parameterType = parameterInfos[i].ParameterType;
+
+                if (parameterType == typeof (JsValue))
+                {
+                    parameters[i] = arguments[i];
+                }
+                else
+                {
+                    parameters[i] = Engine.Options.GetTypeConverter().Convert(
+                        arguments[i].ToObject(),
+                        parameterType,
+                        CultureInfo.InvariantCulture);
+                }
             }
 
+            // assign null to parameters not provided
+            for (var i = arguments.Length; i < parameterInfos.Length; i++)
+            {
+                if (parameterInfos[i].ParameterType.IsValueType)
+                {
+                    parameters[i] = Activator.CreateInstance(parameterInfos[i].ParameterType);
+                }
+                else
+                {
+                    parameters[i] = null;
+                }
+            }
 
             return JsValue.FromObject(Engine, _d.DynamicInvoke(parameters));
         }

+ 13 - 4
Jint/Runtime/Interop/MethodInfoFunctionInstance.cs

@@ -33,10 +33,19 @@ namespace Jint.Runtime.Interop
                 {
                     for (var i = 0; i < arguments.Length; i++)
                     {
-                        parameters[i] = Engine.Options.GetTypeConverter().Convert(
-                            arguments[i].ToObject(),
-                            method.GetParameters()[i].ParameterType,
-                            CultureInfo.InvariantCulture);
+                        var parameterType = method.GetParameters()[i].ParameterType;
+
+                        if (parameterType == typeof(JsValue))
+                        {
+                            parameters[i] = arguments[i];
+                        }
+                        else
+                        {
+                            parameters[i] = Engine.Options.GetTypeConverter().Convert(
+                                arguments[i].ToObject(),
+                                parameterType,
+                                CultureInfo.InvariantCulture);
+                        }
                     }
 
                     var result = JsValue.FromObject(Engine, method.Invoke(thisObject.ToObject(), parameters.ToArray()));

+ 13 - 4
Jint/Runtime/Interop/TypeReference.cs

@@ -55,10 +55,19 @@ namespace Jint.Runtime.Interop
                 {
                     for (var i = 0; i < arguments.Length; i++)
                     {
-                        parameters[i] = Engine.Options.GetTypeConverter().Convert(
-                            arguments[i].ToObject(),
-                            method.GetParameters()[i].ParameterType,
-                            CultureInfo.InvariantCulture);
+                        var parameterType =  method.GetParameters()[i].ParameterType;
+
+                        if (parameterType == typeof(JsValue))
+                        {
+                            parameters[i] = arguments[i];
+                        }
+                        else
+                        {
+                            parameters[i] = Engine.Options.GetTypeConverter().Convert(
+                                arguments[i].ToObject(),
+                                parameterType,
+                                CultureInfo.InvariantCulture);
+                        }
                     }
 
                     var constructor = (ConstructorInfo)method;