예제 #1
0
        public virtual IDynamic Call(IEnvironment environment, IDynamic thisBinding, IArgs args)
        {
            var oldContext = environment.Context;
            var newEnvironment = Scope.NewDeclarativeEnvironment();
            using (var newContext = environment.EnterContext())
            {
                newContext.LexicalEnviroment = newEnvironment;
                newContext.VariableEnviroment = newEnvironment;
                newContext.Strict = ExecutableCode.Strict;
                if (ExecutableCode.Strict)
                {
                    newContext.ThisBinding = thisBinding;
                }
                else
                {
                    switch (thisBinding.TypeCode)
                    {
                        case LanguageTypeCode.Undefined:
                        case LanguageTypeCode.Null:
                            newContext.ThisBinding = Environment.GlobalObject;
                            break;
                        default:
                            newContext.ThisBinding = thisBinding.ConvertToObject();
                            break;
                    }
                }

                BindFormalParameters(args);
                Environment.BindFunctionDeclarations(ExecutableCode.FunctionDeclarations, ExecutableCode.Strict, true);
                BindArgumentsObject(args);
                Environment.BindVariableDeclarations(ExecutableCode.VariableDeclarations, ExecutableCode.Strict, true);
                return ExecutableCode.Code(environment, args);
            }
        }
예제 #2
0
        internal static IDynamic Write(IEnvironment environment, IArgs args)
        {
            var value = args[0].ConvertToString().BaseValue;

            environment.Output.Write(value);
            return(environment.Undefined);
        }
예제 #3
0
        private static IDynamic Shift(IEnvironment environment, IArgs args)
        {
            var obj    = environment.Context.ThisBinding.ConvertToObject();
            var length = obj.Get("length").ConvertToUInt32().BaseValue;

            if (length == 0)
            {
                return(environment.Undefined);
            }
            var first = obj.Get("0");
            var from  = "";
            var to    = "";

            for (int i = 1; i < length; i++)
            {
                from = i.ToString();
                to   = (i - 1).ToString();
                if (obj.HasProperty(from))
                {
                    obj.Put(to, obj.Get(from), true);
                }
                else
                {
                    obj.Delete(to, true);
                }
            }
            obj.Delete((length - 1).ToString(), true);
            obj.Put("length", environment.CreateNumber(length - 1D), true);
            return(first);
        }
예제 #4
0
        internal static IDynamic Parse(IEnvironment environment, IArgs args)
        {
            var text    = args[0];
            var reviver = args[1];

            return(Machete.Compiler.JsonParser.Parse(environment, text, reviver));
        }
예제 #5
0
        private static IDynamic IsPrototypeOf(IEnvironment environment, IArgs args)
        {
            var value   = args[0] as LObject;
            var thisObj = environment.Context.ThisBinding.ConvertToObject();

            return(environment.CreateBoolean(value != null && value.Prototype != null && value.Prototype == thisObj));
        }
예제 #6
0
        internal static IDynamic Eval(IEnvironment environment, IArgs args)
        {
            var x = args[0];

            if (x.TypeCode != LanguageTypeCode.String)
            {
                return(x);
            }
            var compiler = new CompilerService(environment);
            var context  = environment.Context;
            var e        = compiler.CompileEvalCode(x.ConvertToString().BaseValue, context.Strict);

            using (var c = environment.EnterContext())
            {
                c.ThisBinding        = context.ThisBinding;
                c.LexicalEnviroment  = context.LexicalEnviroment;
                c.VariableEnviroment = context.VariableEnviroment;
                if (e.Strict)
                {
                    var s = context.LexicalEnviroment.NewDeclarativeEnvironment();
                    c.LexicalEnviroment  = s;
                    c.VariableEnviroment = s;
                }
                return(e.Code(environment, environment.EmptyArgs));
            }
        }
예제 #7
0
 public void OnbroadcastEvt(EventType eventType, IArgs args)
 {
     for (int i = 0; i < dispatchers.Count; i++)
     {
         dispatchers[i].OnInvokeEvt(eventType, args);
     }
 }
예제 #8
0
        internal static IDynamic DefineProperty(IEnvironment environment, IArgs args)
        {
            if (args[0].TypeCode != LanguageTypeCode.Object)
            {
                throw environment.CreateTypeError("");
            }
            var obj  = args[0].ConvertToObject();
            var name = args[1].ConvertToString().BaseValue;

            if (args.Count < 2)
            {
                var desc = environment.CreateGenericDescriptor(null, null);
                obj.DefineOwnProperty(name, desc, true);
            }
            else
            {
                var attributes = args[2] as IObject;
                if (attributes == null)
                {
                    throw environment.CreateTypeError("");
                }
                var desc = environment.ToPropertyDescriptor(attributes);
                obj.DefineOwnProperty(name, desc, true);
            }

            return(obj);
        }
