Esempio n. 1
0
        public RegExpInstance Construct(string regExp)
        {
            var r = new RegExpInstance(Engine);

            r.Prototype  = PrototypeObject;
            r.Extensible = true;

            var segments = regExp.Split('/');

            var pattern = segments[1];
            var flags   = segments[2];

            var options = ParseOptions(r, flags);

            try
            {
                r.Value = new Regex(pattern, options);
            }
            catch (Exception e)
            {
                throw new JavaScriptException(Engine.SyntaxError, e.Message);
            }

            r.Flags  = flags;
            r.Source = System.String.IsNullOrEmpty(pattern) ? "(?:)" : pattern;

            r.FastAddProperty("global", r.Global, false, false, false);
            r.FastAddProperty("ignoreCase", r.IgnoreCase, false, false, false);
            r.FastAddProperty("multiline", r.Multiline, false, false, false);
            r.FastAddProperty("source", r.Source, false, false, false);
            r.FastAddProperty("lastIndex", 0, true, false, false);

            return(r);
        }
        public RegExpInstance Construct(string regExp, Engine engine)
        {
            var r = new RegExpInstance(Engine);

            r._prototype = PrototypeObject;

            var scanner = new Scanner(regExp, new ParserOptions {
                AdaptRegexp = true
            });
            var body  = (string)scanner.ScanRegExpBody().Value;
            var flags = (string)scanner.ScanRegExpFlags().Value;

            r.Value = scanner.TestRegExp(body, flags);

            var timeout = engine.Options._RegexTimeoutInterval;

            if (timeout.Ticks > 0)
            {
                r.Value = new Regex(r.Value.ToString(), r.Value.Options);
            }

            r.Flags  = flags;
            r.Source = string.IsNullOrEmpty(body) ? "(?:)" : body;

            RegExpInitialize(r);

            return(r);
        }
Esempio n. 3
0
        /// <summary>
        /// http://www.ecma-international.org/ecma-262/5.1/#sec-7.8.5
        /// http://www.ecma-international.org/ecma-262/5.1/#sec-15.10.4
        /// </summary>
        /// <param name="arguments"></param>
        /// <returns></returns>
        public ObjectInstance Construct(JsValue[] arguments)
        {
            string p;
            string f;

            var pattern = arguments.At(0);
            var flags   = arguments.At(1);

            var r = pattern.TryCast <RegExpInstance>();

            if (flags.IsUndefined() && !ReferenceEquals(r, null))
            {
                return(r);
            }

            if (!flags.IsUndefined() && !ReferenceEquals(r, null))
            {
                ExceptionHelper.ThrowTypeError(Engine);
            }

            if (pattern.IsUndefined())
            {
                p = "";
            }
            else
            {
                p = TypeConverter.ToString(pattern);
            }

            f = !flags.IsUndefined() ? TypeConverter.ToString(flags) : "";

            r            = new RegExpInstance(Engine);
            r.Prototype  = PrototypeObject;
            r.Extensible = true;

            try
            {
                var options = new Scanner("").ParseRegexOptions(f);
                r.Value = new Regex(p, options);
            }
            catch (Exception e)
            {
                ExceptionHelper.ThrowSyntaxError(_engine, e.Message);
            }

            var s = p;

            if (string.IsNullOrEmpty(s))
            {
                s = "(?:)";
            }

            r.Flags  = f;
            r.Source = s;
            AssignFlags(r, f);

            SetRegexProperties(r);

            return(r);
        }
