Qt
Internal/Contributor docs for the Qt SDK. <b>Note:</b> These are NOT official API docs; those are found <a href='https://doc.qt.io/'>here</a>.
Loading...
Searching...
No Matches
qv4errorobject.cpp
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
4
5#include "qv4errorobject_p.h"
6#include <QtCore/qnumeric.h>
7#include <QtCore/qmath.h>
8#include <QtCore/QDateTime>
9#include <QtCore/QStringList>
10#include <QtCore/QDebug>
11
12#include <private/qv4mm_p.h>
13#include <private/qv4codegen_p.h>
14
15#ifndef Q_OS_WIN
16# include <time.h>
17# ifndef Q_OS_VXWORKS
18# include <sys/time.h>
19# else
20# include "qplatformdefs.h"
21# endif
22#else
23# include <qt_windows.h>
24#endif
25
26using namespace QV4;
27
28void Heap::ErrorObject::init()
29{
30 Object::init();
31 stackTrace = nullptr;
32
33 Scope scope(internalClass->engine);
34 Scoped<QV4::ErrorObject> e(scope, this);
35
36 if (internalClass == scope.engine->internalClasses(EngineBase::Class_ErrorProto))
37 return;
38
39 setProperty(scope.engine, QV4::ErrorObject::Index_Stack, scope.engine->getStackFunction()->d());
43}
44
45void Heap::ErrorObject::init(const Value &message, ErrorType t)
46{
47 Object::init();
48 errorType = t;
49
50 Scope scope(internalClass->engine);
51 Scoped<QV4::ErrorObject> e(scope, this);
52
53 setProperty(scope.engine, QV4::ErrorObject::Index_Stack, scope.engine->getStackFunction()->d());
55
56 e->d()->stackTrace = new StackTrace(scope.engine->stackTrace());
57 if (!e->d()->stackTrace->isEmpty()) {
58 setProperty(scope.engine, QV4::ErrorObject::Index_FileName, scope.engine->newString(e->d()->stackTrace->at(0).source));
59 setProperty(scope.engine, QV4::ErrorObject::Index_LineNumber, Value::fromInt32(qAbs(e->d()->stackTrace->at(0).line)));
60 }
61
62 if (!message.isUndefined())
64}
65
66void Heap::ErrorObject::init(const Value &message, const QString &fileName, int line, int column, ErrorObject::ErrorType t)
67{
68 Q_UNUSED(fileName); // ####
69 Object::init();
70 errorType = t;
71
72 Scope scope(internalClass->engine);
73 Scoped<QV4::ErrorObject> e(scope, this);
74
75 setProperty(scope.engine, QV4::ErrorObject::Index_Stack, scope.engine->getStackFunction()->d());
77
78 e->d()->stackTrace = new StackTrace(scope.engine->stackTrace());
80 frame.source = fileName;
81 frame.line = line;
82 frame.column = column;
83 e->d()->stackTrace->prepend(frame);
84
85 Q_ASSERT(!e->d()->stackTrace->isEmpty());
86 setProperty(scope.engine, QV4::ErrorObject::Index_FileName, scope.engine->newString(e->d()->stackTrace->at(0).source));
87 setProperty(scope.engine, QV4::ErrorObject::Index_LineNumber, Value::fromInt32(qAbs(e->d()->stackTrace->at(0).line)));
88
89 if (!message.isUndefined())
91}
92
93const char *ErrorObject::className(Heap::ErrorObject::ErrorType t)
94{
95 switch (t) {
96 case Heap::ErrorObject::Error:
97 return "Error";
98 case Heap::ErrorObject::EvalError:
99 return "EvalError";
100 case Heap::ErrorObject::RangeError:
101 return "RangeError";
102 case Heap::ErrorObject::ReferenceError:
103 return "ReferenceError";
104 case Heap::ErrorObject::SyntaxError:
105 return "SyntaxError";
106 case Heap::ErrorObject::TypeError:
107 return "TypeError";
108 case Heap::ErrorObject::URIError:
109 return "URIError";
110 }
111 Q_UNREACHABLE();
112}
113
115{
116 ExecutionEngine *v4 = b->engine();
117 const ErrorObject *This = thisObject->as<ErrorObject>();
118 if (!This)
119 return v4->throwTypeError();
120 if (!This->d()->stack) {
122 for (int i = 0; i < This->d()->stackTrace->size(); ++i) {
123 if (i > 0)
124 trace += QLatin1Char('\n');
125 const StackFrame &frame = This->d()->stackTrace->at(i);
126 trace += frame.function + QLatin1Char('@') + frame.source;
127 if (frame.line >= 0)
128 trace += QLatin1Char(':') + QString::number(frame.line);
129 }
130 This->d()->stack.set(v4, v4->newString(trace));
131 }
132 return This->d()->stack->asReturnedValue();
133}
134
136
138{
139 Heap::ErrorObject::init(msg, SyntaxError);
140}
141
142void Heap::SyntaxErrorObject::init(const Value &msg, const QString &fileName, int lineNumber, int columnNumber)
143{
144 Heap::ErrorObject::init(msg, fileName, lineNumber, columnNumber, SyntaxError);
145}
146
148{
149 Heap::ErrorObject::init(message, EvalError);
150}
151
153{
154 Heap::ErrorObject::init(message, RangeError);
155}
156
158{
159 Heap::ErrorObject::init(message, ReferenceError);
160}
161
162void Heap::ReferenceErrorObject::init(const Value &msg, const QString &fileName, int lineNumber, int columnNumber)
163{
164 Heap::ErrorObject::init(msg, fileName, lineNumber, columnNumber, ReferenceError);
165}
166
168{
169 Heap::ErrorObject::init(message, TypeError);
170}
171
173{
174 Heap::ErrorObject::init(message, URIError);
175}
176
184
186{
187 Heap::FunctionObject::init(engine, QStringLiteral("Error"));
188}
189
191{
192 Heap::FunctionObject::init(engine, name);
193}
194
195ReturnedValue ErrorCtor::virtualCallAsConstructor(const FunctionObject *f, const Value *argv, int argc, const Value *newTarget)
196{
197 Value v = argc ? *argv : Value::undefinedValue();
198 return ErrorObject::create<ErrorObject>(f->engine(), v, newTarget)->asReturnedValue();
199}
200
201ReturnedValue ErrorCtor::virtualCall(const FunctionObject *f, const Value *, const Value *argv, int argc)
202{
203 return f->callAsConstructor(argv, argc);
204}
205
207{
208 Heap::FunctionObject::init(engine, QStringLiteral("EvalError"));
209}
210
211ReturnedValue EvalErrorCtor::virtualCallAsConstructor(const FunctionObject *f, const Value *argv, int argc, const Value *newTarget)
212{
213 Value v = argc ? *argv : Value::undefinedValue();
214 return ErrorObject::create<EvalErrorObject>(f->engine(), v, newTarget)->asReturnedValue();
215}
216
218{
219 Heap::FunctionObject::init(engine, QStringLiteral("RangeError"));
220}
221
223{
224 Value v = argc ? *argv : Value::undefinedValue();
225 return ErrorObject::create<RangeErrorObject>(f->engine(), v, newTarget)->asReturnedValue();
226}
227
229{
230 Heap::FunctionObject::init(engine, QStringLiteral("ReferenceError"));
231}
232
234{
235 Value v = argc ? *argv : Value::undefinedValue();
236 return ErrorObject::create<ReferenceErrorObject>(f->engine(), v, newTarget)->asReturnedValue();
237}
238
240{
241 Heap::FunctionObject::init(engine, QStringLiteral("SyntaxError"));
242}
243
245{
246 Value v = argc ? *argv : Value::undefinedValue();
247 return ErrorObject::create<SyntaxErrorObject>(f->engine(), v, newTarget)->asReturnedValue();
248}
249
251{
252 Heap::FunctionObject::init(engine, QStringLiteral("TypeError"));
253}
254
255ReturnedValue TypeErrorCtor::virtualCallAsConstructor(const FunctionObject *f, const Value *argv, int argc, const Value *newTarget)
256{
257 Value v = argc ? *argv : Value::undefinedValue();
258 return ErrorObject::create<TypeErrorObject>(f->engine(), v, newTarget)->asReturnedValue();
259}
260
262{
263 Heap::FunctionObject::init(engine, QStringLiteral("URIError"));
264}
265
266ReturnedValue URIErrorCtor::virtualCallAsConstructor(const FunctionObject *f, const Value *argv, int argc, const Value *newTarget)
267{
268 Value v = argc ? *argv : Value::undefinedValue();
269 return ErrorObject::create<URIErrorObject>(f->engine(), v, newTarget)->asReturnedValue();
270}
271
272void ErrorPrototype::init(ExecutionEngine *engine, Object *ctor, Object *obj, Heap::ErrorObject::ErrorType t)
273{
274 Scope scope(engine);
275 ScopedString s(scope);
276 ScopedObject o(scope);
277 ctor->defineReadonlyProperty(engine->id_prototype(), (o = obj));
278 ctor->defineReadonlyConfigurableProperty(engine->id_length(), Value::fromInt32(1));
279 obj->setProperty(Index_Constructor, ctor->d());
280 obj->setProperty(Index_Message, engine->id_empty()->d());
281 obj->setProperty(Index_Name, engine->newString(QString::fromLatin1(ErrorObject::className(t))));
282 obj->defineDefaultProperty(engine->id_toString(), method_toString, 0);
283}
284
286{
287 ExecutionEngine *v4 = b->engine();
288 const Object *o = thisObject->as<Object>();
289 if (!o)
290 return v4->throwTypeError();
291
292 Scope scope(v4);
293 ScopedValue name(scope, o->get(scope.engine->id_name()));
294 QString qname;
295 if (name->isUndefined())
296 qname = QStringLiteral("Error");
297 else
298 qname = name->toQString();
299
300 ScopedString s(scope, scope.engine->newString(QStringLiteral("message")));
301 ScopedValue message(scope, o->get(s));
302 QString qmessage;
303 if (!message->isUndefined())
304 qmessage = message->toQString();
305
306 QString str;
307 if (qname.isEmpty()) {
308 str = qmessage;
309 } else if (qmessage.isEmpty()) {
310 str = qname;
311 } else {
312 str = qname + QLatin1String(": ") + qmessage;
313 }
314
315 return scope.engine->newString(str)->asReturnedValue();
316}
\macro QT_RESTRICTED_CAST_FROM_ASCII
Definition qstring.h:129
static QString fromLatin1(QByteArrayView ba)
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition qstring.cpp:5871
static QString number(int, int base=10)
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition qstring.cpp:8084
QString str
[2]
QVector< StackFrame > StackTrace
quint64 ReturnedValue
Scoped< String > ScopedString
Definition qctf_p.h:75
constexpr T qAbs(const T &t)
Definition qnumeric.h:328
GLboolean GLboolean GLboolean b
GLsizei const GLfloat * v
[13]
GLfloat GLfloat f
GLuint GLsizei const GLchar * message
GLuint name
GLenum GLenum GLsizei void GLsizei void * column
GLhandleARB obj
[2]
GLdouble s
[6]
Definition qopenglext.h:235
GLdouble GLdouble t
Definition qopenglext.h:243
#define Q_ASSERT(cond)
Definition qrandom.cpp:47
QLatin1StringView QLatin1String
Definition qstringfwd.h:31
#define QStringLiteral(str)
#define Q_UNUSED(x)
#define DEFINE_OBJECT_VTABLE(classname)
QFrame frame
[0]
args<< 1<< 2;QJSValue threeAgain=fun.call(args);QString fileName="helloworld.qs";QFile scriptFile(fileName);if(!scriptFile.open(QIODevice::ReadOnly)) QTextStream stream(&scriptFile);QString contents=stream.readAll();scriptFile.close();myEngine.evaluate(contents, fileName);myEngine.globalObject().setProperty("myNumber", 123);...QJSValue myNumberPlusOne=myEngine.evaluate("myNumber + 1");QJSValue result=myEngine.evaluate(...);if(result.isError()) qDebug()<< "Uncaught exception at line"<< result.property("lineNumber").toInt()<< ":"<< result.toString();QPushButton *button=new QPushButton;QJSValue scriptButton=myEngine.newQObject(button);myEngine.globalObject().setProperty("button", scriptButton);myEngine.evaluate("button.checkable = true");qDebug()<< scriptButton.property("checkable").toBool();scriptButton.property("show").call();QJSEngine engine;QObject *myQObject=new QObject();myQObject- setProperty)("dynamicProperty", 3)
QJSEngine engine
[0]
\inmodule QtCore \reentrant
Definition qchar.h:18
static ReturnedValue method_get_stack(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static const char * className(Heap::ErrorObject::ErrorType t)
void init(ExecutionEngine *engine, Object *ctor)
static ReturnedValue method_toString(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
String * id_name() const
Heap::String * newString(char16_t c)
ReturnedValue throwTypeError()
ReturnedValue asReturnedValue() const
Definition qv4value_p.h:342
void init(ExecutionEngine *engine)
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(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)
QString className() const
bool set(StringOrSymbol *name, const Value &v, ThrowOnFailure shouldThrow)
ExecutionEngine * engine
constexpr ReturnedValue asReturnedValue() const
static constexpr VTable::CallAsConstructor virtualCallAsConstructor
static constexpr VTable::Call virtualCall
static constexpr Value fromInt32(int i)
Definition qv4value_p.h:187
static constexpr Value undefinedValue()
Definition qv4value_p.h:191
const T * as() const
Definition qv4value_p.h:132