예제 #9
0
        internal static IDynamic DecodeUri(IEnvironment environment, IArgs args)
        {
            const string reservedURISet = ";/?:@&=+$,#";
            var          uriString      = args[0].ConvertToString().BaseValue;

            return(environment.CreateString(Decode(environment, uriString, reservedURISet)));
        }
예제 #10
0
        internal static IDynamic Min(IEnvironment environment, IArgs args)
        {
            if (args.IsEmpty)
            {
                return(environment.CreateNumber(double.PositiveInfinity));
            }
            if (args.Count == 1)
            {
                return(args[0].ConvertToNumber());
            }

            var numbers = new INumber[args.Count];

            for (int i = 0; i < numbers.Length; i++)
            {
                var number = args[i].ConvertToNumber();
                if (double.IsNaN(number.BaseValue))
                {
                    return(environment.CreateNumber(double.NaN));
                }
                numbers[i] = number;
            }

            INumber r = null;

            foreach (var n in numbers)
            {
                if (r == null || r.Op_Greaterthan(n).ConvertToBoolean().BaseValue)
                {
                    r = n;
                }
            }
            return(r);
        }
예제 #11
0
        private static IDynamic ForEach(IEnvironment environment, IArgs args)
        {
            var obj        = environment.Context.ThisBinding.ConvertToObject();
            var callArgs   = new IDynamic[] { null, null, obj };
            var length     = (uint)obj.Get("length").ConvertToUInt32().BaseValue;
            var callbackfn = args[0] as ICallable;
            var thisArg    = args[1];

            if (callbackfn == null)
            {
                throw environment.CreateTypeError("The first parameter 'callbackfn' must be callable.");
            }

            for (uint i = 0; i < length; i++)
            {
                var key = i.ToString();
                if (obj.HasProperty(key))
                {
                    callArgs[0] = obj.Get(key);
                    callArgs[1] = environment.CreateNumber(i);
                    callbackfn.Call(environment, thisArg, environment.CreateArgs(callArgs));
                }
            }

            return(environment.Undefined);
        }
예제 #12
0
        private static IDynamic Filter(IEnvironment environment, IArgs args)
        {
            var result     = ((IConstructable)environment.ArrayConstructor).Construct(environment, environment.EmptyArgs);
            var obj        = environment.Context.ThisBinding.ConvertToObject();
            var length     = (uint)obj.Get("length").ConvertToUInt32().BaseValue;
            var callbackfn = args[0] as ICallable;
            var thisArg    = args[1];

            if (callbackfn == null)
            {
                throw environment.CreateTypeError("");
            }

            for (uint i = 0; i < length; i++)
            {
                var key = i.ToString();
                if (obj.HasProperty(key))
                {
                    var value    = obj.Get(key);
                    var callArgs = environment.CreateArgs(new[] { value, environment.CreateNumber(i), obj });
                    var include  = callbackfn.Call(environment, thisArg, callArgs);
                    if (include.ConvertToBoolean().BaseValue)
                    {
                        result.DefineOwnProperty(key, environment.CreateDataDescriptor(value, true, true, true), false);
                    }
                }
            }

            return(result);
        }
예제 #13
0
        private static IDynamic Map(IEnvironment environment, IArgs args)
        {
            var result     = ((IConstructable)environment.ArrayConstructor).Construct(environment, environment.EmptyArgs);
            var obj        = environment.Context.ThisBinding.ConvertToObject();
            var callArgs   = new IDynamic[] { null, null, obj };
            var length     = (uint)obj.Get("length").ConvertToUInt32().BaseValue;
            var callbackfn = args[0] as ICallable;
            var thisArg    = args[1];

            if (callbackfn == null)
            {
                throw environment.CreateTypeError("The first parameter 'callbackfn' must be callable.");
            }

            for (uint i = 0; i < length; i++)
            {
                var key = i.ToString();
                if (obj.HasProperty(key))
                {
                    callArgs[0] = obj.Get(key);
                    callArgs[1] = environment.CreateNumber(i);
                    var value = callbackfn.Call(environment, thisArg, environment.CreateArgs(callArgs));
                    result.DefineOwnProperty(key, environment.CreateDataDescriptor(value, true, true, true), false);
                }
            }

            return(result);
        }
        public void RunNewInstance(IPackage package)
        {
            string target = null;

            if (application.Args.SelfOriginalPath != null)
            {
                target = application.Args.SelfOriginalPath;
            }
            else
            {
                target = Directory
                         .EnumerateFiles(application.Args.Path, CurrentFileName, SearchOption.AllDirectories)
                         .FirstOrDefault();
            }

            if (target != null)
            {
                IArgs args = application.Args.Clone();

                args.IsSelfUpdate      = false;
                args.SelfUpdateVersion = null;

                string arguments = args.ToString();
                processes.Run(target, arguments);
            }
        }
