public Parameters(ParameterInfo[] parameterInfos, GeneralGetterManager generalGetterManager, GeneralSetterManager generalSetterManager) { this.generalGetterManager = generalGetterManager; length = parameterInfos.Length; typeMasks = new JsValueType[parameterInfos.Length]; types = new Type[parameterInfos.Length]; args = new object[parameterInfos.Length]; argsTranslateFuncs = new GeneralGetter[parameterInfos.Length]; byRefValueSetFuncs = new GeneralSetter[parameterInfos.Length]; byRef = new bool[parameterInfos.Length]; isOut = new bool[parameterInfos.Length]; for (int i = 0; i < parameterInfos.Length; i++) { var parameterInfo = parameterInfos[i]; var parameterType = parameterInfo.ParameterType; if (parameterInfo.IsDefined(typeof(ParamArrayAttribute), false)) { parameterType = parameterType.GetElementType(); hasParamArray = true; } types[i] = parameterType; typeMasks[i] = GeneralGetterManager.GetJsTypeMask(parameterType); argsTranslateFuncs[i] = generalGetterManager.GetTranslateFunc(parameterType); byRef[i] = parameterType.IsByRef; if (parameterType.IsByRef) { byRefValueSetFuncs[i] = generalSetterManager.GetTranslateFunc(parameterType.GetElementType()); } isOut[i] = parameterType.IsByRef && parameterInfo.IsOut && !parameterInfo.IsIn; } }
private FunctionCallback GenFieldSetter(Type type, FieldInfo field) { var translateFunc = jsEnv.GeneralGetterManager.GetTranslateFunc(field.FieldType); var typeMask = GeneralGetterManager.GetJsTypeMask(field.FieldType); if (field.IsStatic) { return((IntPtr isolate, IntPtr info, IntPtr self, int argumentsLen) => { var valuePtr = PuertsDLL.GetArgumentValue(info, 0); var valueType = PuertsDLL.GetJsValueType(isolate, valuePtr, false); if ((typeMask & valueType) != valueType) { PuertsDLL.ThrowException(isolate, "expect " + typeMask + " but got " + valueType); } else { field.SetValue(null, translateFunc(isolate, NativeValueApi.GetValueFromArgument, valuePtr, false)); } }); } else { return((IntPtr isolate, IntPtr info, IntPtr self, int argumentsLen) => { var valuePtr = PuertsDLL.GetArgumentValue(info, 0); var valueType = PuertsDLL.GetJsValueType(isolate, valuePtr, false); if ((typeMask & valueType) != valueType) { PuertsDLL.ThrowException(isolate, "expect " + typeMask + " but got " + valueType); } else { var me = jsEnv.GeneralGetterManager.GetSelf(self); field.SetValue(me, translateFunc(isolate, NativeValueApi.GetValueFromArgument, valuePtr, false)); } }); } }