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); }
/// <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); }
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); }
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); }
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); }
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); }
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; } } }
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); }
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); }
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)); }
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; }
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; }
/// <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; }
/// <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); }