Ejemplo n.º 1
0
        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);
            }
        }
Ejemplo n.º 2
0
        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;
        }
Ejemplo n.º 3
0
        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));
                }
            }
        }
Ejemplo n.º 4
0
        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;
        }
Ejemplo n.º 5
0
 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));
             }
         }
     }
 }
Ejemplo n.º 6
0
        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;
        }
Ejemplo n.º 7
0
        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;
        }
Ejemplo n.º 8
0
        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;
        }
Ejemplo n.º 9
0
        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));
        }
Ejemplo n.º 10
0
        public JsClr(IJintVisitor visitor)
        {
            _global = visitor.Global;
            _propertyGetter = visitor.PropertyGetter;
            _fieldGetter = visitor.FieldGetter;
            _entityAccessor = visitor.EntityAccessor;

            value = null;
        }
Ejemplo n.º 11
0
        public JsClr(IJintVisitor visitor)
        {
            this.global = visitor.Global;
            this.propertyGetter = visitor.PropertyGetter;
            this.methodGetter = visitor.MethodGetter;
            this.fieldGetter = visitor.FieldGetter;
            value = null;

        }
Ejemplo n.º 12
0
        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);
            }
        }
Ejemplo n.º 13
0
 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;
     }
 }
Ejemplo n.º 14
0
        /// <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);
        }
Ejemplo n.º 15
0
        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;
        }
Ejemplo n.º 16
0
        /// <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);
        }
Ejemplo n.º 17
0
        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;
            }
        }
Ejemplo n.º 18
0
 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;
 }
Ejemplo n.º 19
0
        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;
        }
Ejemplo n.º 20
0
        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));
        }
Ejemplo n.º 21
0
        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;
        }
Ejemplo n.º 22
0
        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;
        }
Ejemplo n.º 23
0
		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;
			}
		}
Ejemplo n.º 24
0
 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));
 }
Ejemplo n.º 25
0
        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)));
        }
Ejemplo n.º 26
0
        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);
        }
Ejemplo n.º 27
0
 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);
 }
Ejemplo n.º 28
0
 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;
     }
 }
Ejemplo n.º 29
0
 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;
 }
Ejemplo n.º 30
0
        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;
            }
        }
Ejemplo n.º 31
0
        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);
        }
Ejemplo n.º 32
0
 public override JsInstance Execute(IJintVisitor visitor, JsDictionaryObject that, JsInstance[] parameters)
 {
     return(visitor.Return(Construct(parameters, null, visitor)));
 }
Ejemplo n.º 33
0
        public void ExecuteCallback(IJintVisitor visitor, object state, object args)
        {
            JsInstance[] jsPrameters = JsClr.ConvertParametersBack(visitor, new[] { state, args });

            visitor.ExecuteFunction(this, null, jsPrameters);
        }
Ejemplo n.º 34
0
 public JsComparer(IJintVisitor visitor, JsFunction function)
 {
     this.Visitor  = visitor;
     this.Function = function;
 }
Ejemplo n.º 35
0
        //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);
        }
Ejemplo n.º 36
0
 public virtual JsInstance Execute(IJintVisitor visitor, JsDictionaryObject that, JsInstance[] parameters)
 {
     Statement.Accept((IStatementVisitor)visitor);
     return(that);
 }
Ejemplo n.º 37
0
        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);
        }
Ejemplo n.º 38
0
 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;
 }
Ejemplo n.º 39
0
        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;
 }
Ejemplo n.º 41
0
 public override JsInstance Execute(IJintVisitor visitor, JsDictionaryObject that, JsInstance[] parameters)
 {
     return(Execute(visitor, that, parameters, null));
 }
Ejemplo n.º 42
0
        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);
        }
Ejemplo n.º 43
0
 public override JsObject Construct(JsInstance[] parameters, Type[] genericArgs, IJintVisitor visitor)
 {
     throw new JintException("This method can't be used as a constructor");
 }
Ejemplo n.º 44
0
 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( ));
 }
Ejemplo n.º 45
0
        public void ExecuteStandalone(IJintVisitor visitor, params object[] parameters)
        {
            JsInstance[] jsPrameters = JsClr.ConvertParametersBack(visitor, parameters);

            visitor.ExecuteFunction(this, null, jsPrameters);
        }
Ejemplo n.º 46
0
        public void ExecuteStandalone(IJintVisitor visitor, params object[] parameters)
        {
            JsInstance[] jsPrameters = JsClr.ConvertParametersBack(visitor, parameters);

            visitor.ExecuteFunction(this, null, jsPrameters);
        }
Ejemplo n.º 47
0
 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);
 }
Ejemplo n.º 49
0
        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;
        }
Ejemplo n.º 50
0
 public override JsInstance Execute(IJintVisitor visitor, JsDictionaryObject that, JsInstance[] parameters)
 {
     visitor.CallFunction(Callee, that, parameters);
     return(visitor.Result);
 }
Ejemplo n.º 51
0
        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);
            }

        }
Ejemplo n.º 52
0
 public virtual JsInstance Execute(IJintVisitor visitor, JsDictionaryObject that, JsInstance[] parameters)
 {
     visitor.CallFunction(this, that, parameters);
     return(that);
 }
Ejemplo n.º 53
0
 public override JsInstance Execute(IJintVisitor visitor, JsDictionaryObject that, JsInstance[] parameters)
 {
     visitor.CallFunction(Callee, that, parameters);
     return visitor.Result;
 }
Ejemplo n.º 54
0
        public void ExecuteCallback(IJintVisitor visitor, object state, object args)
        {
            JsInstance[] jsPrameters = JsClr.ConvertParametersBack(visitor, new[] { state, args });

            visitor.ExecuteFunction(this, null, jsPrameters);
        }
Ejemplo n.º 55
0
 public virtual JsInstance Execute(IJintVisitor visitor, JsDictionaryObject that, JsInstance[] parameters)
 {
     visitor.CallFunction(this, that, parameters);
     return that;
 }
Ejemplo n.º 56
0
        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);
        }