Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qv4errorobject_p.h
Go to the documentation of this file.
1// Copyright (C) 2016 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3// Qt-Security score:significant
4#ifndef QV4ERROROBJECT_H
5#define QV4ERROROBJECT_H
6
7//
8// W A R N I N G
9// -------------
10//
11// This file is not part of the Qt API. It exists purely as an
12// implementation detail. This header file may change from version to
13// version without notice, or even be removed.
14//
15// We mean it.
16//
17
18#include "qv4object_p.h"
20
22
23namespace QV4 {
24
26
27namespace Heap {
28
29
30#define ErrorObjectMembers(class, Member)
31 Member(class, Pointer, String *, stack)
32
33DECLARE_HEAP_OBJECT(ErrorObject, Object) {
34 DECLARE_MARKOBJECTS(ErrorObject)
35 enum ErrorType {
36 Error,
37 EvalError,
38 RangeError,
39 ReferenceError,
40 SyntaxError,
41 TypeError,
42 URIError
43 };
44 StackTrace *stackTrace;
45 ErrorType errorType;
46
47 void init();
48 void init(const Value &message, ErrorType t = Error);
49 void init(const Value &message, const QString &fileName, int line, int column, ErrorType t = Error);
50 void destroy() {
51 delete stackTrace;
52 Object::destroy();
53 }
54};
55
57 void init(const Value &message);
58};
59
61 void init(const Value &message);
62};
63
65 void init(const Value &message);
66 void init(const Value &msg, const QString &fileName, int lineNumber, int columnNumber);
67};
68
70 void init(const Value &message);
71 void init(const Value &msg, const QString &fileName, int lineNumber, int columnNumber);
72};
73
75 void init(const Value &message);
76};
77
79 void init(const Value &message);
80};
81
83 void init(ExecutionEngine *engine);
84 void init(ExecutionEngine *engine, const QString &name);
85};
86
88 void init(ExecutionEngine *engine);
89};
90
92 void init(ExecutionEngine *engine);
93};
94
96 void init(ExecutionEngine *engine);
97};
98
100 void init(ExecutionEngine *engine);
101};
102
104 void init(ExecutionEngine *engine);
105};
106
108 void init(ExecutionEngine *engine);
109};
110
111}
112
114 enum {
116 };
117
118 enum {
119 Index_Stack = 0, // Accessor Property
120 Index_StackSetter = 1, // Accessor Property
124 };
125
126 V4_OBJECT2(ErrorObject, Object)
128 V4_INTERNALCLASS(ErrorObject)
129 V4_PROTOTYPE(errorPrototype)
131
132 template <typename T>
134 template <typename T>
135 static Heap::Object *create(ExecutionEngine *e, const QString &message);
136 template <typename T>
137 static Heap::Object *create(ExecutionEngine *e, const QString &message, const QString &filename, int line, int column);
138
140
141 static const char *className(Heap::ErrorObject::ErrorType t);
142
143 static ReturnedValue method_get_stack(const FunctionObject *, const Value *thisObject, const Value *argv, int argc);
144};
145
146template<>
147inline const ErrorObject *Value::as() const {
148 return isManaged() && m()->internalClass->vtable->isErrorObject ? reinterpret_cast<const ErrorObject *>(this) : nullptr;
149}
150
153 V4_PROTOTYPE(evalErrorPrototype)
154 const Data *d() const { return static_cast<const Data *>(ErrorObject::d()); }
155 Data *d() { return static_cast<Data *>(ErrorObject::d()); }
156};
157
160 V4_PROTOTYPE(rangeErrorPrototype)
161 const Data *d() const { return static_cast<const Data *>(ErrorObject::d()); }
162 Data *d() { return static_cast<Data *>(ErrorObject::d()); }
163};
164
167 V4_PROTOTYPE(referenceErrorPrototype)
168 const Data *d() const { return static_cast<const Data *>(ErrorObject::d()); }
169 Data *d() { return static_cast<Data *>(ErrorObject::d()); }
170};
171
174 V4_PROTOTYPE(syntaxErrorPrototype)
175 const Data *d() const { return static_cast<const Data *>(ErrorObject::d()); }
176 Data *d() { return static_cast<Data *>(ErrorObject::d()); }
177};
178
181 V4_PROTOTYPE(typeErrorPrototype)
182 const Data *d() const { return static_cast<const Data *>(ErrorObject::d()); }
183 Data *d() { return static_cast<Data *>(ErrorObject::d()); }
184};
185
188 V4_PROTOTYPE(uRIErrorPrototype)
189 const Data *d() const { return static_cast<const Data *>(ErrorObject::d()); }
190 Data *d() { return static_cast<Data *>(ErrorObject::d()); }
191};
192
194{
195 V4_OBJECT2(ErrorCtor, FunctionObject)
196
197 static ReturnedValue virtualCallAsConstructor(const FunctionObject *f, const Value *argv, int argc, const Value *);
198 static ReturnedValue virtualCall(const FunctionObject *f, const Value *thisObject, const Value *argv, int argc);
199};
200
202{
203 V4_OBJECT2(EvalErrorCtor, FunctionObject)
205
206 static ReturnedValue virtualCallAsConstructor(const FunctionObject *f, const Value *argv, int argc, const Value *);
207};
208
210{
211 V4_OBJECT2(RangeErrorCtor, FunctionObject)
213
214 static ReturnedValue virtualCallAsConstructor(const FunctionObject *f, const Value *argv, int argc, const Value *);
215};
216
218{
219 V4_OBJECT2(ReferenceErrorCtor, FunctionObject)
221
222 static ReturnedValue virtualCallAsConstructor(const FunctionObject *f, const Value *argv, int argc, const Value *);
223};
224
226{
227 V4_OBJECT2(SyntaxErrorCtor, FunctionObject)
229
230 static ReturnedValue virtualCallAsConstructor(const FunctionObject *f, const Value *argv, int argc, const Value *);
231};
232
234{
235 V4_OBJECT2(TypeErrorCtor, FunctionObject)
237
238 static ReturnedValue virtualCallAsConstructor(const FunctionObject *f, const Value *argv, int argc, const Value *);
239};
240
242{
243 V4_OBJECT2(URIErrorCtor, FunctionObject)
245
246 static ReturnedValue virtualCallAsConstructor(const FunctionObject *f, const Value *argv, int argc, const Value *);
247};
248
249
251{
252 enum {
256 };
257 void init(ExecutionEngine *engine, Object *ctor) { init(engine, ctor, this, Heap::ErrorObject::Error); }
258
259 static void init(ExecutionEngine *engine, Object *ctor, Object *obj, Heap::ErrorObject::ErrorType t);
260 static ReturnedValue method_toString(const FunctionObject *, const Value *thisObject, const Value *argv, int argc);
261};
262
264{
265 void init(ExecutionEngine *engine, Object *ctor) { ErrorPrototype::init(engine, ctor, this, Heap::ErrorObject::EvalError); }
266};
267
269{
270 void init(ExecutionEngine *engine, Object *ctor) { ErrorPrototype::init(engine, ctor, this, Heap::ErrorObject::RangeError); }
271};
272
274{
275 void init(ExecutionEngine *engine, Object *ctor) { ErrorPrototype::init(engine, ctor, this, Heap::ErrorObject::ReferenceError); }
276};
277
279{
280 void init(ExecutionEngine *engine, Object *ctor) { ErrorPrototype::init(engine, ctor, this, Heap::ErrorObject::SyntaxError); }
281};
282
284{
285 void init(ExecutionEngine *engine, Object *ctor) { ErrorPrototype::init(engine, ctor, this, Heap::ErrorObject::TypeError); }
286};
287
289{
290 void init(ExecutionEngine *engine, Object *ctor) { ErrorPrototype::init(engine, ctor, this, Heap::ErrorObject::URIError); }
291};
292
293
295{
296 return d()->errorType == QV4::Heap::ErrorObject::SyntaxError ? static_cast<SyntaxErrorObject *>(this) : nullptr;
297}
298
299
300template <typename T>
301Heap::Object *ErrorObject::create(ExecutionEngine *e, const Value &message, const Value *newTarget) {
302 EngineBase::InternalClassType klass = message.isUndefined() ? EngineBase::Class_ErrorObject : EngineBase::Class_ErrorObjectWithMessage;
303 Scope scope(e);
304 ScopedObject proto(scope, static_cast<const Object *>(newTarget)->get(scope.engine->id_prototype()));
305 Scoped<InternalClass> ic(scope, e->internalClasses(klass)->changePrototype(proto->d()));
306 return e->memoryManager->allocObject<T>(ic->d(), message);
307}
308template <typename T>
309Heap::Object *ErrorObject::create(ExecutionEngine *e, const QString &message) {
310 Scope scope(e);
311 ScopedValue v(scope, message.isEmpty() ? Encode::undefined() : e->newString(message)->asReturnedValue());
312 EngineBase::InternalClassType klass = v->isUndefined() ? EngineBase::Class_ErrorObject : EngineBase::Class_ErrorObjectWithMessage;
313 Scoped<InternalClass> ic(scope, e->internalClasses(klass)->changePrototype(T::defaultPrototype(e)->d()));
314 return e->memoryManager->allocObject<T>(ic->d(), v);
315}
316template <typename T>
317Heap::Object *ErrorObject::create(ExecutionEngine *e, const QString &message, const QString &filename, int line, int column) {
318 Scope scope(e);
319 ScopedValue v(scope, message.isEmpty() ? Encode::undefined() : e->newString(message)->asReturnedValue());
320 EngineBase::InternalClassType klass = v->isUndefined() ? EngineBase::Class_ErrorObject : EngineBase::Class_ErrorObjectWithMessage;
321 Scoped<InternalClass> ic(scope, e->internalClasses(klass)->changePrototype(T::defaultPrototype(e)->d()));
322 return e->memoryManager->allocObject<T>(ic->d(), v, filename, line, column);
323}
324
325
326}
327
328QT_END_NAMESPACE
329
330#endif // QV4ECMAOBJECTS_P_H
DECLARE_HEAP_OBJECT(ErrorObject, Object)
Definition qjsvalue.h:23
QVector< StackFrame > StackTrace
Scoped< Object > ScopedObject
Scoped< String > ScopedString
DEFINE_OBJECT_VTABLE(EvalErrorCtor)
DEFINE_OBJECT_VTABLE(URIErrorCtor)
DEFINE_OBJECT_VTABLE(ErrorCtor)
DEFINE_OBJECT_VTABLE(SyntaxErrorCtor)
DEFINE_OBJECT_VTABLE(RangeErrorCtor)
DEFINE_OBJECT_VTABLE(TypeErrorCtor)
DEFINE_OBJECT_VTABLE(ErrorObject)
DEFINE_OBJECT_VTABLE(ReferenceErrorCtor)
#define V4_NEEDS_DESTROY
#define Q_MANAGED_TYPE(type)
#define V4_INTERNALCLASS(c)
static ReturnedValue virtualCall(const FunctionObject *f, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_get_stack(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
SyntaxErrorObject * asSyntaxError()
static Heap::Object * create(ExecutionEngine *e, const QString &message)
static Heap::Object * create(ExecutionEngine *e, const QString &message, const QString &filename, int line, int column)
Heap::Object * create(ExecutionEngine *e, const Value &message, const Value *newTarget)
static const char * className(Heap::ErrorObject::ErrorType t)
static void init(ExecutionEngine *engine, Object *ctor, Object *obj, Heap::ErrorObject::ErrorType t)
void init(ExecutionEngine *engine, Object *ctor)
static ReturnedValue method_toString(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
Heap::EvalErrorObject Data
void init(ExecutionEngine *engine, Object *ctor)
void init(ExecutionEngine *engine)
void init(ExecutionEngine *engine, const QString &name)
void init(ExecutionEngine *engine)
void init(const Value &message)
void init(ExecutionEngine *engine)
void init(const Value &message)
void init(ExecutionEngine *engine)
void init(const Value &message)
void init(const Value &msg, const QString &fileName, int lineNumber, int columnNumber)
void init(ExecutionEngine *engine)
void init(const Value &message)
void init(const Value &msg, const QString &fileName, int lineNumber, int columnNumber)
void init(ExecutionEngine *engine)
void init(const Value &message)
void init(ExecutionEngine *engine)
void init(const Value &message)
Heap::RangeErrorObject Data
void init(ExecutionEngine *engine, Object *ctor)
Heap::ReferenceErrorObject Data
void init(ExecutionEngine *engine, Object *ctor)
Scope(ExecutionEngine *e)
Heap::SyntaxErrorObject Data
void init(ExecutionEngine *engine, Object *ctor)
Heap::TypeErrorObject Data
void init(ExecutionEngine *engine, Object *ctor)
Heap::URIErrorObject Data
void init(ExecutionEngine *engine, Object *ctor)