0
|
1
|
|
2 /* Digital Mars DMDScript source code.
|
|
3 * Copyright (c) 2000-2002 by Chromium Communications
|
|
4 * D version Copyright (c) 2004-2006 by Digital Mars
|
|
5 * All Rights Reserved
|
|
6 * written by Walter Bright
|
|
7 * www.digitalmars.com
|
|
8 * Use at your own risk. There is no warranty, express or implied.
|
|
9 * License for redistribution is by the GNU General Public License in gpl.txt.
|
|
10 *
|
|
11 * A binary, non-exclusive license for commercial use can be
|
|
12 * purchased from www.digitalmars.com/dscript/buy.html.
|
|
13 *
|
|
14 * DMDScript is implemented in the D Programming Language,
|
|
15 * www.digitalmars.com/d/
|
|
16 *
|
|
17 * For a C++ implementation of DMDScript, including COM support,
|
|
18 * see www.digitalmars.com/dscript/cppscript.html.
|
|
19 */
|
|
20
|
|
21
|
3
|
22 module dmdscript_tango.derror;
|
0
|
23
|
3
|
24 import dmdscript_tango.script;
|
|
25 import dmdscript_tango.dobject;
|
|
26 import dmdscript_tango.dfunction;
|
|
27 import dmdscript_tango.value;
|
|
28 import dmdscript_tango.threadcontext;
|
|
29 import dmdscript_tango.dnative;
|
|
30 import dmdscript_tango.text;
|
|
31 import dmdscript_tango.property;
|
0
|
32
|
|
33
|
|
34 // Comes from MAKE_HRESULT(SEVERITY_ERROR, FACILITY_CONTROL, 0)
|
|
35 const uint FACILITY = 0x800A0000;
|
|
36
|
|
37 /* ===================== Derror_constructor ==================== */
|
|
38
|
|
39 class Derror_constructor : Dfunction
|
|
40 {
|
|
41 this(ThreadContext *tc)
|
|
42 {
|
|
43 super(1, tc.Dfunction_prototype);
|
|
44 }
|
|
45
|
|
46 void* Construct(CallContext *cc, Value *ret, Value[] arglist)
|
|
47 {
|
|
48 // ECMA 15.7.2
|
|
49 Dobject o;
|
|
50 Value* m;
|
|
51 Value* n;
|
|
52 Value vemptystring;
|
|
53
|
|
54 vemptystring.putVstring(null);
|
|
55 switch (arglist.length)
|
|
56 {
|
|
57 case 0: // ECMA doesn't say what we do if m is undefined
|
|
58 m = &vemptystring;
|
|
59 n = &vundefined;
|
|
60 break;
|
|
61 case 1:
|
|
62 m = &arglist[0];
|
|
63 if (m.isNumber())
|
|
64 {
|
|
65 n = m;
|
|
66 m = &vemptystring;
|
|
67 }
|
|
68 else
|
|
69 n = &vundefined;
|
|
70 break;
|
|
71 default:
|
|
72 m = &arglist[0];
|
|
73 n = &arglist[1];
|
|
74 break;
|
|
75 }
|
|
76 o = new Derror(m, n);
|
|
77 ret.putVobject(o);
|
|
78 return null;
|
|
79 }
|
|
80
|
|
81 void* Call(CallContext *cc, Dobject othis, Value* ret, Value[] arglist)
|
|
82 {
|
|
83 // ECMA v3 15.11.1
|
|
84 return Construct(cc, ret, arglist);
|
|
85 }
|
|
86 }
|
|
87
|
|
88
|
|
89 /* ===================== Derror_prototype_toString =============== */
|
|
90
|
|
91 void* Derror_prototype_toString(Dobject pthis, CallContext *cc, Dobject othis, Value *ret, Value[] arglist)
|
|
92 {
|
|
93 // ECMA v3 15.11.4.3
|
|
94 // Return implementation defined string
|
|
95 Value* v;
|
|
96
|
|
97 //writef("Error.prototype.toString()\n");
|
|
98 v = othis.Get(TEXT_message);
|
|
99 if (!v)
|
|
100 v = &vundefined;
|
|
101 ret.putVstring(v.toString());
|
|
102 return null;
|
|
103 }
|
|
104
|
|
105 /* ===================== Derror_prototype ==================== */
|
|
106
|
|
107 class Derror_prototype : Derror
|
|
108 {
|
|
109 this(ThreadContext *tc)
|
|
110 {
|
|
111 super(tc.Dobject_prototype);
|
|
112 Dobject f = tc.Dfunction_prototype;
|
|
113 //d_string m = d_string_ctor(DTEXT("Error.prototype.message"));
|
|
114
|
|
115 Put(TEXT_constructor, tc.Derror_constructor, DontEnum);
|
|
116
|
|
117 static NativeFunctionData nfd[] =
|
|
118 [
|
|
119 { &TEXT_toString, &Derror_prototype_toString, 0 },
|
|
120 ];
|
|
121
|
|
122 DnativeFunction.init(this, nfd, 0);
|
|
123
|
|
124 Put(TEXT_name, TEXT_Error, 0);
|
|
125 Put(TEXT_message, TEXT_, 0);
|
|
126 Put(TEXT_description, TEXT_, 0);
|
|
127 Put(TEXT_number, cast(d_number)(/*FACILITY |*/ 0), 0);
|
|
128 }
|
|
129 }
|
|
130
|
|
131
|
|
132 /* ===================== Derror ==================== */
|
|
133
|
|
134 class Derror : Dobject
|
|
135 {
|
|
136 this(Value* m, Value* v2)
|
|
137 {
|
|
138 super(getPrototype());
|
|
139 classname = TEXT_Error;
|
|
140
|
|
141 d_string msg;
|
|
142 msg = m.toString();
|
|
143 Put(TEXT_message, msg, 0);
|
|
144 Put(TEXT_description, msg, 0);
|
|
145 if (m.isString())
|
|
146 {
|
|
147 }
|
|
148 else if (m.isNumber())
|
|
149 { d_number n = m.toNumber();
|
|
150 n = cast(d_number)(/*FACILITY |*/ cast(int)n);
|
|
151 Put(TEXT_number, n, 0);
|
|
152 }
|
|
153 if (v2.isString())
|
|
154 {
|
|
155 Put(TEXT_description, v2.toString(), 0);
|
|
156 Put(TEXT_message, v2.toString(), 0);
|
|
157 }
|
|
158 else if (v2.isNumber())
|
|
159 { d_number n = v2.toNumber();
|
|
160 n = cast(d_number)(/*FACILITY |*/ cast(int)n);
|
|
161 Put(TEXT_number, n, 0);
|
|
162 }
|
|
163 }
|
|
164
|
|
165 this(Dobject prototype)
|
|
166 {
|
|
167 super(prototype);
|
|
168 classname = TEXT_Error;
|
|
169 }
|
|
170
|
|
171 static Dfunction getConstructor()
|
|
172 {
|
|
173 ThreadContext *tc = ThreadContext.getThreadContext();
|
|
174 assert(tc);
|
|
175 return tc.Derror_constructor;
|
|
176 }
|
|
177
|
|
178 static Dobject getPrototype()
|
|
179 {
|
|
180 ThreadContext *tc = ThreadContext.getThreadContext();
|
|
181 assert(tc);
|
|
182 return tc.Derror_prototype;
|
|
183 }
|
|
184
|
|
185 static void init(ThreadContext *tc)
|
|
186 {
|
|
187 tc.Derror_constructor = new Derror_constructor(tc);
|
|
188 tc.Derror_prototype = new Derror_prototype(tc);
|
|
189
|
|
190 tc.Derror_constructor.Put(TEXT_prototype, tc.Derror_prototype, DontEnum | DontDelete | ReadOnly);
|
|
191 }
|
|
192 }
|
|
193
|