annotate dmdscript_tango/dregexp.d @ 3:8363a4bf6a8f

rename package: dmdscript to dmdscript_tango
author saaadel
date Sun, 24 Jan 2010 18:33:05 +0200
parents 55c2951c07be
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2 /* Digital Mars DMDScript source code.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
3 * Copyright (c) 2000-2002 by Chromium Communications
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
4 * D version Copyright (c) 2004-2005 by Digital Mars
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
5 * All Rights Reserved
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
6 * written by Walter Bright
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
7 * www.digitalmars.com
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
8 * Use at your own risk. There is no warranty, express or implied.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
9 * License for redistribution is by the GNU General Public License in gpl.txt.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
10 *
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
11 * A binary, non-exclusive license for commercial use can be
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
12 * purchased from www.digitalmars.com/dscript/buy.html.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
13 *
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
14 * DMDScript is implemented in the D Programming Language,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
15 * www.digitalmars.com/d/
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
16 *
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
17 * For a C++ implementation of DMDScript, including COM support,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
18 * see www.digitalmars.com/dscript/cppscript.html.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
19 */
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
20
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
21
3
8363a4bf6a8f rename package: dmdscript to dmdscript_tango
saaadel
parents: 0
diff changeset
22 module dmdscript_tango.dregexp;
0
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
23
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
24 private import std.regexp;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
25
3
8363a4bf6a8f rename package: dmdscript to dmdscript_tango
saaadel
parents: 0
diff changeset
26 import dmdscript_tango.script;
8363a4bf6a8f rename package: dmdscript to dmdscript_tango
saaadel
parents: 0
diff changeset
27 import dmdscript_tango.dobject;
8363a4bf6a8f rename package: dmdscript to dmdscript_tango
saaadel
parents: 0
diff changeset
28 import dmdscript_tango.value;
8363a4bf6a8f rename package: dmdscript to dmdscript_tango
saaadel
parents: 0
diff changeset
29 import dmdscript_tango.protoerror;
8363a4bf6a8f rename package: dmdscript to dmdscript_tango
saaadel
parents: 0
diff changeset
30 import dmdscript_tango.text;
8363a4bf6a8f rename package: dmdscript to dmdscript_tango
saaadel
parents: 0
diff changeset
31 import dmdscript_tango.darray;
8363a4bf6a8f rename package: dmdscript to dmdscript_tango
saaadel
parents: 0
diff changeset
32 import dmdscript_tango.threadcontext;
8363a4bf6a8f rename package: dmdscript to dmdscript_tango
saaadel
parents: 0
diff changeset
33 import dmdscript_tango.dfunction;
8363a4bf6a8f rename package: dmdscript to dmdscript_tango
saaadel
parents: 0
diff changeset
34 import dmdscript_tango.property;
8363a4bf6a8f rename package: dmdscript to dmdscript_tango
saaadel
parents: 0
diff changeset
35 import dmdscript_tango.textgen.errmsgs;
8363a4bf6a8f rename package: dmdscript to dmdscript_tango
saaadel
parents: 0
diff changeset
36 import dmdscript_tango.dnative;
0
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
37
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
38 //alias script.tchar tchar;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
39
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
40 // Values for Dregexp.exec.rettype
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
41 enum { EXEC_STRING, EXEC_ARRAY, EXEC_BOOLEAN, EXEC_INDEX };
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
42
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
43
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
44 /* ===================== Dregexp_constructor ==================== */
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
45
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
46 class Dregexp_constructor : Dfunction
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
47 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
48 Value* input;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
49 Value* multiline;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
50 Value* lastMatch;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
51 Value* lastParen;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
52 Value* leftContext;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
53 Value* rightContext;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
54 Value* dollar[10];
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
55
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
56 // Extensions
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
57 Value* index;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
58 Value* lastIndex;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
59
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
60 this(ThreadContext *tc)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
61 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
62 super(2, tc.Dfunction_prototype);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
63
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
64 Value v;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
65 v.putVstring(null);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
66
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
67 Value vb;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
68 vb.putVboolean(false);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
69
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
70 Value vnm1;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
71 vnm1.putVnumber(-1);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
72
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
73 name = "RegExp";
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
74
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
75 // Static properties
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
76 Put(TEXT_input, &v, DontDelete);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
77 Put(TEXT_multiline, &vb, DontDelete);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
78 Put(TEXT_lastMatch, &v, ReadOnly | DontDelete);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
79 Put(TEXT_lastParen, &v, ReadOnly | DontDelete);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
80 Put(TEXT_leftContext, &v, ReadOnly | DontDelete);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
81 Put(TEXT_rightContext, &v, ReadOnly | DontDelete);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
82 Put(TEXT_dollar1, &v, ReadOnly | DontDelete);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
83 Put(TEXT_dollar2, &v, ReadOnly | DontDelete);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
84 Put(TEXT_dollar3, &v, ReadOnly | DontDelete);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
85 Put(TEXT_dollar4, &v, ReadOnly | DontDelete);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
86 Put(TEXT_dollar5, &v, ReadOnly | DontDelete);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
87 Put(TEXT_dollar6, &v, ReadOnly | DontDelete);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
88 Put(TEXT_dollar7, &v, ReadOnly | DontDelete);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
89 Put(TEXT_dollar8, &v, ReadOnly | DontDelete);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
90 Put(TEXT_dollar9, &v, ReadOnly | DontDelete);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
91
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
92 Put(TEXT_index, &vnm1, ReadOnly | DontDelete);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
93 Put(TEXT_lastIndex, &vnm1, ReadOnly | DontDelete);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
94
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
95 input = Get(TEXT_input);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
96 multiline = Get(TEXT_multiline);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
97 lastMatch = Get(TEXT_lastMatch);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
98 lastParen = Get(TEXT_lastParen);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
99 leftContext = Get(TEXT_leftContext);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
100 rightContext = Get(TEXT_rightContext);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
101 dollar[0] = lastMatch;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
102 dollar[1] = Get(TEXT_dollar1);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
103 dollar[2] = Get(TEXT_dollar2);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
104 dollar[3] = Get(TEXT_dollar3);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
105 dollar[4] = Get(TEXT_dollar4);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
106 dollar[5] = Get(TEXT_dollar5);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
107 dollar[6] = Get(TEXT_dollar6);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
108 dollar[7] = Get(TEXT_dollar7);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
109 dollar[8] = Get(TEXT_dollar8);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
110 dollar[9] = Get(TEXT_dollar9);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
111
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
112 index = Get(TEXT_index);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
113 lastIndex = Get(TEXT_lastIndex);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
114
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
115 // Should lastMatch be an alias for dollar[nparens],
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
116 // or should it be a separate property?
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
117 // We implemented it the latter way.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
118 // Since both are ReadOnly, I can't see that it makes
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
119 // any difference.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
120 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
121
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
122 void* Construct(CallContext *cc, Value *ret, Value[] arglist)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
123 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
124 // ECMA 262 v3 15.10.4.1
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
125
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
126 Value* pattern;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
127 Value* flags;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
128 d_string P;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
129 d_string F;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
130 Dregexp r;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
131 Dregexp R;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
132
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
133 //writef("Dregexp_constructor.Construct()\n");
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
134 ret.putVundefined();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
135 pattern = &vundefined;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
136 flags = &vundefined;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
137 switch (arglist.length)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
138 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
139 case 0:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
140 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
141
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
142 default:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
143 flags = &arglist[1];
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
144 case 1:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
145 pattern = &arglist[0];
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
146 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
147 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
148 R = Dregexp.isRegExp(pattern);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
149 if (R)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
150 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
151 if (flags.isUndefined())
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
152 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
153 P = R.re.pattern;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
154 F = R.re.flags;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
155 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
156 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
157 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
158 ErrInfo errinfo;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
159 return RuntimeError(&errinfo, ERR_TYPE_ERROR,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
160 "RegExp.prototype.constructor");
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
161 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
162 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
163 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
164 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
165 P = pattern.isUndefined() ? "" : pattern.toString();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
166 F = flags.isUndefined() ? "" : flags.toString();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
167 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
168 r = new Dregexp(P, F);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
169 if (r.re.errors)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
170 { Dobject o;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
171 ErrInfo errinfo;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
172
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
173 version (none)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
174 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
175 writef("P = '%s'\nF = '%s'\n", d_string_ptr(P), d_string_ptr(F));
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
176 for (int i = 0; i < d_string_len(P); i++)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
177 writef("x%02x\n", d_string_ptr(P)[i]);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
178 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
179 errinfo.message = errmsgtbl[ERR_REGEXP_COMPILE];
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
180 o = new syntaxerror.D0(&errinfo);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
181 Value* v = new Value;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
182 v.putVobject(o);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
183 return v;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
184 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
185 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
186 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
187 ret.putVobject(r);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
188 return null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
189 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
190 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
191
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
192 void* Call(CallContext *cc, Dobject othis, Value* ret, Value[] arglist)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
193 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
194 // ECMA 262 v3 15.10.3.1
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
195 if (arglist.length >= 1)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
196 { Value* pattern;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
197 Dobject o;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
198
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
199 pattern = &arglist[0];
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
200 if (!pattern.isPrimitive())
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
201 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
202 o = pattern.object;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
203 if (o.isDregexp() &&
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
204 (arglist.length == 1 || arglist[1].isUndefined())
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
205 )
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
206 { ret.putVobject(o);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
207 return null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
208 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
209 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
210 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
211 return Construct(cc, ret, arglist);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
212 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
213
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
214
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
215 Value* Get(d_string PropertyName)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
216 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
217 return Dfunction.Get(perlAlias(PropertyName));
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
218 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
219
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
220 Value* Put(d_string PropertyName, Value* value, uint attributes)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
221 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
222 return Dfunction.Put(perlAlias(PropertyName), value, attributes);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
223 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
224
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
225 Value* Put(d_string PropertyName, Dobject o, uint attributes)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
226 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
227 return Dfunction.Put(perlAlias(PropertyName), o, attributes);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
228 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
229
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
230 Value* Put(d_string PropertyName, d_number n, uint attributes)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
231 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
232 return Dfunction.Put(perlAlias(PropertyName), n, attributes);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
233 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
234
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
235 int CanPut(d_string PropertyName)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
236 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
237 return Dfunction.CanPut(perlAlias(PropertyName));
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
238 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
239
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
240 int HasProperty(d_string PropertyName)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
241 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
242 return Dfunction.HasProperty(perlAlias(PropertyName));
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
243 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
244
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
245 int Delete(d_string PropertyName)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
246 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
247 return Dfunction.Delete(perlAlias(PropertyName));
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
248 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
249
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
250 // Translate Perl property names to script property names
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
251 static d_string perlAlias(d_string s)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
252 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
253 d_string t;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
254
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
255 static tchar[6] from = "_*&+`'";
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
256 static d_string*[] to =
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
257 [
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
258 &TEXT_input,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
259 &TEXT_multiline,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
260 &TEXT_lastMatch,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
261 &TEXT_lastParen,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
262 &TEXT_leftContext,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
263 &TEXT_rightContext,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
264 ];
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
265
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
266 t = s;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
267 if (s.length == 2 && s[0] == '$')
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
268 { int i;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
269
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
270 i = std.string.find(from, s[1]);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
271 if (i >= 0)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
272 t = *to[i];
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
273 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
274 return t;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
275 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
276 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
277
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
278
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
279 /* ===================== Dregexp_prototype_toString =============== */
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
280
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
281 void* Dregexp_prototype_toString(Dobject pthis, CallContext *cc, Dobject othis, Value *ret, Value[] arglist)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
282 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
283 // othis must be a RegExp
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
284 Dregexp r;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
285
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
286 if (!othis.isDregexp())
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
287 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
288 ret.putVundefined();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
289 ErrInfo errinfo;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
290 return Dobject.RuntimeError(&errinfo, ERR_NOT_TRANSFERRABLE,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
291 "RegExp.prototype.toString()");
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
292 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
293 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
294 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
295 d_string s;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
296
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
297 r = cast(Dregexp)(othis);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
298 s = "/";
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
299 s ~= r.re.pattern;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
300 s ~= "/";
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
301 s ~= r.re.flags;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
302 ret.putVstring(s);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
303 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
304 return null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
305 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
306
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
307 /* ===================== Dregexp_prototype_test =============== */
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
308
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
309 void* Dregexp_prototype_test(Dobject pthis, CallContext *cc, Dobject othis, Value *ret, Value[] arglist)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
310 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
311 // ECMA v3 15.10.6.3 says this is equivalent to:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
312 // RegExp.prototype.exec(string) != null
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
313 return Dregexp.exec(othis, ret, arglist, EXEC_BOOLEAN);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
314 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
315
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
316 /* ===================== Dregexp_prototype_exec ============= */
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
317
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
318 void* Dregexp_prototype_exec(Dobject pthis, CallContext *cc, Dobject othis, Value *ret, Value[] arglist)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
319 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
320 return Dregexp.exec(othis, ret, arglist, EXEC_ARRAY);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
321 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
322
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
323
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
324 /* ===================== Dregexp_prototype_compile ============= */
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
325
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
326 void* Dregexp_prototype_compile(Dobject pthis, CallContext *cc, Dobject othis, Value *ret, Value[] arglist)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
327 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
328 // RegExp.prototype.compile(pattern, attributes)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
329
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
330 // othis must be a RegExp
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
331 if (!othis.isClass(TEXT_RegExp))
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
332 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
333 ErrInfo errinfo;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
334 ret.putVundefined();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
335 return Dobject.RuntimeError(&errinfo, ERR_NOT_TRANSFERRABLE,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
336 "RegExp.prototype.compile()");
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
337 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
338 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
339 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
340 d_string pattern;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
341 d_string attributes;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
342 Dregexp dr;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
343 RegExp r;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
344
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
345 dr = cast(Dregexp)othis;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
346 switch (arglist.length)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
347 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
348 case 0:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
349 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
350
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
351 default:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
352 attributes = arglist[1].toString();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
353 case 1:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
354 pattern = arglist[0].toString();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
355 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
356 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
357
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
358 r = dr.re;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
359 try
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
360 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
361 r.compile(pattern, attributes);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
362 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
363 catch (RegExpException e)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
364 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
365 // Affect source, global and ignoreCase properties
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
366 dr.source.putVstring(r.pattern);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
367 dr.global.putVboolean((r.attributes & RegExp.REA.global) != 0);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
368 dr.ignoreCase.putVboolean((r.attributes & RegExp.REA.ignoreCase) != 0);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
369 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
370 //writef("r.attributes = x%x\n", r.attributes);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
371 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
372 // Documentation says nothing about a return value,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
373 // so let's use "undefined"
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
374 ret.putVundefined();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
375 return null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
376 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
377
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
378 /* ===================== Dregexp_prototype ==================== */
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
379
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
380 class Dregexp_prototype : Dregexp
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
381 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
382 this(ThreadContext *tc)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
383 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
384 super(tc.Dobject_prototype);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
385 classname = TEXT_Object;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
386 uint attributes = ReadOnly | DontDelete | DontEnum;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
387 Dobject f = tc.Dfunction_prototype;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
388
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
389 Put(TEXT_constructor, tc.Dregexp_constructor, attributes);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
390
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
391 static NativeFunctionData nfd[] =
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
392 [
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
393 { &TEXT_toString, &Dregexp_prototype_toString, 0 },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
394 { &TEXT_compile, &Dregexp_prototype_compile, 2 },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
395 { &TEXT_exec, &Dregexp_prototype_exec, 1 },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
396 { &TEXT_test, &Dregexp_prototype_test, 1 },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
397 ];
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
398
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
399 DnativeFunction.init(this, nfd, attributes);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
400 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
401 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
402
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
403
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
404 /* ===================== Dregexp ==================== */
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
405
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
406
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
407 class Dregexp : Dobject
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
408 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
409 Value *global;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
410 Value *ignoreCase;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
411 Value *multiline;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
412 Value *lastIndex;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
413 Value *source;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
414
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
415 RegExp re;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
416
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
417 void *Call(CallContext *cc, Dobject othis, Value* ret, Value[] arglist);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
418
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
419 this(d_string pattern, d_string attributes)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
420 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
421 super(getPrototype());
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
422
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
423 Value v;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
424 v.putVstring(null);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
425
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
426 Value vb;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
427 vb.putVboolean(false);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
428
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
429 classname = TEXT_RegExp;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
430
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
431 //writef("Dregexp.Dregexp(pattern = '%ls', attributes = '%ls')\n", d_string_ptr(pattern), d_string_ptr(attributes));
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
432 Put(TEXT_source, &v, ReadOnly | DontDelete | DontEnum);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
433 Put(TEXT_global, &vb, ReadOnly | DontDelete | DontEnum);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
434 Put(TEXT_ignoreCase, &vb, ReadOnly | DontDelete | DontEnum);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
435 Put(TEXT_multiline, &vb, ReadOnly | DontDelete | DontEnum);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
436 Put(TEXT_lastIndex, 0.0, DontDelete | DontEnum);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
437
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
438 source = Get(TEXT_source);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
439 global = Get(TEXT_global);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
440 ignoreCase = Get(TEXT_ignoreCase);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
441 multiline = Get(TEXT_multiline);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
442 lastIndex = Get(TEXT_lastIndex);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
443
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
444 re = new RegExp(pattern, attributes);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
445 if (re.errors == 0)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
446 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
447 source.putVstring(pattern);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
448 //writef("source = '%s'\n", source.x.string.toDchars());
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
449 global.putVboolean((re.attributes & RegExp.REA.global) != 0);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
450 ignoreCase.putVboolean((re.attributes & RegExp.REA.ignoreCase) != 0);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
451 multiline.putVboolean((re.attributes & RegExp.REA.multiline) != 0);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
452 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
453 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
454 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
455 // have caller throw SyntaxError
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
456 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
457 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
458
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
459 this(Dobject prototype)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
460 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
461 super(prototype);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
462
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
463 Value v;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
464 v.putVstring(null);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
465
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
466 Value vb;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
467 vb.putVboolean(false);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
468
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
469 classname = TEXT_RegExp;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
470
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
471 Put(TEXT_source, &v, ReadOnly | DontDelete | DontEnum);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
472 Put(TEXT_global, &vb, ReadOnly | DontDelete | DontEnum);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
473 Put(TEXT_ignoreCase, &vb, ReadOnly | DontDelete | DontEnum);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
474 Put(TEXT_multiline, &vb, ReadOnly | DontDelete | DontEnum);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
475 Put(TEXT_lastIndex, 0.0, DontDelete | DontEnum);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
476
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
477 source = Get(TEXT_source);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
478 global = Get(TEXT_global);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
479 ignoreCase = Get(TEXT_ignoreCase);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
480 multiline = Get(TEXT_multiline);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
481 lastIndex = Get(TEXT_lastIndex);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
482
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
483 re = new RegExp(null, null);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
484 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
485
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
486 void* Call(CallContext *cc, Dobject othis, Value* ret, Value[] arglist)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
487 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
488 // This is the same as calling RegExp.prototype.exec(str)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
489 Value* v;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
490
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
491 v = Get(TEXT_exec);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
492 return v.toObject().Call(cc, this, ret, arglist);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
493 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
494
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
495 static Dregexp isRegExp(Value* v)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
496 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
497 Dregexp r;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
498
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
499 if (!v.isPrimitive() && v.toObject().isDregexp())
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
500 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
501 r = cast(Dregexp)(v.toObject());
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
502 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
503 return r;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
504 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
505
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
506 static void* exec(Dobject othis, Value* ret, Value[] arglist, int rettype)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
507 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
508 //writef("Dregexp.exec(arglist.length = %d, rettype = %d)\n", arglist.length, rettype);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
509
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
510 // othis must be a RegExp
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
511 if (!othis.isClass(TEXT_RegExp))
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
512 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
513 ret.putVundefined();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
514 ErrInfo errinfo;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
515 return RuntimeError(&errinfo, ERR_NOT_TRANSFERRABLE,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
516 "RegExp.prototype.exec()");
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
517 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
518 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
519 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
520 d_string s;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
521 Dregexp dr;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
522 RegExp r;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
523 Dregexp_constructor dc;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
524 uint i;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
525 d_int32 lasti;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
526
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
527 if (arglist.length)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
528 s = arglist[0].toString();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
529 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
530 { Dfunction df;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
531
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
532 df = Dregexp.getConstructor();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
533 s = (cast(Dregexp_constructor)df).input.string;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
534 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
535
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
536 dr = cast(Dregexp)othis;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
537 r = dr.re;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
538 dc = cast(Dregexp_constructor)Dregexp.getConstructor();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
539
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
540 // Decide if we are multiline
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
541 if (dr.multiline.dbool)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
542 r.attributes |= RegExp.REA.multiline;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
543 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
544 r.attributes &= ~RegExp.REA.multiline;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
545
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
546 if (r.attributes & RegExp.REA.global && rettype != EXEC_INDEX)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
547 lasti = cast(int)dr.lastIndex.toInteger();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
548 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
549 lasti = 0;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
550
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
551 if (r.test(s, lasti))
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
552 { // Successful match
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
553 Value* lastv;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
554 uint nmatches;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
555
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
556 if (r.attributes & RegExp.REA.global && rettype != EXEC_INDEX)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
557 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
558 dr.lastIndex.putVnumber(r.pmatch[0].rm_eo);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
559 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
560
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
561 dc.input.putVstring(r.input);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
562
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
563 s = r.input[r.pmatch[0].rm_so .. r.pmatch[0].rm_eo];
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
564 dc.lastMatch.putVstring(s);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
565
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
566 s = r.input[0 .. r.pmatch[0].rm_so];
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
567 dc.leftContext.putVstring(s);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
568
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
569 s = r.input[r.pmatch[0].rm_eo .. length];
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
570 dc.rightContext.putVstring(s);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
571
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
572 dc.index.putVnumber(r.pmatch[0].rm_so);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
573 dc.lastIndex.putVnumber(r.pmatch[0].rm_eo);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
574
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
575 // Fill in $1..$9
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
576 lastv = &vundefined;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
577 nmatches = 0;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
578 for (i = 1; i <= 9; i++)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
579 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
580 if (i <= r.re_nsub)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
581 { int n;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
582
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
583 // Use last 9 entries for $1..$9
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
584 n = i;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
585 if (r.re_nsub > 9)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
586 n += (r.re_nsub - 9);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
587
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
588 if (r.pmatch[n].rm_so != -1)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
589 { s = r.input[r.pmatch[n].rm_so .. r.pmatch[n].rm_eo];
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
590 dc.dollar[i].putVstring(s);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
591 nmatches = i;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
592 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
593 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
594 dc.dollar[i].putVundefined();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
595 lastv = dc.dollar[i];
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
596 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
597 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
598 dc.dollar[i].putVundefined();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
599 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
600 // Last substring in $1..$9, or "" if none
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
601 if (r.re_nsub)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
602 Value.copy(dc.lastParen, lastv);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
603 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
604 dc.lastParen.putVstring(null);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
605
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
606 switch (rettype)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
607 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
608 case EXEC_ARRAY:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
609 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
610 Darray a = new Darray();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
611
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
612 a.Put(TEXT_input, r.input, 0);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
613 a.Put(TEXT_index, r.pmatch[0].rm_so, 0);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
614 a.Put(TEXT_lastIndex, r.pmatch[0].rm_eo, 0);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
615
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
616 a.Put(cast(d_uint32)0, dc.lastMatch, cast(uint)0);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
617
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
618 // [1]..[nparens]
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
619 for (i = 1; i <= r.re_nsub; i++)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
620 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
621 if (i > nmatches)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
622 a.Put(i, TEXT_, 0);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
623
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
624 // Reuse values already put into dc.dollar[]
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
625 else if (r.re_nsub <= 9)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
626 a.Put(i, dc.dollar[i], 0);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
627 else if (i > r.re_nsub - 9)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
628 a.Put(i, dc.dollar[i - (r.re_nsub - 9)], 0);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
629 else if (r.pmatch[i].rm_so == -1)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
630 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
631 a.Put(i, &vundefined, 0);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
632 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
633 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
634 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
635 s = r.input[r.pmatch[i].rm_so .. r.pmatch[i].rm_eo];
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
636 a.Put(i, s, 0);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
637 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
638 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
639 ret.putVobject(a);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
640 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
641 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
642 case EXEC_STRING:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
643 Value.copy(ret, dc.lastMatch);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
644 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
645
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
646 case EXEC_BOOLEAN:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
647 ret.putVboolean(true); // success
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
648 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
649
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
650 case EXEC_INDEX:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
651 ret.putVnumber(r.pmatch[0].rm_so);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
652 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
653
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
654 default:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
655 assert(0);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
656 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
657 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
658 else // failed to match
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
659 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
660 //writef("failed\n");
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
661 switch (rettype)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
662 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
663 case EXEC_ARRAY:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
664 //writef("memcpy\n");
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
665 ret.putVnull(); // Return null
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
666 dr.lastIndex.putVnumber(0);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
667 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
668
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
669 case EXEC_STRING:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
670 ret.putVstring(null);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
671 dr.lastIndex.putVnumber(0);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
672 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
673
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
674 case EXEC_BOOLEAN:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
675 ret.putVboolean(false);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
676 dr.lastIndex.putVnumber(0);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
677 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
678
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
679 case EXEC_INDEX:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
680 ret.putVnumber(-1.0);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
681 // Do not set lastIndex
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
682 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
683
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
684 default:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
685 assert(0);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
686 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
687 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
688 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
689 return null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
690 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
691
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
692 static Dfunction getConstructor()
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
693 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
694 ThreadContext *tc = ThreadContext.getThreadContext();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
695 assert(tc);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
696 return tc.Dregexp_constructor;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
697 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
698
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
699 static Dobject getPrototype()
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
700 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
701 ThreadContext* tc = ThreadContext.getThreadContext();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
702 assert(tc);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
703 return tc.Dregexp_prototype;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
704 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
705
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
706 static void init(ThreadContext *tc)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
707 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
708 tc.Dregexp_constructor = new Dregexp_constructor(tc);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
709 tc.Dregexp_prototype = new Dregexp_prototype(tc);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
710
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
711 version (none)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
712 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
713 writef("tc.Dregexp_constructor = %x\n", tc.Dregexp_constructor);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
714 uint *p;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
715 p = cast(uint *)tc.Dregexp_constructor;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
716 writef("p = %x\n", p);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
717 if (p)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
718 writef("*p = %x, %x, %x, %x\n", p[0], p[1], p[2], p[3]);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
719 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
720
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
721 tc.Dregexp_constructor.Put(TEXT_prototype, tc.Dregexp_prototype, DontEnum | DontDelete | ReadOnly);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
722 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
723 }