public override JsInstance Execute(IJintVisitor visitor, JsDictionaryObject that, JsInstance[] parameters) { if (that == null) { // 15.5.1 - When String is called as a function rather than as a constructor, it performs a type conversion. if (parameters.Length > 0) { return visitor.Return(Global.StringClass.New(parameters[0].ToString())); } else { return visitor.Return(Global.StringClass.New(String.Empty)); } } else { // 15.5.2 - When String is called as part of a new expression, it is a constructor: it initialises the newly created object. if (parameters.Length > 0) { that.Value = parameters[0].ToString(); } else { that.Value = String.Empty; } return visitor.Return(that); } }
public override JsInstance Execute(IJintVisitor visitor, JsDictionaryObject that, JsInstance[] parameters) { if (that == null) { // 15.7.1 - When Number is called as a function rather than as a constructor, it performs a type conversion. if (parameters.Length > 0) { return visitor.Return(new JsNumber(parameters[0].ToNumber())); } else { return visitor.Return(new JsNumber(0)); } } else { // 15.7.2 - When Number is called as part of a new expression, it is a constructor: it initialises the newly created object. if (parameters.Length > 0) { that.Value = parameters[0].ToNumber(); } else { that.Value = 0; } visitor.Return(that); } return that; }
public JsClr(IJintVisitor visitor, object clr) : this(visitor) { value = clr; if (value != null) { //TODO: Когда нибудь, когда солнце и земля объединятся, этот костыль должен быть исправлен. Но поныне нужно помнить: namespace BitMobile.Controls только для контролов, и контролы только для него. // Основное назначение: из за того что UIVewItem реализует IEnumerable, мы получаем такой гемор. if (value is System.Collections.IEnumerable && clr.GetType().Namespace != "BitMobile.Controls") clrCountProperty = _propertyGetter.GetValue(value, "Count"); else { //properties = new List<string>(); foreach (PropertyInfo pi in value.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public)) { DefineOwnProperty(pi.Name, new ClrPropertyDescriptor(_propertyGetter, _global, this, pi.Name)); } foreach (FieldInfo pi in value.GetType().GetFields(BindingFlags.Instance | BindingFlags.Public)) { DefineOwnProperty(pi.Name, new ClrFieldDescriptor(_fieldGetter, _global, this, pi.Name)); } ClrMethodDescriptor cmd = null; foreach (MethodInfo mi in value.GetType().GetMethods(BindingFlags.Instance | BindingFlags.Public | BindingFlags.Static)) { if (cmd == null || cmd.Name != mi.Name) DefineOwnProperty(mi.Name, cmd = new ClrMethodDescriptor(this, mi.Name)); } var entity = value as IEntity; if (entity != null) foreach (string column in entity.EntityType.GetColumns()) DefineOwnProperty(column, new ClrEntityDescriptor(_entityAccessor, _global, this, column)); } } }
public override JsInstance Execute(IJintVisitor visitor, JsDictionaryObject that, JsInstance[] parameters) { if (that == null) { JsArray array = Global.ArrayClass.New(); for (int i = 0; i < parameters.Length; i++) { array[i.ToString()] = parameters[i]; } visitor.Return(array); } else { // When called as part of a new expression, it is a constructor: it initialises the newly created object. for (int i = 0; i < parameters.Length; i++) { that[i.ToString()] = parameters[i]; } visitor.Return(that); } return that; }
public JsClr(IJintVisitor visitor, object clr) : this(visitor) { value = clr; if (value != null) { if (value is System.Collections.IEnumerable) clrCountProperty = propertyGetter.GetValue(value, "Count"); else { //properties = new List<string>(); foreach (PropertyInfo pi in value.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public)) { DefineOwnProperty(pi.Name, new ClrPropertyDescriptor(propertyGetter, global, this, pi.Name)); } foreach (FieldInfo pi in value.GetType().GetFields(BindingFlags.Instance | BindingFlags.Public)) { DefineOwnProperty(pi.Name, new ClrFieldDescriptor(fieldGetter, global, this, pi.Name)); } ClrMethodDescriptor cmd = null; foreach (MethodInfo mi in value.GetType().GetMethods(BindingFlags.Instance | BindingFlags.Public | BindingFlags.Static)) { if (cmd == null || cmd.Name != mi.Name) DefineOwnProperty(mi.Name, cmd = new ClrMethodDescriptor(this, mi.Name)); } } } }
public override JsInstance Execute(IJintVisitor visitor, JsDictionaryObject that, JsInstance[] parameters) { JsFunction function = that as JsFunction; if (function == null) { throw new ArgumentException("the target of call() must be a function"); } JsDictionaryObject _this; JsInstance[] _parameters; if (parameters.Length >= 1 && parameters[0] != JsUndefined.Instance && parameters[0] != JsNull.Instance) _this = parameters[0] as JsDictionaryObject; else _this = visitor.Global as JsDictionaryObject; if (parameters.Length >= 2 && parameters[1] != JsNull.Instance) { _parameters = new JsInstance[parameters.Length - 1]; for (int i = 1; i < parameters.Length; i++) { _parameters[i - 1] = parameters[i]; } } else { _parameters = JsInstance.EMPTY; } // Executes the statements in 'that' and use _this as the target of the call visitor.ExecuteFunction(function, _this, _parameters); return visitor.Result; //visitor.CallFunction(function, _this, _parameters); //return visitor.Result; }
public override JsInstance Execute(IJintVisitor visitor, JsDictionaryObject that, JsInstance[] parameters) { JsFunction function = that as JsFunction; if (function == null) { throw new ArgumentException("the target of call() must be a function"); } JsDictionaryObject _this; JsInstance[] _parameters; if (parameters.Length >= 1) _this = parameters[0] as JsDictionaryObject; else _this = visitor.Global as JsDictionaryObject; if (parameters.Length >= 2 && parameters[1] != JsNull.Instance) { JsObject arguments = parameters[1] as JsObject; if (arguments == null) throw new JsException(visitor.Global.TypeErrorClass.New("second argument must be an array")); _parameters = new JsInstance[arguments.Length]; for (int i = 0; i < arguments.Length; i++) { _parameters[i] = arguments[i.ToString()]; } } else { _parameters = JsInstance.EMPTY; } // Executes the statements in 'that' and use _this as the target of the call visitor.ExecuteFunction(function, _this, _parameters); return visitor.Result; //visitor.CallFunction(function, _this, _parameters); //return visitor.Result; }
public override JsObject Construct(JsInstance[] parameters, Type[] genericArgs, IJintVisitor visitor) { JsArray array = New(); for (int i = 0; i < parameters.Length; i++) array.put(i, parameters[i]); // fast versin since it avoids a type conversion return array; }
public override JsInstance Execute(IJintVisitor visitor, JsDictionaryObject that, JsInstance[] parameters) { if (parameters.Length == 0) { return visitor.Return(New()); //throw new ArgumentNullException("pattern"); } return visitor.Return(New(parameters[0].ToString(), false, false, false)); }
public JsClr(IJintVisitor visitor) { _global = visitor.Global; _propertyGetter = visitor.PropertyGetter; _fieldGetter = visitor.FieldGetter; _entityAccessor = visitor.EntityAccessor; value = null; }
public JsClr(IJintVisitor visitor) { this.global = visitor.Global; this.propertyGetter = visitor.PropertyGetter; this.methodGetter = visitor.MethodGetter; this.fieldGetter = visitor.FieldGetter; value = null; }
public override JsInstance Execute(IJintVisitor visitor, JsDictionaryObject that, JsInstance[] parameters) { if (that == null || (that as IGlobal) == visitor.Global ) { return visitor.Return(Construct(parameters,null,visitor)); } else { // When called as part of a new expression, it is a constructor: it initialises the newly created object. for (int i = 0; i < parameters.Length; i++) { that[i.ToString()] = parameters[i]; } return visitor.Return(that); } }
public override JsInstance Execute(IJintVisitor visitor, JsDictionaryObject that, JsInstance[] parameters, Type[] genericArguments) { if (m_generics.Count == 0 && (genericArguments != null && genericArguments.Length > 0)) return base.Execute(visitor, that, parameters, genericArguments); else { JsMethodImpl impl = m_overloads.ResolveOverload(parameters, genericArguments); if (impl == null) throw new JintException(String.Format("No matching overload found {0}<{1}>", Name, genericArguments)); visitor.Return(impl(visitor.Global, that, parameters)); return that; } }
/// <summary> /// 15.2.2.1 /// </summary> public override JsInstance Execute(IJintVisitor visitor, JsDictionaryObject that, JsInstance[] parameters) { if (parameters.Length > 0) { switch (parameters[0].Class) { case JsInstance.CLASS_STRING: return Global.StringClass.New(parameters[0].ToString()); case JsInstance.CLASS_NUMBER: return Global.NumberClass.New(parameters[0].ToNumber()); case JsInstance.CLASS_BOOLEAN: return Global.BooleanClass.New(parameters[0].ToBoolean()); default: return parameters[0]; } } return New(this); }
public override JsInstance Execute(IJintVisitor visitor, JsDictionaryObject that, JsInstance[] parameters) { int clrParameterCount = Delegate.Method.GetParameters().Length; object[] clrParameters = new object[clrParameterCount]; for (int i = 0; i < parameters.Length; i++) { // First see if either the JsInstance or it's value can be directly accepted without converstion if (typeof(JsInstance).IsAssignableFrom(Parameters[i].ParameterType) && Parameters[i].ParameterType.IsInstanceOfType(parameters[i])) { clrParameters[i] = parameters[i]; } else if (Parameters[i].ParameterType.IsInstanceOfType(parameters[i].Value)) { clrParameters[i] = parameters[i].Value; } else { clrParameters[i] = visitor.Global.Marshaller.MarshalJsValue<object>(parameters[i]); } } object result; try { result = Delegate.DynamicInvoke(clrParameters); } catch (TargetInvocationException e) { throw e.InnerException; } catch (Exception e) { if (e.InnerException is JsException) { throw e.InnerException; } throw; } if (result != null) { // Don't wrap if the result should be a JsInstance if (typeof(JsInstance).IsInstanceOfType(result)) { visitor.Return((JsInstance)result); } else { visitor.Return(visitor.Global.WrapClr(result)); } } else { visitor.Return(JsUndefined.Instance); } return null; }
/// <summary> /// 15.2.2.1 /// </summary> public override JsInstance Execute(IJintVisitor visitor, JsDictionaryObject that, JsInstance[] parameters) { if (parameters.Length > 0) { switch (parameters[0].Class) { case JsString.TYPEOF: return Global.StringClass.New(parameters[0].ToString()); case JsNumber.TYPEOF: return new JsNumber(parameters[0].ToNumber()); case JsBoolean.TYPEOF: return new JsBoolean(parameters[0].ToBoolean()); default: return parameters[0]; } } return New(this); }
public override JsInstance Execute(IJintVisitor visitor, JsDictionaryObject that, JsInstance[] parameters) { try { //visitor.CurrentScope["this"] = visitor.Global; JsInstance result = Delegate( parameters ); visitor.Return(result == null ? JsUndefined.Instance : result); return that; } catch (Exception e) { if (e.InnerException is JsException) { throw e.InnerException; } throw; } }
public JsFunctionDelegate(IJintVisitor visitor, JsFunction function, JsDictionaryObject that,Type delegateType) { if (visitor == null) throw new ArgumentNullException("visitor"); if (function == null) throw new ArgumentNullException("function"); if (delegateType == null) throw new ArgumentNullException("delegateType"); if (!typeof(Delegate).IsAssignableFrom(delegateType)) throw new ArgumentException("A delegate type is required", "delegateType"); m_visitor = visitor; m_function = function; m_delegateType = delegateType; m_that = that; m_marshaller = visitor.Global.Marshaller; }
public override JsInstance Execute(IJintVisitor visitor, JsDictionaryObject that, JsInstance[] parameters) { if (that == null || (that as IGlobal) == visitor.Global) { visitor.Return(parameters.Length > 0 ? New(parameters[0].ToString()) : New()); } else { if (parameters.Length > 0) { that.Value = parameters[0].ToString(); } else { that.Value = String.Empty; } visitor.Return(that); } return that; }
public override JsInstance Execute(IJintVisitor visitor, JsDictionaryObject that, JsInstance[] parameters) { if (parameters.Length == 0) { return visitor.Return(New()); //throw new ArgumentNullException("pattern"); } bool g = false, m = false, ic = false; if (parameters.Length == 2) { string strParam = parameters[1].ToString(); if (strParam != null) { m = strParam.Contains("m"); ic = strParam.Contains("i"); g = strParam.Contains("g"); } } return visitor.Return(New(parameters[0].ToString(), g, ic, m)); }
public override JsInstance Execute(IJintVisitor visitor, JsDictionaryObject that, JsInstance[] parameters) { // e.g., var foo = Boolean(true); if (that == null || (that as IGlobal) == visitor.Global) { visitor.Return(parameters.Length > 0 ? new JsBoolean(parameters[0].ToBoolean(), PrototypeProperty) : new JsBoolean(PrototypeProperty)); } else // e.g., var foo = new Boolean(true); { if (parameters.Length > 0) { that.Value = parameters[0].ToBoolean(); } else { that.Value = false; } visitor.Return(that); } return that; }
public override JsObject Construct(JsInstance[] parameters, Type[] genericArgs, IJintVisitor visitor) { JsArray array = New(); if (parameters.Length == 1 && parameters[0].Class == CLASS_NUMBER) { var num = parameters[0].ToNumber(); if (Math.Abs(num - (int) num) > 0 || num < 0 || num >= int.MaxValue) { throw new JsException(Global.RangeErrorClass.New("Invalid array length")); } for (int i = 0; i < num; i++) { array.put(i, JsUndefined.Instance); } return array; } for (int i = 0; i < parameters.Length; i++) array.put(i, parameters[i]); // fast versin since it avoids a type conversion return array; }
public override JsInstance Execute(IJintVisitor visitor, JsDictionaryObject that, JsInstance[] parameters) { try { JsInstance result; switch (argLen) { case 0: result = impl.DynamicInvoke() as JsInstance; break; case 1: result = impl.DynamicInvoke(parameters[0].Value) as JsInstance; break; case 2: result = impl.DynamicInvoke(parameters[0].Value, parameters[1].Value) as JsInstance; break; default: throw new ArgumentOutOfRangeException("argLen"); } visitor.Return(result); return result; } catch (ArgumentException) { var constructor = that["constructor"] as JsFunction; throw new JsException(visitor.Global.TypeErrorClass.New("incompatible type: " + constructor == null ? "<unknown>" : constructor.Name)); } catch (Exception e) { if (e.InnerException is JsException) { throw e.InnerException; } throw; } }
public override JsInstance Execute( IJintVisitor visitor, JsDictionaryObject that, JsInstance[] parameters) { if (that == null || that as IGlobal == visitor.Global) { if ((uint)parameters.Length > 0U) { return(visitor.Return((JsInstance)this.New(parameters[0].ToNumber()))); } return(visitor.Return((JsInstance)this.New(0.0))); } if ((uint)parameters.Length > 0U) { that.Value = (object)parameters[0].ToNumber(); } else { that.Value = (object)0; } return(visitor.Return((JsInstance)that)); }
public override JsInstance Execute(IJintVisitor visitor, JsDictionaryObject that, JsInstance[] parameters) { if (parameters.Length == 0) { return(visitor.Return(New())); //throw new ArgumentNullException("pattern"); } bool g = false, m = false, ic = false; if (parameters.Length == 2) { string strParam = parameters[1].ToString(); if (strParam != null) { m = strParam.Contains("m"); ic = strParam.Contains("i"); g = strParam.Contains("g"); } } return(visitor.Return(New(parameters[0].ToString(), g, ic, m))); }
public override JsInstance Execute(IJintVisitor visitor, JsDictionaryObject that, JsInstance[] parameters) { // e.g., var foo = Boolean(true); if (that == null) { visitor.Return(parameters.Length > 0 ? new JsBoolean(parameters[0].ToBoolean()) : new JsBoolean()); } else // e.g., var foo = new Boolean(true); { if (parameters.Length > 0) { that.Value = parameters[0].ToBoolean(); } else { that.Value = false; } visitor.Return(that); } return(that); }
public override JsInstance Execute( IJintVisitor visitor, JsDictionaryObject that, JsInstance[] parameters) { if (that == null || that as IGlobal == visitor.Global) { visitor.Return(parameters.Length != 0 ? (JsInstance)this.New(parameters[0].ToString()) : (JsInstance)this.New()); } else { if ((uint)parameters.Length > 0U) { that.Value = (object)parameters[0].ToString(); } else { that.Value = (object)string.Empty; } visitor.Return((JsInstance)that); } return((JsInstance)that); }
public override JsInstance Execute( IJintVisitor visitor, JsDictionaryObject that, JsInstance[] parameters) { try { JsInstance result; if (this.hasParameters) { result = this.impl.DynamicInvoke((object)that, (object)parameters) as JsInstance; } else { result = this.impl.DynamicInvoke((object)that) as JsInstance; } visitor.Return(result); return(result); } catch (TargetInvocationException ex) { throw ex.InnerException; } catch (ArgumentException ex) { JsFunction jsFunction = that["constructor"] as JsFunction; throw new JsException((JsInstance)visitor.Global.TypeErrorClass.New("incompatible type: " + (object)jsFunction == null ? "<unknown>" : jsFunction.Name)); } catch (Exception ex) { if (ex.InnerException is JsException) { throw ex.InnerException; } throw; } }
public JsFunctionDelegate(IJintVisitor visitor, JsFunction function, JsDictionaryObject that, Type delegateType) { if (visitor == null) { throw new ArgumentNullException("visitor"); } if (function == null) { throw new ArgumentNullException("function"); } if (delegateType == null) { throw new ArgumentNullException("delegateType"); } if (!typeof(Delegate).IsAssignableFrom(delegateType)) { throw new ArgumentException("A delegate type is required", "delegateType"); } m_visitor = visitor; m_function = function; m_delegateType = delegateType; m_that = that; m_marshaller = visitor.Global.Marshaller; }
public override JsInstance Execute(IJintVisitor visitor, JsDictionaryObject that, JsInstance[] parameters) { try { JsInstance result; if (hasParameters) { result = impl.DynamicInvoke(new object[] { that, parameters }) as JsInstance; } else { result = impl.DynamicInvoke(new object[] { that }) as JsInstance; } visitor.Return(result); return(result); } catch (TargetInvocationException e) { throw e.InnerException; } catch (ArgumentException e) { var constructor = that.Prototype["constructor"] as JsFunction; throw new JsException(visitor.Global.TypeErrorClass.New("incompatible type: " + constructor == null ? "" : constructor.Name)); } catch (Exception e) { if (e.InnerException is JsException) { throw e.InnerException; } throw; } }
public override JsObject Construct(JsInstance[] parameters, Type[] genericArgs, IJintVisitor visitor) { JsFunction instance = New(); instance.Arguments = new List <string>(); for (int i = 0; i < parameters.Length - 1; i++) { string arg = parameters[i].ToString(); foreach (string a in arg.Split(',')) { instance.Arguments.Add(a.Trim()); } } if (parameters.Length >= 1) { Program p = JintEngine.Compile(parameters[parameters.Length - 1].Value.ToString(), visitor.DebugMode); instance.Statement = new BlockStatement() { Statements = p.Statements }; } return(instance); }
public override JsInstance Execute(IJintVisitor visitor, JsDictionaryObject that, JsInstance[] parameters) { return(visitor.Return(Construct(parameters, null, visitor))); }
public void ExecuteCallback(IJintVisitor visitor, object state, object args) { JsInstance[] jsPrameters = JsClr.ConvertParametersBack(visitor, new[] { state, args }); visitor.ExecuteFunction(this, null, jsPrameters); }
public JsComparer(IJintVisitor visitor, JsFunction function) { this.Visitor = visitor; this.Function = function; }
//13.2.2 public virtual JsObject Construct(JsInstance[] parameters, Type[] genericArgs, IJintVisitor visitor) { var instance = visitor.Global.ObjectClass.New(PrototypeProperty); visitor.ExecuteFunction(this, instance, parameters); return(visitor.Result as JsObject ?? instance); }
public virtual JsInstance Execute(IJintVisitor visitor, JsDictionaryObject that, JsInstance[] parameters) { Statement.Accept((IStatementVisitor)visitor); return(that); }
public override JsObject Construct(JsInstance[] parameters, Type[] genericArgs, IJintVisitor visitor) { JsArray array = New(); if (parameters.Length == 1 && parameters[0].Class == CLASS_NUMBER) { var num = parameters[0].ToNumber(); if (Math.Abs(num - (int)num) > 0 || num < 0 || num >= int.MaxValue) { throw new JsException(Global.RangeErrorClass.New("Invalid array length")); } for (int i = 0; i < num; i++) { array.put(i, JsUndefined.Instance); } return(array); } for (int i = 0; i < parameters.Length; i++) { array.put(i, parameters[i]); // fast versin since it avoids a type conversion } return(array); }
public static JsInstance[] ConvertParametersBack(IJintVisitor visitor, object[] args) { JsInstance[] jsParameters = new JsInstance[args.Length]; for (int j = 0; j < jsParameters.Length; j++) { // don't convert JsFunction as they will be translated to Delegates later jsParameters[j] = ConvertParameterBack(visitor, args[j]); } return jsParameters; }
public override JsInstance Execute(IJintVisitor visitor, JsDictionaryObject that, JsInstance[] parameters) { int clrParameterCount = Delegate.Method.GetParameters().Length; object[] clrParameters = new object[clrParameterCount]; for (int i = 0; i < parameters.Length; i++) { // First see if either the JsInstance or it's value can be directly accepted without converstion if (typeof(JsInstance).IsAssignableFrom(Parameters[i].ParameterType) && Parameters[i].ParameterType.IsInstanceOfType(parameters[i])) { clrParameters[i] = parameters[i]; } else if (Parameters[i].ParameterType.IsInstanceOfType(parameters[i].Value)) { clrParameters[i] = parameters[i].Value; } else { clrParameters[i] = JsClr.ConvertParameter(parameters[i]); } } object result; try { result = Delegate.DynamicInvoke(clrParameters); } catch (TargetInvocationException e) { throw e.InnerException; } catch (Exception e) { if (e.InnerException is JsException) { throw e.InnerException; } throw; } if (result != null) { // Don't wrap if the result should be a JsInstance if (typeof(JsInstance).IsInstanceOfType(result)) { visitor.Return((JsInstance)result); } else { visitor.Return(visitor.Global.WrapClr(result)); } } else { visitor.Return(JsUndefined.Instance); } return(null); }
public JsComparer(IJintVisitor visitor, JsFunction function) { Visitor = visitor; Function = function; }
public override JsInstance Execute(IJintVisitor visitor, JsDictionaryObject that, JsInstance[] parameters) { return(Execute(visitor, that, parameters, null)); }
public override JsObject Construct(JsInstance[] parameters, Type[] genericArgs, IJintVisitor visitor) { JsArray array = New(); for (int i = 0; i < parameters.Length; i++) { array.put(i, parameters[i]); // fast versin since it avoids a type conversion } return(array); }
public override JsObject Construct(JsInstance[] parameters, Type[] genericArgs, IJintVisitor visitor) { throw new JintException("This method can't be used as a constructor"); }
public override JsObject Construct(JsInstance[] parameters, Type[] genericArgs, IJintVisitor visitor) { return(parameters != null && parameters.Length > 0 ? visitor.Global.ErrorClass.New(parameters[0].ToString()) : visitor.Global.ErrorClass.New( )); }
public void ExecuteStandalone(IJintVisitor visitor, params object[] parameters) { JsInstance[] jsPrameters = JsClr.ConvertParametersBack(visitor, parameters); visitor.ExecuteFunction(this, null, jsPrameters); }
public virtual JsInstance Execute(IJintVisitor visitor, JsDictionaryObject that, JsInstance[] parameters, Type[] genericArguments) { throw new JintException("This method can't be called as a generic"); }
public override object Call(IJintVisitor visitor, string function, params JsInstance[] parameters) { visitor.ExecuteFunction(this[function] as JsFunction, this, parameters); return(visitor.Returned); }
public override JsInstance Execute(IJintVisitor visitor, JsDictionaryObject that, JsInstance[] parameters) { JsDate result = Construct(parameters); if (that == null) { return visitor.Return(ToStringImpl(result, JsInstance.EMPTY)); } return result; }
public override JsInstance Execute(IJintVisitor visitor, JsDictionaryObject that, JsInstance[] parameters) { visitor.CallFunction(Callee, that, parameters); return(visitor.Result); }
public static JsInstance ConvertParameterBack(IJintVisitor visitor, object parameter) { //if (parameter.Class != JsFunction.TYPEOF && parameter.Class != JsArray.TYPEOF) //{ // return parameter.Value; //} if (parameter == null) { return JsNull.Instance; } else { if (parameter.GetType().IsArray) { JsArray jsArray = visitor.Global.ArrayClass.New(); int index = -1; foreach (object value in (System.Collections.IEnumerable)parameter) { jsArray[(index++).ToString()] = ConvertParameterBack(visitor, value); } return jsArray; } else return visitor.Global.WrapClr(parameter); } }
public virtual JsInstance Execute(IJintVisitor visitor, JsDictionaryObject that, JsInstance[] parameters) { visitor.CallFunction(this, that, parameters); return(that); }
public override JsInstance Execute(IJintVisitor visitor, JsDictionaryObject that, JsInstance[] parameters) { visitor.CallFunction(Callee, that, parameters); return visitor.Result; }
public virtual JsInstance Execute(IJintVisitor visitor, JsDictionaryObject that, JsInstance[] parameters) { visitor.CallFunction(this, that, parameters); return that; }
public override JsInstance Execute(IJintVisitor visitor, JsDictionaryObject that, JsInstance[] parameters) { int clrParameterCount = Delegate.Method.GetParameters().Length; object[] clrParameters = new object[clrParameterCount]; for (int i = 0; i < parameters.Length; i++) { // First see if either the JsInstance or it's value can be directly accepted without converstion if (typeof(JsInstance).IsAssignableFrom(Parameters[i].ParameterType) && Parameters[i].ParameterType.IsInstanceOfType(parameters[i])) { clrParameters[i] = parameters[i]; } else if (Parameters[i].ParameterType.IsInstanceOfType(parameters[i].Value)) { clrParameters[i] = parameters[i].Value; } else { clrParameters[i] = visitor.Global.Marshaller.MarshalJsValue <object>(parameters[i]); } } object result; try { result = Delegate.DynamicInvoke(clrParameters); } catch (TargetInvocationException e) { throw e.InnerException; } catch (Exception e) { if (e.InnerException is JsException) { throw e.InnerException; } throw; } if (result != null) { // Don't wrap if the result should be a JsInstance if (typeof(JsInstance).IsInstanceOfType(result)) { visitor.Return((JsInstance)result); } else { TypeCode t = System.Type.GetTypeCode(result.GetType()); switch (t) { case TypeCode.Boolean: visitor.Return( visitor.Global.BooleanClass.New((bool)result)); break; case TypeCode.Char: case TypeCode.String: case TypeCode.Object: visitor.Return( visitor.Global.StringClass.New(result.ToString())); break; case TypeCode.DateTime: visitor.Return( visitor.Global.DateClass.New((DateTime)result)); break; case TypeCode.Byte: case TypeCode.Int16: case TypeCode.Int32: case TypeCode.Int64: case TypeCode.SByte: case TypeCode.UInt16: case TypeCode.UInt32: case TypeCode.UInt64: case TypeCode.Decimal: case TypeCode.Double: case TypeCode.Single: visitor.Return(visitor.Global.NumberClass.New( Convert.ToDouble(result))); break; case TypeCode.DBNull: case TypeCode.Empty: visitor.Return(JsNull.Instance); break; default: throw new NotSupportedException(); } } } else { visitor.Return(JsUndefined.Instance); } return(null); }