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

Generated by: LCOV version 1.11