Browse Source

boxing before calling JsValue.FromObject

fix: https://github.com/sebastienros/jint/issues/249
Wu Shuang 9 years ago
parent
commit
dc3a0ac3fd
1 changed files with 15 additions and 1 deletions
  1. 15 1
      Jint/Runtime/Interop/DefaultTypeConverter.cs

+ 15 - 1
Jint/Runtime/Interop/DefaultTypeConverter.cs

@@ -72,7 +72,21 @@ namespace Jint.Runtime.Interop
                         {
                         {
                             @params[i] = Expression.Parameter(genericArguments[i], genericArguments[i].Name + i);
                             @params[i] = Expression.Parameter(genericArguments[i], genericArguments[i].Name + i);
                         }
                         }
-                        var @vars = Expression.NewArrayInit(typeof(JsValue), @params.Select(p => Expression.Call(null, jsValueFromObject, Expression.Constant(_engine, typeof(Engine)), p)));
+                        var tmpVars = new Expression[@params.Length];
+                        for (var i = 0; i < @params.Count(); i++)
+                        {
+                            var param = @params[i];
+                            if (param.Type.IsValueType)
+                            {
+                                var boxing = Expression.Convert(param, typeof(object));
+                                tmpVars[i] = Expression.Call(null, jsValueFromObject, Expression.Constant(_engine, typeof(Engine)), boxing);
+                            }
+                            else
+                            {
+                                tmpVars[i] = Expression.Call(null, jsValueFromObject, Expression.Constant(_engine, typeof(Engine)), param);
+                            }
+                        }
+                        var @vars = Expression.NewArrayInit(typeof(JsValue), tmpVars);
 
 
                         var callExpresion = Expression.Block(Expression.Call(
                         var callExpresion = Expression.Block(Expression.Call(
                                                 Expression.Call(Expression.Constant(function.Target),
                                                 Expression.Call(Expression.Constant(function.Target),