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
{
using namespace ::com::sun::star;
static const sal_Char* pInternal[ 1 ] = { "TTT" };
static const sal_Char* pInternal[2] = { "TTT", "__DEBUG_VAR" };
namespace {
......@@ -794,6 +794,8 @@ bool FormulaCompiler::IsOpCodeVolatile( OpCode eOp )
case ocIndirectXL:
// ocOffset results in indirect references.
case ocOffset:
// ocDebugVar shows internal value that may change as the internal state changes.
case ocDebugVar:
bRet = true;
break;
default:
......
......@@ -450,10 +450,11 @@
/*** Internal ***/
#define SC_OPCODE_INTERNAL_BEGIN 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 ***/
#define SC_OPCODE_DATA_TOKEN_1 10000
#define SC_OPCODE_DATA_TOKEN_1 10001
#define SC_OPCODE_NONE 0xFFFF
......
......@@ -440,6 +440,7 @@ enum OpCodeEnum
// internal stuff
ocInternalBegin = SC_OPCODE_INTERNAL_BEGIN,
ocTTT = SC_OPCODE_TTT,
ocDebugVar = SC_OPCODE_DEBUG_VAR,
ocInternalEnd = SC_OPCODE_INTERNAL_END,
// from here on ExtraData
ocDataToken1 = SC_OPCODE_DATA_TOKEN_1,
......
......@@ -561,6 +561,7 @@ void ScBitXor();
void ScBitRshift();
void ScBitLshift();
void ScTTT();
void ScDebugVar();
/** Obtain the date serial number for a given date.
@param bStrict
......
......@@ -89,7 +89,7 @@ enum ScanState
ssStop
};
static const sal_Char* pInternal[ 1 ] = { "TTT" };
static const sal_Char* pInternal[2] = { "TTT", "__DEBUG_VAR" };
using namespace ::com::sun::star::i18n;
......@@ -3440,7 +3440,7 @@ bool ScCompiler::NextNewToken( bool bInArray )
bool bAsciiNonAlnum; // operators, separators, ...
if ( cSymbol[0] < 128 )
{
bMayBeFuncName = rtl::isAsciiAlpha( cSymbol[0] );
bMayBeFuncName = rtl::isAsciiAlpha( cSymbol[0] ) || cSymbol[0] == '_';
bAsciiNonAlnum = !bMayBeFuncName && !rtl::isAsciiDigit( cSymbol[0] );
}
else
......
......@@ -4228,6 +4228,7 @@ StackVar ScInterpreter::Interpret()
case ocBitRshift : ScBitRshift(); break;
case ocBitLshift : ScBitLshift(); break;
case ocTTT : ScTTT(); break;
case ocDebugVar : ScDebugVar(); break;
case ocNone : nFuncFmtType = NUMBERFORMAT_UNDEFINED; break;
default : PushError( errUnknownOpCode); break;
}
......
......@@ -15,6 +15,8 @@
#include <com/sun/star/io/XInputStream.hpp>
#include "libxml/xpath.h"
#include <dpobject.hxx>
#include <document.hxx>
#include <boost/shared_ptr.hpp>
#include <cstring>
......@@ -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: */
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