public override IScriptable Construct (Context cx, IScriptable scope, object [] args) { BuiltinRegExp re = new BuiltinRegExp (); re.compile (cx, scope, args); ScriptRuntime.setObjectProtoAndParent (re, scope); return re; }
/// <summary> Analog of C match_or_replace.</summary> private static object matchOrReplace (Context cx, IScriptable scope, IScriptable thisObj, object [] args, RegExpImpl reImpl, GlobData data, bool forceFlat) { BuiltinRegExp re; string str = ScriptConvert.ToString (thisObj); data.str = str; IScriptable topScope = ScriptableObject.GetTopLevelScope (scope); if (args.Length == 0) { object compiled = BuiltinRegExp.compileRE ("", "", false); re = new BuiltinRegExp (topScope, compiled); } else if (args [0] is BuiltinRegExp) { re = (BuiltinRegExp)args [0]; } else { string src = ScriptConvert.ToString (args [0]); string opt; if (data.optarg < args.Length) { args [0] = src; opt = ScriptConvert.ToString (args [data.optarg]); } else { opt = null; } object compiled = BuiltinRegExp.compileRE (src, opt, forceFlat); re = new BuiltinRegExp (topScope, compiled); } data.regexp = re; data.global = (re.Flags & BuiltinRegExp.JSREG_GLOB) != 0; int [] indexp = new int [] { 0 }; object result = null; if (data.mode == EcmaScript.NET.RegExpActions.Search) { result = re.executeRegExp (cx, scope, reImpl, str, indexp, BuiltinRegExp.TEST); if (result != null && result.Equals (true)) result = (int)reImpl.leftContext.length; else result = -1; } else if (data.global) { re.lastIndex = 0; for (int count = 0; indexp [0] <= str.Length; count++) { result = re.executeRegExp (cx, scope, reImpl, str, indexp, BuiltinRegExp.TEST); if (result == null || !result.Equals (true)) break; if (data.mode == EcmaScript.NET.RegExpActions.Match) { match_glob (data, cx, scope, count, reImpl); } else { if (data.mode != EcmaScript.NET.RegExpActions.Replace) Context.CodeBug (); SubString lastMatch = reImpl.lastMatch; int leftIndex = data.leftIndex; int leftlen = lastMatch.index - leftIndex; data.leftIndex = lastMatch.index + lastMatch.length; replace_glob (data, cx, scope, reImpl, leftIndex, leftlen); } if (reImpl.lastMatch.length == 0) { if (indexp [0] == str.Length) break; indexp [0]++; } } } else { result = re.executeRegExp (cx, scope, reImpl, str, indexp, ((data.mode == EcmaScript.NET.RegExpActions.Replace) ? BuiltinRegExp.TEST : BuiltinRegExp.MATCH)); } return result; }
public static void Init(IScriptable scope, bool zealed) { BuiltinRegExp proto = new BuiltinRegExp (); proto.re = (RECompiled)compileRE ("", null, false); proto.ActivatePrototypeMap (MAX_PROTOTYPE_ID); proto.ParentScope = scope; proto.SetPrototype (GetObjectPrototype (scope)); BuiltinRegExpCtor ctor = new BuiltinRegExpCtor (); ScriptRuntime.setFunctionProtoAndParent (ctor, scope); ctor.ImmunePrototypeProperty = proto; if (zealed) { proto.SealObject (); ctor.SealObject (); } DefineProperty (scope, "RegExp", ctor, ScriptableObject.DONTENUM); }