Kaydet (Commit) 9c09211b authored tarafından Kohei Yoshida's avatar Kohei Yoshida

Add internal cell function __DEBUG_VAR to sniff arbitrary internal state.

Useful for debugging in a more flashy way.  But never ever document this
for end users.  If you are an end user reading this, use this at your
own risk.  You have been warned.

Change-Id: Ibbdb45f576287f707106327704754ffaec27ba3c
üst efb30219
...@@ -39,7 +39,7 @@ namespace formula ...@@ -39,7 +39,7 @@ namespace formula
{ {
using namespace ::com::sun::star; using namespace ::com::sun::star;
static const sal_Char* pInternal[ 1 ] = { "TTT" }; static const sal_Char* pInternal[2] = { "TTT", "__DEBUG_VAR" };
namespace { namespace {
...@@ -794,6 +794,8 @@ bool FormulaCompiler::IsOpCodeVolatile( OpCode eOp ) ...@@ -794,6 +794,8 @@ bool FormulaCompiler::IsOpCodeVolatile( OpCode eOp )
case ocIndirectXL: case ocIndirectXL:
// ocOffset results in indirect references. // ocOffset results in indirect references.
case ocOffset: case ocOffset:
// ocDebugVar shows internal value that may change as the internal state changes.
case ocDebugVar:
bRet = true; bRet = true;
break; break;
default: default:
......
...@@ -450,10 +450,11 @@ ...@@ -450,10 +450,11 @@
/*** Internal ***/ /*** Internal ***/
#define SC_OPCODE_INTERNAL_BEGIN 9999 #define SC_OPCODE_INTERNAL_BEGIN 9999
#define SC_OPCODE_TTT 9999 #define SC_OPCODE_TTT 9999
#define SC_OPCODE_INTERNAL_END 9999 #define SC_OPCODE_DEBUG_VAR 10000
#define SC_OPCODE_INTERNAL_END 10000
/*** from here on ExtraData contained ***/ /*** from here on ExtraData contained ***/
#define SC_OPCODE_DATA_TOKEN_1 10000 #define SC_OPCODE_DATA_TOKEN_1 10001
#define SC_OPCODE_NONE 0xFFFF #define SC_OPCODE_NONE 0xFFFF
......
...@@ -440,6 +440,7 @@ enum OpCodeEnum ...@@ -440,6 +440,7 @@ enum OpCodeEnum
// internal stuff // internal stuff
ocInternalBegin = SC_OPCODE_INTERNAL_BEGIN, ocInternalBegin = SC_OPCODE_INTERNAL_BEGIN,
ocTTT = SC_OPCODE_TTT, ocTTT = SC_OPCODE_TTT,
ocDebugVar = SC_OPCODE_DEBUG_VAR,
ocInternalEnd = SC_OPCODE_INTERNAL_END, ocInternalEnd = SC_OPCODE_INTERNAL_END,
// from here on ExtraData // from here on ExtraData
ocDataToken1 = SC_OPCODE_DATA_TOKEN_1, ocDataToken1 = SC_OPCODE_DATA_TOKEN_1,
......
...@@ -561,6 +561,7 @@ void ScBitXor(); ...@@ -561,6 +561,7 @@ void ScBitXor();
void ScBitRshift(); void ScBitRshift();
void ScBitLshift(); void ScBitLshift();
void ScTTT(); void ScTTT();
void ScDebugVar();
/** Obtain the date serial number for a given date. /** Obtain the date serial number for a given date.
@param bStrict @param bStrict
......
...@@ -89,7 +89,7 @@ enum ScanState ...@@ -89,7 +89,7 @@ enum ScanState
ssStop ssStop
}; };
static const sal_Char* pInternal[ 1 ] = { "TTT" }; static const sal_Char* pInternal[2] = { "TTT", "__DEBUG_VAR" };
using namespace ::com::sun::star::i18n; using namespace ::com::sun::star::i18n;
...@@ -3440,7 +3440,7 @@ bool ScCompiler::NextNewToken( bool bInArray ) ...@@ -3440,7 +3440,7 @@ bool ScCompiler::NextNewToken( bool bInArray )
bool bAsciiNonAlnum; // operators, separators, ... bool bAsciiNonAlnum; // operators, separators, ...
if ( cSymbol[0] < 128 ) if ( cSymbol[0] < 128 )
{ {
bMayBeFuncName = rtl::isAsciiAlpha( cSymbol[0] ); bMayBeFuncName = rtl::isAsciiAlpha( cSymbol[0] ) || cSymbol[0] == '_';
bAsciiNonAlnum = !bMayBeFuncName && !rtl::isAsciiDigit( cSymbol[0] ); bAsciiNonAlnum = !bMayBeFuncName && !rtl::isAsciiDigit( cSymbol[0] );
} }
else else
......
...@@ -4228,6 +4228,7 @@ StackVar ScInterpreter::Interpret() ...@@ -4228,6 +4228,7 @@ StackVar ScInterpreter::Interpret()
case ocBitRshift : ScBitRshift(); break; case ocBitRshift : ScBitRshift(); break;
case ocBitLshift : ScBitLshift(); break; case ocBitLshift : ScBitLshift(); break;
case ocTTT : ScTTT(); break; case ocTTT : ScTTT(); break;
case ocDebugVar : ScDebugVar(); break;
case ocNone : nFuncFmtType = NUMBERFORMAT_UNDEFINED; break; case ocNone : nFuncFmtType = NUMBERFORMAT_UNDEFINED; break;
default : PushError( errUnknownOpCode); break; default : PushError( errUnknownOpCode); break;
} }
......
...@@ -15,6 +15,8 @@ ...@@ -15,6 +15,8 @@
#include <com/sun/star/io/XInputStream.hpp> #include <com/sun/star/io/XInputStream.hpp>
#include "libxml/xpath.h" #include "libxml/xpath.h"
#include <dpobject.hxx>
#include <document.hxx>
#include <boost/shared_ptr.hpp> #include <boost/shared_ptr.hpp>
#include <cstring> #include <cstring>
...@@ -205,4 +207,42 @@ void ScInterpreter::ScWebservice() ...@@ -205,4 +207,42 @@ void ScInterpreter::ScWebservice()
} }
} }
void ScInterpreter::ScDebugVar()
{
// This is to be used by developers only! Never document this for end
// users. This is a convenient way to extract arbitrary internal state to
// a cell for easier debugging.
if (!MustHaveParamCount(GetByte(), 1))
{
PushIllegalParameter();
return;
}
rtl_uString* p = GetString().getDataIgnoreCase();
if (!p)
{
PushIllegalParameter();
return;
}
OUString aStrUpper(p);
if (aStrUpper == "PIVOTCOUNT")
{
// Set the number of pivot tables in the document.
double fVal = 0.0;
if (pDok->HasPivotTable())
{
const ScDPCollection* pDPs = pDok->GetDPCollection();
fVal = pDPs->GetCount();
}
PushDouble(fVal);
return;
}
PushIllegalParameter();
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment