annotate dmdscript_tango/dglobal.d @ 3:8363a4bf6a8f

rename package: dmdscript to dmdscript_tango
author saaadel
date Sun, 24 Jan 2010 18:33:05 +0200
parents 55c2951c07be
children 4adfb4e05382
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-2006 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.dglobal;
0
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
23
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
24 import std.uri;
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 import std.c.string;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
27 import std.stdio;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
28 import std.math;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
29
3
8363a4bf6a8f rename package: dmdscript to dmdscript_tango
saaadel
parents: 0
diff changeset
30 import dmdscript_tango.script;
8363a4bf6a8f rename package: dmdscript to dmdscript_tango
saaadel
parents: 0
diff changeset
31 import dmdscript_tango.protoerror;
8363a4bf6a8f rename package: dmdscript to dmdscript_tango
saaadel
parents: 0
diff changeset
32 import dmdscript_tango.parse;
8363a4bf6a8f rename package: dmdscript to dmdscript_tango
saaadel
parents: 0
diff changeset
33 import dmdscript_tango.text;
8363a4bf6a8f rename package: dmdscript to dmdscript_tango
saaadel
parents: 0
diff changeset
34 import dmdscript_tango.dobject;
8363a4bf6a8f rename package: dmdscript to dmdscript_tango
saaadel
parents: 0
diff changeset
35 import dmdscript_tango.value;
8363a4bf6a8f rename package: dmdscript to dmdscript_tango
saaadel
parents: 0
diff changeset
36 import dmdscript_tango.statement;
8363a4bf6a8f rename package: dmdscript to dmdscript_tango
saaadel
parents: 0
diff changeset
37 import dmdscript_tango.threadcontext;
8363a4bf6a8f rename package: dmdscript to dmdscript_tango
saaadel
parents: 0
diff changeset
38 import dmdscript_tango.functiondefinition;
8363a4bf6a8f rename package: dmdscript to dmdscript_tango
saaadel
parents: 0
diff changeset
39 import dmdscript_tango.scopex;
8363a4bf6a8f rename package: dmdscript to dmdscript_tango
saaadel
parents: 0
diff changeset
40 import dmdscript_tango.opcodes;
8363a4bf6a8f rename package: dmdscript to dmdscript_tango
saaadel
parents: 0
diff changeset
41 import dmdscript_tango.property;
0
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
42
3
8363a4bf6a8f rename package: dmdscript to dmdscript_tango
saaadel
parents: 0
diff changeset
43 import dmdscript_tango.dstring;
8363a4bf6a8f rename package: dmdscript to dmdscript_tango
saaadel
parents: 0
diff changeset
44 import dmdscript_tango.darray;
8363a4bf6a8f rename package: dmdscript to dmdscript_tango
saaadel
parents: 0
diff changeset
45 import dmdscript_tango.dregexp;
8363a4bf6a8f rename package: dmdscript to dmdscript_tango
saaadel
parents: 0
diff changeset
46 import dmdscript_tango.dnumber;
8363a4bf6a8f rename package: dmdscript to dmdscript_tango
saaadel
parents: 0
diff changeset
47 import dmdscript_tango.dboolean;
8363a4bf6a8f rename package: dmdscript to dmdscript_tango
saaadel
parents: 0
diff changeset
48 import dmdscript_tango.dfunction;
8363a4bf6a8f rename package: dmdscript to dmdscript_tango
saaadel
parents: 0
diff changeset
49 import dmdscript_tango.dnative;
0
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
50
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
51 d_string arg0string(Value[] arglist)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
52 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
53 Value* v = arglist.length ? &arglist[0] : &vundefined;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
54 return v.toString();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
55 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
56
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
57 /* ====================== Dglobal_eval ================ */
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
58
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
59 void* Dglobal_eval(Dobject pthis, CallContext *cc, Dobject othis, Value* ret, Value[] arglist)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
60 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
61 // ECMA 15.1.2.1
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
62 Value* v;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
63 d_string s;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
64 FunctionDefinition fd;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
65 ErrInfo errinfo;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
66
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
67 //FuncLog funclog(L"Global.eval()");
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
68
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
69 v = arglist.length ? &arglist[0] : &vundefined;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
70 if (v.getType() != TypeString)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
71 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
72 Value.copy(ret, v);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
73 return null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
74 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
75 s = v.toString();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
76 //writef("eval('%ls')\n", s);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
77
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
78 // Parse program
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
79 TopStatement[] topstatements;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
80 Parser p = new Parser("eval", s, 0);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
81 if (p.parseProgram(topstatements, &errinfo))
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
82 goto Lsyntaxerror;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
83
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
84 // Analyze, generate code
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
85 fd = new FunctionDefinition(topstatements);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
86 fd.iseval = 1;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
87 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
88 Scope sc;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
89 sc.ctor(fd);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
90 sc.src = s;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
91 fd.semantic(&sc);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
92 errinfo = sc.errinfo;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
93 sc.dtor();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
94 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
95 if (errinfo.message)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
96 goto Lsyntaxerror;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
97 fd.toIR(null);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
98
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
99 // Execute code
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
100 Value[] locals;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
101 Value[] p1 = null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
102
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
103 Value* v1 = null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
104 if (fd.nlocals < 128)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
105 v1 = cast(Value*) alloca(fd.nlocals * Value.sizeof);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
106 if (v1)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
107 locals = v1[0 .. fd.nlocals];
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
108 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
109 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
110 p1 = new Value[fd.nlocals];
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
111 locals = p1;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
112 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
113
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
114 void *result;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
115 version (none)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
116 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
117 Array scopex;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
118 scopex.reserve(cc.scoperoot + fd.withdepth + 2);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
119 for (uint u = 0; u < cc.scoperoot; u++)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
120 scopex.push(cc.scopex.data[u]);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
121
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
122 Array *scopesave = cc.scopex;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
123 cc.scopex = &scopex;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
124 Dobject variablesave = cc.variable;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
125 cc.variable = cc.global;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
126
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
127 fd.instantiate(cc.variable, 0);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
128
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
129 // The this value is the same as the this value of the
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
130 // calling context.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
131 result = IR.call(cc, othis, fd.code, ret, locals);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
132
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
133 delete p1;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
134 cc.variable = variablesave;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
135 cc.scopex = scopesave;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
136 return result;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
137 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
138 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
139 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
140 // The scope chain is initialized to contain the same objects,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
141 // in the same order, as the calling context's scope chain.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
142 // This includes objects added to the calling context's
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
143 // scope chain by WithStatement.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
144 // cc.scopex.reserve(fd.withdepth);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
145
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
146 // Variable instantiation is performed using the calling
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
147 // context's variable object and using empty
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
148 // property attributes
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
149 fd.instantiate(cc.scopex, cc.variable, 0);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
150
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
151 // The this value is the same as the this value of the
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
152 // calling context.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
153 assert(cc.callerothis);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
154 result = IR.call(cc, cc.callerothis, fd.code, ret, locals.ptr);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
155 if (p1)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
156 delete p1;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
157 fd = null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
158 //if (result) writef("result = '%s'\n", d_string_ptr(((Value* )result).toString()));
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
159 return result;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
160 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
161
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
162 Lsyntaxerror:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
163 Dobject o;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
164
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
165 // For eval()'s, use location of caller, not the string
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
166 errinfo.linnum = 0;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
167
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
168 ret.putVundefined();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
169 o = new syntaxerror.D0(&errinfo);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
170 Value* v2 = new Value;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
171 v2.putVobject(o);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
172 return v2;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
173 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
174
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
175 /* ====================== Dglobal_parseInt ================ */
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
176
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
177 void* Dglobal_parseInt(Dobject pthis, CallContext *cc, Dobject othis, Value* ret, Value[] arglist)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
178 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
179 // ECMA 15.1.2.2
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
180 Value* v2;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
181 tchar *s;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
182 tchar *z;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
183 d_int32 radix;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
184 int sign = 1;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
185 d_number number;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
186 uint i;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
187 d_string string;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
188
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
189 string = arg0string(arglist);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
190
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
191 //writefln("Dglobal_parseInt('%s')", string);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
192
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
193 while (i < string.length)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
194 { uint idx = i;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
195 dchar c = std.utf.decode(string, idx);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
196 if (!isStrWhiteSpaceChar(c))
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
197 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
198 i = idx;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
199 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
200 s = string.ptr + i;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
201 i = string.length - i;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
202
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
203 if (i)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
204 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
205 if (*s == '-')
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
206 { sign = -1;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
207 s++;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
208 i--;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
209 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
210 else if (*s == '+')
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
211 { s++;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
212 i--;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
213 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
214 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
215
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
216 radix = 0;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
217 if (arglist.length >= 2)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
218 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
219 v2 = &arglist[1];
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
220 radix = v2.toInt32();
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 if (radix)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
224 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
225 if (radix < 2 || radix > 36)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
226 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
227 number = d_number.nan;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
228 goto Lret;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
229 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
230 if (radix == 16 && i >= 2 && *s == '0' &&
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
231 (s[1] == 'x' || s[1] == 'X'))
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
232 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
233 s += 2;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
234 i -= 2;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
235 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
236 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
237 else if (i >= 1 && *s != '0')
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
238 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
239 radix = 10;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
240 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
241 else if (i >= 2 && (s[1] == 'x' || s[1] == 'X'))
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
242 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
243 radix = 16;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
244 s += 2;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
245 i -= 2;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
246 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
247 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
248 radix = 8;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
249
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
250 number = 0;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
251 for (z = s; i; z++, i--)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
252 { d_int32 n;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
253 tchar c;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
254
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
255 c = *z;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
256 if ('0' <= c && c <= '9')
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
257 n = c - '0';
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
258 else if ('A' <= c && c <= 'Z')
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
259 n = c - 'A' + 10;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
260 else if ('a' <= c && c <= 'z')
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
261 n = c - 'a' + 10;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
262 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
263 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
264 if (radix <= n)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
265 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
266 number = number * radix + n;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
267 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
268 if (z == s)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
269 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
270 number = d_number.nan;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
271 goto Lret;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
272 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
273 if (sign < 0)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
274 number = -number;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
275
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
276 version (none) // ECMA says to silently ignore trailing characters
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
277 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
278 while (z - &string[0] < string.length)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
279 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
280 if (!isStrWhiteSpaceChar(*z))
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
281 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
282 number = d_number.nan;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
283 goto Lret;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
284 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
285 z++;
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 Lret:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
290 ret.putVnumber(number);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
291 return null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
292 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
293
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
294 /* ====================== Dglobal_parseFloat ================ */
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
295
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
296 void* Dglobal_parseFloat(Dobject pthis, CallContext *cc, Dobject othis, Value* ret, Value[] arglist)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
297 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
298 // ECMA 15.1.2.3
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
299 d_number n;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
300 size_t endidx;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
301
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
302 d_string string = arg0string(arglist);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
303 n = StringNumericLiteral(string, endidx, 1);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
304
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
305 ret.putVnumber(n);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
306 return null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
307 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
308
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
309 /* ====================== Dglobal_escape ================ */
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
310
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
311 int ISURIALNUM(dchar c)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
312 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
313 return (c >= 'a' && c <= 'z') ||
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
314 (c >= 'A' && c <= 'Z') ||
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
315 (c >= '0' && c <= '9');
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
316 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
317
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
318 tchar TOHEX[16+1] = "0123456789ABCDEF";
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
319
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
320 void* Dglobal_escape(Dobject pthis, CallContext *cc, Dobject othis, Value* ret, Value[] arglist)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
321 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
322 // ECMA 15.1.2.4
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
323 d_string s;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
324 d_string R;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
325 uint escapes;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
326 uint unicodes;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
327 size_t slen;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
328
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
329 s = arg0string(arglist);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
330 escapes = 0;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
331 unicodes = 0;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
332 foreach (dchar c; s)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
333 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
334 slen++;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
335 if (c >= 0x100)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
336 unicodes++;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
337 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
338 if (c == 0 || c >= 0x80 || (!ISURIALNUM(c) && std.string.find("*@-_+./", c) == -1))
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
339 escapes++;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
340 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
341 if ((escapes + unicodes) == 0)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
342 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
343 R = s;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
344 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
345 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
346 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
347 //writefln("s.length = %d, escapes = %d, unicodes = %d", s.length, escapes, unicodes);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
348 R = new tchar[slen + escapes * 2 + unicodes * 5];
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
349 tchar* r = R.ptr;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
350 foreach (dchar c; s)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
351 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
352 if (c >= 0x100)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
353 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
354 r[0] = '%';
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
355 r[1] = 'u';
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
356 r[2] = TOHEX[(c >> 12) & 15];
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
357 r[3] = TOHEX[(c >> 8) & 15];
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
358 r[4] = TOHEX[(c >> 4) & 15];
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
359 r[5] = TOHEX[c & 15];
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
360 r += 6;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
361 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
362 else if (c == 0 || c >= 0x80 || (!ISURIALNUM(c) && std.string.find("*@-_+./", c) == -1))
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
363 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
364 r[0] = '%';
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
365 r[1] = TOHEX[c >> 4];
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
366 r[2] = TOHEX[c & 15];
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
367 r += 3;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
368 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
369 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
370 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
371 r[0] = cast(tchar)c;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
372 r++;
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 assert(r - R.ptr == R.length);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
376 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
377 ret.putVstring(R);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
378 return null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
379 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
380
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
381 /* ====================== Dglobal_unescape ================ */
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
382
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
383 void* Dglobal_unescape(Dobject pthis, CallContext *cc, Dobject othis, Value* ret, Value[] arglist)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
384 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
385 // ECMA 15.1.2.5
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
386 d_string s;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
387 d_string R;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
388
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
389 s = arg0string(arglist);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
390 //writefln("Dglobal.unescape(s = '%s')", s);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
391 for (size_t k = 0; k < s.length; k++)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
392 { tchar c = s[k];
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
393
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
394 if (c == '%')
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
395 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
396 if (k + 6 <= s.length && s[k + 1] == 'u')
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
397 { uint u;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
398
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
399 u = 0;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
400 for (int i = 2; ; i++)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
401 { uint x;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
402
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
403 if (i == 6)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
404 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
405 std.utf.encode(R, cast(dchar)u);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
406 k += 5;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
407 goto L1;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
408 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
409 x = s[k + i];
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
410 if ('0' <= x && x <= '9')
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
411 x = x - '0';
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
412 else if ('A' <= x && x <= 'F')
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
413 x = x - 'A' + 10;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
414 else if ('a' <= x && x <= 'f')
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
415 x = x - 'a' + 10;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
416 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
417 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
418 u = (u << 4) + x;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
419 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
420 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
421 else if (k + 3 <= s.length)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
422 { uint u;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
423
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
424 u = 0;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
425 for (int i = 1; ; i++)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
426 { uint x;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
427
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
428 if (i == 3)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
429 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
430 std.utf.encode(R, cast(dchar)u);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
431 k += 2;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
432 goto L1;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
433 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
434 x = s[k + i];
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
435 if ('0' <= x && x <= '9')
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
436 x = x - '0';
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
437 else if ('A' <= x && x <= 'F')
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
438 x = x - 'A' + 10;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
439 else if ('a' <= x && x <= 'f')
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
440 x = x - 'a' + 10;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
441 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
442 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
443 u = (u << 4) + x;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
444 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
445 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
446 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
447 R ~= c;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
448 L1:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
449 ;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
450 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
451
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
452 ret.putVstring(R);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
453 return null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
454 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
455
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
456 /* ====================== Dglobal_isNaN ================ */
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
457
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
458 void* Dglobal_isNaN(Dobject pthis, CallContext *cc, Dobject othis, Value* ret, Value[] arglist)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
459 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
460 // ECMA 15.1.2.6
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
461 Value* v;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
462 d_number n;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
463 d_boolean b;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
464
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
465 if (arglist.length)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
466 v = &arglist[0];
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
467 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
468 v = &vundefined;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
469 n = v.toNumber();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
470 b = isnan(n) ? true : false;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
471 ret.putVboolean(b);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
472 return null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
473 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
474
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
475 /* ====================== Dglobal_isFinite ================ */
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
476
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
477 void* Dglobal_isFinite(Dobject pthis, CallContext *cc, Dobject othis, Value* ret, Value[] arglist)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
478 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
479 // ECMA 15.1.2.7
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
480 Value* v;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
481 d_number n;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
482 d_boolean b;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
483
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
484 if (arglist.length)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
485 v = &arglist[0];
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
486 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
487 v = &vundefined;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
488 n = v.toNumber();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
489 b = isfinite(n) ? true : false;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
490 ret.putVboolean(b);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
491 return null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
492 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
493
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
494 /* ====================== Dglobal_ URI Functions ================ */
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
495
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
496 void* URI_error(char[] s)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
497 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
498 Dobject o = new urierror.D0(s ~ "() failure");
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
499 Value* v = new Value;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
500 v.putVobject(o);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
501 return v;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
502 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
503
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
504 void* Dglobal_decodeURI(Dobject pthis, CallContext *cc, Dobject othis, Value* ret, Value[] arglist)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
505 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
506 // ECMA v3 15.1.3.1
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
507 d_string s;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
508
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
509 s = arg0string(arglist);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
510 try
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
511 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
512 s = std.uri.decode(s);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
513 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
514 catch (URIerror u)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
515 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
516 ret.putVundefined();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
517 return URI_error(TEXT_decodeURI);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
518 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
519 ret.putVstring(s);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
520 return null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
521 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
522
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
523 void* Dglobal_decodeURIComponent(Dobject pthis, CallContext *cc, Dobject othis, Value* ret, Value[] arglist)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
524 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
525 // ECMA v3 15.1.3.2
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
526 d_string s;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
527
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
528 s = arg0string(arglist);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
529 try
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
530 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
531 s = std.uri.decodeComponent(s);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
532 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
533 catch (URIerror u)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
534 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
535 ret.putVundefined();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
536 return URI_error(TEXT_decodeURIComponent);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
537 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
538 ret.putVstring(s);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
539 return null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
540 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
541
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
542 void* Dglobal_encodeURI(Dobject pthis, CallContext *cc, Dobject othis, Value* ret, Value[] arglist)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
543 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
544 // ECMA v3 15.1.3.3
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
545 d_string s;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
546
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
547 s = arg0string(arglist);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
548 try
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
549 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
550 s = std.uri.encode(s);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
551 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
552 catch (URIerror u)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
553 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
554 ret.putVundefined();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
555 return URI_error(TEXT_encodeURI);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
556 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
557 ret.putVstring(s);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
558 return null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
559 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
560
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
561 void* Dglobal_encodeURIComponent(Dobject pthis, CallContext *cc, Dobject othis, Value* ret, Value[] arglist)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
562 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
563 // ECMA v3 15.1.3.4
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
564 d_string s;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
565
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
566 s = arg0string(arglist);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
567 try
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
568 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
569 s = std.uri.encodeComponent(s);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
570 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
571 catch (URIerror u)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
572 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
573 ret.putVundefined();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
574 return URI_error(TEXT_encodeURIComponent);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
575 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
576 ret.putVstring(s);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
577 return null;
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 /* ====================== Dglobal_print ================ */
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
581
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
582 static void dglobal_print(CallContext *cc, Dobject othis, Value* ret, Value[] arglist)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
583 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
584 // Our own extension
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
585 if (arglist.length)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
586 { uint i;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
587
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
588 for (i = 0; i < arglist.length; i++)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
589 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
590 d_string s = arglist[i].toString();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
591
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
592 writef("%s", s);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
593 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
594 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
595
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
596 ret.putVundefined();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
597 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
598
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
599 void* Dglobal_print(Dobject pthis, CallContext *cc, Dobject othis, Value* ret, Value[] arglist)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
600 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
601 // Our own extension
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
602 dglobal_print(cc, othis, ret, arglist);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
603 return null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
604 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
605
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
606 /* ====================== Dglobal_println ================ */
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
607
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
608 void* Dglobal_println(Dobject pthis, CallContext *cc, Dobject othis, Value* ret, Value[] arglist)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
609 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
610 // Our own extension
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
611 dglobal_print(cc, othis, ret, arglist);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
612 writef("\n");
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
613 return null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
614 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
615
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
616 /* ====================== Dglobal_readln ================ */
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
617
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
618 void* Dglobal_readln(Dobject pthis, CallContext *cc, Dobject othis, Value* ret, Value[] arglist)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
619 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
620 // Our own extension
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
621 dchar c;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
622 tchar[] s;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
623
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
624 for (;;)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
625 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
626 version (linux)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
627 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
628 c = std.c.stdio.getchar();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
629 if (c == EOF)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
630 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
631 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
632 else version (Windows)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
633 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
634 c = std.c.stdio.getchar();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
635 if (c == EOF)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
636 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
637 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
638 else version (OSX)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
639 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
640 c = std.c.stdio.getchar();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
641 if (c == EOF)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
642 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
643 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
644 else version (FreeBSD)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
645 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
646 c = std.c.stdio.getchar();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
647 if (c == EOF)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
648 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
649 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
650 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
651 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
652 static assert(0);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
653 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
654 if (c == '\n')
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
655 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
656 std.utf.encode(s, c);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
657 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
658 ret.putVstring(s);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
659 return null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
660 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
661
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
662 /* ====================== Dglobal_getenv ================ */
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
663
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
664 void* Dglobal_getenv(Dobject pthis, CallContext *cc, Dobject othis, Value* ret, Value[] arglist)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
665 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
666 // Our own extension
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
667 ret.putVundefined();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
668 if (arglist.length)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
669 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
670 d_string s = arglist[0].toString();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
671 tchar* p = getenv(std.string.toStringz(s));
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
672 if (p)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
673 ret.putVstring(p[0 .. strlen(p)].dup);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
674 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
675 ret.putVnull();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
676 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
677 return null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
678 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
679
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
680
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
681 /* ====================== Dglobal_ScriptEngine ================ */
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
682
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
683 void* Dglobal_ScriptEngine(Dobject pthis, CallContext *cc, Dobject othis, Value* ret, Value[] arglist)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
684 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
685 ret.putVstring(TEXT_DMDScript);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
686 return null;
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 void* Dglobal_ScriptEngineBuildVersion(Dobject pthis, CallContext *cc, Dobject othis, Value* ret, Value[] arglist)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
690 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
691 ret.putVnumber(BUILD_VERSION);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
692 return null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
693 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
694
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
695 void* Dglobal_ScriptEngineMajorVersion(Dobject pthis, CallContext *cc, Dobject othis, Value* ret, Value[] arglist)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
696 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
697 ret.putVnumber(MAJOR_VERSION);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
698 return null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
699 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
700
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
701 void* Dglobal_ScriptEngineMinorVersion(Dobject pthis, CallContext *cc, Dobject othis, Value* ret, Value[] arglist)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
702 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
703 ret.putVnumber(MINOR_VERSION);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
704 return null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
705 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
706
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
707 /* ====================== Dglobal =========================== */
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
708
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
709 class Dglobal : Dobject
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
710 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
711 this(tchar[][] argv)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
712 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
713 super(Dobject.getPrototype()); // Dglobal.prototype is implementation-dependent
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
714
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
715 //writef("Dglobal.Dglobal(%x)\n", this);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
716 ThreadContext *tc = ThreadContext.getThreadContext();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
717 assert(tc);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
718
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
719 Dobject f = Dfunction.getPrototype();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
720
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
721 classname = TEXT_global;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
722
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
723 // ECMA 15.1
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
724 // Add in built-in objects which have attribute { DontEnum }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
725
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
726 // Value properties
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
727
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
728 Put(TEXT_NaN, d_number.nan, DontEnum);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
729 Put(TEXT_Infinity, d_number.infinity, DontEnum);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
730
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
731 static NativeFunctionData nfd[] =
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
732 [
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
733 // Function properties
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
734 { &TEXT_eval, &Dglobal_eval, 1 },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
735 { &TEXT_parseInt, &Dglobal_parseInt, 2 },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
736 { &TEXT_parseFloat, &Dglobal_parseFloat, 1 },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
737 { &TEXT_escape, &Dglobal_escape, 1 },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
738 { &TEXT_unescape, &Dglobal_unescape, 1 },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
739 { &TEXT_isNaN, &Dglobal_isNaN, 1 },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
740 { &TEXT_isFinite, &Dglobal_isFinite, 1 },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
741 { &TEXT_decodeURI, &Dglobal_decodeURI, 1 },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
742 { &TEXT_decodeURIComponent, &Dglobal_decodeURIComponent, 1 },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
743 { &TEXT_encodeURI, &Dglobal_encodeURI, 1 },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
744 { &TEXT_encodeURIComponent, &Dglobal_encodeURIComponent, 1 },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
745
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
746 // Dscript unique function properties
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
747 { &TEXT_print, &Dglobal_print, 1 },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
748 { &TEXT_println, &Dglobal_println, 1 },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
749 { &TEXT_readln, &Dglobal_readln, 0 },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
750 { &TEXT_getenv, &Dglobal_getenv, 1 },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
751
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
752 // Jscript compatible extensions
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
753 { &TEXT_ScriptEngine, &Dglobal_ScriptEngine, 0 },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
754 { &TEXT_ScriptEngineBuildVersion, &Dglobal_ScriptEngineBuildVersion, 0 },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
755 { &TEXT_ScriptEngineMajorVersion, &Dglobal_ScriptEngineMajorVersion, 0 },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
756 { &TEXT_ScriptEngineMinorVersion, &Dglobal_ScriptEngineMinorVersion, 0 },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
757 ];
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
758
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
759 DnativeFunction.init(this, nfd, DontEnum);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
760
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
761 // Now handled by AssertExp()
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
762 // Put(TEXT_assert, tc.Dglobal_assert(), DontEnum);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
763
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
764 // Constructor properties
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
765
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
766 Put(TEXT_Object, tc.Dobject_constructor, DontEnum);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
767 Put(TEXT_Function, tc.Dfunction_constructor, DontEnum);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
768 Put(TEXT_Array, tc.Darray_constructor, DontEnum);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
769 Put(TEXT_String, tc.Dstring_constructor, DontEnum);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
770 Put(TEXT_Boolean, tc.Dboolean_constructor, DontEnum);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
771 Put(TEXT_Number, tc.Dnumber_constructor, DontEnum);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
772 Put(TEXT_Date, tc.Ddate_constructor, DontEnum);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
773 Put(TEXT_RegExp, tc.Dregexp_constructor, DontEnum);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
774 Put(TEXT_Error, tc.Derror_constructor, DontEnum);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
775
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
776 foreach (d_string key, Dfunction ctor; tc.ctorTable)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
777 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
778 Put(key, ctor, DontEnum);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
779 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
780
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
781 // Other properties
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
782
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
783 assert(tc.Dmath_object);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
784 Put(TEXT_Math, tc.Dmath_object, DontEnum);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
785
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
786 // Build an "arguments" property out of argv[],
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
787 // and add it to the global object.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
788 Darray arguments;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
789
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
790 arguments = new Darray();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
791 Put(TEXT_arguments, arguments, DontDelete);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
792 arguments.length.putVnumber(argv.length);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
793 for (int i = 0; i < argv.length; i++)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
794 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
795 arguments.Put(i, argv[i].dup, DontEnum);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
796 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
797 arguments.Put(TEXT_callee, &vnull, DontEnum);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
798 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
799 }