Esempio n. 4
0
        public RegExpInstance Construct(string regExp)
        {
            var r = new RegExpInstance(Engine);

            r.Prototype  = PrototypeObject;
            r.Extensible = true;

            if (regExp[0] != '/')
            {
                throw new JavaScriptException(Engine.SyntaxError, "Regexp should start with slash");
            }
            var lastSlash = regExp.LastIndexOf('/');
            // Unescape escaped forward slashes (\/)
            var pattern = regExp.Substring(1, lastSlash - 1).Replace("\\/", "/");
            var flags   = regExp.Substring(lastSlash + 1);

            var options = ParseOptions(r, flags);

            try
            {
                if ((RegexOptions.Multiline & options) == RegexOptions.Multiline)
                {
                    // Router all non-escaped $ occurences by \r?$
                    // c.f. http://programmaticallyspeaking.com/regular-expression-multiline-mode-whats-a-newline.html

                    int index      = 0;
                    var newPattern = pattern;
                    while ((index = newPattern.IndexOf("$", index)) != -1)
                    {
                        if (index > 0 && newPattern[index - 1] != '\\')
                        {
                            newPattern = newPattern.Substring(0, index) + @"\r?" + newPattern.Substring(index);
                            index     += 4;
                        }
                    }

                    r.Value = new Regex(newPattern, options);
                }
                else
                {
                    r.Value = new Regex(pattern, options);
                }
            }
            catch (Exception e)
            {
                throw new JavaScriptException(Engine.SyntaxError, e.Message);
            }

            r.Flags  = flags;
            r.Source = System.String.IsNullOrEmpty(pattern) ? "(?:)" : pattern;

            r.FastAddProperty("global", r.Global, false, false, false);
            r.FastAddProperty("ignoreCase", r.IgnoreCase, false, false, false);
            r.FastAddProperty("multiline", r.Multiline, false, false, false);
            r.FastAddProperty("source", r.Source, false, false, false);
            r.FastAddProperty("lastIndex", 0, true, false, false);

            return(r);
        }
Esempio n. 5
0
 private static void SetRegexProperties(RegExpInstance r)
 {
     r.SetOwnProperty("global", new PropertyDescriptor(r.Global, PropertyFlag.AllForbidden));
     r.SetOwnProperty("ignoreCase", new PropertyDescriptor(r.IgnoreCase, PropertyFlag.AllForbidden));
     r.SetOwnProperty("multiline", new PropertyDescriptor(r.Multiline, PropertyFlag.AllForbidden));
     r.SetOwnProperty("source", new PropertyDescriptor(r.Source, PropertyFlag.AllForbidden));
     r.SetOwnProperty("lastIndex", new PropertyDescriptor(0, PropertyFlag.OnlyWritable));
 }
        private RegExpInstance RegExpAlloc()
        {
            var r = new RegExpInstance(Engine)
            {
                _prototype = PrototypeObject
            };

            return(r);
        }
Esempio n. 7
0
        private RegexOptions ParseOptions(RegExpInstance r, string flags)
        {
            for (int k = 0; k < flags.Length; k++)
            {
                var c = flags[k];
                if (c == 'g')
                {
                    if (r.Global)
                    {
                        throw new JavaScriptException(Engine.SyntaxError);
                    }

                    r.Global = true;
                }
                else if (c == 'i')
                {
                    if (r.IgnoreCase)
                    {
                        throw new JavaScriptException(Engine.SyntaxError);
                    }

                    r.IgnoreCase = true;
                }
                else if (c == 'm')
                {
                    if (r.Multiline)
                    {
                        throw new JavaScriptException(Engine.SyntaxError);
                    }

                    r.Multiline = true;
                }
                else
                {
                    throw new JavaScriptException(Engine.SyntaxError);
                }
            }

            var options = RegexOptions.ECMAScript;

            if (r.Multiline)
            {
                options = options | RegexOptions.Multiline;
            }

            if (r.IgnoreCase)
            {
                options = options | RegexOptions.IgnoreCase;
            }

            return(options);
        }
Esempio n. 8
0
        public RegExpInstance Construct(Regex regExp, string flags)
        {
            var r = new RegExpInstance(Engine);

            r.Prototype  = PrototypeObject;
            r.Extensible = true;

            r.Flags = flags;
            AssignFlags(r, flags);

            r.Source = regExp.ToString();
            r.Value  = regExp;

            SetRegexProperties(r);

            return(r);
        }
Esempio n. 9
0
        private static void AssignFlags(RegExpInstance r, string flags)
        {
            for (var i = 0; i < flags.Length; i++)
            {
                switch (flags[i])
                {
                case 'i':
                    r.IgnoreCase = true;
                    break;

                case 'm':
                    r.Multiline = true;
                    break;

                case 'g':
                    r.Global = true;
                    break;
                }
            }
        }
Esempio n. 10
0
        public RegExpInstance Construct(string regExp)
        {
            var r = new RegExpInstance(Engine);

            r.Prototype  = PrototypeObject;
            r.Extensible = true;

            if (regExp[0] != '/')
            {
                throw new JavaScriptException(Engine.SyntaxError, "Regexp should start with slash");
            }
            var lastSlash = regExp.LastIndexOf('/');
            // Unescape escaped forward slashes (\/)
            var pattern = regExp.Substring(1, lastSlash - 1).Replace("\\/", "/");
            var flags   = regExp.Substring(lastSlash + 1);

            var options = ParseOptions(r, flags);

            try
            {
                r.Value = new Regex(pattern, options);
            }
            catch (Exception e)
            {
                throw new JavaScriptException(Engine.SyntaxError, e.Message);
            }

            r.Flags  = flags;
            r.Source = System.String.IsNullOrEmpty(pattern) ? "(?:)" : pattern;

            r.FastAddProperty("global", r.Global, false, false, false);
            r.FastAddProperty("ignoreCase", r.IgnoreCase, false, false, false);
            r.FastAddProperty("multiline", r.Multiline, false, false, false);
            r.FastAddProperty("source", r.Source, false, false, false);
            r.FastAddProperty("lastIndex", 0, true, false, false);

            return(r);
        }
        private ObjectInstance RegExpInitialize(RegExpInstance r, JsValue pattern, JsValue flags)
        {
            var p = pattern.IsUndefined() ? "" : TypeConverter.ToString(pattern);

            if (string.IsNullOrEmpty(p))
            {
                p = "(?:)";
            }

            var f = flags.IsUndefined() ? "" : TypeConverter.ToString(flags);

            try
            {
                var scanner = new Scanner("/" + p + "/" + flags, new ParserOptions {
                    AdaptRegexp = true
                });

                // seems valid
                r.Value = scanner.TestRegExp(p, f);

                var timeout = _engine.Options._RegexTimeoutInterval;
                if (timeout.Ticks > 0)
                {
                    r.Value = new Regex(r.Value.ToString(), r.Value.Options, timeout);
                }
            }
            catch (Exception ex)
            {
                ExceptionHelper.ThrowSyntaxError(_engine, ex.Message);
            }

            r.Flags  = f;
            r.Source = p;

            RegExpInitialize(r);

            return(r);
        }
Esempio n. 12
0
        public RegExpInstance Construct(string regExp)
        {
            var r = new RegExpInstance(Engine);

            r.Prototype  = PrototypeObject;
            r.Extensible = true;

            var scanner = new Scanner(regExp, new ParserOptions {
                AdaptRegexp = true
            });
            var body  = (string)scanner.ScanRegExpBody().Value;
            var flags = (string)scanner.ScanRegExpFlags().Value;

            r.Value = scanner.TestRegExp(body, flags);

            r.Flags = flags;
            AssignFlags(r, flags);
            r.Source = System.String.IsNullOrEmpty(body) ? "(?:)" : body;

            SetRegexProperties(r);

            return(r);
        }
        public RegExpInstance Construct(Regex regExp, string flags, Engine engine)
        {
            var r = new RegExpInstance(Engine);

            r._prototype = PrototypeObject;

            r.Flags  = flags;
            r.Source = regExp.ToString();

            var timeout = _engine.Options._RegexTimeoutInterval;

            if (timeout.Ticks > 0)
            {
                r.Value = new Regex(regExp.ToString(), regExp.Options, timeout);
            }
            else
            {
                r.Value = regExp;
            }

            RegExpInitialize(r);

            return(r);
        }
Esempio n. 14
0
        public RegExpInstance Construct(string regExp)
        {
            var r = new RegExpInstance(Engine);
            r.Prototype = PrototypeObject;
            r.Extensible = true;
 
            if (regExp[0] != '/')
            {
                throw new JavaScriptException(Engine.SyntaxError, "Regexp should start with slash");
            }
            var lastSlash = regExp.LastIndexOf('/');
            // Unescape escaped forward slashes (\/)
            var pattern = regExp.Substring(1, lastSlash - 1).Replace("\\/", "/");
            var flags = regExp.Substring(lastSlash + 1);

            var options = ParseOptions(r, flags);
            try
            {
                if((RegexOptions.Multiline & options) == RegexOptions.Multiline)
                {
                    // Replace all non-escaped $ occurences by \r?$
                    // c.f. http://programmaticallyspeaking.com/regular-expression-multiline-mode-whats-a-newline.html

                    int index = 0;
                    var newPattern = pattern;
                    while((index = newPattern.IndexOf("$", index)) != -1)
                    {
                        if(index > 0 && newPattern[index - 1] != '\\')
                        {
                            newPattern = newPattern.Substring(0, index) + @"\r?" + newPattern.Substring(index);
                            index += 4;
                        }
                    }

                    r.Value = new Regex(newPattern, options);
                }
                else
                {
                    r.Value = new Regex(pattern, options);
                }
                
            }
            catch (Exception e)
            {
                throw new JavaScriptException(Engine.SyntaxError, e.Message);
            }

            r.Flags = flags;
            r.Source = System.String.IsNullOrEmpty(pattern) ? "(?:)" : pattern;

            r.FastAddProperty("global", r.Global, false, false, false);
            r.FastAddProperty("ignoreCase", r.IgnoreCase, false, false, false);
            r.FastAddProperty("multiline", r.Multiline, false, false, false);
            r.FastAddProperty("source", r.Source, false, false, false);
            r.FastAddProperty("lastIndex", 0, true, false, false);

            return r;
        }
 private static void RegExpInitialize(RegExpInstance r)
 {
     r.SetOwnProperty(RegExpInstance.PropertyLastIndex, new PropertyDescriptor(0, PropertyFlag.OnlyWritable));
 }
Esempio n. 16
0
        private RegexOptions ParseOptions(RegExpInstance r, string flags)
        {
            for (int k = 0; k < flags.Length; k++)
            {
                var c = flags[k];
                if (c == 'g')
                {
                    if (r.Global)
                    {
                        throw new JavaScriptException(Engine.SyntaxError);
                    }

                    r.Global = true;
                }
                else if (c == 'i')
                {
                    if (r.IgnoreCase)
                    {
                        throw new JavaScriptException(Engine.SyntaxError);
                    }

                    r.IgnoreCase = true;
                }
                else if (c == 'm')
                {
                    if (r.Multiline)
                    {
                        throw new JavaScriptException(Engine.SyntaxError);
                    }

                    r.Multiline = true;
                }
                else
                {
                    throw new JavaScriptException(Engine.SyntaxError);
                }
            }

            var options = RegexOptions.ECMAScript;

            if (r.Multiline)
            {
                options = options | RegexOptions.Multiline;
            }

            if (r.IgnoreCase)
            {
                options = options | RegexOptions.IgnoreCase;
            }

            return options;
        }
Esempio n. 17
0
        public RegExpInstance Construct(string regExp)
        {
            var r = new RegExpInstance(Engine);
            r.Prototype = PrototypeObject;
            r.Extensible = true;
 
            if (regExp[0] != '/')
            {
                throw new JavaScriptException(Engine.SyntaxError, "Regexp should start with slash");
            }
            var lastSlash = regExp.LastIndexOf('/');
            // Unescape escaped forward slashes (\/)
            var pattern = regExp.Substring(1, lastSlash - 1).Replace("\\/", "/");
            var flags = regExp.Substring(lastSlash + 1);

            var options = ParseOptions(r, flags);
            try
            {
                r.Value = new Regex(pattern, options);
            }
            catch (Exception e)
            {
                throw new JavaScriptException(Engine.SyntaxError, e.Message);
            }

            r.Flags = flags;
            r.Source = System.String.IsNullOrEmpty(pattern) ? "(?:)" : pattern;

            r.FastAddProperty("global", r.Global, false, false, false);
            r.FastAddProperty("ignoreCase", r.IgnoreCase, false, false, false);
            r.FastAddProperty("multiline", r.Multiline, false, false, false);
            r.FastAddProperty("source", r.Source, false, false, false);
            r.FastAddProperty("lastIndex", 0, true, false, false);

            return r;
        }
Esempio n. 18
0
        /// <summary>
        /// http://www.ecma-international.org/ecma-262/5.1/#sec-7.8.5
        /// http://www.ecma-international.org/ecma-262/5.1/#sec-15.10.4
        /// </summary>
        /// <param name="arguments"></param>
        /// <returns></returns>
        public ObjectInstance Construct(JsValue[] arguments)
        {
            string p;
            string f;

            var pattern = arguments.At(0);
            var flags = arguments.At(1);

            var r = pattern.TryCast<RegExpInstance>();
            if (flags == Undefined.Instance && r != null)
            {
                return r;
            }
            else if (flags != Undefined.Instance && r != null)
            {
                throw new JavaScriptException(Engine.TypeError);
            }
            else
            {
                if (pattern == Undefined.Instance)
                {
                    p = "";

                }
                else
                {
                    p = TypeConverter.ToString(pattern);
                }
                
                f = flags != Undefined.Instance ? TypeConverter.ToString(flags) : "";
            }

            r = new RegExpInstance(Engine);
            r.Prototype = PrototypeObject;
            r.Extensible = true;

            var options = ParseOptions(r, f);

            try
            {
                r.Value = new Regex(p, options);
            }
            catch (Exception e)
            {
                throw new JavaScriptException(Engine.SyntaxError, e.Message);
            }

            string s;
            s = p;
             
            if (System.String.IsNullOrEmpty(s))
            {
                s = "(?:)";
            }

            r.Flags = f;
            r.Source = s;

            r.FastAddProperty("global", r.Global, false, false, false);
            r.FastAddProperty("ignoreCase", r.IgnoreCase, false, false, false);
            r.FastAddProperty("multiline", r.Multiline, false, false, false);
            r.FastAddProperty("source", r.Source, false, false, false);
            r.FastAddProperty("lastIndex", 0, true, false, false);

            return r;
        }
Esempio n. 19
0
        /// <summary>
        /// http://www.ecma-international.org/ecma-262/5.1/#sec-7.8.5
        /// http://www.ecma-international.org/ecma-262/5.1/#sec-15.10.4
        /// </summary>
        /// <param name="arguments"></param>
        /// <returns></returns>
        public ObjectInstance Construct(JsValue[] arguments)
        {
            string p;
            string f;

            var pattern = arguments.At(0);
            var flags   = arguments.At(1);

            var r = pattern.TryCast <RegExpInstance>();

            if (flags == Undefined.Instance && r != null)
            {
                return(r);
            }
            else if (flags != Undefined.Instance && r != null)
            {
                throw new JavaScriptException(Engine.TypeError);
            }
            else
            {
                if (pattern == Undefined.Instance)
                {
                    p = "";
                }
                else
                {
                    p = TypeConverter.ToString(pattern);
                }

                f = flags != Undefined.Instance ? TypeConverter.ToString(flags) : "";
            }

            r            = new RegExpInstance(Engine);
            r.Prototype  = PrototypeObject;
            r.Extensible = true;

            var options = ParseOptions(r, f);

            try
            {
                r.Value = new Regex(p, options);
            }
            catch (Exception e)
            {
                throw new JavaScriptException(Engine.SyntaxError, e.Message);
            }

            string s;

            s = p;

            if (System.String.IsNullOrEmpty(s))
            {
                s = "(?:)";
            }

            r.Flags  = f;
            r.Source = s;

            r.FastAddProperty("global", r.Global, false, false, false);
            r.FastAddProperty("ignoreCase", r.IgnoreCase, false, false, false);
            r.FastAddProperty("multiline", r.Multiline, false, false, false);
            r.FastAddProperty("source", r.Source, false, false, false);
            r.FastAddProperty("lastIndex", 0, true, false, false);

            return(r);
        }