예제 #15
0
        internal static IDynamic IsArray(IEnvironment environment, IArgs args)
        {
            // 15.4.3.2 Array.isArray ( arg )

            var arg = args[0] as IObject;
            return environment.CreateBoolean(arg != null && arg.Class == "Array");
        }
예제 #16
0
 public override IDynamic CreateIterator(IEnvironment environment, IArgs args)
 {
     var scope = Scope.NewDeclarativeEnvironment();
     var generator = new Generator(new GeneratorSteps(Steps));
     var iterator = new HGeneratorIterator(environment, generator, VariableDeclarations, scope);
     return iterator;
 }
예제 #17
0
        private static IDynamic Concat(IEnvironment environment, IArgs args)
        {
            var obj     = environment.Context.ThisBinding.ConvertToObject();
            var array   = environment.ArrayConstructor.Op_Construct(environment.EmptyArgs);
            var current = default(IDynamic);
            var count   = 0;

            for (int i = -1; i < args.Count; i++)
            {
                current = i < 0 ? obj : args[i];
                if (current.TypeCode != LanguageTypeCode.Object)
                {
                    var desc = environment.CreateDataDescriptor(current, true, true, true);
                    array.DefineOwnProperty((count++).ToString(), desc, false);
                }
                else
                {
                    var inner = current as NArray;
                    if (inner != null)
                    {
                        var length = (uint)inner.Get("length").ConvertToUInt32().BaseValue;
                        for (int j = 0; j < length; j++)
                        {
                            var key = j.ToString();
                            if (inner.HasProperty(key))
                            {
                                var desc = environment.CreateDataDescriptor(inner.Get(key), true, true, true);
                                array.DefineOwnProperty((count++).ToString(), desc, false);
                            }
                        }
                    }
                }
            }
            return(array);
        }
예제 #18
0
        private static IDynamic IndexOf(IEnvironment environment, IArgs args)
        {
            var obj    = environment.Context.ThisBinding.ConvertToObject();
            var length = (uint)obj.Get("length").ConvertToUInt32().BaseValue;

            if (length == 0)
            {
                return(environment.CreateNumber(-1));
            }

            var searchElement = args[0];
            var fromIndex     = (uint)Math.Max(Math.Floor(args[1].ConvertToNumber().BaseValue), 0D);

            if (fromIndex >= length)
            {
                return(environment.CreateNumber(-1));
            }

            for (uint i = 0; i < length; i++)
            {
                var key = i.ToString();
                if (obj.HasProperty(key))
                {
                    if (obj.Get(key).Op_StrictEquals(searchElement).ConvertToBoolean().BaseValue)
                    {
                        return(environment.CreateNumber(i));
                    }
                }
            }

            return(environment.CreateNumber(-1));
        }
예제 #19
0
        IDynamic Search(IEnvironment environment, IArgs args)
        {
            var o = environment.Context.ThisBinding;

            environment.CheckObjectCoercible(o);
            var s         = o.ConvertToString().BaseValue;
            var regexpArg = args[0];
            var regexpObj = regexpArg as NRegExp;

            if (regexpObj == null)
            {
                var constructor = (IConstructable)environment.RegExpConstructor;
                var pattern     = regexpArg.ConvertToString();
                regexpObj = (NRegExp)constructor.Construct(environment, environment.CreateArgs(new [] { pattern }));
            }
            var regExp = regexpObj.RegExpMatcher;
            var index  = 0;

            do
            {
                var result = regExp(s, index);
                if (result.success)
                {
                    return(environment.CreateNumber(index));
                }
            } while (++index < s.Length);
            return(environment.CreateNumber(-1));
        }
예제 #20
0
        private static IDynamic Unshift(IEnvironment environment, IArgs args)
        {
            var obj      = environment.Context.ThisBinding.ConvertToObject();
            var len      = (uint)obj.Get("length").ConvertToUInt32().BaseValue;
            var argCount = (uint)args.Count;
            var k        = len;

            while (k > 0)
            {
                var from = (k - 1).ToString();
                var to   = (k + argCount - 1).ToString();
                if (obj.HasProperty(from))
                {
                    var fromValue = obj.Get(from);
                    obj.Put(to, fromValue, true);
                }
                else
                {
                    obj.Delete(to, true);
                }
                k--;
            }
            for (int i = 0; i < argCount; i++)
            {
                obj.Put(i.ToString(), args[i], true);
            }
            var newLength = environment.CreateNumber(len + argCount);

            obj.Put("length", newLength, true);
            return(newLength);
        }
