formula/source/core/api/FormulaCompiler.cxx | 4 ++ include/formula/compiler.hrc | 5 ++- include/formula/opcode.hxx | 1 sc/source/core/inc/interpre.hxx | 1 sc/source/core/tool/compiler.cxx | 4 +- sc/source/core/tool/interpr4.cxx | 1 sc/source/core/tool/interpr7.cxx | 40 ++++++++++++++++++++++++++++ 7 files changed, 51 insertions(+), 5 deletions(-)
New commits: commit 7d3e6d47b0e1cf8b666cd991575a6ac9da671ff0 Author: Kohei Yoshida <kohei.yosh...@collabora.com> Date: Fri Dec 20 19:57:28 2013 -0500 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 diff --git a/formula/source/core/api/FormulaCompiler.cxx b/formula/source/core/api/FormulaCompiler.cxx index e8c40aa..1051b73 100644 --- a/formula/source/core/api/FormulaCompiler.cxx +++ b/formula/source/core/api/FormulaCompiler.cxx @@ -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: diff --git a/include/formula/compiler.hrc b/include/formula/compiler.hrc index 9bda945..e11f825 100644 --- a/include/formula/compiler.hrc +++ b/include/formula/compiler.hrc @@ -442,10 +442,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 diff --git a/include/formula/opcode.hxx b/include/formula/opcode.hxx index 58f3d41..c86b3a3 100644 --- a/include/formula/opcode.hxx +++ b/include/formula/opcode.hxx @@ -432,6 +432,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, diff --git a/sc/source/core/inc/interpre.hxx b/sc/source/core/inc/interpre.hxx index f8fc0e9..cc67580 100644 --- a/sc/source/core/inc/interpre.hxx +++ b/sc/source/core/inc/interpre.hxx @@ -563,6 +563,7 @@ void ScBitXor(); void ScBitRshift(); void ScBitLshift(); void ScTTT(); +void ScDebugVar(); /** Obtain the date serial number for a given date. @param bStrict diff --git a/sc/source/core/tool/compiler.cxx b/sc/source/core/tool/compiler.cxx index 496c151..7b1ef50 100644 --- a/sc/source/core/tool/compiler.cxx +++ b/sc/source/core/tool/compiler.cxx @@ -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 diff --git a/sc/source/core/tool/interpr4.cxx b/sc/source/core/tool/interpr4.cxx index 6983d3e..c5ebbd3 100644 --- a/sc/source/core/tool/interpr4.cxx +++ b/sc/source/core/tool/interpr4.cxx @@ -4219,6 +4219,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; } diff --git a/sc/source/core/tool/interpr7.cxx b/sc/source/core/tool/interpr7.cxx index bb647c1..0bcf7ae 100644 --- a/sc/source/core/tool/interpr7.cxx +++ b/sc/source/core/tool/interpr7.cxx @@ -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: */ _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits