32#include <osl/diagnose.h>
33#include <rtl/ustrbuf.hxx>
35#include <com/sun/star/script/ModuleType.hpp>
142 std::unique_ptr<SbiImage>
p(
new SbiImage);
151 if(
rMod.
mnType == css::script::ModuleType::CLASS )
162 for(
int i = 0 ;
i < nIfaceCount ;
i++ )
166 pIfaceVar->
SetName( rIfaceName );
178 if (
rMod.
mnType == css::script::ModuleType::CLASS )
180 rMod.
mnType = css::script::ModuleType::NORMAL;
197 OUString aProcName = pProc->
GetName();
198 OUStringBuffer aIfaceProcName;
200 sal_uInt16 nPassCount = 1;
203 int nPropPrefixFound = aProcName.indexOf(
"Property ");
204 std::u16string_view aPureProcName = aProcName;
205 std::u16string_view aPropPrefix;
206 if( nPropPrefixFound == 0 )
208 aPropPrefix = aProcName.subView( 0, 13 );
209 aPureProcName = aProcName.subView( 13 );
211 for(
int i = 0 ;
i < nIfaceCount ;
i++ )
215 if( bFound && aPureProcName[rIfaceName.getLength()] ==
'_' )
217 if( nPropPrefixFound == 0 )
219 aIfaceProcName.append(aPropPrefix);
221 aIfaceProcName.append(aPureProcName.substr(rIfaceName.getLength() + 1) );
222 aIfaceName = rIfaceName;
229 for( sal_uInt16 nPass = 0 ; nPass < nPassCount ; nPass++ )
233 aProcName = aIfaceProcName.toString();
263 OSL_FAIL(
"Illegal PropertyMode");
286 if( !pProc->
GetLib().isEmpty())
294 SbxInfo* pInfo = pMeth->
GetInfo();
295 OUString aHelpFile, aComment;
296 sal_uInt32 nHelpId = 0;
300 aHelpFile = pInfo->GetHelpFile();
301 aComment = pInfo->GetComment();
302 nHelpId = pInfo->GetHelpId();
305 pInfo =
new SbxInfo( aHelpFile, nHelpId );
306 pInfo->SetComment( aComment );
309 for( sal_uInt16
i = 1;
i < pPool->
GetSize();
i++ )
327 pInfo->AddParam( pPar->
GetName(),
t, nFlags );
329 sal_uInt32 nUserData = 0;
333 nUserData |= nDefaultId;
367 sal_uInt16 nSize = pPool->
GetSize();
368 p->MakeStrings( nSize );
370 for(
i = 1;
i <= nSize;
i++ )
372 p->AddString( pPool->
Find(
i ) );
399 virtual ~PCodeVisitor();
402 virtual void processOpCode0(
SbiOpcode eOp ) = 0;
403 virtual void processOpCode1(
SbiOpcode eOp, T nOp1 ) = 0;
404 virtual void processOpCode2(
SbiOpcode eOp, T nOp1, T nOp2 ) = 0;
405 virtual bool processParams() = 0;
410template <
class T> PCodeVisitor< T >::~PCodeVisitor()
416class PCodeBufferWalker
421 static T readParam(
sal_uInt8 const *& pCode )
424 for ( std::size_t i=0;
i<
sizeof( T ); ++
i )
425 nOp1 |= *pCode++ << ( i * 8);
429 PCodeBufferWalker(
const sal_uInt8* pCode, T nBytes ): m_nBytes( nBytes ), m_pCode( pCode )
432 void visitBuffer( PCodeVisitor< T >& visitor )
437 const sal_uInt8* pEnd = pCode + m_nBytes;
438 visitor.start( m_pCode );
439 T nOp1 = 0, nOp2 = 0;
440 for( ; pCode < pEnd; )
445 visitor.processOpCode0( eOp );
448 if ( visitor.processParams() )
449 nOp1 = readParam( pCode );
451 pCode +=
sizeof( T );
452 visitor.processOpCode1( eOp, nOp1 );
456 if ( visitor.processParams() )
458 nOp1 = readParam( pCode );
459 nOp2 = readParam( pCode );
462 pCode += (
sizeof( T ) * 2 );
463 visitor.processOpCode2( eOp, nOp1, nOp2 );
469template <
class T,
class S >
470class OffSetAccumulator :
public PCodeVisitor< T >
473 T m_nNumSingleParams;
474 T m_nNumDoubleParams;
477 OffSetAccumulator() : m_nNumOp0(0), m_nNumSingleParams(0), m_nNumDoubleParams(0){}
479 virtual void processOpCode0(
SbiOpcode )
override { ++m_nNumOp0; }
480 virtual void processOpCode1(
SbiOpcode , T )
override { ++m_nNumSingleParams; }
481 virtual void processOpCode2(
SbiOpcode , T , T )
override { ++m_nNumDoubleParams; }
484 typedef decltype(T(1) +
S(1)) larger_t;
486 static const S max = std::numeric_limits< S >::max();
487 result = m_nNumOp0 + ( (
sizeof(
S) + 1 ) * m_nNumSingleParams ) + ( ((
sizeof(S) * 2 )+ 1 ) * m_nNumDoubleParams );
488 return std::min<larger_t>(max, result);
490 virtual bool processParams()
override {
return false; }
494template <
class T,
class S >
495class BufferTransformer :
public PCodeVisitor< T >
500 BufferTransformer():m_pStart(nullptr) {}
501 virtual void start(
const sal_uInt8* pStart )
override { m_pStart = pStart; }
502 virtual void processOpCode0(
SbiOpcode eOp )
override
504 m_ConvertedBuf +=
static_cast<sal_uInt8>(eOp);
506 virtual void processOpCode1(
SbiOpcode eOp, T nOp1 )
override
508 m_ConvertedBuf +=
static_cast<sal_uInt8>(eOp);
519 nOp1 =
static_cast<T
>( convertBufferOffSet(m_pStart, nOp1) );
523 nOp1 =
static_cast<T
>( convertBufferOffSet(m_pStart, nOp1) );
529 m_ConvertedBuf +=
static_cast<S>(nOp1);
531 virtual void processOpCode2(
SbiOpcode eOp, T nOp1, T nOp2 )
override
533 m_ConvertedBuf +=
static_cast<sal_uInt8>(eOp);
535 nOp1 =
static_cast<T
>( convertBufferOffSet(m_pStart, nOp1) );
536 m_ConvertedBuf +=
static_cast<S>(nOp1);
537 m_ConvertedBuf +=
static_cast<S>(nOp2);
540 virtual bool processParams()
override {
return true; }
546 return m_ConvertedBuf;
548 static S convertBufferOffSet(
const sal_uInt8* pStart, T nOp1 )
550 PCodeBufferWalker< T > aBuff( pStart, nOp1);
551 OffSetAccumulator< T, S > aVisitor;
552 aBuff.visitBuffer( aVisitor );
553 return aVisitor.offset();
562 return BufferTransformer< sal_uInt16, sal_uInt32 >::convertBufferOffSet( pCode, nOffset );
568 return BufferTransformer< sal_uInt32, sal_uInt16 >::convertBufferOffSet( pCode, nOffset );
571template <
class T,
class S>
576 BufferTransformer< T, S > aTrnsfrmer;
577 aBuf.visitBuffer( aTrnsfrmer );
579 m_aCnvtdBuf = aTrnsfrmer.buffer().GetBuffer();
virtual SbxInfo * GetInfo() override
SAL_DLLPRIVATE SbMethod * GetMethod(const OUString &, SbxDataType)
SAL_DLLPRIVATE void GetProcedureProperty(const OUString &, SbxDataType)
SAL_DLLPRIVATE void StartDefinitions()
std::unique_ptr< SbiImage > pImage
SAL_DLLPRIVATE void EndDefinitions(bool=false)
std::unique_ptr< SbClassData > pClassData
SAL_DLLPRIVATE void GetIfaceMapperMethod(const OUString &, SbMethod *)
const ErrCode & GetErrCode() const
sal_uInt32 GetSize() const
const OUString & GetErrMessage() const
std::vector< sal_uInt8 > && GetBuffer()
SbiCodeGen(SbModule &, SbiParser *)
static sal_uInt32 calcNewOffSet(sal_uInt8 const *pCode, sal_uInt16 nOffset)
sal_uInt32 Gen(SbiOpcode)
static sal_uInt16 calcLegacyOffSet(sal_uInt8 const *pCode, sal_uInt32 nOffset)
SbiStringPool aGblStrings
std::vector< OUString > aRequiredTypes
std::vector< OUString > aIfaceVector
bool IsCodeCompleting() const
sal_uInt16 GetLine1() const
const OUString & GetPropName() const
virtual SbiProcDef * GetProcDef() override
PropertyMode getPropertyMode() const
sal_uInt16 GetLine2() const
sal_Int32 GetCol1() const
sal_Int32 GetLine() const
OUString Find(sal_uInt32) const
sal_uInt32 GetSize() const
bool IsWithBrackets() const
sal_uInt32 GetAddr() const
bool IsParamArray() const
SbxDataType GetType() const
const OUString & GetName()
sal_uInt16 GetDefaultId() const
SbiSymDef * Get(sal_uInt16)
sal_uInt16 GetSize() const
void Insert(SbxVariable *, sal_uInt32)
void SetFlag(SbxFlagBits n)
void SetName(const OUString &)
#define PARAM_INFO_WITHBRACKETS
#define PARAM_INFO_PARAMARRAY
constexpr bool starts_with(std::basic_string_view< charT, traits > sv, std::basic_string_view< charT, traits > x) noexcept
#define ERRCODE_BASIC_INTERNAL_ERROR