Skip to content

Commit 9d7bdea

Browse files
nirvnnyalldawson
authored andcommittedJan 15, 2021
[expression] Avoid paying the price of a QgsCoordinateReferenceSystem destruction if we didn't need one
(cherry picked from commit ff3bb1c)
1 parent b79f618 commit 9d7bdea

File tree

2 files changed

+12
-9
lines changed

2 files changed

+12
-9
lines changed
 

‎src/core/expression/qgsexpression.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -278,8 +278,8 @@ void QgsExpression::initGeomCalculator( const QgsExpressionContext *context )
278278
// actually don't do it right away, cos it's expensive to create and only a very small number of expression
279279
// functions actually require it. Let's lazily construct it when needed
280280
d->mDaEllipsoid = context->variable( QStringLiteral( "project_ellipsoid" ) ).toString();
281-
d->mDaCrs = context->variable( QStringLiteral( "_layer_crs" ) ).value<QgsCoordinateReferenceSystem>();
282-
d->mDaTransformContext = context->variable( QStringLiteral( "_project_transform_context" ) ).value<QgsCoordinateTransformContext>();
281+
d->mDaCrs = qgis::make_unique<QgsCoordinateReferenceSystem>( context->variable( QStringLiteral( "_layer_crs" ) ).value<QgsCoordinateReferenceSystem>() );
282+
d->mDaTransformContext = qgis::make_unique<QgsCoordinateTransformContext>( context->variable( QStringLiteral( "_project_transform_context" ) ).value<QgsCoordinateTransformContext>() );
283283
}
284284

285285
// Set the distance units from the context if it has not been set by setDistanceUnits()
@@ -396,12 +396,12 @@ QString QgsExpression::dump() const
396396

397397
QgsDistanceArea *QgsExpression::geomCalculator()
398398
{
399-
if ( !d->mCalc && d->mDaCrs.isValid() )
399+
if ( !d->mCalc && d->mDaCrs && d->mDaCrs->isValid() && d->mDaTransformContext )
400400
{
401401
// calculator IS required, so initialize it now...
402402
d->mCalc = std::shared_ptr<QgsDistanceArea>( new QgsDistanceArea() );
403403
d->mCalc->setEllipsoid( d->mDaEllipsoid.isEmpty() ? geoNone() : d->mDaEllipsoid );
404-
d->mCalc->setSourceCrs( d->mDaCrs, d->mDaTransformContext );
404+
d->mCalc->setSourceCrs( *d->mDaCrs.get(), *d->mDaTransformContext.get() );
405405
}
406406

407407
return d->mCalc.get();

‎src/core/expression/qgsexpression_p.h

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -47,12 +47,15 @@ class QgsExpressionPrivate
4747
, mParserErrors( other.mParserErrors )
4848
, mExp( other.mExp )
4949
, mDaEllipsoid( other.mDaEllipsoid )
50-
, mDaCrs( other.mDaCrs )
51-
, mDaTransformContext( other.mDaTransformContext )
5250
, mCalc( other.mCalc )
5351
, mDistanceUnit( other.mDistanceUnit )
5452
, mAreaUnit( other.mAreaUnit )
55-
{}
53+
{
54+
if ( other.mDaCrs )
55+
mDaCrs = qgis::make_unique<QgsCoordinateReferenceSystem>( *other.mDaCrs.get() );
56+
if ( other.mDaTransformContext )
57+
mDaTransformContext = qgis::make_unique<QgsCoordinateTransformContext>( *other.mDaTransformContext.get() );
58+
}
5659

5760
~QgsExpressionPrivate()
5861
{
@@ -71,8 +74,8 @@ class QgsExpressionPrivate
7174
QString mExp;
7275

7376
QString mDaEllipsoid;
74-
QgsCoordinateReferenceSystem mDaCrs;
75-
QgsCoordinateTransformContext mDaTransformContext;
77+
std::unique_ptr<QgsCoordinateReferenceSystem> mDaCrs;
78+
std::unique_ptr<QgsCoordinateTransformContext> mDaTransformContext;
7679

7780
std::shared_ptr<QgsDistanceArea> mCalc;
7881
QgsUnitTypes::DistanceUnit mDistanceUnit = QgsUnitTypes::DistanceUnknownUnit;

0 commit comments

Comments
 (0)
Please sign in to comment.