예제 #21
0
        internal static IDynamic IsFrozen(IEnvironment environment, IArgs args)
        {
            if (args[0].TypeCode != LanguageTypeCode.Object)
            {
                throw environment.CreateTypeError("");
            }
            var obj = args[0].ConvertToObject();

            foreach (var name in obj)
            {
                var desc = obj.GetOwnProperty(name);
                if (desc.Configurable ?? false)
                {
                    return(environment.False);
                }
                if (desc.IsDataDescriptor)
                {
                    if (desc.Writable ?? false)
                    {
                        return(environment.False);
                    }
                }
                obj.DefineOwnProperty(name, desc, true);
            }

            return(environment.CreateBoolean(!obj.Extensible));
        }
예제 #22
0
        // Spawns with given arguments and adds a collider
        public void SpawnBullet(IArgs args)
        {
            Bullet bullet = bulletPool.SpawnFromPool(args);

            bulletsAlive.Add(bullet);
            OnAddCollider?.Invoke(bullet);
        }
예제 #23
0
        internal static IDynamic EncodeUriComponent(IEnvironment environment, IArgs args)
        {
            const string unescapedURIComponentSet = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_.!~*'()";
            var          componentString          = args[0].ConvertToString().BaseValue;

            return(environment.CreateString(Encode(environment, componentString, unescapedURIComponentSet)));
        }
예제 #24
0
 internal static IDynamic Stringify(IEnvironment environment, IArgs args)
 {
     var value = args[0];
     var replacer = args[1];
     var space = args[2];
     return Machete.Compiler.JsonParser.Stringify(environment, value, replacer, space);
 }
예제 #25
0
        internal static IDynamic Now(IEnvironment environment, IArgs args)
        {
            var value         = environment.CreateNumber((DateTime.UtcNow - _utcStart).TotalMilliseconds);
            var constructArgs = environment.CreateArgs(new IDynamic[] { value });

            return(((IConstructable)environment.DateConstructor).Construct(environment, constructArgs));
        }
예제 #26
0
 private static IDynamic HasOwnProperty(IEnvironment environment, IArgs args)
 {
     if (args.IsEmpty) return environment.False;
     var obj = environment.Context.ThisBinding.ConvertToObject();
     var desc = obj.GetOwnProperty(args[0].ConvertToString().BaseValue);
     return environment.CreateBoolean(desc != null);
 }
예제 #27
0
        private IObject CreateArgumentsObject(IArgs args)
        {
            return(new HLazy(
                       Environment,
                       () =>
            {
                var obj = new NArguments(Environment);
                var len = Environment.CreateNumber(args.Count);
                var lenDesc = Environment.CreateDataDescriptor(len, true, false, true);
                var map = Environment.ObjectConstructor.Op_Construct(Environment.EmptyArgs);
                var mappedNames = new List <string>();
                var index = args.Count - 1;

                obj.Class = "Arguments";
                obj.Extensible = true;
                obj.Prototype = Environment.ObjectPrototype;
                obj.DefineOwnProperty("length", lenDesc, false);

                while (--index >= 0)
                {
                    var val = args[index];
                    var valDesc = Environment.CreateDataDescriptor(val, true, true, true);

                    obj.DefineOwnProperty(index.ToString(), valDesc, false);
                    if (index < FormalParameters.Count)
                    {
                        var name = FormalParameters[index];
                        if (!ExecutableCode.Strict)
                        {
                            var g = MakeArgGetter(name);
                            var p = MakeArgSetter(name);
                            var desc = Environment.CreateAccessorDescriptor(g, p, false, true);

                            map.DefineOwnProperty(name, desc, false);
                            mappedNames.Add(name);
                        }
                    }
                }

                if (mappedNames.Count > 0)
                {
                    obj.ParameterMap = map;
                }

                if (!ExecutableCode.Strict)
                {
                    var desc = Environment.CreateDataDescriptor(this, true, false, true);
                    obj.DefineOwnProperty("callee", desc, false);
                }
                else
                {
                    var desc = Environment.CreateAccessorDescriptor(Environment.ThrowTypeErrorFunction, Environment.ThrowTypeErrorFunction, false, false);
                    obj.DefineOwnProperty("caller", desc, false);
                    obj.DefineOwnProperty("callee", desc, false);
                }

                return obj;
            }
                       ));
        }
