annotate dmdscript_tango/dglobal.d @ 5:4adfb4e05382 default tip

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