LCOV - code coverage report
Current view: top level - basic/source/comp - dim.cxx (source / functions) Hit Total Coverage
Test: commit 10e77ab3ff6f4314137acd6e2702a6e5c1ce1fae Lines: 385 689 55.9 %
Date: 2014-11-03 Functions: 11 20 55.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2             : /*
       3             :  * This file is part of the LibreOffice project.
       4             :  *
       5             :  * This Source Code Form is subject to the terms of the Mozilla Public
       6             :  * License, v. 2.0. If a copy of the MPL was not distributed with this
       7             :  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
       8             :  *
       9             :  * This file incorporates work covered by the following license notice:
      10             :  *
      11             :  *   Licensed to the Apache Software Foundation (ASF) under one or more
      12             :  *   contributor license agreements. See the NOTICE file distributed
      13             :  *   with this work for additional information regarding copyright
      14             :  *   ownership. The ASF licenses this file to you under the Apache
      15             :  *   License, Version 2.0 (the "License"); you may not use this file
      16             :  *   except in compliance with the License. You may obtain a copy of
      17             :  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
      18             :  */
      19             : 
      20             : #include <basic/sbx.hxx>
      21             : #include "sbcomp.hxx"
      22             : #include "sbunoobj.hxx"
      23             : #include <svtools/miscopt.hxx>
      24             : #include <com/sun/star/reflection/theCoreReflection.hpp>
      25             : #include <comphelper/namedvaluecollection.hxx>
      26             : #include <comphelper/processfactory.hxx>
      27             : #include <com/sun/star/reflection/XInterfaceMemberTypeDescription.hpp>
      28             : #include <com/sun/star/reflection/XIdlMethod.hpp>
      29             : #include <com/sun/star/uno/Exception.hpp>
      30             : #include <basic/codecompletecache.hxx>
      31             : #include <boost/scoped_ptr.hpp>
      32             : 
      33             : using namespace ::com::sun::star;
      34             : using namespace ::com::sun::star::uno;
      35             : 
      36             : // Declaration of a variable
      37             : // If there are errors it will be parsed up to the comma or the newline.
      38             : // Return-value: a new instance, which were inserted and then deleted.
      39             : // Array-Indexex were returned as SbiDimList
      40             : 
      41        2214 : SbiSymDef* SbiParser::VarDecl( SbiDimList** ppDim, bool bStatic, bool bConst )
      42             : {
      43        2214 :     bool bWithEvents = false;
      44        2214 :     if( Peek() == WITHEVENTS )
      45             :     {
      46           0 :         Next();
      47           0 :         bWithEvents = true;
      48             :     }
      49        2214 :     if( !TestSymbol() ) return NULL;
      50        2214 :     SbxDataType t = eScanType;
      51        2214 :     SbiSymDef* pDef = bConst ? new SbiConstDef( aSym ) : new SbiSymDef( aSym );
      52        2214 :     SbiDimList* pDim = NULL;
      53             :     // Brackets?
      54        2214 :     if( Peek() == LPAREN )
      55             :     {
      56          90 :         pDim = new SbiDimList( this );
      57          90 :         if( !pDim->GetDims() )
      58          38 :             pDef->SetWithBrackets();
      59             :     }
      60        2214 :     pDef->SetType( t );
      61        2214 :     if( bStatic )
      62           0 :         pDef->SetStatic();
      63        2214 :     if( bWithEvents )
      64           0 :         pDef->SetWithEvents();
      65        2214 :     TypeDecl( *pDef );
      66        2214 :     if( !ppDim && pDim )
      67             :     {
      68           0 :         if(pDim->GetDims() )
      69           0 :             Error( SbERR_EXPECTED, "()" );
      70           0 :         delete pDim;
      71             :     }
      72        2214 :     else if( ppDim )
      73        1774 :         *ppDim = pDim;
      74        2214 :     return pDef;
      75             : }
      76             : 
      77             : // Resolving of a AS-Type-Declaration
      78             : // The data type were inserted into the handed over variable
      79             : 
      80        3032 : void SbiParser::TypeDecl( SbiSymDef& rDef, bool bAsNewAlreadyParsed )
      81             : {
      82        3032 :     SbxDataType eType = rDef.GetType();
      83        3032 :     if( bAsNewAlreadyParsed || Peek() == AS )
      84             :     {
      85        2046 :         short nSize = 0;
      86        2046 :         if( !bAsNewAlreadyParsed )
      87        2046 :             Next();
      88        2046 :         rDef.SetDefinedAs();
      89        2046 :         SbiToken eTok = Next();
      90        2046 :         if( !bAsNewAlreadyParsed && eTok == NEW )
      91             :         {
      92          56 :             rDef.SetNew();
      93          56 :             eTok = Next();
      94             :         }
      95        2046 :         switch( eTok )
      96             :         {
      97             :             case ANY:
      98           0 :                 if( rDef.IsNew() )
      99           0 :                     Error( SbERR_SYNTAX );
     100           0 :                 eType = SbxVARIANT; break;
     101             :             case TINTEGER:
     102             :             case TLONG:
     103             :             case TSINGLE:
     104             :             case TDOUBLE:
     105             :             case TCURRENCY:
     106             :             case TDATE:
     107             :             case TSTRING:
     108             :             case TOBJECT:
     109             :             case _ERROR_:
     110             :             case TBOOLEAN:
     111             :             case TVARIANT:
     112             :             case TBYTE:
     113        1768 :                 if( rDef.IsNew() )
     114           0 :                     Error( SbERR_SYNTAX );
     115        1768 :                 eType = (eTok==TBYTE) ? SbxBYTE : SbxDataType( eTok - TINTEGER + SbxINTEGER );
     116        1768 :                 if( eType == SbxSTRING )
     117             :                 {
     118             :                     // STRING*n ?
     119         914 :                     if( Peek() == MUL )
     120             :                     {       // fixed size!
     121           0 :                         Next();
     122           0 :                         SbiConstExpression aSize( this );
     123           0 :                         nSize = aSize.GetShortValue();
     124           0 :                         if( nSize < 0 || (bVBASupportOn && nSize <= 0) )
     125           0 :                             Error( SbERR_OUT_OF_RANGE );
     126             :                         else
     127           0 :                             rDef.SetFixedStringLength( nSize );
     128             :                     }
     129             :                 }
     130        1768 :                 break;
     131             :             case SYMBOL: // can only be a TYPE or a object class!
     132         250 :                 if( eScanType != SbxVARIANT )
     133           0 :                     Error( SbERR_SYNTAX );
     134             :                 else
     135             :                 {
     136         250 :                     OUString aCompleteName = aSym;
     137             : 
     138             :                     // #52709 DIM AS NEW for Uno with full-qualified name
     139         250 :                     if( Peek() == DOT )
     140             :                     {
     141          30 :                         OUString aDotStr( '.' );
     142          30 :                         while( Peek() == DOT )
     143             :                         {
     144         114 :                             aCompleteName += aDotStr;
     145         114 :                             Next();
     146         114 :                             SbiToken ePeekTok = Peek();
     147         114 :                             if( ePeekTok == SYMBOL || IsKwd( ePeekTok ) )
     148             :                             {
     149         114 :                                 Next();
     150         114 :                                 aCompleteName += aSym;
     151             :                             }
     152             :                             else
     153             :                             {
     154           0 :                                 Next();
     155           0 :                                 Error( SbERR_UNEXPECTED, SYMBOL );
     156           0 :                                 break;
     157             :                             }
     158          30 :                         }
     159             :                     }
     160         220 :                     else if( rEnumArray->Find( aCompleteName, SbxCLASS_OBJECT ) || ( IsVBASupportOn() && VBAConstantHelper::instance().isVBAConstantType( aCompleteName ) ) )
     161             :                     {
     162           0 :                         eType = SbxLONG;
     163           0 :                         break;
     164             :                     }
     165             : 
     166             :                     // Take over in the string pool
     167         250 :                     rDef.SetTypeId( aGblStrings.Add( aCompleteName ) );
     168             : 
     169         250 :                     if( rDef.IsNew() && pProc == NULL )
     170           0 :                         aRequiredTypes.push_back( aCompleteName );
     171             :                 }
     172         250 :                 eType = SbxOBJECT;
     173         250 :                 break;
     174             :             case FIXSTRING: // new syntax for complex UNO types
     175          28 :                 rDef.SetTypeId( aGblStrings.Add( aSym ) );
     176          28 :                 eType = SbxOBJECT;
     177          28 :                 break;
     178             :             default:
     179           0 :                 Error( SbERR_UNEXPECTED, eTok );
     180           0 :                 Next();
     181             :         }
     182             :         // The variable could have been declared with a suffix
     183        2046 :         if( rDef.GetType() != SbxVARIANT )
     184             :         {
     185         278 :             if( rDef.GetType() != eType )
     186           0 :                 Error( SbERR_VAR_DEFINED, rDef.GetName() );
     187         278 :             else if( eType == SbxSTRING && rDef.GetLen() != nSize )
     188           0 :                 Error( SbERR_VAR_DEFINED, rDef.GetName() );
     189             :         }
     190        2046 :         rDef.SetType( eType );
     191        2046 :         rDef.SetLen( nSize );
     192             :     }
     193        3032 : }
     194             : 
     195             : // Here variables, arrays and structures were definied.
     196             : // DIM/PRIVATE/PUBLIC/GLOBAL
     197             : 
     198        1644 : void SbiParser::Dim()
     199             : {
     200        1644 :     DefVar( _DIM, pProc && bVBASupportOn && pProc->IsStatic() );
     201        1644 : }
     202             : 
     203        1646 : void SbiParser::DefVar( SbiOpcode eOp, bool bStatic )
     204             : {
     205        1646 :     SbiSymPool* pOldPool = pPool;
     206        1646 :     bool bSwitchPool = false;
     207        1646 :     bool bPersistantGlobal = false;
     208        1646 :     SbiToken eFirstTok = eCurTok;
     209             : 
     210        1646 :     if( pProc && ( eCurTok == GLOBAL || eCurTok == PUBLIC || eCurTok == PRIVATE ) )
     211           0 :         Error( SbERR_NOT_IN_SUBR, eCurTok );
     212        1646 :     if( eCurTok == PUBLIC || eCurTok == GLOBAL )
     213             :     {
     214         168 :         bSwitchPool = true;     // at the right moment switch to the global pool
     215         168 :         if( eCurTok == GLOBAL )
     216         124 :             bPersistantGlobal = true;
     217             :     }
     218             :     // behavior in VBA is that a module scope variable's lifetime is
     219             :     // tied to the document. e.g. a module scope variable is global
     220        1646 :        if(  GetBasic()->IsDocBasic() && bVBASupportOn && !pProc )
     221         290 :         bPersistantGlobal = true;
     222             :     // PRIVATE is a synonymous for DIM
     223             :     // _CONST_?
     224        1646 :     bool bConst = false;
     225        1646 :     if( eCurTok == _CONST_ )
     226          58 :         bConst = true;
     227        1588 :     else if( Peek() == _CONST_ )
     228          86 :         Next(), bConst = true;
     229             : 
     230             :     // #110004 It can also be a sub/function
     231        3092 :     if( !bConst && (eCurTok == SUB || eCurTok == FUNCTION || eCurTok == PROPERTY ||
     232        2892 :                     eCurTok == STATIC || eCurTok == ENUM || eCurTok == DECLARE || eCurTok == TYPE) )
     233             :     {
     234             :         // Next token is read here, because !bConst
     235          66 :         bool bPrivate = ( eFirstTok == PRIVATE );
     236             : 
     237          66 :         if( eCurTok == STATIC )
     238             :         {
     239           0 :             Next();
     240           0 :             DefStatic( bPrivate );
     241             :         }
     242          66 :         else if( eCurTok == SUB || eCurTok == FUNCTION || eCurTok == PROPERTY )
     243             :         {
     244             :             // End global chain if necessary (not done in
     245             :             // SbiParser::Parse() under these conditions
     246          56 :             if( bNewGblDefs && nGblChain == 0 )
     247             :             {
     248           0 :                 nGblChain = aGen.Gen( _JUMP, 0 );
     249           0 :                 bNewGblDefs = false;
     250             :             }
     251          56 :             Next();
     252          56 :             DefProc( false, bPrivate );
     253         122 :             return;
     254             :         }
     255          10 :         else if( eCurTok == ENUM )
     256             :         {
     257           0 :             Next();
     258           0 :             DefEnum( bPrivate );
     259           0 :             return;
     260             :         }
     261          10 :         else if( eCurTok == DECLARE )
     262             :         {
     263           8 :             Next();
     264           8 :             DefDeclare( bPrivate );
     265           8 :             return;
     266             :         }
     267             :         // #i109049
     268           2 :         else if( eCurTok == TYPE )
     269             :         {
     270           2 :             Next();
     271           2 :             DefType( bPrivate );
     272           2 :             return;
     273             :         }
     274             :     }
     275             : 
     276             : #ifdef SHARED
     277             : #define tmpSHARED
     278             : #undef SHARED
     279             : #endif
     280             :     // SHARED were ignored
     281        1580 :     if( Peek() == SHARED ) Next();
     282             : #ifdef tmpSHARED
     283             : #define SHARED
     284             : #undef tmpSHARED
     285             : #endif
     286             :     // PRESERVE only at REDIM
     287        1580 :     if( Peek() == PRESERVE )
     288             :     {
     289           0 :         Next();
     290           0 :         if( eOp == _REDIM )
     291           0 :             eOp = _REDIMP;
     292             :         else
     293           0 :             Error( SbERR_UNEXPECTED, eCurTok );
     294             :     }
     295             :     SbiSymDef* pDef;
     296             :     SbiDimList* pDim;
     297             : 
     298             :     // #40689, Statics -> Modul-Initialising, skip in Sub
     299        1580 :     sal_uInt32 nEndOfStaticLbl = 0;
     300        1580 :     if( !bVBASupportOn && bStatic )
     301             :     {
     302           0 :         nEndOfStaticLbl = aGen.Gen( _JUMP, 0 );
     303           0 :         aGen.Statement();   // catch up on static here
     304             :     }
     305             : 
     306        1580 :     bool bDefined = false;
     307        3350 :     while( ( pDef = VarDecl( &pDim, bStatic, bConst ) ) != NULL )
     308             :     {
     309             :         /*fprintf(stderr, "Actual sub: \n");
     310             :         fprintf(stderr, "Symbol name: %s\n",OUStringToOString(pDef->GetName(),RTL_TEXTENCODING_UTF8).getStr());*/
     311        1770 :         EnableErrors();
     312             :         // search variable:
     313        1770 :         if( bSwitchPool )
     314         272 :             pPool = &aGlobals;
     315        1770 :         SbiSymDef* pOld = pPool->Find( pDef->GetName() );
     316             :         // search also in the Runtime-Library
     317        1770 :         bool bRtlSym = false;
     318        1770 :         if( !pOld )
     319             :         {
     320        1760 :             pOld = CheckRTLForSym( pDef->GetName(), SbxVARIANT );
     321        1760 :             if( pOld )
     322           2 :                 bRtlSym = true;
     323             :         }
     324        1770 :         if( pOld && !(eOp == _REDIM || eOp == _REDIMP) )
     325             :         {
     326          10 :             if( pDef->GetScope() == SbLOCAL && pOld->GetScope() != SbLOCAL )
     327          10 :                 pOld = NULL;
     328             :         }
     329        1770 :         if( pOld )
     330             :         {
     331           2 :             bDefined = true;
     332             :             // always an error at a RTL-S
     333           2 :             if( !bRtlSym && (eOp == _REDIM || eOp == _REDIMP) )
     334             :             {
     335             :                 // compare the attributes at a REDIM
     336             :                 SbxDataType eDefType;
     337           2 :                 bool bError_ = false;
     338           2 :                 if( pOld->IsStatic() )
     339             :                 {
     340           0 :                     bError_ = true;
     341             :                 }
     342           2 :                 else if( pOld->GetType() != ( eDefType = pDef->GetType() ) )
     343             :                 {
     344           0 :                     if( !( eDefType == SbxVARIANT && !pDef->IsDefinedAs() ) )
     345           0 :                         bError_ = true;
     346             :                 }
     347           2 :                 if( bError_ )
     348           0 :                     Error( SbERR_VAR_DEFINED, pDef->GetName() );
     349             :             }
     350             :             else
     351           0 :                 Error( SbERR_VAR_DEFINED, pDef->GetName() );
     352           2 :             delete pDef; pDef = pOld;
     353             :         }
     354             :         else
     355        1768 :             pPool->Add( pDef );
     356             : 
     357             :         // #36374: Create the variable in front of the distinction IsNew()
     358             :         // Otherwise error at Dim Identifier As New Type and option explicit
     359        5308 :         if( !bDefined && !(eOp == _REDIM || eOp == _REDIMP)
     360        3538 :                       && ( !bConst || pDef->GetScope() == SbGLOBAL ) )
     361             :         {
     362             :             // Declare variable or global constant
     363             :             SbiOpcode eOp2;
     364        1698 :             switch ( pDef->GetScope() )
     365             :             {
     366         272 :                 case SbGLOBAL:  eOp2 = bPersistantGlobal ? _GLOBAL_P : _GLOBAL;
     367         272 :                                 goto global;
     368         260 :                 case SbPUBLIC:  eOp2 = bPersistantGlobal ? _PUBLIC_P : _PUBLIC;
     369             :                                 // #40689, no own Opcode anymore
     370         260 :                                 if( bVBASupportOn && bStatic )
     371             :                                 {
     372           0 :                                     eOp2 = _STATIC;
     373           0 :                                     break;
     374             :                                 }
     375         532 :                 global:         aGen.BackChain( nGblChain );
     376         532 :                                 nGblChain = 0;
     377         532 :                                 bGblDefs = bNewGblDefs = true;
     378         532 :                                 break;
     379        1166 :                 default:        eOp2 = _LOCAL;
     380             :             }
     381        1698 :             sal_uInt32 nOpnd2 = sal::static_int_cast< sal_uInt16 >( pDef->GetType() );
     382        1698 :             if( pDef->IsWithEvents() )
     383           0 :                 nOpnd2 |= SBX_TYPE_WITH_EVENTS_FLAG;
     384             : 
     385        1698 :             if( bCompatible && pDef->IsNew() )
     386           2 :                 nOpnd2 |= SBX_TYPE_DIM_AS_NEW_FLAG;
     387             : 
     388        1698 :             short nFixedStringLength = pDef->GetFixedStringLength();
     389        1698 :             if( nFixedStringLength >= 0 )
     390           0 :                 nOpnd2 |= (SBX_FIXED_LEN_STRING_FLAG + (sal_uInt32(nFixedStringLength) << 17));     // len = all bits above 0x10000
     391             : 
     392        1698 :             if( pDim != NULL && pDim->GetDims() > 0 )
     393          50 :                 nOpnd2 |= SBX_TYPE_VAR_TO_DIM_FLAG;
     394             : 
     395        1698 :             aGen.Gen( eOp2, pDef->GetId(), nOpnd2 );
     396             :         }
     397             : 
     398             :         // Initialising for self-defined daty types
     399             :         // and per NEW created variable
     400        3540 :         if( pDef->GetType() == SbxOBJECT
     401        1770 :          && pDef->GetTypeId() )
     402             :         {
     403         262 :             if( !bCompatible && !pDef->IsNew() )
     404             :             {
     405           0 :                 OUString aTypeName( aGblStrings.Find( pDef->GetTypeId() ) );
     406           0 :                 if( rTypeArray->Find( aTypeName, SbxCLASS_OBJECT ) == NULL )
     407             :                 {
     408           0 :                     if( CodeCompleteOptions::IsExtendedTypeDeclaration() )
     409             :                     {
     410           0 :                         if(!IsUnoInterface(aTypeName))
     411           0 :                             Error( SbERR_UNDEF_TYPE, aTypeName );
     412             :                     }
     413             :                     else
     414           0 :                         Error( SbERR_UNDEF_TYPE, aTypeName );
     415           0 :                 }
     416             :             }
     417             : 
     418         262 :             if( bConst )
     419             :             {
     420           0 :                 Error( SbERR_SYNTAX );
     421             :             }
     422             : 
     423         262 :             if( pDim )
     424             :             {
     425           8 :                 if( eOp == _REDIMP )
     426             :                 {
     427           0 :                     SbiExpression aExpr( this, *pDef, NULL );
     428           0 :                     aExpr.Gen();
     429           0 :                     aGen.Gen( _REDIMP_ERASE );
     430             : 
     431           0 :                     pDef->SetDims( pDim->GetDims() );
     432           0 :                     SbiExpression aExpr2( this, *pDef, pDim );
     433           0 :                     aExpr2.Gen();
     434           0 :                     aGen.Gen( _DCREATE_REDIMP, pDef->GetId(), pDef->GetTypeId() );
     435             :                 }
     436             :                 else
     437             :                 {
     438           8 :                     pDef->SetDims( pDim->GetDims() );
     439           8 :                     SbiExpression aExpr( this, *pDef, pDim );
     440           8 :                     aExpr.Gen();
     441           8 :                     aGen.Gen( _DCREATE, pDef->GetId(), pDef->GetTypeId() );
     442             :                 }
     443             :             }
     444             :             else
     445             :             {
     446         254 :                 SbiExpression aExpr( this, *pDef );
     447         254 :                 aExpr.Gen();
     448         254 :                 SbiOpcode eOp_ = pDef->IsNew() ? _CREATE : _TCREATE;
     449         254 :                 aGen.Gen( eOp_, pDef->GetId(), pDef->GetTypeId() );
     450         254 :                 if ( bVBASupportOn )
     451         208 :                     aGen.Gen( _VBASET );
     452             :                 else
     453          46 :                     aGen.Gen( _SET );
     454             :             }
     455             :         }
     456             :         else
     457             :         {
     458        1508 :             if( bConst )
     459             :             {
     460             :                 // Definition of the constants
     461         244 :                 if( pDim )
     462             :                 {
     463           0 :                     Error( SbERR_SYNTAX );
     464           0 :                     delete pDim;
     465             :                 }
     466         244 :                 SbiExpression aVar( this, *pDef );
     467         244 :                 if( !TestToken( EQ ) )
     468           0 :                     goto MyBreak;   // (see below)
     469         488 :                 SbiConstExpression aExpr( this );
     470         244 :                 if( !bDefined && aExpr.IsValid() )
     471             :                 {
     472         244 :                     if( pDef->GetScope() == SbGLOBAL )
     473             :                     {
     474             :                         // Create code only for the global constant!
     475         174 :                         aVar.Gen();
     476         174 :                         aExpr.Gen();
     477         174 :                         aGen.Gen( _PUTC );
     478             :                     }
     479         244 :                     SbiConstDef* pConst = pDef->GetConstDef();
     480         244 :                     if( aExpr.GetType() == SbxSTRING )
     481         124 :                         pConst->Set( aExpr.GetString() );
     482             :                     else
     483         120 :                         pConst->Set( aExpr.GetValue(), aExpr.GetType() );
     484         244 :                 }
     485             :             }
     486        1264 :             else if( pDim )
     487             :             {
     488             :                 // Dimension the variable
     489             :                 // Delete the var at REDIM beforehand
     490          82 :                 if( eOp == _REDIM )
     491             :                 {
     492           2 :                     SbiExpression aExpr( this, *pDef, NULL );
     493           2 :                     aExpr.Gen();
     494           2 :                     if ( bVBASupportOn )
     495             :                         // delete the array but
     496             :                         // clear the variable ( this
     497             :                         // allows the processing of
     498             :                         // the param to happen as normal without errors ( ordinary ERASE just clears the array )
     499           2 :                         aGen.Gen( _ERASE_CLEAR );
     500             :                     else
     501           0 :                         aGen.Gen( _ERASE );
     502             :                 }
     503          80 :                 else if( eOp == _REDIMP )
     504             :                 {
     505           0 :                     SbiExpression aExpr( this, *pDef, NULL );
     506           0 :                     aExpr.Gen();
     507           0 :                     aGen.Gen( _REDIMP_ERASE );
     508             :                 }
     509          82 :                 pDef->SetDims( pDim->GetDims() );
     510          82 :                 if( bPersistantGlobal )
     511           4 :                     pDef->SetGlobal( true );
     512          82 :                 SbiExpression aExpr( this, *pDef, pDim );
     513          82 :                 aExpr.Gen();
     514          82 :                 pDef->SetGlobal( false );
     515          82 :                 aGen.Gen( (eOp == _STATIC) ? _DIM : eOp );
     516             :             }
     517             :         }
     518        1770 :         if( !TestComma() )
     519        1580 :             goto MyBreak;
     520             : 
     521             :         // Implementation of bSwitchPool (see above): pPool must not be set to &aGlobals
     522             :         // at the VarDecl-Call.
     523             :         // Apart from that the behavior should be absolutely identical,
     524             :         // i.e., pPool had to be reset always at the end of the loop.
     525             :         // also at a break
     526         190 :         pPool = pOldPool;
     527         190 :         continue;       // Skip MyBreak
     528             :     MyBreak:
     529        1580 :         pPool = pOldPool;
     530        1580 :         break;
     531             :     }
     532             : 
     533             :     // #40689, finalize the jump over statics declarations
     534        1580 :     if( !bVBASupportOn && bStatic )
     535             :     {
     536             :         // maintain the global chain
     537           0 :         nGblChain = aGen.Gen( _JUMP, 0 );
     538           0 :         bGblDefs = bNewGblDefs = true;
     539             : 
     540             :         // Register for Sub a jump to the end of statics
     541           0 :         aGen.BackChain( nEndOfStaticLbl );
     542             :     }
     543             : 
     544             : }
     545             : 
     546             : // Here were Arrays redimensioned.
     547             : 
     548           2 : void SbiParser::ReDim()
     549             : {
     550           2 :     DefVar( _REDIM, pProc && bVBASupportOn && pProc->IsStatic() );
     551           2 : }
     552             : 
     553             : // ERASE array, ...
     554             : 
     555           0 : void SbiParser::Erase()
     556             : {
     557           0 :     while( !bAbort )
     558             :     {
     559           0 :         SbiExpression aExpr( this, SbLVALUE );
     560           0 :         aExpr.Gen();
     561           0 :         aGen.Gen( _ERASE );
     562           0 :         if( !TestComma() ) break;
     563           0 :     }
     564           0 : }
     565             : 
     566             : // Declaration of a data type
     567             : 
     568           0 : void SbiParser::Type()
     569             : {
     570           0 :     DefType( false );
     571           0 : }
     572             : 
     573           2 : void SbiParser::DefType( bool bPrivate )
     574             : {
     575             :     // TODO: Use bPrivate
     576             :     (void)bPrivate;
     577             : 
     578             :     // Read the new Token lesen. It had to be a symbol
     579           2 :     if (!TestSymbol())
     580           0 :         return;
     581             : 
     582           2 :     if (rTypeArray->Find(aSym,SbxCLASS_OBJECT))
     583             :     {
     584           0 :         Error( SbERR_VAR_DEFINED, aSym );
     585           0 :         return;
     586             :     }
     587             : 
     588           2 :     SbxObject *pType = new SbxObject(aSym);
     589             : 
     590           2 :     boost::scoped_ptr<SbiSymDef> pElem;
     591           2 :     SbiDimList* pDim = NULL;
     592           2 :     bool bDone = false;
     593             : 
     594          16 :     while( !bDone && !IsEof() )
     595             :     {
     596          12 :         switch( Peek() )
     597             :         {
     598             :             case ENDTYPE :
     599           2 :                 bDone = true;
     600           2 :                 Next();
     601           2 :             break;
     602             : 
     603             :             case EOLN :
     604             :             case REM :
     605           6 :                 Next();
     606           6 :             break;
     607             : 
     608             :             default:
     609           4 :                 pElem.reset(VarDecl(&pDim, false, false));
     610           4 :                 if( !pElem )
     611           0 :                     bDone = true;   // Error occurred
     612             :         }
     613          12 :         if( pElem )
     614             :         {
     615           4 :             SbxArray *pTypeMembers = pType->GetProperties();
     616           4 :             OUString aElemName = pElem->GetName();
     617           4 :             if( pTypeMembers->Find( aElemName, SbxCLASS_DONTCARE) )
     618             :             {
     619           0 :                 Error (SbERR_VAR_DEFINED);
     620             :             }
     621             :             else
     622             :             {
     623           4 :                 SbxDataType eElemType = pElem->GetType();
     624           4 :                 SbxProperty *pTypeElem = new SbxProperty( aElemName, eElemType );
     625           4 :                 if( pDim )
     626             :                 {
     627           0 :                     SbxDimArray* pArray = new SbxDimArray( pElem->GetType() );
     628           0 :                     if ( pDim->GetSize() )
     629             :                     {
     630             :                         // Dimension the target array
     631             : 
     632           0 :                         for ( short i=0; i<pDim->GetSize();++i )
     633             :                         {
     634           0 :                             sal_Int32 lb = nBase;
     635           0 :                             SbiExprNode* pNode =  pDim->Get(i)->GetExprNode();
     636           0 :                             sal_Int32 ub = pNode->GetNumber();
     637           0 :                             if ( !pDim->Get( i )->IsBased() ) // each dim is low/up
     638             :                             {
     639           0 :                                 if (  ++i >= pDim->GetSize() ) // trouble
     640           0 :                                     StarBASIC::FatalError( SbERR_INTERNAL_ERROR );
     641           0 :                                 pNode =  pDim->Get(i)->GetExprNode();
     642           0 :                                 lb = ub;
     643           0 :                                 ub = pNode->GetNumber();
     644             :                             }
     645           0 :                             else if ( !bCompatible )
     646           0 :                                 ub += nBase;
     647           0 :                             pArray->AddDim32( lb, ub );
     648             :                         }
     649           0 :                         pArray->setHasFixedSize( true );
     650             :                     }
     651             :                     else
     652           0 :                         pArray->unoAddDim( 0, -1 ); // variant array
     653           0 :                     SbxFlagBits nSavFlags = pTypeElem->GetFlags();
     654             :                     // need to reset the FIXED flag
     655             :                     // when calling PutObject ( because the type will not match Object )
     656           0 :                     pTypeElem->ResetFlag( SBX_FIXED );
     657           0 :                     pTypeElem->PutObject( pArray );
     658           0 :                     pTypeElem->SetFlags( nSavFlags );
     659             :                 }
     660             :                 // Nested user type?
     661           4 :                 if( eElemType == SbxOBJECT )
     662             :                 {
     663           0 :                     sal_uInt16 nElemTypeId = pElem->GetTypeId();
     664           0 :                     if( nElemTypeId != 0 )
     665             :                     {
     666           0 :                         OUString aTypeName( aGblStrings.Find( nElemTypeId ) );
     667           0 :                         SbxObject* pTypeObj = static_cast< SbxObject* >( rTypeArray->Find( aTypeName, SbxCLASS_OBJECT ) );
     668           0 :                         if( pTypeObj != NULL )
     669             :                         {
     670           0 :                             SbxObject* pCloneObj = cloneTypeObjectImpl( *pTypeObj );
     671           0 :                             pTypeElem->PutObject( pCloneObj );
     672           0 :                         }
     673             :                     }
     674             :                 }
     675           4 :                 pTypeMembers->Insert( pTypeElem, pTypeMembers->Count() );
     676             :             }
     677           4 :             delete pDim, pDim = NULL;
     678           4 :             pElem.reset();
     679             :         }
     680             :     }
     681             : 
     682           2 :     pType->Remove( OUString("Name"), SbxCLASS_DONTCARE );
     683           2 :     pType->Remove( OUString("Parent"), SbxCLASS_DONTCARE );
     684             : 
     685           2 :     rTypeArray->Insert (pType,rTypeArray->Count());
     686             : }
     687             : 
     688             : 
     689             : // Declaration of Enum type
     690             : 
     691           0 : void SbiParser::Enum()
     692             : {
     693           0 :     DefEnum( false );
     694           0 : }
     695             : 
     696           0 : void SbiParser::DefEnum( bool bPrivate )
     697             : {
     698             :     // Read a the new Token. It had to be a symbol
     699           0 :     if (!TestSymbol())
     700           0 :         return;
     701             : 
     702           0 :     OUString aEnumName = aSym;
     703           0 :     if( rEnumArray->Find(aEnumName,SbxCLASS_OBJECT) )
     704             :     {
     705           0 :         Error( SbERR_VAR_DEFINED, aSym );
     706           0 :         return;
     707             :     }
     708             : 
     709           0 :     SbxObject *pEnum = new SbxObject( aEnumName );
     710           0 :     if( bPrivate )
     711             :     {
     712           0 :         pEnum->SetFlag( SBX_PRIVATE );
     713             :     }
     714             :     SbiSymDef* pElem;
     715             :     SbiDimList* pDim;
     716           0 :     bool bDone = false;
     717             : 
     718             :     // Starting with -1 to make first default value 0 after ++
     719           0 :     sal_Int32 nCurrentEnumValue = -1;
     720           0 :     while( !bDone && !IsEof() )
     721             :     {
     722           0 :         switch( Peek() )
     723             :         {
     724             :             case ENDENUM :
     725           0 :                 pElem = NULL;
     726           0 :                 bDone = true;
     727           0 :                 Next();
     728           0 :             break;
     729             : 
     730             :             case EOLN :
     731             :             case REM :
     732           0 :                 pElem = NULL;
     733           0 :                 Next();
     734           0 :             break;
     735             : 
     736             :             default:
     737             :             {
     738             :                 // TODO: Check existing!
     739           0 :                 bool bDefined = false;
     740             : 
     741           0 :                 pDim = NULL;
     742           0 :                 pElem = VarDecl( &pDim, false, true );
     743           0 :                 if( !pElem )
     744             :                 {
     745           0 :                     bDone = true;   // Error occurred
     746           0 :                     break;
     747             :                 }
     748           0 :                 else if( pDim )
     749             :                 {
     750           0 :                     delete pDim;
     751           0 :                     Error( SbERR_SYNTAX );
     752           0 :                     bDone = true;   // Error occurred
     753           0 :                     break;
     754             :                 }
     755             : 
     756           0 :                 SbiExpression aVar( this, *pElem );
     757           0 :                 if( Peek() == EQ )
     758             :                 {
     759           0 :                     Next();
     760             : 
     761           0 :                     SbiConstExpression aExpr( this );
     762           0 :                     if( !bDefined && aExpr.IsValid() )
     763             :                     {
     764           0 :                         SbxVariableRef xConvertVar = new SbxVariable();
     765           0 :                         if( aExpr.GetType() == SbxSTRING )
     766           0 :                             xConvertVar->PutString( aExpr.GetString() );
     767             :                         else
     768           0 :                             xConvertVar->PutDouble( aExpr.GetValue() );
     769             : 
     770           0 :                         nCurrentEnumValue = xConvertVar->GetLong();
     771           0 :                     }
     772             :                 }
     773             :                 else
     774           0 :                     nCurrentEnumValue++;
     775             : 
     776           0 :                 SbiSymPool* pPoolToUse = bPrivate ? pPool : &aGlobals;
     777             : 
     778           0 :                 SbiSymDef* pOld = pPoolToUse->Find( pElem->GetName() );
     779           0 :                 if( pOld )
     780             :                 {
     781           0 :                     Error( SbERR_VAR_DEFINED, pElem->GetName() );
     782           0 :                     bDone = true;   // Error occurred
     783           0 :                     break;
     784             :                 }
     785             : 
     786           0 :                 pPool->Add( pElem );
     787             : 
     788           0 :                 if( !bPrivate )
     789             :                 {
     790           0 :                     SbiOpcode eOp = _GLOBAL;
     791           0 :                     aGen.BackChain( nGblChain );
     792           0 :                     nGblChain = 0;
     793           0 :                     bGblDefs = bNewGblDefs = true;
     794             :                     aGen.Gen(
     795           0 :                         eOp, pElem->GetId(),
     796           0 :                         sal::static_int_cast< sal_uInt16 >( pElem->GetType() ) );
     797             : 
     798           0 :                     aVar.Gen();
     799           0 :                     sal_uInt16 nStringId = aGen.GetParser()->aGblStrings.Add( nCurrentEnumValue, SbxLONG );
     800           0 :                     aGen.Gen( _NUMBER, nStringId );
     801           0 :                     aGen.Gen( _PUTC );
     802             :                 }
     803             : 
     804           0 :                 SbiConstDef* pConst = pElem->GetConstDef();
     805           0 :                 pConst->Set( nCurrentEnumValue, SbxLONG );
     806             :             }
     807             :         }
     808           0 :         if( pElem )
     809             :         {
     810           0 :             SbxArray *pEnumMembers = pEnum->GetProperties();
     811           0 :             SbxProperty *pEnumElem = new SbxProperty( pElem->GetName(), SbxLONG );
     812           0 :             pEnumElem->PutLong( nCurrentEnumValue );
     813           0 :             pEnumElem->ResetFlag( SBX_WRITE );
     814           0 :             pEnumElem->SetFlag( SBX_CONST );
     815           0 :             pEnumMembers->Insert( pEnumElem, pEnumMembers->Count() );
     816             :         }
     817             :     }
     818             : 
     819           0 :     pEnum->Remove( OUString("Name"), SbxCLASS_DONTCARE );
     820           0 :     pEnum->Remove( OUString("Parent"), SbxCLASS_DONTCARE );
     821             : 
     822           0 :     rEnumArray->Insert( pEnum, rEnumArray->Count() );
     823             : }
     824             : 
     825             : 
     826             : // Procedure-Declaration
     827             : // the first Token is already read in (SUB/FUNCTION)
     828             : // xxx Name [LIB "name"[ALIAS "name"]][(Parameter)][AS TYPE]
     829             : 
     830         818 : SbiProcDef* SbiParser::ProcDecl( bool bDecl )
     831             : {
     832         818 :     bool bFunc = ( eCurTok == FUNCTION );
     833         818 :     bool bProp = ( eCurTok == GET || eCurTok == SET || eCurTok == LET );
     834         818 :     if( !TestSymbol() ) return NULL;
     835         818 :     OUString aName( aSym );
     836         818 :     SbxDataType eType = eScanType;
     837         818 :     SbiProcDef* pDef = new SbiProcDef( this, aName, true );
     838         818 :     pDef->SetType( eType );
     839         818 :     if( Peek() == _CDECL_ )
     840             :     {
     841           0 :         Next(); pDef->SetCdecl();
     842             :     }
     843         818 :     if( Peek() == LIB )
     844             :     {
     845           8 :         Next();
     846           8 :         if( Next() == FIXSTRING )
     847             :         {
     848           8 :             pDef->GetLib() = aSym;
     849             :         }
     850             :         else
     851             :         {
     852           0 :             Error( SbERR_SYNTAX );
     853             :         }
     854             :     }
     855         818 :     if( Peek() == ALIAS )
     856             :     {
     857           0 :         Next();
     858           0 :         if( Next() == FIXSTRING )
     859             :         {
     860           0 :             pDef->GetAlias() = aSym;
     861             :         }
     862             :         else
     863             :         {
     864           0 :             Error( SbERR_SYNTAX );
     865             :         }
     866             :     }
     867         818 :     if( !bDecl )
     868             :     {
     869             :         // CDECL, LIB and ALIAS are invalid
     870         810 :         if( !pDef->GetLib().isEmpty() )
     871             :         {
     872           0 :             Error( SbERR_UNEXPECTED, LIB );
     873             :         }
     874         810 :         if( !pDef->GetAlias().isEmpty() )
     875             :         {
     876           0 :             Error( SbERR_UNEXPECTED, ALIAS );
     877             :         }
     878         810 :         if( pDef->IsCdecl() )
     879             :         {
     880           0 :             Error( SbERR_UNEXPECTED, _CDECL_ );
     881             :         }
     882         810 :         pDef->SetCdecl( false );
     883         810 :         pDef->GetLib() = "";
     884         810 :         pDef->GetAlias() = "";
     885             :     }
     886           8 :     else if( pDef->GetLib().isEmpty() )
     887             :     {
     888             :         // ALIAS and CDECL only together with LIB
     889           0 :         if( !pDef->GetAlias().isEmpty() )
     890             :         {
     891           0 :             Error( SbERR_UNEXPECTED, ALIAS );
     892             :         }
     893           0 :         if( pDef->IsCdecl() )
     894             :         {
     895           0 :             Error( SbERR_UNEXPECTED, _CDECL_ );
     896             :         }
     897           0 :         pDef->SetCdecl( false );
     898           0 :         pDef->GetAlias() = "";
     899             :     }
     900             :     // Brackets?
     901         818 :     if( Peek() == LPAREN )
     902             :     {
     903         714 :         Next();
     904         714 :         if( Peek() == RPAREN )
     905             :         {
     906         516 :             Next();
     907             :         }
     908             :         else
     909             :         {
     910             :             for(;;)
     911             :             {
     912         440 :                 bool bByVal = false;
     913         440 :                 bool bOptional = false;
     914         440 :                 bool bParamArray = false;
     915         984 :                 while( Peek() == BYVAL || Peek() == BYREF || Peek() == _OPTIONAL_ )
     916             :                 {
     917         104 :                     if( Peek() == BYVAL )
     918             :                     {
     919           8 :                         bByVal = true;
     920             :                     }
     921          96 :                     else if ( Peek() == BYREF )
     922             :                     {
     923           4 :                         bByVal = false;
     924             :                     }
     925          92 :                     else if ( Peek() == _OPTIONAL_ )
     926             :                     {
     927          92 :                         bOptional = true;
     928             :                     }
     929         104 :                     Next();
     930             :                 }
     931         440 :                 if( bCompatible && Peek() == PARAMARRAY )
     932             :                 {
     933           0 :                     if( bByVal || bOptional )
     934             :                     {
     935           0 :                         Error( SbERR_UNEXPECTED, PARAMARRAY );
     936             :                     }
     937           0 :                     Next();
     938           0 :                     bParamArray = true;
     939             :                 }
     940         440 :                 SbiSymDef* pPar = VarDecl( NULL, false, false );
     941         440 :                 if( !pPar )
     942             :                 {
     943           0 :                     break;
     944             :                 }
     945         440 :                 if( bByVal )
     946             :                 {
     947           8 :                     pPar->SetByVal();
     948             :                 }
     949         440 :                 if( bOptional )
     950             :                 {
     951          92 :                     pPar->SetOptional();
     952             :                 }
     953         440 :                 if( bParamArray )
     954             :                 {
     955           0 :                     pPar->SetParamArray();
     956             :                 }
     957         440 :                 pDef->GetParams().Add( pPar );
     958         440 :                 SbiToken eTok = Next();
     959         440 :                 if( eTok != COMMA && eTok != RPAREN )
     960             :                 {
     961           0 :                     bool bError2 = true;
     962           0 :                     if( bOptional && bCompatible && eTok == EQ )
     963             :                     {
     964           0 :                         boost::scoped_ptr<SbiConstExpression> pDefaultExpr(new SbiConstExpression( this ));
     965           0 :                         SbxDataType eType2 = pDefaultExpr->GetType();
     966             : 
     967             :                         sal_uInt16 nStringId;
     968           0 :                         if( eType2 == SbxSTRING )
     969             :                         {
     970           0 :                             nStringId = aGblStrings.Add( pDefaultExpr->GetString() );
     971             :                         }
     972             :                         else
     973             :                         {
     974           0 :                             nStringId = aGblStrings.Add( pDefaultExpr->GetValue(), eType2 );
     975             :                         }
     976           0 :                         pPar->SetDefaultId( nStringId );
     977           0 :                         pDefaultExpr.reset();
     978             : 
     979           0 :                         eTok = Next();
     980           0 :                         if( eTok == COMMA || eTok == RPAREN )
     981             :                         {
     982           0 :                             bError2 = false;
     983           0 :                         }
     984             :                     }
     985           0 :                     if( bError2 )
     986             :                     {
     987           0 :                         Error( SbERR_EXPECTED, RPAREN );
     988           0 :                         break;
     989             :                     }
     990             :                 }
     991         440 :                 if( eTok == RPAREN )
     992             :                 {
     993         198 :                     break;
     994             :                 }
     995         242 :             }
     996             :         }
     997             :     }
     998         818 :     TypeDecl( *pDef );
     999         818 :     if( eType != SbxVARIANT && pDef->GetType() != eType )
    1000             :     {
    1001           0 :         Error( SbERR_BAD_DECLARATION, aName );
    1002             :     }
    1003         818 :     if( pDef->GetType() == SbxVARIANT && !( bFunc || bProp ) )
    1004             :     {
    1005         530 :         pDef->SetType( SbxEMPTY );
    1006             :     }
    1007         818 :     return pDef;
    1008             : }
    1009             : 
    1010             : // DECLARE
    1011             : 
    1012           0 : void SbiParser::Declare()
    1013             : {
    1014           0 :     DefDeclare( false );
    1015           0 : }
    1016             : 
    1017           8 : void SbiParser::DefDeclare( bool bPrivate )
    1018             : {
    1019           8 :     Next();
    1020           8 :     if( eCurTok != SUB && eCurTok != FUNCTION )
    1021             :     {
    1022           0 :       Error( SbERR_UNEXPECTED, eCurTok );
    1023             :     }
    1024             :     else
    1025             :     {
    1026           8 :         bool bFunction = (eCurTok == FUNCTION);
    1027             : 
    1028           8 :         SbiProcDef* pDef = ProcDecl( true );
    1029           8 :         if( pDef )
    1030             :         {
    1031           8 :             if( pDef->GetLib().isEmpty() )
    1032             :             {
    1033           0 :                 Error( SbERR_EXPECTED, LIB );
    1034             :             }
    1035             :             // Is it already there?
    1036           8 :             SbiSymDef* pOld = aPublics.Find( pDef->GetName() );
    1037           8 :             if( pOld )
    1038             :             {
    1039           0 :                 SbiProcDef* p = pOld->GetProcDef();
    1040           0 :                 if( !p )
    1041             :                 {
    1042             :                     // Declared as a variable
    1043           0 :                     Error( SbERR_BAD_DECLARATION, pDef->GetName() );
    1044           0 :                     delete pDef;
    1045           0 :                     pDef = NULL;
    1046             :                 }
    1047             :                 else
    1048             :                 {
    1049           0 :                     pDef->Match( p );
    1050             :                 }
    1051             :             }
    1052             :             else
    1053             :             {
    1054           8 :                 aPublics.Add( pDef );
    1055             :             }
    1056           8 :             if ( pDef )
    1057             :             {
    1058           8 :                 pDef->SetPublic( !bPrivate );
    1059             : 
    1060             :                 // New declare handling
    1061           8 :                 if( !pDef->GetLib().isEmpty())
    1062             :                 {
    1063           8 :                     if( bNewGblDefs && nGblChain == 0 )
    1064             :                     {
    1065           4 :                         nGblChain = aGen.Gen( _JUMP, 0 );
    1066           4 :                         bNewGblDefs = false;
    1067             :                     }
    1068             : 
    1069           8 :                     sal_uInt16 nSavLine = nLine;
    1070           8 :                     aGen.Statement();
    1071           8 :                     pDef->Define();
    1072           8 :                     pDef->SetLine1( nSavLine );
    1073           8 :                     pDef->SetLine2( nSavLine );
    1074             : 
    1075           8 :                     SbiSymPool& rPool = pDef->GetParams();
    1076           8 :                     sal_uInt16 nParCount = rPool.GetSize();
    1077             : 
    1078           8 :                     SbxDataType eType = pDef->GetType();
    1079           8 :                     if( bFunction )
    1080             :                     {
    1081           8 :                         aGen.Gen( _PARAM, 0, sal::static_int_cast< sal_uInt16 >( eType ) );
    1082             :                     }
    1083           8 :                     if( nParCount > 1 )
    1084             :                     {
    1085           8 :                         aGen.Gen( _ARGC );
    1086             : 
    1087          16 :                         for( sal_uInt16 i = 1 ; i < nParCount ; ++i )
    1088             :                         {
    1089           8 :                             SbiSymDef* pParDef = rPool.Get( i );
    1090           8 :                             SbxDataType eParType = pParDef->GetType();
    1091             : 
    1092           8 :                             aGen.Gen( _PARAM, i, sal::static_int_cast< sal_uInt16 >( eParType ) );
    1093           8 :                             aGen.Gen( _ARGV );
    1094             : 
    1095           8 :                             sal_uInt16 nTyp = sal::static_int_cast< sal_uInt16 >( pParDef->GetType() );
    1096           8 :                             if( pParDef->IsByVal() )
    1097             :                             {
    1098             :                                 // Reset to avoid additional byval in call to wrapper function
    1099           0 :                                 pParDef->SetByVal( false );
    1100           0 :                                 nTyp |= 0x8000;
    1101             :                             }
    1102           8 :                             aGen.Gen( _ARGTYP, nTyp );
    1103             :                         }
    1104             :                     }
    1105             : 
    1106           8 :                     aGen.Gen( _LIB, aGblStrings.Add( pDef->GetLib() ) );
    1107             : 
    1108           8 :                     SbiOpcode eOp = pDef->IsCdecl() ? _CALLC : _CALL;
    1109           8 :                     sal_uInt16 nId = pDef->GetId();
    1110           8 :                     if( !pDef->GetAlias().isEmpty() )
    1111             :                     {
    1112           0 :                         nId = ( nId & 0x8000 ) | aGblStrings.Add( pDef->GetAlias() );
    1113             :                     }
    1114           8 :                     if( nParCount > 1 )
    1115             :                     {
    1116           8 :                         nId |= 0x8000;
    1117             :                     }
    1118           8 :                     aGen.Gen( eOp, nId, sal::static_int_cast< sal_uInt16 >( eType ) );
    1119             : 
    1120           8 :                     if( bFunction )
    1121             :                     {
    1122           8 :                         aGen.Gen( _PUT );
    1123             :                     }
    1124           8 :                     aGen.Gen( _LEAVE );
    1125             :                 }
    1126             :             }
    1127             :         }
    1128             :     }
    1129           8 : }
    1130             : 
    1131           0 : void SbiParser::Attribute()
    1132             : {
    1133             :     // TODO: Need to implement the method as an attributed object.
    1134           0 :     while( Next() != EQ )
    1135             :     {
    1136           0 :         if( Next() != DOT)
    1137             :         {
    1138           0 :             break;
    1139             :         }
    1140             :     }
    1141             : 
    1142           0 :     if( eCurTok != EQ )
    1143             :     {
    1144           0 :         Error( SbERR_SYNTAX );
    1145             :     }
    1146             :     else
    1147             :     {
    1148           0 :         SbiExpression aValue( this );
    1149             :     }
    1150             :     // Don't generate any code - just discard it.
    1151           0 : }
    1152             : 
    1153             : // Call of a SUB or a FUNCTION
    1154             : 
    1155         750 : void SbiParser::Call()
    1156             : {
    1157         750 :     SbiExpression aVar( this, SbSYMBOL );
    1158         750 :     aVar.Gen( FORCE_CALL );
    1159         750 :     aGen.Gen( _GET );
    1160         750 : }
    1161             : 
    1162             : // SUB/FUNCTION
    1163             : 
    1164         754 : void SbiParser::SubFunc()
    1165             : {
    1166         754 :     DefProc( false, false );
    1167         754 : }
    1168             : 
    1169             : // Read in of a procedure
    1170             : 
    1171         810 : void SbiParser::DefProc( bool bStatic, bool bPrivate )
    1172             : {
    1173         810 :     sal_uInt16 l1 = nLine;
    1174         810 :     bool bSub = ( eCurTok == SUB );
    1175         810 :     bool bProperty = ( eCurTok == PROPERTY );
    1176         810 :     PropertyMode ePropertyMode = PROPERTY_MODE_NONE;
    1177         810 :     if( bProperty )
    1178             :     {
    1179           0 :         Next();
    1180           0 :         if( eCurTok == GET )
    1181             :         {
    1182           0 :             ePropertyMode = PROPERTY_MODE_GET;
    1183             :         }
    1184           0 :         else if( eCurTok == LET )
    1185             :         {
    1186           0 :             ePropertyMode = PROPERTY_MODE_LET;
    1187             :         }
    1188           0 :         else if( eCurTok == SET )
    1189             :         {
    1190           0 :             ePropertyMode = PROPERTY_MODE_SET;
    1191             :         }
    1192             :         else
    1193             :         {
    1194           0 :             Error( SbERR_EXPECTED, "Get or Let or Set" );
    1195             :         }
    1196             :     }
    1197             : 
    1198         810 :     SbiToken eExit = eCurTok;
    1199         810 :     SbiProcDef* pDef = ProcDecl( false );
    1200         810 :     if( !pDef )
    1201             :     {
    1202           0 :         return;
    1203             :     }
    1204         810 :     pDef->setPropertyMode( ePropertyMode );
    1205             : 
    1206             :     // Is the Proc already declared?
    1207         810 :     SbiSymDef* pOld = aPublics.Find( pDef->GetName() );
    1208         810 :     if( pOld )
    1209             :     {
    1210         428 :         bool bError_ = false;
    1211             : 
    1212         428 :         pProc = pOld->GetProcDef();
    1213         428 :         if( !pProc )
    1214             :         {
    1215             :             // Declared as a variable
    1216           0 :             Error( SbERR_BAD_DECLARATION, pDef->GetName() );
    1217           0 :             delete pDef;
    1218           0 :             pProc = NULL;
    1219           0 :             bError_ = true;
    1220             :         }
    1221             :         // #100027: Multiple declaration -> Error
    1222             :         // #112787: Not for setup, REMOVE for 8
    1223         428 :         else if( pProc->IsUsedForProcDecl() )
    1224             :         {
    1225           0 :             PropertyMode ePropMode = pDef->getPropertyMode();
    1226           0 :             if( ePropMode == PROPERTY_MODE_NONE || ePropMode == pProc->getPropertyMode() )
    1227             :             {
    1228           0 :                 Error( SbERR_PROC_DEFINED, pDef->GetName() );
    1229           0 :                 delete pDef;
    1230           0 :                 pProc = NULL;
    1231           0 :                 bError_ = true;
    1232             :             }
    1233             :         }
    1234             : 
    1235         428 :         if( !bError_ )
    1236             :         {
    1237         428 :             pDef->Match( pProc );
    1238         428 :             pProc = pDef;
    1239             :         }
    1240             :     }
    1241             :     else
    1242             :     {
    1243         382 :         aPublics.Add( pDef ), pProc = pDef;
    1244             :     }
    1245         810 :     if( !pProc )
    1246             :     {
    1247           0 :         return;
    1248             :     }
    1249         810 :     pProc->SetPublic( !bPrivate );
    1250             : 
    1251             :     // Now we set the search hierarchy for symbols as well as the
    1252             :     // current procedure.
    1253         810 :     aPublics.SetProcId( pProc->GetId() );
    1254         810 :     pProc->GetParams().SetParent( &aPublics );
    1255         810 :     if( bStatic )
    1256             :     {
    1257           0 :         if ( bVBASupportOn )
    1258             :         {
    1259           0 :             pProc->SetStatic( true );
    1260             :         }
    1261             :         else
    1262             :         {
    1263           0 :             Error( SbERR_NOT_IMPLEMENTED ); // STATIC SUB ...
    1264             :         }
    1265             :     }
    1266             :     else
    1267             :     {
    1268         810 :         pProc->SetStatic( false );
    1269             :     }
    1270             :     // Normal case: Local variable->parameter->global variable
    1271         810 :     pProc->GetLocals().SetParent( &pProc->GetParams() );
    1272         810 :     pPool = &pProc->GetLocals();
    1273             : 
    1274         810 :     pProc->Define();
    1275         810 :     OpenBlock( eExit );
    1276         810 :     StmntBlock( bSub ? ENDSUB : (bProperty ? ENDPROPERTY : ENDFUNC) );
    1277         810 :     sal_uInt16 l2 = nLine;
    1278         810 :     pProc->SetLine1( l1 );
    1279         810 :     pProc->SetLine2( l2 );
    1280         810 :     pPool = &aPublics;
    1281         810 :     aPublics.SetProcId( 0 );
    1282             :     // Open labels?
    1283         810 :     pProc->GetLabels().CheckRefs();
    1284         810 :     CloseBlock();
    1285         810 :     aGen.Gen( _LEAVE );
    1286         810 :     pProc = NULL;
    1287             : }
    1288             : 
    1289             : // STATIC variable|procedure
    1290             : 
    1291           0 : void SbiParser::Static()
    1292             : {
    1293           0 :     DefStatic( false );
    1294           0 : }
    1295             : 
    1296           0 : void SbiParser::DefStatic( bool bPrivate )
    1297             : {
    1298             :     SbiSymPool* p;
    1299             : 
    1300           0 :     switch( Peek() )
    1301             :     {
    1302             :     case SUB:
    1303             :     case FUNCTION:
    1304             :     case PROPERTY:
    1305             :         // End global chain if necessary (not done in
    1306             :         // SbiParser::Parse() under these conditions
    1307           0 :         if( bNewGblDefs && nGblChain == 0 )
    1308             :         {
    1309           0 :             nGblChain = aGen.Gen( _JUMP, 0 );
    1310           0 :             bNewGblDefs = false;
    1311             :         }
    1312           0 :         Next();
    1313           0 :         DefProc( true, bPrivate );
    1314           0 :         break;
    1315             :     default:
    1316           0 :         if( !pProc )
    1317             :         {
    1318           0 :             Error( SbERR_NOT_IN_SUBR );
    1319             :         }
    1320             :         // Reset the Pool, so that STATIC-Declarations go into the
    1321             :         // global Pool
    1322           0 :         p = pPool;
    1323           0 :         pPool = &aPublics;
    1324           0 :         DefVar( _STATIC, true );
    1325           0 :         pPool = p;
    1326           0 :         break;
    1327             :     }
    1328           0 : }
    1329             : 
    1330           0 : bool SbiParser::IsUnoInterface(const OUString& sTypeName)
    1331             : {
    1332             :     try
    1333             :     {
    1334             :         return css::reflection::theCoreReflection::get(
    1335           0 :             comphelper::getProcessComponentContext())->forName(sTypeName).is();
    1336             :     }
    1337           0 :     catch(const Exception&)
    1338             :     {
    1339             :         OSL_FAIL("Could not create reflection.CoreReflection.");
    1340             :     }
    1341           0 :     return false;
    1342             : }
    1343             : 
    1344             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10