annotate dmdscript_tango/darray.d @ 4:6d905019f7bf

some changes
author saaadel
date Thu, 28 Jan 2010 21:23:27 +0200
parents 8363a4bf6a8f
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.darray;
0
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
23
4
6d905019f7bf some changes
saaadel
parents: 3
diff changeset
24 //import std.string;
6d905019f7bf some changes
saaadel
parents: 3
diff changeset
25 //import std.c.stdlib;
6d905019f7bf some changes
saaadel
parents: 3
diff changeset
26 import tango.stdc.stdlib;
6d905019f7bf some changes
saaadel
parents: 3
diff changeset
27 import tango.text.Text;
0
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
28
3
8363a4bf6a8f rename package: dmdscript to dmdscript_tango
saaadel
parents: 0
diff changeset
29 import dmdscript_tango.script;
8363a4bf6a8f rename package: dmdscript to dmdscript_tango
saaadel
parents: 0
diff changeset
30 import dmdscript_tango.value;
8363a4bf6a8f rename package: dmdscript to dmdscript_tango
saaadel
parents: 0
diff changeset
31 import dmdscript_tango.dobject;
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.identifier;
8363a4bf6a8f rename package: dmdscript to dmdscript_tango
saaadel
parents: 0
diff changeset
34 import dmdscript_tango.dfunction;
8363a4bf6a8f rename package: dmdscript to dmdscript_tango
saaadel
parents: 0
diff changeset
35 import dmdscript_tango.text;
8363a4bf6a8f rename package: dmdscript to dmdscript_tango
saaadel
parents: 0
diff changeset
36 import dmdscript_tango.property;
8363a4bf6a8f rename package: dmdscript to dmdscript_tango
saaadel
parents: 0
diff changeset
37 import dmdscript_tango.textgen.errmsgs;
8363a4bf6a8f rename package: dmdscript to dmdscript_tango
saaadel
parents: 0
diff changeset
38 import dmdscript_tango.dnative;
8363a4bf6a8f rename package: dmdscript to dmdscript_tango
saaadel
parents: 0
diff changeset
39 import dmdscript_tango.program;
0
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
40
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
41 /* ===================== Darray_constructor ==================== */
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
42
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
43 class Darray_constructor : Dfunction
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
44 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
45 this(ThreadContext *tc)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
46 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
47 super(1, tc.Dfunction_prototype);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
48 name = "Array";
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
49 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
50
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
51 void* Construct(CallContext *cc, Value *ret, Value[] arglist)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
52 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
53 // ECMA 15.4.2
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
54 Darray a;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
55
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
56 a = new Darray();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
57 if (arglist.length == 0)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
58 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
59 a.ulength = 0;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
60 a.length.number = 0;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
61 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
62 else if (arglist.length == 1)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
63 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
64 Value* v = &arglist[0];
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
65
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
66 if (v.isNumber())
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
67 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
68 d_uint32 len;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
69
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
70 len = v.toUint32();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
71 if (cast(double) len != v.number)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
72 { ErrInfo errinfo;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
73
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
74 ret.putVundefined();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
75 return RangeError(&errinfo, ERR_ARRAY_LEN_OUT_OF_BOUNDS, v.number);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
76 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
77 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
78 { a.ulength = len;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
79 a.length.number = len;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
80 /+
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
81 if (len > 16)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
82 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
83 //writef("setting %p dimension to %d\n", &a.proptable, len);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
84 if (len > 10000)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
85 len = 10000; // cap so we don't run out of memory
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
86 a.proptable.roots.setDim(len);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
87 a.proptable.roots.zero();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
88 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
89 +/
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
90 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
91 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
92 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
93 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
94 a.ulength = 1;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
95 a.length.number = 1;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
96 a.Put(cast(d_uint32) 0, v, 0);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
97 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
98 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
99 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
100 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
101 //if (arglist.length > 10) writef("Array constructor: arglist.length = %d\n", arglist.length);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
102 /+
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
103 if (arglist.length > 16)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
104 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
105 a.proptable.roots.setDim(arglist.length);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
106 a.proptable.roots.zero();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
107 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
108 +/
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
109 a.ulength = arglist.length;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
110 a.length.number = arglist.length;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
111 for (uint k = 0; k < arglist.length; k++)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
112 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
113 a.Put(k, &arglist[k], 0);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
114 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
115 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
116 Value.copy(ret, &a.value);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
117 //writef("Darray_constructor.Construct(): length = %g\n", a.length.number);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
118 return null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
119 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
120
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
121 void* Call(CallContext *cc, Dobject othis, Value* ret, Value[] arglist)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
122 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
123 // ECMA 15.4.1
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
124 return Construct(cc, ret, arglist);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
125 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
126 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
127
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
128
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
129 /* ===================== Darray_prototype_toString ================= */
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
130
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
131 void *Darray_prototype_toString(Dobject pthis, CallContext *cc, Dobject othis, Value *ret, Value[] arglist)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
132 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
133 //writef("Darray_prototype_toString()\n");
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
134 array_join(othis, ret, null);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
135 return null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
136 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
137
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
138 /* ===================== Darray_prototype_toLocaleString ================= */
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
139
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
140 void *Darray_prototype_toLocaleString(Dobject pthis, CallContext *cc, Dobject othis, Value *ret, Value[] arglist)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
141 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
142 // ECMA v3 15.4.4.3
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
143 tchar[] separator;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
144 d_string r;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
145 d_uint32 len;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
146 d_uint32 k;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
147 Value* v;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
148
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
149 //writef("array_join(othis = %p)\n", othis);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
150
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
151 if (!othis.isClass(TEXT_Array))
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
152 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
153 ret.putVundefined();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
154 ErrInfo errinfo;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
155 return Dobject.RuntimeError(&errinfo, ERR_TLS_NOT_TRANSFERRABLE);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
156 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
157
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
158 v = othis.Get(TEXT_length);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
159 len = v ? v.toUint32() : 0;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
160
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
161 Program prog = cc.prog;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
162 if (!prog.slist)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
163 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
164 // Determine what list separator is only once per thread
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
165 //prog.slist = list_separator(prog.lcid);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
166 prog.slist = ",";
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
167 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
168 separator = prog.slist;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
169
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
170 for (k = 0; k != len; k++)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
171 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
172 if (k)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
173 r ~= separator;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
174 v = othis.Get(k);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
175 if (v && !v.isUndefinedOrNull())
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
176 { Dobject ot;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
177
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
178 ot = v.toObject();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
179 v = ot.Get(TEXT_toLocaleString);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
180 if (v && !v.isPrimitive()) // if it's an Object
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
181 { void* a;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
182 Dobject o;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
183 Value rt;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
184
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
185 o = v.object;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
186 rt.putVundefined();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
187 a = o.Call(cc, ot, &rt, null);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
188 if (a) // if exception was thrown
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
189 return a;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
190 r ~= rt.toString();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
191 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
192 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
193 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
194
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
195 ret.putVstring(r);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
196 return null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
197 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
198
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
199 /* ===================== Darray_prototype_concat ================= */
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
200
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
201 void *Darray_prototype_concat(Dobject pthis, CallContext *cc, Dobject othis, Value *ret, Value[] arglist)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
202 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
203 // ECMA v3 15.4.4.4
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
204 Darray A;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
205 Darray E;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
206 Value* v;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
207 d_uint32 k;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
208 d_uint32 n;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
209 d_uint32 a;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
210
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
211 A = new Darray();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
212 n = 0;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
213 v = &othis.value;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
214 for (a = 0; ; a++)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
215 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
216 if (!v.isPrimitive() && v.object.isDarray())
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
217 { d_uint32 len;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
218
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
219 E = cast(Darray)v.object;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
220 len = E.ulength;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
221 for (k = 0; k != len; k++)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
222 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
223 v = E.Get(k);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
224 if (v)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
225 A.Put(n, v, 0);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
226 n++;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
227 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
228 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
229 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
230 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
231 A.Put(n, v, 0);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
232 n++;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
233 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
234 if (a == arglist.length)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
235 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
236 v = &arglist[a];
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
237 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
238
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
239 A.Put(TEXT_length, n, DontDelete | DontEnum);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
240 Value.copy(ret, &A.value);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
241 return null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
242 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
243
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
244 /* ===================== Darray_prototype_join ================= */
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
245
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
246 void *Darray_prototype_join(Dobject pthis, CallContext *cc, Dobject othis, Value *ret, Value[] arglist)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
247 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
248 array_join(othis, ret, arglist);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
249 return null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
250 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
251
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
252 void array_join(Dobject othis, Value* ret, Value[] arglist)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
253 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
254 // ECMA 15.4.4.3
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
255 d_string separator;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
256 d_string r;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
257 d_uint32 len;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
258 d_uint32 k;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
259 Value* v;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
260
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
261 //writef("array_join(othis = %p)\n", othis);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
262 v = othis.Get(TEXT_length);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
263 len = v ? v.toUint32() : 0;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
264 if (arglist.length == 0)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
265 separator = TEXT_comma;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
266 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
267 separator = arglist[0].toString();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
268
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
269 for (k = 0; k != len; k++)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
270 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
271 if (k)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
272 r ~= separator;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
273 v = othis.Get(k);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
274 if (v && !v.isUndefinedOrNull())
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
275 r ~= v.toString();
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 ret.putVstring(r);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
279 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
280
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
281 /* ===================== Darray_prototype_toSource ================= */
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
282
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
283 void *Darray_prototype_toSource(Dobject pthis, CallContext *cc, Dobject othis, Value *ret, Value[] arglist)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
284 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
285 tchar[] separator;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
286 d_string r;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
287 d_uint32 len;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
288 d_uint32 k;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
289 Value* v;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
290
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
291 v = othis.Get(TEXT_length);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
292 len = v ? v.toUint32() : 0;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
293 separator = ",";
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
294
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
295 r = "[";
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
296 for (k = 0; k != len; k++)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
297 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
298 if (k)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
299 r ~= separator;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
300 v = othis.Get(k);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
301 if (v && !v.isUndefinedOrNull())
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
302 r ~= v.toSource();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
303 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
304 r ~= "]";
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
305
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
306 ret.putVstring(r);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
307 return null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
308 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
309
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
310
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
311 /* ===================== Darray_prototype_pop ================= */
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
312
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
313 void *Darray_prototype_pop(Dobject pthis, CallContext *cc, Dobject othis, Value *ret, Value[] arglist)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
314 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
315 // ECMA v3 15.4.4.6
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
316 Value* v;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
317 d_uint32 u;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
318
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
319 // If othis is a Darray, then we can optimize this significantly
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
320 v = othis.Get(TEXT_length);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
321 if (!v)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
322 v = &vundefined;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
323 u = v.toUint32();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
324 if (u == 0)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
325 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
326 othis.Put(TEXT_length, 0.0, DontDelete | DontEnum);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
327 ret.putVundefined();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
328 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
329 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
330 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
331 v = othis.Get(u - 1);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
332 if (!v)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
333 v = &vundefined;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
334 Value.copy(ret, v);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
335 othis.Delete(u - 1);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
336 othis.Put(TEXT_length, u - 1, DontDelete | DontEnum);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
337 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
338 return null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
339 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
340
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
341 /* ===================== Darray_prototype_push ================= */
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
342
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
343 void *Darray_prototype_push(Dobject pthis, CallContext *cc, Dobject othis, Value *ret, Value[] arglist)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
344 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
345 // ECMA v3 15.4.4.7
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
346 Value* v;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
347 d_uint32 u;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
348 d_uint32 a;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
349
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
350 // If othis is a Darray, then we can optimize this significantly
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
351 v = othis.Get(TEXT_length);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
352 if (!v)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
353 v = &vundefined;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
354 u = v.toUint32();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
355 for (a = 0; a < arglist.length; a++)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
356 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
357 othis.Put(u + a, &arglist[a], 0);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
358 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
359 othis.Put(TEXT_length, u + a, DontDelete | DontEnum);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
360 ret.putVnumber(u + a);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
361 return null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
362 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
363
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
364 /* ===================== Darray_prototype_reverse ================= */
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
365
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
366 void *Darray_prototype_reverse(Dobject pthis, CallContext *cc, Dobject othis, Value *ret, Value[] arglist)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
367 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
368 // ECMA 15.4.4.4
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
369 d_uint32 a;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
370 d_uint32 b;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
371 Value* va;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
372 Value* vb;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
373 Value* v;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
374 d_uint32 pivot;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
375 d_uint32 len;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
376 Value tmp;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
377
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
378 v = othis.Get(TEXT_length);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
379 len = v ? v.toUint32() : 0;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
380 pivot = len / 2;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
381 for (a = 0; a != pivot; a++)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
382 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
383 b = len - a - 1;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
384 //writef("a = %d, b = %d\n", a, b);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
385 va = othis.Get(a);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
386 if (va)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
387 Value.copy(&tmp, va);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
388 vb = othis.Get(b);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
389 if (vb)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
390 othis.Put(a, vb, 0);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
391 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
392 othis.Delete(a);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
393
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
394 if (va)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
395 othis.Put(b, &tmp, 0);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
396 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
397 othis.Delete(b);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
398 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
399 Value.copy(ret, &othis.value);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
400 return null;
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 /* ===================== Darray_prototype_shift ================= */
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
404
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
405 void *Darray_prototype_shift(Dobject pthis, CallContext *cc, Dobject othis, Value *ret, Value[] arglist)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
406 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
407 // ECMA v3 15.4.4.9
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
408 Value* v;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
409 Value* result;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
410 d_uint32 len;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
411 d_uint32 k;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
412
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
413 // If othis is a Darray, then we can optimize this significantly
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
414 //writef("shift(othis = %p)\n", othis);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
415 v = othis.Get(TEXT_length);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
416 if (!v)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
417 v = &vundefined;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
418 len = v.toUint32();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
419 if (len)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
420 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
421 result = othis.Get(0u);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
422 Value.copy(ret, result);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
423 for (k = 1; k != len; k++)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
424 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
425 v = othis.Get(k);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
426 if (v)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
427 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
428 othis.Put(k - 1, v, 0);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
429 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
430 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
431 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
432 othis.Delete(k - 1);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
433 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
434 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
435 othis.Delete(len - 1);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
436 len--;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
437 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
438 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
439 Value.copy(ret, &vundefined);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
440
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
441 othis.Put(TEXT_length, len, DontDelete | DontEnum);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
442 return null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
443 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
444
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
445 /* ===================== Darray_prototype_slice ================= */
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
446
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
447 void *Darray_prototype_slice(Dobject pthis, CallContext *cc, Dobject othis, Value *ret, Value[] arglist)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
448 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
449 // ECMA v3 15.4.4.10
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
450 d_uint32 len;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
451 d_uint32 n;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
452 d_uint32 k;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
453 d_uint32 r8;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
454 d_number start;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
455 d_number end;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
456 Value* v;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
457 Darray A;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
458
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
459 v = othis.Get(TEXT_length);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
460 if (!v)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
461 v = &vundefined;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
462 len = v.toUint32();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
463
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
464 switch (arglist.length)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
465 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
466 case 0:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
467 start = vundefined.toUint32();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
468 end = start;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
469 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
470
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
471 case 1:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
472 start = arglist[0].toInteger();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
473 end = len;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
474 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
475
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
476 default:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
477 start = arglist[0].toInteger();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
478 end = arglist[1].toInteger();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
479 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
480 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
481
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
482 if (start < 0)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
483 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
484 k = len + cast(d_uint32) start;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
485 if (cast(d_int32)k < 0)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
486 k = 0;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
487 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
488 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
489 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
490 k = cast(d_uint32) start;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
491 if (len < k)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
492 k = len;
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 if (end < 0)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
496 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
497 r8 = len + cast(d_uint32) end;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
498 if (cast(d_int32)r8 < 0)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
499 r8 = 0;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
500 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
501 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
502 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
503 r8 = cast(d_uint32) end;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
504 if (len < cast(d_uint32) end)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
505 r8 = len;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
506 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
507
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
508 A = new Darray();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
509 for (n = 0; k < r8; k++)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
510 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
511 v = othis.Get(k);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
512 if (v)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
513 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
514 A.Put(n, v, 0);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
515 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
516 n++;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
517 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
518
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
519 A.Put(TEXT_length, n, DontDelete | DontEnum);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
520 Value.copy(ret, &A.value);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
521 return null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
522 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
523
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
524 /* ===================== Darray_prototype_sort ================= */
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
525
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
526 static Dobject comparefn;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
527 static CallContext *comparecc;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
528
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
529 extern (C) int compare_value(void* x, void* y)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
530 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
531 Value* vx = cast(Value*)x;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
532 Value* vy = cast(Value*)y;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
533 d_string sx;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
534 d_string sy;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
535 int cmp;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
536
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
537 //writef("compare_value()\n");
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
538 if (vx.isUndefined())
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
539 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
540 cmp = (vy.isUndefined()) ? 0 : 1;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
541 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
542 else if (vy.isUndefined())
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
543 cmp = -1;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
544 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
545 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
546 if (comparefn)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
547 { Value arglist[2];
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
548 Value ret;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
549 Value* v;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
550 d_number n;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
551
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
552 Value.copy(&arglist[0], vx);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
553 Value.copy(&arglist[1], vy);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
554 ret.putVundefined();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
555 comparefn.Call(comparecc, comparefn, &ret, arglist);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
556 n = ret.toNumber();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
557 if (n < 0)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
558 cmp = -1;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
559 else if (n > 0)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
560 cmp = 1;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
561 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
562 cmp = 0;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
563 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
564 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
565 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
566 sx = vx.toString();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
567 sy = vy.toString();
4
6d905019f7bf some changes
saaadel
parents: 3
diff changeset
568 scope tv = new TextView!(tchar)(sx, false);
6d905019f7bf some changes
saaadel
parents: 3
diff changeset
569 cmp = tv.compare(sy);
6d905019f7bf some changes
saaadel
parents: 3
diff changeset
570 //cmp = std.string.cmp(sx, sy);
0
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
571 if (cmp < 0)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
572 cmp = -1;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
573 else if (cmp > 0)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
574 cmp = 1;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
575 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
576 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
577 return cmp;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
578 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
579
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
580 void *Darray_prototype_sort(Dobject pthis, CallContext *cc, Dobject othis, Value *ret, Value[] arglist)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
581 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
582 // ECMA v3 15.4.4.11
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
583 Value* v;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
584 d_uint32 len;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
585 uint u;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
586
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
587 //writef("Array.prototype.sort()\n");
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
588 v = othis.Get(TEXT_length);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
589 len = v ? v.toUint32() : 0;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
590
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
591 // This is not optimal, as isArrayIndex is done at least twice
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
592 // for every array member. Additionally, the qsort() by index
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
593 // can be avoided if we can deduce it is not a sparse array.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
594
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
595 Property *p;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
596 Value[] pvalues;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
597 d_uint32[] pindices;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
598 d_uint32 parraydim;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
599 d_uint32 nprops;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
600
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
601 // First, size & alloc our temp array
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
602 if (len < 100)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
603 { // Probably not too sparse an array
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
604 parraydim = len;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
605 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
606 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
607 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
608 parraydim = 0;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
609 foreach (inout Property p; *othis.proptable)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
610 { if (p.attributes == 0) // don't count special properties
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
611 parraydim++;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
612 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
613 if (parraydim > len) // could theoretically happen
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
614 parraydim = len;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
615 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
616
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
617 Value[] p1 = null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
618 Value* v1;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
619 version (Win32) // eh and alloca() not working under linux
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
620 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
621 if (parraydim < 128)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
622 v1 = cast(Value*)alloca(parraydim * Value.sizeof);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
623 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
624 if (v1)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
625 pvalues = v1[0 .. parraydim];
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
626 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
627 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
628 p1 = new Value[parraydim];
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
629 pvalues = p1;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
630 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
631
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
632 d_uint32[] p2 = null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
633 d_uint32* p3;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
634 version (Win32)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
635 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
636 if (parraydim < 128)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
637 p3 = cast(d_uint32*)alloca(parraydim * d_uint32.sizeof);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
638 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
639 if (p3)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
640 pindices = p3[0 .. parraydim];
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
641 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
642 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
643 p2 = new d_uint32[parraydim];
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
644 pindices = p2;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
645 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
646
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
647 // Now fill it with all the Property's that are array indices
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
648 nprops = 0;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
649 foreach (Value key, inout Property p; *othis.proptable)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
650 { d_uint32 index;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
651
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
652 if (p.attributes == 0 && key.isArrayIndex(index))
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
653 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
654 pindices[nprops] = index;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
655 Value.copy(&pvalues[nprops], &p.value);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
656 nprops++;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
657 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
658 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
659
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
660 synchronized
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
661 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
662 comparefn = null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
663 comparecc = cc;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
664 if (arglist.length)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
665 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
666 if (!arglist[0].isPrimitive())
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
667 comparefn = arglist[0].object;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
668 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
669
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
670 // Sort pvalues[]
4
6d905019f7bf some changes
saaadel
parents: 3
diff changeset
671 tango.stdc.stdlib.qsort(pvalues.ptr, nprops, Value.sizeof, &compare_value);
6d905019f7bf some changes
saaadel
parents: 3
diff changeset
672 //std.c.stdlib.qsort(pvalues.ptr, nprops, Value.sizeof, &compare_value);
0
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
673
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
674 comparefn = null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
675 comparecc = null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
676 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
677
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
678 // Stuff the sorted value's back into the array
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
679 for (u = 0; u < nprops; u++)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
680 { d_uint32 index;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
681
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
682 othis.Put(u, &pvalues[u], 0);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
683 index = pindices[u];
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
684 if (index >= nprops)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
685 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
686 othis.Delete(index);
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
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
690 delete p1;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
691 delete p2;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
692
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
693 ret.putVobject(othis);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
694 return null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
695 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
696
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
697 /* ===================== Darray_prototype_splice ================= */
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
698
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
699 void *Darray_prototype_splice(Dobject pthis, CallContext *cc, Dobject othis, Value *ret, Value[] arglist)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
700 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
701 // ECMA v3 15.4.4.12
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
702 d_uint32 len;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
703 d_uint32 k;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
704 d_number start;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
705 d_number deleteCount;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
706 Value* v;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
707 Darray A;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
708 d_uint32 a;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
709 d_uint32 delcnt;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
710 d_uint32 inscnt;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
711 d_uint32 startidx;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
712
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
713 v = othis.Get(TEXT_length);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
714 if (!v)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
715 v = &vundefined;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
716 len = v.toUint32();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
717
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
718 switch (arglist.length)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
719 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
720 case 0:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
721 start = vundefined.toUint32();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
722 deleteCount = start;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
723 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
724
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
725 case 1:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
726 start = arglist[0].toInteger();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
727 deleteCount = vundefined.toUint32();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
728 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
729
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
730 default:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
731 start = arglist[0].toInteger();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
732 deleteCount = arglist[1].toInteger();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
733 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
734 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
735
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
736 if (start < 0)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
737 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
738 startidx = len + cast(d_uint32) start;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
739 if (cast(d_int32)startidx < 0)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
740 startidx = 0;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
741 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
742 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
743 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
744 startidx = cast(d_uint32) start;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
745 if (len < startidx)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
746 startidx = len;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
747 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
748
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
749 A = new Darray();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
750
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
751 delcnt = (deleteCount > 0) ? cast(d_uint32) deleteCount : 0;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
752 if (delcnt > len - startidx)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
753 delcnt = len - startidx;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
754
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
755 // If deleteCount is not specified, ECMA implies it should
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
756 // be 0, while "JavaScript The Definitive Guide" says it should
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
757 // be delete to end of array. Jscript doesn't implement splice().
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
758 // We'll do it the Guide way.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
759 if (arglist.length < 2)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
760 delcnt = len - startidx;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
761
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
762 //writef("Darray.splice(startidx = %d, delcnt = %d)\n", startidx, delcnt);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
763 for (k = 0; k != delcnt; k++)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
764 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
765 v = othis.Get(startidx + k);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
766 if (v)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
767 A.Put(k, v, 0);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
768 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
769
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
770 A.Put(TEXT_length, delcnt, DontDelete | DontEnum);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
771 inscnt = (arglist.length > 2) ? arglist.length - 2 : 0;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
772 if (inscnt != delcnt)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
773 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
774 if (inscnt <= delcnt)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
775 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
776 for (k = startidx; k != (len - delcnt); k++)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
777 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
778 v = othis.Get(k + delcnt);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
779 if (v)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
780 othis.Put(k + inscnt, v, 0);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
781 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
782 othis.Delete(k + inscnt);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
783 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
784
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
785 for (k = len; k != (len - delcnt + inscnt); k--)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
786 othis.Delete(k - 1);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
787 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
788 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
789 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
790 for (k = len - delcnt; k != startidx; k--)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
791 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
792 v = othis.Get(k + delcnt - 1);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
793 if (v)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
794 othis.Put(k + inscnt - 1, v, 0);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
795 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
796 othis.Delete(k + inscnt - 1);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
797 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
798 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
799 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
800 k = startidx;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
801 for (a = 2; a < arglist.length; a++)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
802 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
803 v = &arglist[a];
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
804 othis.Put(k, v, 0);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
805 k++;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
806 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
807
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
808 othis.Put(TEXT_length, len - delcnt + inscnt, DontDelete | DontEnum);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
809 Value.copy(ret, &A.value);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
810 return null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
811 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
812
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
813 /* ===================== Darray_prototype_unshift ================= */
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
814
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
815 void *Darray_prototype_unshift(Dobject pthis, CallContext *cc, Dobject othis, Value *ret, Value[] arglist)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
816 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
817 // ECMA v3 15.4.4.13
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
818 Value* v;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
819 d_uint32 len;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
820 d_uint32 k;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
821
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
822 v = othis.Get(TEXT_length);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
823 if (!v)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
824 v = &vundefined;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
825 len = v.toUint32();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
826
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
827 for (k = len; k; k--)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
828 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
829 v = othis.Get(k - 1);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
830 if (v)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
831 othis.Put(k + arglist.length - 1, v, 0);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
832 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
833 othis.Delete(k + arglist.length - 1);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
834 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
835
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
836 for (k = 0; k < arglist.length; k++)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
837 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
838 othis.Put(k, &arglist[k], 0);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
839 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
840 othis.Put(TEXT_length, len + arglist.length, DontDelete | DontEnum);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
841 ret.putVnumber(len + arglist.length);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
842 return null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
843 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
844
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
845 /* =========================== Darray_prototype =================== */
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
846
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
847 class Darray_prototype : Darray
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
848 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
849 this(ThreadContext *tc)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
850 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
851 super(tc.Dobject_prototype);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
852 Dobject f = tc.Dfunction_prototype;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
853
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
854 Put(TEXT_constructor, tc.Darray_constructor, DontEnum);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
855
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
856 static NativeFunctionData nfd[] =
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
857 [
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
858 { &TEXT_toString, &Darray_prototype_toString, 0 },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
859 { &TEXT_toLocaleString, &Darray_prototype_toLocaleString, 0 },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
860 { &TEXT_toSource, &Darray_prototype_toSource, 0 },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
861 { &TEXT_concat, &Darray_prototype_concat, 1 },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
862 { &TEXT_join, &Darray_prototype_join, 1 },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
863 { &TEXT_pop, &Darray_prototype_pop, 0 },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
864 { &TEXT_push, &Darray_prototype_push, 1 },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
865 { &TEXT_reverse, &Darray_prototype_reverse, 0 },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
866 { &TEXT_shift, &Darray_prototype_shift, 0, },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
867 { &TEXT_slice, &Darray_prototype_slice, 2 },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
868 { &TEXT_sort, &Darray_prototype_sort, 1 },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
869 { &TEXT_splice, &Darray_prototype_splice, 2 },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
870 { &TEXT_unshift, &Darray_prototype_unshift, 1 },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
871 ];
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
872
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
873 DnativeFunction.init(this, nfd, DontEnum);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
874 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
875 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
876
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
877
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
878 /* =========================== Darray =================== */
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
879
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
880 class Darray : Dobject
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
881 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
882 Value length; // length property
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
883 d_uint32 ulength;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
884
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
885 this()
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
886 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
887 this(getPrototype());
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
888 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
889
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
890 this(Dobject prototype)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
891 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
892 super(prototype);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
893 length.putVnumber(0);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
894 ulength = 0;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
895 classname = TEXT_Array;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
896 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
897
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
898 Value* Put(Identifier* key, Value* value, uint attributes)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
899 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
900 Value* result = proptable.put(&key.value, key.value.hash, value, attributes);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
901 if (!result)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
902 Put(key.value.string, value, attributes);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
903 return null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
904 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
905
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
906 Value* Put(d_string name, Value* v, uint attributes)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
907 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
908 d_uint32 i;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
909 uint c;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
910 Value* result;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
911
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
912 // ECMA 15.4.5.1
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
913 result = proptable.put(name, v, attributes);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
914 if (!result)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
915 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
916 if (name == TEXT_length)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
917 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
918 i = v.toUint32();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
919 if (i != v.toInteger())
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
920 { ErrInfo errinfo;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
921
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
922 return Dobject.RuntimeError(&errinfo, ERR_LENGTH_INT);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
923 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
924 if (i < ulength)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
925 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
926 // delete all properties with keys >= i
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
927 d_uint32[] todelete;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
928
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
929 foreach (Value key, inout Property p; *proptable)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
930 { d_uint32 j;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
931
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
932 j = key.toUint32();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
933 if (j >= i)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
934 todelete ~= j;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
935 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
936 foreach (d_uint32 j; todelete)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
937 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
938 proptable.del(j);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
939 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
940 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
941 ulength = i;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
942 length.number = i;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
943 proptable.put(name, v, attributes | DontDelete | DontEnum);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
944 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
945
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
946 // if (name is an array index i)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
947
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
948 i = 0;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
949 for (size_t j = 0; j < name.length; j++)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
950 { ulong k;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
951
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
952 c = name[j];
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
953 if (c == '0' && i == 0 && name.length > 1)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
954 goto Lret;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
955 if (c >= '0' && c <= '9')
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
956 { k = i * cast(ulong)10 + c - '0';
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
957 i = cast(d_uint32)k;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
958 if (i != k)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
959 goto Lret; // overflow
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
960 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
961 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
962 goto Lret;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
963 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
964 if (i >= ulength)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
965 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
966 if (i == 0xFFFFFFFF)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
967 goto Lret;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
968 ulength = i + 1;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
969 length.number = ulength;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
970 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
971 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
972 Lret:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
973 return null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
974 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
975
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
976 Value* Put(d_string name, Dobject o, uint attributes)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
977 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
978 return Put(name, &o.value, attributes);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
979 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
980
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
981 Value* Put(d_string PropertyName, d_number n, uint attributes)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
982 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
983 Value v;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
984
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
985 v.putVnumber(n);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
986 return Put(PropertyName, &v, attributes);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
987 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
988
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
989 Value* Put(d_string PropertyName, d_string string, uint attributes)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
990 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
991 Value v;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
992
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
993 v.putVstring(string);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
994 return Put(PropertyName, &v, attributes);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
995 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
996
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
997 Value* Put(d_uint32 index, Value* vindex, Value* value, uint attributes)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
998 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
999 if (index >= ulength)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1000 ulength = index + 1;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1001
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1002 proptable.put(vindex, index ^ 0x55555555 /*Value.calcHash(index)*/, value, attributes);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1003 return null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1004 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1005
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1006 Value* Put(d_uint32 index, Value* value, uint attributes)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1007 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1008 if (index >= ulength)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1009 { ulength = index + 1;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1010 length.number = ulength;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1011 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1012
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1013 proptable.put(index, value, attributes);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1014 return null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1015 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1016
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1017 Value* Put(d_uint32 index, d_string string, uint attributes)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1018 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1019 if (index >= ulength)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1020 { ulength = index + 1;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1021 length.number = ulength;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1022 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1023
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1024 proptable.put(index, string, attributes);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1025 return null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1026 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1027
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1028 Value* Get(Identifier* id)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1029 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1030 //writef("Darray.Get(%p, '%s')\n", &proptable, PropertyName);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1031 if (id.value.string == TEXT_length)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1032 { length.number = ulength;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1033 return &length;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1034 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1035 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1036 return Dobject.Get(id);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1037 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1038
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1039 Value* Get(d_string PropertyName, uint hash)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1040 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1041 //writef("Darray.Get(%p, '%s')\n", &proptable, PropertyName);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1042 if (PropertyName == TEXT_length)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1043 { length.number = ulength;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1044 return &length;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1045 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1046 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1047 return Dobject.Get(PropertyName, hash);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1048 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1049
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1050 Value* Get(d_uint32 index)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1051 { Value* v;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1052
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1053 //writef("Darray.Get(%p, %d)\n", &proptable, index);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1054 v = proptable.get(index);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1055 return v;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1056 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1057
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1058 Value* Get(d_uint32 index, Value* vindex)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1059 { Value* v;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1060
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1061 //writef("Darray.Get(%p, %d)\n", &proptable, index);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1062 v = proptable.get(vindex, index ^ 0x55555555 /*Value.calcHash(index)*/);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1063 return v;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1064 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1065
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1066 int Delete(d_string PropertyName)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1067 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1068 // ECMA 8.6.2.5
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1069 //writef("Darray.Delete('%ls')\n", d_string_ptr(PropertyName));
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1070 if (PropertyName == TEXT_length)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1071 return 0; // can't delete 'length' property
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1072 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1073 return proptable.del(PropertyName);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1074 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1075
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1076 int Delete(d_uint32 index)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1077 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1078 // ECMA 8.6.2.5
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1079 return proptable.del(index);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1080 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1081
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1082
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1083 static Dfunction getConstructor()
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1084 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1085 ThreadContext *tc = ThreadContext.getThreadContext();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1086 assert(tc);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1087 return tc.Darray_constructor;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1088 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1089
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1090 static Dobject getPrototype()
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1091 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1092 ThreadContext *tc = ThreadContext.getThreadContext();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1093 assert(tc);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1094 return tc.Darray_prototype;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1095 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1096
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1097 static void init(ThreadContext *tc)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1098 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1099 tc.Darray_constructor = new Darray_constructor(tc);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1100 tc.Darray_prototype = new Darray_prototype(tc);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1101
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1102 tc.Darray_constructor.Put(TEXT_prototype, tc.Darray_prototype, DontEnum | DontDelete | ReadOnly);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1103 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1104 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1105