예제 #28
0
        public virtual IObject Construct(IEnvironment environment, IArgs args)
        {
            var obj = new LObject(environment);

            obj.Class      = "Object";
            obj.Extensible = true;

            var proto = Get("prototype");

            if (proto.TypeCode == LanguageTypeCode.Object)
            {
                obj.Prototype = (IObject)proto;
            }
            else
            {
                obj.Prototype = environment.ObjectPrototype;
            }

            var result = ((ICallable)this).Call(environment, obj, args);

            if (result.TypeCode == LanguageTypeCode.Object)
            {
                return((IObject)result);
            }

            return(obj);
        }
예제 #29
0
        internal static IDynamic SetTime(IEnvironment environment, IArgs args)
        {
            var dt = (NDate)environment.Context.ThisBinding;
            var v  = TimeClip(args[0].ConvertToNumber().BaseValue);

            dt.PrimitiveValue = environment.CreateNumber(v);
            return(dt.PrimitiveValue);
        }
예제 #30
0
        internal static IDynamic Stringify(IEnvironment environment, IArgs args)
        {
            var value    = args[0];
            var replacer = args[1];
            var space    = args[2];

            return(Machete.Compiler.JsonParser.Stringify(environment, value, replacer, space));
        }
예제 #31
0
 public IDynamic Call(IEnvironment environment, IDynamic thisBinding, IArgs args)
 {
     using (var newContext = environment.EnterContext())
     {
         Environment.Context.ThisBinding = thisBinding;
         return _code(environment, args);
     }
 }
예제 #32
0
 public IDynamic Call(IEnvironment environment, IDynamic thisBinding, IArgs args)
 {
     using (var newContext = environment.EnterContext())
     {
         Environment.Context.ThisBinding = thisBinding;
         return(_code(environment, args));
     }
 }
예제 #33
0
 protected override sealed IDynamic Call(IEnvironment environment, IArgs args)
 {
     if (args.Count > 0)
     {
         return args[0].ConvertToNumber();
     }
     return environment.CreateNumber(0.0);
 }
        public void Update(IPackage latest)
        {
            string current   = Assembly.GetExecutingAssembly().Location;
            string temp      = CopySelfToTemp(current);
            IArgs  arguments = CreateArguments(current, latest);

            RerunFromTemp(temp, arguments);
        }
예제 #35
0
        /// <summary>
        /// Error for invalid operand(s) to operator
        /// </summary>
        /// <param name="token"></param>
        /// <param name="required"></param>
        /// <param name="given"></param>
        public void OperandError(IToken token, IArgs required, Type[] given)
        {
            string haveTypes     = string.Join(" and ", given.Select(t => "'" + TypeName(t) + "'"));
            string expectedTypes = string.Join(" and ", required.Types.Select(t => "'" + TypeName(t) + "'"));
            string arity         = required.Arity == 1 ? "unary " : required.Arity == 2 ? "binary " : string.Empty;

            this.Error(token, string.Format(CultureInfo.InvariantCulture, "Invalid operands to {0}operator '{1}': have {2}, expected {3}", arity, token.Text, haveTypes, expectedTypes));
        }
예제 #36
0
 public override IDynamic Current(IEnvironment environment, IArgs args)
 {
     if (!_initialized)
     {
         throw environment.CreateTypeError("");
     }
     return(_array.Get(_index.ToString()));
 }
예제 #37
0
 protected override sealed IDynamic Call(IEnvironment environment, IArgs args)
 {
     if (args.Count > 0)
     {
         return args[0].ConvertToString();
     }
     return environment.CreateString("");
 }
예제 #38
0
        internal static IDynamic IsArray(IEnvironment environment, IArgs args)
        {
            // 15.4.3.2 Array.isArray ( arg )

            var arg = args[0] as IObject;

            return(environment.CreateBoolean(arg != null && arg.Class == "Array"));
        }
예제 #39
0
 public override IObject Construct(IEnvironment environment, IArgs args)
 {
     var func = TargetFunction as NFunction;
     if (func == null)
     {
         throw Environment.CreateTypeError("");
     }
     return func.Construct(environment, environment.ConcatArgs(BoundArguments, args));
 }
예제 #40
0
 protected override sealed IDynamic Call(IEnvironment environment, IArgs args)
 {
     var patternObject = args[0] as IObject;
     if (patternObject != null && patternObject.Class == "RegExp")
     {
         return patternObject;
     }
     return Construct(environment, args);
 }
예제 #41
0
 internal static IDynamic FromCharCode(IEnvironment environment, IArgs args)
 {
     var sb = new StringBuilder(args.Count);
     foreach (var arg in args)
     {
         sb.Append((char)arg.ConvertToUInt16().BaseValue);
     }
     return environment.CreateString(sb.ToString());
 }
예제 #42
0
 public override IObject Construct(IEnvironment environment, IArgs args)
 {
     var obj = new NBoolean(environment);
     obj.Class = "Boolean";
     obj.Extensible = true;
     obj.PrimitiveValue = args[0].ConvertToBoolean();
     obj.Prototype = environment.BooleanPrototype;
     return obj;
 }
예제 #43
0
 internal static IDynamic Assert(IEnvironment environment, IArgs args)
 {
     var condition = args[0].ConvertToBoolean().BaseValue;
     if (!condition)
     {
         var message = args[1].ConvertToString().BaseValue;
         throw environment.CreateError(message);
     }
     return environment.Undefined;
 }
예제 #44
0
 public override IDynamic Next(IEnvironment environment, IArgs args)
 {
     if (_complete)
         return environment.False;
     _initialized = true;
     if (++_index < _length)
         return environment.True;
     _complete = true;
     return environment.False;
 }
예제 #45
0
 internal static IDynamic Filter(IEnvironment environment, IArgs args)
 {
     if (args.Count < 2)
         throw environment.CreateTypeError("The arguments 'iterable' and 'predicate' are required.");
     var iterable = args[1].ConvertToObject();
     var predicate = args[0].ConvertToObject() as ICallable;
     if (predicate == null)
         throw environment.CreateTypeError("The argument 'predicate' must be a callable function.");
     return new HFilterIterable(environment, iterable, predicate);
 }
예제 #46
0
 internal static IDynamic Asin(IEnvironment environment, IArgs args)
 {
     double x = args[0].ConvertToNumber().BaseValue;
     if (double.IsNaN(x))
         return environment.CreateNumber(double.NaN);
     if (x > 1.0 || x < -1.0)
         return environment.CreateNumber(double.NaN);
     if (x == 0.0)
         return environment.CreateNumber(x);
     return environment.CreateNumber(Math.Asin(x));
 }
예제 #47
0
 internal static IDynamic Abs(IEnvironment environment, IArgs args)
 {
     double x = args[0].ConvertToNumber().BaseValue;
     if (double.IsNaN(x))
         return environment.CreateNumber(double.NaN);
     if (IsNegativeZero(x))
         return environment.CreateNumber(0.0);
     if (double.IsNegativeInfinity(x))
         return environment.CreateNumber(double.PositiveInfinity);
     return environment.CreateNumber(Math.Abs(x));
 }
예제 #48
0
        public override sealed IObject Construct(IEnvironment environment, IArgs args)
        {
            var patternArg = args[0];
            var flagsArg = args[1];
            var pattern = "";
            var flags = "";
            bool global, ignoreCase, multiline;

            var patternObject = patternArg as IObject;
            if (patternObject != null && patternObject.Class == "RegExp")
            {
                if (flagsArg.TypeCode != LanguageTypeCode.Undefined)
                {
                    throw environment.CreateTypeError("");
                }
                global = ((IBoolean)patternObject.Get("global")).BaseValue;
                ignoreCase = ((IBoolean)patternObject.Get("ignoreCase")).BaseValue;
                multiline = ((IBoolean)patternObject.Get("multiline")).BaseValue;
                pattern = ((IString)patternObject.Get("source")).BaseValue;
                if (global) flags += "g";
                if (ignoreCase) flags += "i";
                if (multiline) flags += "m";
            }
            else
            {
                if (patternArg.TypeCode != LanguageTypeCode.Undefined)
                {
                    pattern = patternArg.ConvertToString().BaseValue;
                }
                if (flagsArg.TypeCode != LanguageTypeCode.Undefined)
                {
                    flags = flagsArg.ConvertToString().BaseValue;
                }
                global = flags.Contains("g");
                ignoreCase = flags.Contains("i");
                multiline = flags.Contains("m");
            }

            var regExpObj = new NRegExp(environment);
            regExpObj.Class = "RegExp";
            regExpObj.Extensible = true;
            regExpObj.Prototype = environment.RegExpPrototype;
            regExpObj.Body = pattern;
            regExpObj.Flags = flags;
            regExpObj.RegExpMatcher = Machete.Compiler.RegExpParser.Parse(Environment, pattern, flags);
            regExpObj.DefineOwnProperty("source", environment.CreateDataDescriptor(environment.CreateString(pattern), false, false, false), false);
            regExpObj.DefineOwnProperty("global", environment.CreateDataDescriptor(environment.CreateBoolean(global), false, false, false), false);
            regExpObj.DefineOwnProperty("ignoreCase", environment.CreateDataDescriptor(environment.CreateBoolean(ignoreCase), false, false, false), false);
            regExpObj.DefineOwnProperty("multiline", environment.CreateDataDescriptor(environment.CreateBoolean(multiline), false, false, false), false);
            regExpObj.DefineOwnProperty("lastIndex", environment.CreateDataDescriptor(environment.CreateNumber(0.0), true, false, false), false);
            return regExpObj;
        }
