1*cdf0e10cSrcweir /************************************************************************* 2*cdf0e10cSrcweir * 3*cdf0e10cSrcweir * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4*cdf0e10cSrcweir * 5*cdf0e10cSrcweir * Copyright 2000, 2010 Oracle and/or its affiliates. 6*cdf0e10cSrcweir * 7*cdf0e10cSrcweir * OpenOffice.org - a multi-platform office productivity suite 8*cdf0e10cSrcweir * 9*cdf0e10cSrcweir * This file is part of OpenOffice.org. 10*cdf0e10cSrcweir * 11*cdf0e10cSrcweir * OpenOffice.org is free software: you can redistribute it and/or modify 12*cdf0e10cSrcweir * it under the terms of the GNU Lesser General Public License version 3 13*cdf0e10cSrcweir * only, as published by the Free Software Foundation. 14*cdf0e10cSrcweir * 15*cdf0e10cSrcweir * OpenOffice.org is distributed in the hope that it will be useful, 16*cdf0e10cSrcweir * but WITHOUT ANY WARRANTY; without even the implied warranty of 17*cdf0e10cSrcweir * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18*cdf0e10cSrcweir * GNU Lesser General Public License version 3 for more details 19*cdf0e10cSrcweir * (a copy is included in the LICENSE file that accompanied this code). 20*cdf0e10cSrcweir * 21*cdf0e10cSrcweir * You should have received a copy of the GNU Lesser General Public License 22*cdf0e10cSrcweir * version 3 along with OpenOffice.org. If not, see 23*cdf0e10cSrcweir * <http://www.openoffice.org/license.html> 24*cdf0e10cSrcweir * for a copy of the LGPLv3 License. 25*cdf0e10cSrcweir * 26*cdf0e10cSrcweir ************************************************************************/ 27*cdf0e10cSrcweir 28*cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 29*cdf0e10cSrcweir #include "precompiled_basic.hxx" 30*cdf0e10cSrcweir 31*cdf0e10cSrcweir #include "sbcomp.hxx" 32*cdf0e10cSrcweir #include "expr.hxx" 33*cdf0e10cSrcweir 34*cdf0e10cSrcweir // Umsetztabelle fuer Token-Operatoren und Opcodes 35*cdf0e10cSrcweir 36*cdf0e10cSrcweir typedef struct { 37*cdf0e10cSrcweir SbiToken eTok; // Token 38*cdf0e10cSrcweir SbiOpcode eOp; // Opcode 39*cdf0e10cSrcweir } OpTable; 40*cdf0e10cSrcweir 41*cdf0e10cSrcweir static OpTable aOpTable [] = { 42*cdf0e10cSrcweir { EXPON,_EXP }, 43*cdf0e10cSrcweir { MUL, _MUL }, 44*cdf0e10cSrcweir { DIV, _DIV }, 45*cdf0e10cSrcweir { IDIV, _IDIV }, 46*cdf0e10cSrcweir { MOD, _MOD }, 47*cdf0e10cSrcweir { PLUS, _PLUS }, 48*cdf0e10cSrcweir { MINUS,_MINUS }, 49*cdf0e10cSrcweir { EQ, _EQ }, 50*cdf0e10cSrcweir { NE, _NE }, 51*cdf0e10cSrcweir { LE, _LE }, 52*cdf0e10cSrcweir { GE, _GE }, 53*cdf0e10cSrcweir { LT, _LT }, 54*cdf0e10cSrcweir { GT, _GT }, 55*cdf0e10cSrcweir { AND, _AND }, 56*cdf0e10cSrcweir { OR, _OR }, 57*cdf0e10cSrcweir { XOR, _XOR }, 58*cdf0e10cSrcweir { EQV, _EQV }, 59*cdf0e10cSrcweir { IMP, _IMP }, 60*cdf0e10cSrcweir { NOT, _NOT }, 61*cdf0e10cSrcweir { NEG, _NEG }, 62*cdf0e10cSrcweir { CAT, _CAT }, 63*cdf0e10cSrcweir { LIKE, _LIKE }, 64*cdf0e10cSrcweir { IS, _IS }, 65*cdf0e10cSrcweir { NIL, _NOP }}; 66*cdf0e10cSrcweir 67*cdf0e10cSrcweir // Ausgabe eines Elements 68*cdf0e10cSrcweir void SbiExprNode::Gen( RecursiveMode eRecMode ) 69*cdf0e10cSrcweir { 70*cdf0e10cSrcweir if( IsConstant() ) 71*cdf0e10cSrcweir { 72*cdf0e10cSrcweir switch( GetType() ) 73*cdf0e10cSrcweir { 74*cdf0e10cSrcweir case SbxEMPTY: pGen->Gen( _EMPTY ); break; 75*cdf0e10cSrcweir case SbxINTEGER: pGen->Gen( _CONST, (short) nVal ); break; 76*cdf0e10cSrcweir case SbxSTRING: 77*cdf0e10cSrcweir { 78*cdf0e10cSrcweir sal_uInt16 nStringId = pGen->GetParser()->aGblStrings.Add( aStrVal, sal_True ); 79*cdf0e10cSrcweir pGen->Gen( _SCONST, nStringId ); break; 80*cdf0e10cSrcweir } 81*cdf0e10cSrcweir default: 82*cdf0e10cSrcweir { 83*cdf0e10cSrcweir sal_uInt16 nStringId = pGen->GetParser()->aGblStrings.Add( nVal, eType ); 84*cdf0e10cSrcweir pGen->Gen( _NUMBER, nStringId ); 85*cdf0e10cSrcweir } 86*cdf0e10cSrcweir } 87*cdf0e10cSrcweir } 88*cdf0e10cSrcweir else if( IsOperand() ) 89*cdf0e10cSrcweir { 90*cdf0e10cSrcweir SbiExprNode* pWithParent_ = NULL; 91*cdf0e10cSrcweir SbiOpcode eOp; 92*cdf0e10cSrcweir if( aVar.pDef->GetScope() == SbPARAM ) 93*cdf0e10cSrcweir { 94*cdf0e10cSrcweir eOp = _PARAM; 95*cdf0e10cSrcweir if( 0 == aVar.pDef->GetPos() ) 96*cdf0e10cSrcweir { 97*cdf0e10cSrcweir bool bTreatFunctionAsParam = true; 98*cdf0e10cSrcweir if( eRecMode == FORCE_CALL ) 99*cdf0e10cSrcweir { 100*cdf0e10cSrcweir bTreatFunctionAsParam = false; 101*cdf0e10cSrcweir } 102*cdf0e10cSrcweir else if( eRecMode == UNDEFINED ) 103*cdf0e10cSrcweir { 104*cdf0e10cSrcweir if( aVar.pPar && aVar.pPar->IsBracket() ) 105*cdf0e10cSrcweir bTreatFunctionAsParam = false; 106*cdf0e10cSrcweir } 107*cdf0e10cSrcweir if( !bTreatFunctionAsParam ) 108*cdf0e10cSrcweir eOp = aVar.pDef->IsGlobal() ? _FIND_G : _FIND; 109*cdf0e10cSrcweir } 110*cdf0e10cSrcweir } 111*cdf0e10cSrcweir // AB: 17.12.1995, Spezialbehandlung fuer WITH 112*cdf0e10cSrcweir else if( (pWithParent_ = GetWithParent()) != NULL ) 113*cdf0e10cSrcweir { 114*cdf0e10cSrcweir eOp = _ELEM; // .-Ausdruck in WITH 115*cdf0e10cSrcweir } 116*cdf0e10cSrcweir else 117*cdf0e10cSrcweir { 118*cdf0e10cSrcweir eOp = ( aVar.pDef->GetScope() == SbRTL ) ? _RTL : 119*cdf0e10cSrcweir (aVar.pDef->IsGlobal() ? _FIND_G : _FIND); 120*cdf0e10cSrcweir } 121*cdf0e10cSrcweir 122*cdf0e10cSrcweir if( eOp == _FIND ) 123*cdf0e10cSrcweir { 124*cdf0e10cSrcweir 125*cdf0e10cSrcweir SbiProcDef* pProc = aVar.pDef->GetProcDef(); 126*cdf0e10cSrcweir if ( pGen->GetParser()->bClassModule ) 127*cdf0e10cSrcweir eOp = _FIND_CM; 128*cdf0e10cSrcweir else if ( aVar.pDef->IsStatic() || (pProc && pProc->IsStatic()) ) 129*cdf0e10cSrcweir { 130*cdf0e10cSrcweir eOp = _FIND_STATIC; 131*cdf0e10cSrcweir } 132*cdf0e10cSrcweir } 133*cdf0e10cSrcweir for( SbiExprNode* p = this; p; p = p->aVar.pNext ) 134*cdf0e10cSrcweir { 135*cdf0e10cSrcweir if( p == this && pWithParent_ != NULL ) 136*cdf0e10cSrcweir pWithParent_->Gen(); 137*cdf0e10cSrcweir p->GenElement( eOp ); 138*cdf0e10cSrcweir eOp = _ELEM; 139*cdf0e10cSrcweir } 140*cdf0e10cSrcweir } 141*cdf0e10cSrcweir else if( IsTypeOf() ) 142*cdf0e10cSrcweir { 143*cdf0e10cSrcweir pLeft->Gen(); 144*cdf0e10cSrcweir pGen->Gen( _TESTCLASS, nTypeStrId ); 145*cdf0e10cSrcweir } 146*cdf0e10cSrcweir else if( IsNew() ) 147*cdf0e10cSrcweir { 148*cdf0e10cSrcweir pGen->Gen( _CREATE, 0, nTypeStrId ); 149*cdf0e10cSrcweir } 150*cdf0e10cSrcweir else 151*cdf0e10cSrcweir { 152*cdf0e10cSrcweir pLeft->Gen(); 153*cdf0e10cSrcweir if( pRight ) 154*cdf0e10cSrcweir pRight->Gen(); 155*cdf0e10cSrcweir for( OpTable* p = aOpTable; p->eTok != NIL; p++ ) 156*cdf0e10cSrcweir { 157*cdf0e10cSrcweir if( p->eTok == eTok ) 158*cdf0e10cSrcweir { 159*cdf0e10cSrcweir pGen->Gen( p->eOp ); break; 160*cdf0e10cSrcweir } 161*cdf0e10cSrcweir } 162*cdf0e10cSrcweir } 163*cdf0e10cSrcweir } 164*cdf0e10cSrcweir 165*cdf0e10cSrcweir // Ausgabe eines Operanden-Elements 166*cdf0e10cSrcweir 167*cdf0e10cSrcweir void SbiExprNode::GenElement( SbiOpcode eOp ) 168*cdf0e10cSrcweir { 169*cdf0e10cSrcweir #ifdef DBG_UTIL 170*cdf0e10cSrcweir if( (eOp < _RTL || eOp > _CALLC) && eOp != _FIND_G && eOp != _FIND_CM ) 171*cdf0e10cSrcweir pGen->GetParser()->Error( SbERR_INTERNAL_ERROR, "Opcode" ); 172*cdf0e10cSrcweir #endif 173*cdf0e10cSrcweir SbiSymDef* pDef = aVar.pDef; 174*cdf0e10cSrcweir // Das ID ist entweder die Position oder das String-ID 175*cdf0e10cSrcweir // Falls das Bit 0x8000 gesetzt ist, hat die Variable 176*cdf0e10cSrcweir // eine Parameterliste. 177*cdf0e10cSrcweir sal_uInt16 nId = ( eOp == _PARAM ) ? pDef->GetPos() : pDef->GetId(); 178*cdf0e10cSrcweir // Parameterliste aufbauen 179*cdf0e10cSrcweir if( aVar.pPar && aVar.pPar->GetSize() ) 180*cdf0e10cSrcweir { 181*cdf0e10cSrcweir nId |= 0x8000; 182*cdf0e10cSrcweir aVar.pPar->Gen(); 183*cdf0e10cSrcweir } 184*cdf0e10cSrcweir 185*cdf0e10cSrcweir pGen->Gen( eOp, nId, sal::static_int_cast< sal_uInt16 >( GetType() ) ); 186*cdf0e10cSrcweir 187*cdf0e10cSrcweir if( aVar.pvMorePar ) 188*cdf0e10cSrcweir { 189*cdf0e10cSrcweir SbiExprListVector* pvMorePar = aVar.pvMorePar; 190*cdf0e10cSrcweir SbiExprListVector::iterator it; 191*cdf0e10cSrcweir for( it = pvMorePar->begin() ; it != pvMorePar->end() ; ++it ) 192*cdf0e10cSrcweir { 193*cdf0e10cSrcweir SbiExprList* pExprList = *it; 194*cdf0e10cSrcweir pExprList->Gen(); 195*cdf0e10cSrcweir pGen->Gen( _ARRAYACCESS ); 196*cdf0e10cSrcweir } 197*cdf0e10cSrcweir } 198*cdf0e10cSrcweir } 199*cdf0e10cSrcweir 200*cdf0e10cSrcweir // Erzeugen einer Argv-Tabelle 201*cdf0e10cSrcweir // Das erste Element bleibt immer frei fuer Returnwerte etc. 202*cdf0e10cSrcweir // Siehe auch SbiProcDef::SbiProcDef() in symtbl.cxx 203*cdf0e10cSrcweir 204*cdf0e10cSrcweir void SbiExprList::Gen() 205*cdf0e10cSrcweir { 206*cdf0e10cSrcweir if( pFirst ) 207*cdf0e10cSrcweir { 208*cdf0e10cSrcweir pParser->aGen.Gen( _ARGC ); 209*cdf0e10cSrcweir // AB 10.1.96: Typ-Anpassung bei DECLARE 210*cdf0e10cSrcweir sal_uInt16 nCount = 1 /*, nParAnz = 0*/; 211*cdf0e10cSrcweir // SbiSymPool* pPool = NULL; 212*cdf0e10cSrcweir for( SbiExpression* pExpr = pFirst; pExpr; pExpr = pExpr->pNext,nCount++ ) 213*cdf0e10cSrcweir { 214*cdf0e10cSrcweir pExpr->Gen(); 215*cdf0e10cSrcweir if( pExpr->GetName().Len() ) 216*cdf0e10cSrcweir { 217*cdf0e10cSrcweir // named arg 218*cdf0e10cSrcweir sal_uInt16 nSid = pParser->aGblStrings.Add( pExpr->GetName() ); 219*cdf0e10cSrcweir pParser->aGen.Gen( _ARGN, nSid ); 220*cdf0e10cSrcweir 221*cdf0e10cSrcweir /* TODO: Check after Declare concept change 222*cdf0e10cSrcweir // AB 10.1.96: Typanpassung bei named -> passenden Parameter suchen 223*cdf0e10cSrcweir if( pProc ) 224*cdf0e10cSrcweir { 225*cdf0e10cSrcweir // Vorerst: Error ausloesen 226*cdf0e10cSrcweir pParser->Error( SbERR_NO_NAMED_ARGS ); 227*cdf0e10cSrcweir 228*cdf0e10cSrcweir // Spaeter, wenn Named Args bei DECLARE moeglich 229*cdf0e10cSrcweir //for( sal_uInt16 i = 1 ; i < nParAnz ; i++ ) 230*cdf0e10cSrcweir //{ 231*cdf0e10cSrcweir // SbiSymDef* pDef = pPool->Get( i ); 232*cdf0e10cSrcweir // const String& rName = pDef->GetName(); 233*cdf0e10cSrcweir // if( rName.Len() ) 234*cdf0e10cSrcweir // { 235*cdf0e10cSrcweir // if( pExpr->GetName().ICompare( rName ) 236*cdf0e10cSrcweir // == COMPARE_EQUAL ) 237*cdf0e10cSrcweir // { 238*cdf0e10cSrcweir // pParser->aGen.Gen( _ARGTYP, pDef->GetType() ); 239*cdf0e10cSrcweir // break; 240*cdf0e10cSrcweir // } 241*cdf0e10cSrcweir // } 242*cdf0e10cSrcweir //} 243*cdf0e10cSrcweir } 244*cdf0e10cSrcweir */ 245*cdf0e10cSrcweir } 246*cdf0e10cSrcweir else 247*cdf0e10cSrcweir { 248*cdf0e10cSrcweir pParser->aGen.Gen( _ARGV ); 249*cdf0e10cSrcweir } 250*cdf0e10cSrcweir } 251*cdf0e10cSrcweir } 252*cdf0e10cSrcweir } 253*cdf0e10cSrcweir 254*cdf0e10cSrcweir void SbiExpression::Gen( RecursiveMode eRecMode ) 255*cdf0e10cSrcweir { 256*cdf0e10cSrcweir // AB: 17.12.1995, Spezialbehandlung fuer WITH 257*cdf0e10cSrcweir // Wenn pExpr == .-Ausdruck in With, zunaechst Gen fuer Basis-Objekt 258*cdf0e10cSrcweir pExpr->Gen( eRecMode ); 259*cdf0e10cSrcweir if( bByVal ) 260*cdf0e10cSrcweir pParser->aGen.Gen( _BYVAL ); 261*cdf0e10cSrcweir if( bBased ) 262*cdf0e10cSrcweir { 263*cdf0e10cSrcweir sal_uInt16 uBase = pParser->nBase; 264*cdf0e10cSrcweir if( pParser->IsCompatible() ) 265*cdf0e10cSrcweir uBase |= 0x8000; // #109275 Flag compatiblity 266*cdf0e10cSrcweir pParser->aGen.Gen( _BASED, uBase ); 267*cdf0e10cSrcweir pParser->aGen.Gen( _ARGV ); 268*cdf0e10cSrcweir } 269*cdf0e10cSrcweir } 270*cdf0e10cSrcweir 271