annotate dmdscript_tango/dfunction.d @ 0:55c2951c07be

initial, files origin, premoved tree
author saaadel
date Sun, 24 Jan 2010 12:34:47 +0200
parents
children 8363a4bf6a8f
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
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
22 module dmdscript.dfunction;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
23
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
24 import std.string;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
25 import std.c.stdlib;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
26
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
27 import dmdscript.script;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
28 import dmdscript.dobject;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
29 import dmdscript.value;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
30 import dmdscript.protoerror;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
31 import dmdscript.threadcontext;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
32 import dmdscript.text;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
33 import dmdscript.errmsgs;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
34 import dmdscript.property;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
35 import dmdscript.scopex;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
36 import dmdscript.dnative;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
37 import dmdscript.functiondefinition;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
38 import dmdscript.parse;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
39 import dmdscript.ddeclaredfunction;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
40
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
41 /* ===================== Dfunction_constructor ==================== */
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
42
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
43 class Dfunction_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
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
49 // Actually put in later by Dfunction::init()
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
50 //unsigned attributes = DontEnum | DontDelete | ReadOnly;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
51 //Put(TEXT_prototype, Dfunction::getPrototype(), attributes);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
52 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
53
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
54 void *Construct(CallContext *cc, Value *ret, Value[] arglist)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
55 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
56 // ECMA 15.3.2.1
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
57 d_string bdy;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
58 d_string P;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
59 FunctionDefinition fd;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
60 ErrInfo errinfo;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
61
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
62 //writef("Dfunction_constructor::Construct()\n");
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
63
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
64 // Get parameter list (P) and body from arglist[]
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
65 if (arglist.length)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
66 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
67 bdy = arglist[arglist.length - 1].toString();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
68 if (arglist.length >= 2)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
69 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
70 for (uint a = 0; a < arglist.length - 1; a++)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
71 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
72 if (a)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
73 P ~= ',';
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
74 P ~= arglist[a].toString();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
75 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
76 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
77 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
78
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
79 if (Parser.parseFunctionDefinition(fd, P, bdy, errinfo))
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
80 goto Lsyntaxerror;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
81
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
82 if (fd)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
83 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
84 Scope sc;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
85
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
86 sc.ctor(fd);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
87 fd.semantic(&sc);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
88 errinfo = sc.errinfo;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
89 if (errinfo.message)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
90 goto Lsyntaxerror;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
91 fd.toIR(null);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
92 Dfunction fobj = new DdeclaredFunction(fd);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
93 ret.putVobject(fobj);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
94 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
95 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
96 ret.putVundefined();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
97
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
98 return null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
99
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
100 Lsyntaxerror:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
101 Dobject o;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
102
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
103 ret.putVundefined();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
104 o = new syntaxerror.D0(&errinfo);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
105 Value* v = new Value;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
106 v.putVobject(o);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
107 return v;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
108 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
109
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
110 void *Call(CallContext *cc, Dobject othis, Value* ret, Value[] arglist)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
111 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
112 // ECMA 15.3.1
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
113 return Construct(cc, ret, arglist);
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
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
117
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
118 /* ===================== Dfunction_prototype_toString =============== */
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
119
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
120 void* Dfunction_prototype_toString(Dobject pthis, CallContext *cc, Dobject othis, Value *ret, Value[] arglist)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
121 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
122 d_string s;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
123 Dfunction f;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
124
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
125 //writef("function.prototype.toString()\n");
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
126 // othis must be a Function
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
127 if (!othis.isClass(TEXT_Function))
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
128 { ErrInfo errinfo;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
129 ret.putVundefined();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
130 return Dobject.RuntimeError(&errinfo, ERR_TS_NOT_TRANSFERRABLE);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
131 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
132 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
133 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
134 // Generate string that looks like a FunctionDeclaration
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
135 // FunctionDeclaration:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
136 // function Identifier (Identifier, ...) Block
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
137
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
138 // If anonymous function, the name should be "anonymous"
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
139 // per ECMA 15.3.2.1.19
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
140
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
141 f = cast(Dfunction)othis;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
142 s = f.toString();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
143 ret.putVstring(s);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
144 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
145 return null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
146 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
147
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
148 /* ===================== Dfunction_prototype_apply =============== */
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
149
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
150 void* Dfunction_prototype_apply(Dobject pthis, CallContext *cc, Dobject othis, Value *ret, Value[] arglist)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
151 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
152 // ECMA v3 15.3.4.3
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
153
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
154 Value* thisArg;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
155 Value* argArray;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
156 Dobject o;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
157 void* v;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
158
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
159 thisArg = &vundefined;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
160 argArray = &vundefined;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
161 switch (arglist.length)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
162 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
163 case 0:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
164 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
165 default:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
166 argArray = &arglist[1];
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
167 case 1:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
168 thisArg = &arglist[0];
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
169 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
170 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
171
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
172 if (thisArg.isUndefinedOrNull())
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
173 o = cc.global;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
174 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
175 o = thisArg.toObject();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
176
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
177 if (argArray.isUndefinedOrNull())
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
178 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
179 v = othis.Call(cc, o, ret, null);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
180 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
181 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
182 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
183 if (argArray.isPrimitive())
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
184 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
185 Ltypeerror:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
186 ret.putVundefined();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
187 ErrInfo errinfo;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
188 return Dobject.RuntimeError(&errinfo, ERR_ARRAY_ARGS);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
189 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
190 Dobject a;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
191
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
192 a = argArray.toObject();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
193
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
194 // Must be array or arguments object
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
195 if (!a.isDarray() && !a.isDarguments())
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
196 goto Ltypeerror;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
197
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
198 uint len;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
199 uint i;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
200 Value[] alist;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
201 Value* x;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
202
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
203 x = a.Get(TEXT_length);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
204 len = x ? x.toUint32() : 0;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
205
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
206 Value[] p1;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
207 Value* v1;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
208 if (len < 128)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
209 v1 = cast(Value*)alloca(len * Value.sizeof);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
210 if (v1)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
211 alist = v1[0 .. len];
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
212 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
213 { p1 = new Value[len];
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
214 alist = p1;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
215 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
216
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
217 for (i = 0; i < len; i++)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
218 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
219 x = a.Get(i);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
220 Value.copy(&alist[i], x);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
221 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
222
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
223 v = othis.Call(cc, o, ret, alist);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
224
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
225 delete p1;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
226 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
227 return v;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
228 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
229
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
230 /* ===================== Dfunction_prototype_call =============== */
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
231
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
232 void* Dfunction_prototype_call(Dobject pthis, CallContext *cc, Dobject othis, Value *ret, Value[] arglist)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
233 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
234 // ECMA v3 15.3.4.4
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
235 Value* thisArg;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
236 Dobject o;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
237 void* v;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
238
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
239 if (arglist.length == 0)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
240 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
241 o = cc.global;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
242 v = othis.Call(cc, o, ret, arglist);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
243 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
244 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
245 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
246 thisArg = &arglist[0];
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
247 if (thisArg.isUndefinedOrNull())
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
248 o = cc.global;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
249 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
250 o = thisArg.toObject();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
251 v = othis.Call(cc, o, ret, arglist[1 .. length]);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
252 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
253 return v;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
254 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
255
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
256 /* ===================== Dfunction_prototype ==================== */
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
257
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
258 class Dfunction_prototype : Dfunction
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
259 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
260 this(ThreadContext *tc)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
261 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
262 super(0, tc.Dobject_prototype);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
263
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
264 uint attributes = DontEnum;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
265
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
266 classname = TEXT_Function;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
267 name = "prototype";
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
268 Put(TEXT_constructor, tc.Dfunction_constructor, attributes);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
269
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
270 static NativeFunctionData nfd[] =
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
271 [
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
272 { &TEXT_toString, &Dfunction_prototype_toString, 0 },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
273 { &TEXT_apply, &Dfunction_prototype_apply, 2 },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
274 { &TEXT_call, &Dfunction_prototype_call, 1 },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
275 ];
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
276
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
277 DnativeFunction.init(this, nfd, attributes);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
278 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
279
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
280 void *Call(CallContext *cc, Dobject othis, Value* ret, Value[] arglist)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
281 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
282 // ECMA v3 15.3.4
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
283 // Accept any arguments and return "undefined"
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
284 ret.putVundefined();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
285 return null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
286 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
287 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
288
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
289
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
290 /* ===================== Dfunction ==================== */
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
291
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
292 class Dfunction : Dobject
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
293 { tchar[] name;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
294 Dobject[] scopex; // Function object's scope chain per 13.2 step 7
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
295
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
296 this(d_uint32 length)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
297 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
298 this(length, Dfunction.getPrototype());
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
299 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
300
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
301 this(d_uint32 length, Dobject prototype)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
302 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
303 super(prototype);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
304 classname = TEXT_Function;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
305 name = TEXT_Function;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
306 Put(TEXT_length, length, DontDelete | DontEnum | ReadOnly);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
307 Put(TEXT_arity, length, DontDelete | DontEnum | ReadOnly);
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 d_string getTypeof()
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
311 { // ECMA 11.4.3
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
312 return TEXT_function;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
313 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
314
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
315 d_string toString()
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
316 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
317 // Native overrides of this function replace Identifier with the actual name.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
318 // Don't need to do parameter list, though.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
319 d_string s;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
320
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
321 s = std.string.format("function %s() { [native code] }", name);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
322 return s;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
323 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
324
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
325 void *HasInstance(Value* ret, Value* v)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
326 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
327 // ECMA v3 15.3.5.3
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
328 Dobject V;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
329 Value* w;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
330 Dobject o;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
331
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
332 if (v.isPrimitive())
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
333 goto Lfalse;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
334 V = v.toObject();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
335 w = Get(TEXT_prototype);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
336 if (w.isPrimitive())
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
337 { ErrInfo errinfo;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
338 return RuntimeError(&errinfo, errmsgtbl[ERR_MUST_BE_OBJECT], w.getType());
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
339 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
340 o = w.toObject();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
341 for (;;)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
342 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
343 V = V.internal_prototype;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
344 if (!V)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
345 goto Lfalse;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
346 if (o == V)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
347 goto Ltrue;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
348 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
349
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
350 Ltrue:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
351 ret.putVboolean(true);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
352 return null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
353
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
354 Lfalse:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
355 ret.putVboolean(false);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
356 return null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
357 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
358
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
359 static Dfunction isFunction(Value* v)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
360 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
361 Dfunction r;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
362 Dobject o;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
363
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
364 r = null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
365 if (!v.isPrimitive())
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
366 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
367 o = v.toObject();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
368 if (o.isClass(TEXT_Function))
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
369 r = cast(Dfunction)o;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
370 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
371 return r;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
372 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
373
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
374
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
375 static Dfunction getConstructor()
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
376 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
377 ThreadContext *tc = ThreadContext.getThreadContext();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
378 assert(tc);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
379 return tc.Dfunction_constructor;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
380 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
381
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
382 static Dobject getPrototype()
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
383 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
384 ThreadContext *tc = ThreadContext.getThreadContext();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
385 assert(tc);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
386 return tc.Dfunction_prototype;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
387 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
388
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
389 static void init(ThreadContext *tc)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
390 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
391 tc.Dfunction_constructor = new Dfunction_constructor(tc);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
392 tc.Dfunction_prototype = new Dfunction_prototype(tc);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
393
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
394 tc.Dfunction_constructor.Put(TEXT_prototype, tc.Dfunction_prototype, DontEnum | DontDelete | ReadOnly);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
395
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
396 tc.Dfunction_constructor.internal_prototype = tc.Dfunction_prototype;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
397 tc.Dfunction_constructor.proptable.previous = tc.Dfunction_prototype.proptable;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
398 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
399 }