V4 IR: prevent accidental detaches of QVectors.
authorErik Verbruggen <erik.verbruggen@digia.com>
Tue, 15 Apr 2014 13:26:54 +0000 (15:26 +0200)
committerThe Qt Project <gerrit-noreply@qt-project.org>
Tue, 15 Apr 2014 13:31:28 +0000 (15:31 +0200)
Change-Id: I20ebf44ff0609f6833f7e59a4f2fb312be11b8c1
Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
src/qml/compiler/qv4ssa.cpp
src/qml/compiler/qv4ssa_p.h
src/qml/jit/qv4isel_masm.cpp
src/qml/jit/qv4isel_masm_p.h

index fd6b7b537eea6fb24d2f6e5d47a42f376c02ed6a..9c5407e74d3656aa3ef9b4bfd8996158cc86e559 100644 (file)
@@ -3538,6 +3538,7 @@ public:
             _sortedRanges.append(range);
         }
         std::sort(_sortedRanges.begin(), _sortedRanges.end(), LifeTimeInterval::lessThan);
+        _intervals.clear();
     }
 
     QVector<LifeTimeInterval> ranges() const { return _sortedRanges; }
@@ -3692,8 +3693,8 @@ LifeTimeInterval LifeTimeInterval::split(int atPosition, int newStart)
 
     // search where to split the interval
     for (int i = 0, ei = _ranges.size(); i < ei; ++i) {
-        if (_ranges[i].start <= atPosition) {
-            if (_ranges[i].end >= atPosition) {
+        if (_ranges.at(i).start <= atPosition) {
+            if (_ranges.at(i).end >= atPosition) {
                 // split happens in the middle of a range. Keep this range in both the old and the
                 // new interval, and correct the end/start later
                 _ranges.resize(i + 1);
index 9bbe92dfa66fab5216c31a0dfd860ab17cfde887..13f3eed4dff0a1cc922dec14e5d50bb3b0e63664 100644 (file)
@@ -82,7 +82,7 @@ public:
         , _reg(Invalid)
         , _isFixedInterval(0)
         , _isSplitFromInterval(0)
-    {}
+    { _ranges.reserve(2); }
 
     bool isValid() const { return _end != Invalid; }
 
@@ -92,7 +92,7 @@ public:
 
     void setFrom(Stmt *from);
     void addRange(int from, int to);
-    Ranges ranges() const { return _ranges; }
+    const Ranges &ranges() const { return _ranges; }
     void reserveRanges(int capacity) { _ranges.reserve(capacity); }
 
     int start() const { return _ranges.first().start; }
index 57ca940731a2775598555b050b536b1121b70184..74b404a7939a332ad76465adce6176538258d2c6 100644 (file)
@@ -374,14 +374,14 @@ void InstructionSelection::run(int functionIndex)
     qSwap(_removableJumps, removableJumps);
 }
 
-void *InstructionSelection::addConstantTable(QVector<Primitive> *values)
+const void *InstructionSelection::addConstantTable(QVector<Primitive> *values)
 {
     compilationUnit->constantValues.append(*values);
     values->clear();
 
     QVector<QV4::Primitive> &finalValues = compilationUnit->constantValues.last();
     finalValues.squeeze();
-    return finalValues.data();
+    return finalValues.constData();
 }
 
 QV4::CompiledData::CompilationUnit *InstructionSelection::backendCompileStep()
@@ -1620,10 +1620,10 @@ Assembler::ImplicitAddress Assembler::ConstantTable::loadValueAddress(const Prim
 
 void Assembler::ConstantTable::finalize(JSC::LinkBuffer &linkBuffer, InstructionSelection *isel)
 {
-    void *tablePtr = isel->addConstantTable(&_values);
+    const void *tablePtr = isel->addConstantTable(&_values);
 
     foreach (DataLabelPtr label, _toPatch)
-        linkBuffer.patch(label, tablePtr);
+        linkBuffer.patch(label, const_cast<void *>(tablePtr));
 }
 
 bool InstructionSelection::visitCJumpDouble(IR::AluOp op, IR::Expr *left, IR::Expr *right,
index 0e8db93e85b5dd82412f181b678c5da02bfe0969..d589223d7eb38c73ebc3d7eaf053917a38c9ed84 100644 (file)
@@ -72,7 +72,7 @@ public:
 
     virtual void run(int functionIndex);
 
-    void *addConstantTable(QVector<QV4::Primitive> *values);
+    const void *addConstantTable(QVector<QV4::Primitive> *values);
 protected:
     virtual QV4::CompiledData::CompilationUnit *backendCompileStep();