summaryrefslogtreecommitdiff
path: root/sc
diff options
context:
space:
mode:
Diffstat (limited to 'sc')
-rw-r--r--sc/inc/token.hxx13
-rw-r--r--sc/source/core/data/cell.cxx8
-rw-r--r--sc/source/core/tool/compiler.cxx2
-rw-r--r--sc/source/core/tool/interpr1.cxx8
-rw-r--r--sc/source/core/tool/interpr2.cxx10
-rw-r--r--sc/source/core/tool/interpr4.cxx10
-rw-r--r--sc/source/core/tool/token.cxx2
7 files changed, 32 insertions, 21 deletions
diff --git a/sc/inc/token.hxx b/sc/inc/token.hxx
index 68ab308d7..70fa4246a 100644
--- a/sc/inc/token.hxx
+++ b/sc/inc/token.hxx
@@ -32,6 +32,7 @@
#include <memory>
#include <vector>
#include <boost/shared_ptr.hpp>
+#include <boost/intrusive_ptr.hpp>
#include "formula/opcode.hxx"
#include "refdata.hxx"
@@ -47,7 +48,7 @@ class ScJumpMatrix;
class ScToken;
typedef ::std::vector< ScComplexRefData > ScRefList;
-typedef formula::SimpleIntrusiveReference< class ScToken > ScTokenRef;
+typedef ::boost::intrusive_ptr<ScToken> ScTokenRef;
/**
* Another ref-counted token type using shared_ptr. <b>Be extra careful
@@ -122,6 +123,16 @@ public:
static formula::FormulaTokenRef ExtendRangeReference( formula::FormulaToken & rTok1, formula::FormulaToken & rTok2, const ScAddress & rPos, bool bReuseDoubleRef );
};
+inline void intrusive_ptr_add_ref(const ScToken* p)
+{
+ p->IncRef();
+}
+
+inline void intrusive_ptr_release(const ScToken* p)
+{
+ p->DecRef();
+}
+
class ScSingleRefToken : public ScToken
{
private:
diff --git a/sc/source/core/data/cell.cxx b/sc/source/core/data/cell.cxx
index f5037c28b..aabf0969d 100644
--- a/sc/source/core/data/cell.cxx
+++ b/sc/source/core/data/cell.cxx
@@ -1648,7 +1648,7 @@ void ScFormulaCell::InterpretTail( ScInterpretTailParameter eTailParam )
if ( !bContentChanged && pDocument->IsStreamValid(aPos.Tab()) )
{
- ScFormulaResult aNewResult( p->GetResultToken());
+ ScFormulaResult aNewResult( p->GetResultToken().get());
StackVar eOld = aResult.GetCellResultType();
StackVar eNew = aNewResult.GetCellResultType();
if ( eOld == svUnknown && ( eNew == svError || ( eNew == svDouble && aNewResult.GetDouble() == 0.0 ) ) )
@@ -1668,11 +1668,11 @@ void ScFormulaCell::InterpretTail( ScInterpretTailParameter eTailParam )
}
}
- aResult.SetToken( p->GetResultToken() );
+ aResult.SetToken( p->GetResultToken().get() );
}
else
{
- ScFormulaResult aNewResult( p->GetResultToken());
+ ScFormulaResult aNewResult( p->GetResultToken().get());
StackVar eOld = aResult.GetCellResultType();
StackVar eNew = aNewResult.GetCellResultType();
bChanged = (eOld != eNew ||
@@ -1721,7 +1721,7 @@ void ScFormulaCell::InterpretTail( ScInterpretTailParameter eTailParam )
// If the formula wasn't entered as a matrix formula, live on with
// the upper left corner and let reference counting delete the matrix.
if( cMatrixFlag != MM_FORMULA && !pCode->IsHyperLink() )
- aResult.SetToken( aResult.GetCellResultToken());
+ aResult.SetToken( aResult.GetCellResultToken().get());
}
if ( aResult.IsValue() && !::rtl::math::isFinite( aResult.GetDouble() ) )
{
diff --git a/sc/source/core/tool/compiler.cxx b/sc/source/core/tool/compiler.cxx
index 5e743c552..d12e2ccf7 100644
--- a/sc/source/core/tool/compiler.cxx
+++ b/sc/source/core/tool/compiler.cxx
@@ -5260,7 +5260,7 @@ void ScCompiler::fillAddInToken(::std::vector< ::com::sun::star::sheet::FormulaO
// -----------------------------------------------------------------------------
BOOL ScCompiler::HandleSingleRef()
{
- ScSingleRefData& rRef = static_cast<ScToken*>((FormulaToken*)pToken)->GetSingleRef();
+ ScSingleRefData& rRef = static_cast<ScToken*>(pToken.get())->GetSingleRef();
rRef.CalcAbsIfRel( aPos );
if ( !rRef.Valid() )
{
diff --git a/sc/source/core/tool/interpr1.cxx b/sc/source/core/tool/interpr1.cxx
index ab698a4d4..1c890b5d7 100644
--- a/sc/source/core/tool/interpr1.cxx
+++ b/sc/source/core/tool/interpr1.cxx
@@ -179,7 +179,7 @@ void ScInterpreter::ScIfJump()
xNew = new ScJumpMatrixToken( pJumpMat );
GetTokenMatrixMap().insert( ScTokenMatrixMap::value_type(pCur, xNew));
}
- PushTempToken( xNew);
+ PushTempToken( xNew.get());
// set endpoint of path for main code line
aCode.Jump( pJump[ nJumpCount ], pJump[ nJumpCount ] );
}
@@ -293,7 +293,7 @@ void ScInterpreter::ScChoseJump()
GetTokenMatrixMap().insert( ScTokenMatrixMap::value_type(
pCur, xNew));
}
- PushTempToken( xNew);
+ PushTempToken( xNew.get());
// set endpoint of path for main code line
aCode.Jump( pJump[ nJumpCount ], pJump[ nJumpCount ] );
bHaveJump = true;
@@ -7347,7 +7347,7 @@ void ScInterpreter::ScText()
FormulaTokenRef xTok( PopToken());
if (!nGlobalError)
{
- PushTempToken( xTok);
+ PushTempToken( xTok.get());
// Temporarily override the ConvertStringToValue()
// error for GetCellValue() / GetCellValueOrZero()
USHORT nSErr = mnStringNoValueError;
@@ -7358,7 +7358,7 @@ void ScInterpreter::ScText()
{
// Not numeric.
nGlobalError = 0;
- PushTempToken( xTok);
+ PushTempToken( xTok.get());
aStr = GetString();
bString = true;
}
diff --git a/sc/source/core/tool/interpr2.cxx b/sc/source/core/tool/interpr2.cxx
index 7c370841b..40d7fcc17 100644
--- a/sc/source/core/tool/interpr2.cxx
+++ b/sc/source/core/tool/interpr2.cxx
@@ -1895,7 +1895,7 @@ void ScInterpreter::ScIntersect()
PushTempToken( new ScDoubleRefToken( rRef));
}
else
- PushTempToken( xRes);
+ PushTempToken( xRes.get());
}
else
{
@@ -1966,7 +1966,7 @@ void ScInterpreter::ScRangeFunc()
if (!xRes)
PushIllegalArgument();
else
- PushTempToken( xRes);
+ PushTempToken( xRes.get());
}
@@ -2044,7 +2044,7 @@ void ScInterpreter::ScUnionFunc()
}
}
ValidateRef( *pRes); // set #REF! if needed
- PushTempToken( xRes);
+ PushTempToken( xRes.get());
}
@@ -2054,8 +2054,8 @@ void ScInterpreter::ScCurrent()
FormulaTokenRef xTok( PopToken());
if (xTok)
{
- PushTempToken( xTok);
- PushTempToken( xTok);
+ PushTempToken( xTok.get());
+ PushTempToken( xTok.get());
}
else
PushError( errUnknownStackVariable);
diff --git a/sc/source/core/tool/interpr4.cxx b/sc/source/core/tool/interpr4.cxx
index 31e985448..8d2002236 100644
--- a/sc/source/core/tool/interpr4.cxx
+++ b/sc/source/core/tool/interpr4.cxx
@@ -1733,7 +1733,7 @@ bool ScInterpreter::ConvertMatrixParameters()
GetTokenMatrixMap().insert( ScTokenMatrixMap::value_type( pCur,
xNew));
}
- PushTempToken( xNew);
+ PushTempToken( xNew.get());
// set continuation point of path for main code line
aCode.Jump( nNext, nNext);
return true;
@@ -1783,14 +1783,14 @@ void ScInterpreter::QueryMatrixType(ScMatrixRef& xMat, short& rRetTypeExpr, ULON
if ( xMat->IsEmptyPath( 0, 0))
{ // result of empty FALSE jump path
FormulaTokenRef xRes = new FormulaDoubleToken( 0.0);
- PushTempToken( new ScMatrixCellResultToken( xMat, xRes));
+ PushTempToken( new ScMatrixCellResultToken( xMat, xRes.get()));
rRetTypeExpr = NUMBERFORMAT_LOGICAL;
}
else
{
String aStr( nMatVal.GetString());
FormulaTokenRef xRes = new FormulaStringToken( aStr);
- PushTempToken( new ScMatrixCellResultToken( xMat, xRes));
+ PushTempToken( new ScMatrixCellResultToken( xMat, xRes.get()));
rRetTypeExpr = NUMBERFORMAT_TEXT;
}
}
@@ -1802,7 +1802,7 @@ void ScInterpreter::QueryMatrixType(ScMatrixRef& xMat, short& rRetTypeExpr, ULON
xRes = new FormulaErrorToken( nErr);
else
xRes = new FormulaDoubleToken( nMatVal.fVal);
- PushTempToken( new ScMatrixCellResultToken( xMat, xRes));
+ PushTempToken( new ScMatrixCellResultToken( xMat, xRes.get()));
if ( rRetTypeExpr != NUMBERFORMAT_LOGICAL )
rRetTypeExpr = NUMBERFORMAT_NUMBER;
}
@@ -3660,7 +3660,7 @@ StackVar ScInterpreter::Interpret()
if ( nStackBase > sp )
nStackBase = sp; // underflow?!?
sp = nStackBase;
- PushTempToken( (*aTokenMatrixMapIter).second);
+ PushTempToken( (*aTokenMatrixMapIter).second.get());
}
else
{
diff --git a/sc/source/core/tool/token.cxx b/sc/source/core/tool/token.cxx
index 5dc7877e3..9dc0efcbd 100644
--- a/sc/source/core/tool/token.cxx
+++ b/sc/source/core/tool/token.cxx
@@ -1551,7 +1551,7 @@ FormulaToken* ScTokenArray::MergeRangeReference( const ScAddress & rPos )
p2->DecRef();
p3->DecRef();
nLen -= 2;
- pCode[ nLen-1 ] = p;
+ pCode[ nLen-1 ] = p.get();
nRefs--;
}
}