예제 #49
0
 internal static IDynamic Iterate(IEnvironment environment, IArgs args)
 {
     var iterator = new Iterator(environment, args[1]);
     var callback = args[0] as ICallable;
     if (callback == null)
         throw environment.CreateTypeError("The argument 'callback' must be a callable function.");
     while (iterator.Next())
     {
         var callArgs = environment.CreateArgs(new[] { iterator.Current });
         callback.Call(environment, environment.Undefined, callArgs);
     }
     return environment.Undefined;
 }
예제 #50
0
        public override IObject Construct(IEnvironment environment, IArgs args)
        {
            var r = new NDate(environment);
            r.Class = "Date";
            r.Extensible = true;
            r.Prototype = environment.DatePrototype;

            var argCount = args.Count;
            double timeValue = 0.0;
            if (argCount == 0)
            {
                timeValue = (DateTime.UtcNow - _utcStart).TotalMilliseconds;
            }
            else if (argCount == 1)
            {
                var value = args[0].ConvertToPrimitive(null);
                if (value.TypeCode == LanguageTypeCode.String)
                {
                    timeValue = Parse(environment, args).ConvertToNumber().BaseValue;
                }
                else
                {
                    timeValue = value.ConvertToNumber().BaseValue;
                }
            }
            else
            {
                var year = args[0].ConvertToNumber().ConvertToInteger().BaseValue;
                var month = args[1].ConvertToNumber().BaseValue;
                var date = argCount > 2 ? args[2].ConvertToNumber().BaseValue : 1.0;
                var hours = argCount > 3 ? args[3].ConvertToNumber().BaseValue : 0.0;
                var minutes = argCount > 4 ? args[4].ConvertToNumber().BaseValue : 0.0;
                var seconds = argCount > 5 ? args[5].ConvertToNumber().BaseValue : 0.0;
                var ms = argCount > 6 ? args[6].ConvertToNumber().BaseValue : 0.0;

                if (!double.IsNaN(year) && year >= 0.0 && year <= 99)
                {
                    year = 1900.0 + year;
                }

                var dayPortion = PDate.MakeDay(year, month, date);
                var timePortion = PDate.MakeTime(hours, minutes, seconds, ms);
                var dateValue = PDate.MakeDate(dayPortion, timePortion);

                timeValue = PDate.TimeClip(PDate.UTC(dateValue));
            }

            r.PrimitiveValue = environment.CreateNumber(PDate.TimeClip(timeValue));
            return r;
        }
예제 #51
0
 public override IDynamic Next(IEnvironment environment, IArgs args)
 {
     if (_complete)
         return environment.False;
     _initialized = true;
     while (_iterator.Next())
     {
         var callArgs = environment.CreateArgs(new[] { _iterator.Current });
         _current = _mapping.Call(environment, environment.Undefined, callArgs);
         return environment.True;
     }
     _complete = true;
     return environment.False;
 }
예제 #52
0
        IDynamic Exec(IEnvironment environment, IArgs args)
        {
            var r = (NRegExp)environment.Context.ThisBinding;
            var s = args[0].ConvertToString().BaseValue;
            var length = s.Length;
            var global = r.Get("global").ConvertToBoolean().BaseValue;
            var i = !global ? 0 : (int)r.Get("lastIndex").ConvertToInteger().BaseValue;
            int beginIndex = 0;
            MatchResult result;

            while (true)
            {
                beginIndex = i;
                if (i < 0 || i > length)
                {
                    r.Put("length", environment.CreateNumber(0.0), true);
                    return environment.Null;
                }
                result = r.RegExpMatcher(s, i);
                if (result.success) break;
                i++;
            }

            if (global)
            {
                r.Put("length", environment.CreateNumber(result.matchState.endIndex), true);
            }

            var captures = result.matchState.captures;
            var n = captures.Length;
            var array = ((IConstructable)environment.ArrayConstructor).Construct(environment, environment.EmptyArgs);

            array.DefineOwnProperty("index", environment.CreateDataDescriptor(environment.CreateNumber(beginIndex), true, true, true), true);
            array.DefineOwnProperty("input", environment.CreateDataDescriptor(environment.CreateString(s), true, true, true), true);
            array.DefineOwnProperty("length", environment.CreateDataDescriptor(environment.CreateNumber(n + 1), null, null, null), true);

            IDynamic value = environment.CreateString(result.matchState.input.Substring(beginIndex, result.matchState.endIndex - beginIndex));
            var desc = environment.CreateDataDescriptor(value, true, true, true);
            array.DefineOwnProperty("0", desc, true);

            for (int index = 0; index < n; index++)
            {
                var v = captures[index];
                value = v == null ? (IDynamic)environment.Undefined : (IDynamic)environment.CreateString(v);
                desc = environment.CreateDataDescriptor(value, true, true, true);
                array.DefineOwnProperty((index + 1).ToString(), desc, true);
            }

            return array;
        }
예제 #53
0
 public override IDynamic Next(IEnvironment environment, IArgs args)
 {
     if (_complete)
         return environment.False;
     _initialized = true;
     while (_iterator.Next())
     {
         var callArgs = environment.CreateArgs(new[] { _iterator.Current });
         if (_predicate.Call(environment, environment.Undefined, callArgs).ConvertToBoolean().BaseValue)
             return environment.True;
     }
     _complete = true;
     return environment.False;
 }
예제 #54
0
 public override IObject Construct(IEnvironment environment, IArgs args)
 {
     var message = args[0].ConvertToString();
     if (message.BaseValue == "undefined")
     {
         message = environment.CreateString("");
     }
     var error = new NError(environment);
     error.Class = "Error";
     error.Extensible = true;
     error.Prototype = environment.ErrorPrototype;
     error.Put("message", message, false);
     return error;
 }
예제 #55
0
 internal static IDynamic DefineProperties(IEnvironment environment, IArgs args)
 {
     if (args[0].TypeCode != LanguageTypeCode.Object)
     {
         throw environment.CreateTypeError("");
     }
     var obj = args[0].ConvertToObject();
     var props = args[1].ConvertToObject();
     foreach (var name in props)
     {
         var desc = environment.ToPropertyDescriptor(props.Get(name).ConvertToObject());
         obj.DefineOwnProperty(name, desc, true);
     }
     return obj;
 }
예제 #56
0
        public override sealed IObject Construct(IEnvironment environment, IArgs args)
        {
            var obj = new NString(environment);
            {
                var str = args.Count > 0 ? args[0].ConvertToString() : environment.CreateString("");
                var len = environment.CreateNumber(str.BaseValue.Length);
                var lenDesc = environment.CreateDataDescriptor(len, false, false, false);

                obj.Class = "String";
                obj.Extensible = true;
                obj.Prototype = environment.StringPrototype;
                obj.PrimitiveValue = str;
                obj.DefineOwnProperty("length", lenDesc, false);
            }
            return obj;
        }
예제 #57
0
 public override IDynamic Next(IEnvironment environment, IArgs args)
 {
     if (Generator.Complete)
         return environment.CreateBoolean(false);
     environment.Context.LexicalEnviroment = Scope;
     environment.Context.VariableEnviroment = Scope;
     if (!Generator.Initialized)
     {
         environment.BindVariableDeclarations(VariableDeclarations, true, true);
         Generator.Initialized = true;
     }
     var step = Generator.Steps.Dequeue();
     var iterated = step(environment, Generator);
     Generator.Complete = !iterated || Generator.Steps.Count == 0;
     return environment.CreateBoolean(iterated);
 }
예제 #58
0
 public override sealed IObject Construct(IEnvironment environment, IArgs args)
 {
     var obj = new NNumber(environment);
     obj.Class = "Number";
     obj.Extensible = true;
     obj.Prototype = environment.NumberPrototype;
     if (args.Count > 0)
     {
         obj.PrimitiveValue = args[0].ConvertToNumber();
     }
     else
     {
         obj.PrimitiveValue = environment.CreateNumber(0.0);
     }
     return obj;
 }
예제 #59
0
 private static IDynamic ValueOf(IEnvironment environment, IArgs args)
 {
     var v = environment.Context.ThisBinding;
     switch (v.TypeCode)
     {
         case LanguageTypeCode.Boolean:
             return v;
         case LanguageTypeCode.Object:
             var o = (IObject)v;
             if (o.Class == "Boolean")
             {
                 return ((IPrimitiveWrapper)o).PrimitiveValue;
             }
             break;
     }
     throw environment.CreateTypeError("");
 }
예제 #60
0
 private static IDynamic ToString(IEnvironment environment, IArgs args)
 {
     var v = environment.Context.ThisBinding;
     switch (v.TypeCode)
     {
         case LanguageTypeCode.Boolean:
             return environment.CreateString(((IBoolean)v).BaseValue ? "true" : "false");
         case LanguageTypeCode.Object:
             var o = (IObject)v;
             if (o.Class == "Boolean")
             {
                 return environment.CreateString(((IBoolean)((IPrimitiveWrapper)o).PrimitiveValue).BaseValue ? "true" : "false");
             }
             break;
     }
     throw environment.CreateTypeError("");
 }