aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/jsruntime
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@theqtcompany.com>2014-11-10 21:27:52 +0100
committerSimon Hausmann <simon.hausmann@digia.com>2014-11-12 12:13:47 +0100
commit345a5ee67bf80f7c18869fe080bf7dd7cf4a0d90 (patch)
tree3d4a64aca5d5215a4e3574e3c92f875fe52f90dd /src/qml/jsruntime
parent60f3c23f524eaed795dd4ce58722cdf923ba6a51 (diff)
Use heap objects in the remaining managed objects
Change-Id: Id6dc6e34113a287a40e0122dfbdf977f0fc1f3b3 Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
Diffstat (limited to 'src/qml/jsruntime')
-rw-r--r--src/qml/jsruntime/qv4regexp_p.h2
-rw-r--r--src/qml/jsruntime/qv4regexpobject.cpp29
-rw-r--r--src/qml/jsruntime/qv4regexpobject_p.h4
-rw-r--r--src/qml/jsruntime/qv4stringobject.cpp8
4 files changed, 24 insertions, 19 deletions
diff --git a/src/qml/jsruntime/qv4regexp_p.h b/src/qml/jsruntime/qv4regexp_p.h
index 1ac85b4ef3..a7827542ef 100644
--- a/src/qml/jsruntime/qv4regexp_p.h
+++ b/src/qml/jsruntime/qv4regexp_p.h
@@ -70,6 +70,8 @@ struct RegExp : Base {
int subPatternCount;
bool ignoreCase;
bool multiLine;
+
+ int captureCount() const { return subPatternCount + 1; }
};
}
diff --git a/src/qml/jsruntime/qv4regexpobject.cpp b/src/qml/jsruntime/qv4regexpobject.cpp
index a1a0104d7a..44a8b3531e 100644
--- a/src/qml/jsruntime/qv4regexpobject.cpp
+++ b/src/qml/jsruntime/qv4regexpobject.cpp
@@ -71,14 +71,14 @@ Heap::RegExpObject::RegExpObject(InternalClass *ic)
Scope scope(ic->engine);
Scoped<QV4::RegExpObject> o(scope, this);
- o->d()->value = QV4::RegExp::create(ic->engine, QString(), false, false)->getPointer();
+ o->d()->value = QV4::RegExp::create(ic->engine, QString(), false, false)->getPointer()->d();
o->d()->global = false;
o->init(ic->engine);
}
Heap::RegExpObject::RegExpObject(QV4::ExecutionEngine *engine, QV4::RegExp *value, bool global)
: Heap::Object(engine->regExpClass)
- , value(value)
+ , value(value->d())
, global(global)
{
setVTable(QV4::RegExpObject::staticVTable());
@@ -139,7 +139,7 @@ Heap::RegExpObject::RegExpObject(QV4::ExecutionEngine *engine, const QRegExp &re
Scope scope(engine);
Scoped<QV4::RegExpObject> o(scope, this);
- o->d()->value = QV4::RegExp::create(engine, pattern, re.caseSensitivity() == Qt::CaseInsensitive, false)->getPointer();
+ o->d()->value = QV4::RegExp::create(engine, pattern, re.caseSensitivity() == Qt::CaseInsensitive, false)->getPointer()->d();
o->init(engine);
}
@@ -155,7 +155,7 @@ void RegExpObject::init(ExecutionEngine *engine)
if (!this->value())
return;
- QString p = this->value()->pattern();
+ QString p = this->value()->pattern;
if (p.isEmpty()) {
p = QStringLiteral("(?:)");
} else {
@@ -165,8 +165,8 @@ void RegExpObject::init(ExecutionEngine *engine)
defineReadonlyProperty(QStringLiteral("source"), (v = engine->newString(p)));
defineReadonlyProperty(QStringLiteral("global"), Primitive::fromBoolean(global()));
- defineReadonlyProperty(QStringLiteral("ignoreCase"), Primitive::fromBoolean(this->value()->ignoreCase()));
- defineReadonlyProperty(QStringLiteral("multiline"), Primitive::fromBoolean(this->value()->multiLine()));
+ defineReadonlyProperty(QStringLiteral("ignoreCase"), Primitive::fromBoolean(this->value()->ignoreCase));
+ defineReadonlyProperty(QStringLiteral("multiline"), Primitive::fromBoolean(this->value()->multiLine));
}
@@ -190,8 +190,8 @@ Property *RegExpObject::lastIndexProperty(ExecutionContext *ctx)
// have different semantics/flags, but we try to do our best.
QRegExp RegExpObject::toQRegExp() const
{
- Qt::CaseSensitivity caseSensitivity = value()->ignoreCase() ? Qt::CaseInsensitive : Qt::CaseSensitive;
- return QRegExp(value()->pattern(), caseSensitivity, QRegExp::RegExp2);
+ Qt::CaseSensitivity caseSensitivity = value()->ignoreCase ? Qt::CaseInsensitive : Qt::CaseSensitive;
+ return QRegExp(value()->pattern, caseSensitivity, QRegExp::RegExp2);
}
QString RegExpObject::toString() const
@@ -200,9 +200,9 @@ QString RegExpObject::toString() const
result += QLatin1Char('/');
if (global())
result += QLatin1Char('g');
- if (value()->ignoreCase())
+ if (value()->ignoreCase)
result += QLatin1Char('i');
- if (value()->multiLine())
+ if (value()->multiLine)
result += QLatin1Char('m');
return result;
}
@@ -220,9 +220,9 @@ uint RegExpObject::flags() const
uint f = 0;
if (global())
f |= QV4::RegExpObject::RegExp_Global;
- if (value()->ignoreCase())
+ if (value()->ignoreCase)
f |= QV4::RegExpObject::RegExp_IgnoreCase;
- if (value()->multiLine())
+ if (value()->multiLine)
f |= QV4::RegExpObject::RegExp_Multiline;
return f;
}
@@ -256,7 +256,8 @@ ReturnedValue RegExpCtor::construct(Managed *m, CallData *callData)
if (!f->isUndefined())
return ctx->engine()->throwTypeError();
- return Encode(ctx->d()->engine->newRegExpObject(re->value(), re->global()));
+ Scoped<RegExp> regexp(scope, re->value());
+ return Encode(ctx->d()->engine->newRegExpObject(regexp, re->global()));
}
QString pattern;
@@ -368,7 +369,7 @@ ReturnedValue RegExpPrototype::method_exec(CallContext *ctx)
}
uint* matchOffsets = (uint*)alloca(r->value()->captureCount() * 2 * sizeof(uint));
- const int result = r->value()->match(s, offset, matchOffsets);
+ const int result = Scoped<RegExp>(scope, r->value())->match(s, offset, matchOffsets);
Scoped<RegExpCtor> regExpCtor(scope, ctx->d()->engine->regExpCtor);
regExpCtor->d()->clearLastMatch();
diff --git a/src/qml/jsruntime/qv4regexpobject_p.h b/src/qml/jsruntime/qv4regexpobject_p.h
index e71e2c21fd..a6a5587ca5 100644
--- a/src/qml/jsruntime/qv4regexpobject_p.h
+++ b/src/qml/jsruntime/qv4regexpobject_p.h
@@ -62,7 +62,7 @@ struct RegExpObject : Object {
RegExpObject(QV4::ExecutionEngine *engine, const QRegExp &re);
RegExpObject(InternalClass *ic);
- QV4::RegExp *value;
+ RegExp *value;
bool global;
};
@@ -98,7 +98,7 @@ struct RegExpObject: Object {
Index_ArrayInput = Index_ArrayIndex + 1
};
- RegExp *value() const { return d()->value; }
+ Heap::RegExp *value() const { return d()->value; }
bool global() const { return d()->global; }
void init(ExecutionEngine *engine);
diff --git a/src/qml/jsruntime/qv4stringobject.cpp b/src/qml/jsruntime/qv4stringobject.cpp
index 57c12390ff..a21f2b284a 100644
--- a/src/qml/jsruntime/qv4stringobject.cpp
+++ b/src/qml/jsruntime/qv4stringobject.cpp
@@ -606,8 +606,9 @@ ReturnedValue StringPrototype::method_search(CallContext *ctx)
regExp = regExpValue->as<RegExpObject>();
Q_ASSERT(regExp);
}
+ Scoped<RegExp> re(scope, regExp->value());
uint* matchOffsets = (uint*)alloca(regExp->value()->captureCount() * 2 * sizeof(uint));
- uint result = regExp->value()->match(string, /*offset*/0, matchOffsets);
+ uint result = re->match(string, /*offset*/0, matchOffsets);
if (result == JSC::Yarr::offsetNoMatch)
return Encode(-1);
return Encode(result);
@@ -670,7 +671,7 @@ ReturnedValue StringPrototype::method_split(CallContext *ctx)
Scoped<RegExpObject> re(scope, separatorValue);
if (re) {
- if (re->value()->pattern().isEmpty()) {
+ if (re->value()->pattern.isEmpty()) {
re = (RegExpObject *)0;
separatorValue = ctx->d()->engine->newString(QString());
}
@@ -681,7 +682,8 @@ ReturnedValue StringPrototype::method_split(CallContext *ctx)
uint offset = 0;
uint* matchOffsets = (uint*)alloca(re->value()->captureCount() * 2 * sizeof(uint));
while (true) {
- uint result = re->value()->match(text, offset, matchOffsets);
+ Scoped<RegExp> regexp(scope, re->value());
+ uint result = regexp->match(text, offset, matchOffsets);
if (result == JSC::Yarr::offsetNoMatch)
break;