LCOV - code coverage report
Current view: top level - libreoffice/idlc/source - astexpression.cxx (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 200 774 25.8 %
Date: 2012-12-27 Functions: 17 23 73.9 %
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             : 
      21             : #include <idlc/astexpression.hxx>
      22             : #include <idlc/astconstant.hxx>
      23             : #include <idlc/astscope.hxx>
      24             : #include <idlc/errorhandler.hxx>
      25             : 
      26             : #include <limits.h>
      27             : #include <float.h>
      28             : #include <memory> // auto_ptr<>
      29             : 
      30             : #undef  MAXCHAR
      31             : #define MAXCHAR         127
      32             : #undef  MINCHAR
      33             : #define MINCHAR         -128
      34             : 
      35             : using namespace ::rtl;
      36             : 
      37          66 : AstExpression::AstExpression(ExprComb c, AstExpression *pExpr1, AstExpression *pExpr2)
      38             :     : m_combOperator(c)
      39             :     , m_subExpr1(pExpr1)
      40             :     , m_subExpr2(pExpr2)
      41             :     , m_exprValue(NULL)
      42          66 :     , m_pSymbolicName(NULL)
      43             : {
      44          66 :     fillDefinitionDetails();
      45             : 
      46          66 : }
      47             : 
      48       63608 : AstExpression::AstExpression(sal_Int32 l)
      49             :     : m_combOperator(EC_none)
      50             :     , m_subExpr1(NULL)
      51             :     , m_subExpr2(NULL)
      52             :     , m_exprValue(NULL)
      53       63608 :     , m_pSymbolicName(NULL)
      54             : {
      55       63608 :     fillDefinitionDetails();
      56             : 
      57       63608 :     m_exprValue = new AstExprValue();
      58       63608 :     m_exprValue->et = ET_long;
      59       63608 :     m_exprValue->u.lval = l;
      60       63608 : }
      61             : 
      62           0 : AstExpression::AstExpression(sal_Int32  l, ExprType et)
      63             :     : m_combOperator(EC_none)
      64             :     , m_subExpr1(NULL)
      65             :     , m_subExpr2(NULL)
      66             :     , m_exprValue(NULL)
      67           0 :     , m_pSymbolicName(NULL)
      68             : {
      69           0 :     fillDefinitionDetails();
      70             : 
      71           0 :     m_exprValue = new AstExprValue();
      72           0 :     m_exprValue->et = et;
      73           0 :     m_exprValue->u.lval = l;
      74           0 : }
      75             : 
      76       13984 : AstExpression::AstExpression(sal_Int64  h)
      77             :     : m_combOperator(EC_none)
      78             :     , m_subExpr1(NULL)
      79             :     , m_subExpr2(NULL)
      80             :     , m_exprValue(NULL)
      81       13984 :     , m_pSymbolicName(NULL)
      82             : {
      83       13984 :     fillDefinitionDetails();
      84             : 
      85       13984 :     m_exprValue = new AstExprValue();
      86       13984 :     m_exprValue->et = ET_hyper;
      87       13984 :     m_exprValue->u.hval = h;
      88       13984 : }
      89             : 
      90           1 : AstExpression::AstExpression(sal_uInt64 uh)
      91             :     : m_combOperator(EC_none)
      92             :     , m_subExpr1(NULL)
      93             :     , m_subExpr2(NULL)
      94             :     , m_exprValue(NULL)
      95           1 :     , m_pSymbolicName(NULL)
      96             : {
      97           1 :     fillDefinitionDetails();
      98             : 
      99           1 :     m_exprValue = new AstExprValue();
     100           1 :     m_exprValue->et = ET_uhyper;
     101           1 :     m_exprValue->u.uhval = uh;
     102           1 : }
     103             : 
     104          20 : AstExpression::AstExpression(double d)
     105             :     : m_combOperator(EC_none)
     106             :     , m_subExpr1(NULL)
     107             :     , m_subExpr2(NULL)
     108             :     , m_exprValue(NULL)
     109          20 :     , m_pSymbolicName(NULL)
     110             : {
     111          20 :     fillDefinitionDetails();
     112             : 
     113          20 :     m_exprValue = new AstExprValue();
     114          20 :     m_exprValue->et = ET_double;
     115          20 :     m_exprValue->u.dval = d;
     116          20 : }
     117             : 
     118          98 : AstExpression::AstExpression(::rtl::OString* scopedName)
     119             :     : m_combOperator(EC_symbol)
     120             :     , m_subExpr1(NULL)
     121             :     , m_subExpr2(NULL)
     122             :     , m_exprValue(NULL)
     123          98 :     , m_pSymbolicName(scopedName)
     124             : {
     125          98 :     fillDefinitionDetails();
     126          98 : }
     127             : 
     128           0 : AstExpression::~AstExpression()
     129             : {
     130           0 :     if ( m_exprValue )
     131           0 :         delete m_exprValue;
     132           0 :     if ( m_subExpr1 )
     133           0 :         delete m_subExpr1;
     134           0 :     if ( m_subExpr2 )
     135           0 :         delete m_subExpr2;
     136           0 :     if ( m_pSymbolicName )
     137           0 :         delete m_pSymbolicName;
     138           0 : }
     139             : 
     140             : /*
     141             :  * Perform the coercion from the given AstExprValue to the requested
     142             :  * ExprType. Return an AstExprValue if successful, NULL if failed.
     143             :  * must be done for hyper, uhyper
     144             :  */
     145             : static AstExprValue *
     146       14105 : coerce_value(AstExprValue *ev, ExprType t)
     147             : {
     148       14105 :     if (ev == NULL)
     149           0 :         return NULL;
     150             : 
     151       14105 :     switch (t)
     152             :     {
     153             :         case ET_short:
     154        2975 :             switch (ev->et)
     155             :             {
     156             :                 case ET_short:
     157          17 :                     return ev;
     158             :                 case ET_ushort:
     159           0 :                     if (ev->u.usval > SAL_MAX_INT16)
     160           0 :                         return NULL;
     161           0 :                     ev->u.sval = (sal_Int16)ev->u.usval;
     162           0 :                     ev->et = ET_short;
     163           0 :                     return ev;
     164             :                 case ET_long:
     165           0 :                     if (ev->u.lval < SAL_MIN_INT16 || ev->u.lval > SAL_MAX_INT16)
     166           0 :                         return NULL;
     167           0 :                     ev->u.sval = (sal_Int16)ev->u.lval;
     168           0 :                     ev->et = ET_short;
     169           0 :                     return ev;
     170             :                 case ET_ulong:
     171           0 :                     if (ev->u.ulval > SAL_MAX_INT16)
     172           0 :                         return NULL;
     173           0 :                     ev->u.sval = (sal_Int16)ev->u.ulval;
     174           0 :                     ev->et = ET_short;
     175           0 :                     return ev;
     176             :                 case ET_hyper:
     177        2908 :                     if (ev->u.hval < SAL_MIN_INT16 || ev->u.hval > SAL_MAX_INT16)
     178           0 :                         return NULL;
     179        2908 :                     ev->u.sval = (sal_Int16)ev->u.hval;
     180        2908 :                     ev->et = ET_short;
     181        2908 :                     return ev;
     182             :                 case ET_uhyper:
     183           0 :                     if (ev->u.uhval > SAL_MAX_INT16)
     184           0 :                         return NULL;
     185           0 :                     ev->u.sval = (sal_Int16)ev->u.uhval;
     186           0 :                     ev->et = ET_short;
     187           0 :                     return ev;
     188             :                 case ET_boolean:
     189           0 :                     ev->u.sval = (sal_Int16)ev->u.bval;
     190           0 :                     ev->et = ET_short;
     191           0 :                     return ev;
     192             :                 case ET_float:
     193           0 :                     if (ev->u.fval < SAL_MIN_INT16 || ev->u.fval > SAL_MAX_INT16)
     194           0 :                         return NULL;
     195           0 :                     ev->u.sval = (sal_Int16)ev->u.fval;
     196           0 :                     ev->et = ET_short;
     197           0 :                     return ev;
     198             :                 case ET_double:
     199          50 :                     if (ev->u.dval < SAL_MIN_INT16 || ev->u.dval > SAL_MAX_INT16)
     200           0 :                         return NULL;
     201          50 :                     ev->u.sval = (sal_Int16)ev->u.dval;
     202          50 :                     ev->et = ET_short;
     203          50 :                     return ev;
     204             :                 case ET_byte:
     205           0 :                     ev->u.sval = (sal_Int16)ev->u.byval;
     206           0 :                     ev->et = ET_short;
     207           0 :                     return ev;
     208             :                 default:
     209             :                     OSL_ASSERT(false);
     210           0 :                     return NULL;
     211             :             }
     212             :         case ET_ushort:
     213           2 :             switch (ev->et)
     214             :             {
     215             :                 case ET_short:
     216           0 :                     if (ev->u.sval < 0)
     217           0 :                         return NULL;
     218           0 :                     ev->u.usval = (sal_uInt16)ev->u.sval;
     219           0 :                     ev->et = ET_ushort;
     220           0 :                     return ev;
     221             :                 case ET_ushort:
     222           0 :                     return ev;
     223             :                 case ET_long:
     224           0 :                     if (ev->u.lval < 0 || ev->u.lval > SAL_MAX_UINT16)
     225           0 :                         return NULL;
     226           0 :                     ev->u.usval = (sal_uInt16)ev->u.lval;
     227           0 :                     ev->et = ET_ushort;
     228           0 :                     return ev;
     229             :                 case ET_ulong:
     230           0 :                     if (ev->u.ulval > SAL_MAX_UINT16)
     231           0 :                         return NULL;
     232           0 :                     ev->u.usval = (sal_uInt16)ev->u.ulval;
     233           0 :                     ev->et = ET_ushort;
     234           0 :                     return ev;
     235             :                 case ET_hyper:
     236           2 :                     if (ev->u.hval < 0 || ev->u.hval > SAL_MAX_UINT16)
     237           0 :                         return NULL;
     238           2 :                     ev->u.usval = (sal_uInt16)ev->u.hval;
     239           2 :                     ev->et = ET_ushort;
     240           2 :                     return ev;
     241             :                 case ET_uhyper:
     242           0 :                     if (ev->u.uhval > SAL_MAX_UINT16)
     243           0 :                         return NULL;
     244           0 :                     ev->u.usval = (sal_uInt16)ev->u.uhval;
     245           0 :                     ev->et = ET_ushort;
     246           0 :                     return ev;
     247             :                 case ET_boolean:
     248           0 :                     ev->u.usval = (sal_uInt16)ev->u.bval;
     249           0 :                     ev->et = ET_short;
     250           0 :                     return ev;
     251             :                 case ET_float:
     252           0 :                     if (ev->u.fval < 0.0 || ev->u.fval > SAL_MAX_UINT16)
     253           0 :                         return NULL;
     254           0 :                     ev->u.usval = (sal_uInt16)ev->u.fval;
     255           0 :                     ev->et = ET_short;
     256           0 :                     return ev;
     257             :                 case ET_double:
     258           0 :                     if (ev->u.dval < 0.0 || ev->u.dval > SAL_MAX_UINT16)
     259           0 :                         return NULL;
     260           0 :                     ev->u.usval = (sal_uInt16)ev->u.dval;
     261           0 :                     ev->et = ET_short;
     262           0 :                     return ev;
     263             :                 case ET_byte:
     264           0 :                     ev->u.usval = (sal_uInt16)ev->u.byval;
     265           0 :                     ev->et = ET_ushort;
     266           0 :                     return ev;
     267             :                 default:
     268             :                     OSL_ASSERT(false);
     269           0 :                     return NULL;
     270             :             }
     271             :         case ET_long:
     272       10517 :             switch (ev->et)
     273             :             {
     274             :                 case ET_short:
     275           0 :                     ev->u.lval = (sal_Int32)ev->u.sval;
     276           0 :                     ev->et = ET_long;
     277           0 :                     return ev;
     278             :                 case ET_ushort:
     279           0 :                     ev->u.lval = (sal_Int32)ev->u.usval;
     280           0 :                     ev->et = ET_long;
     281           0 :                     return ev;
     282             :                 case ET_long:
     283          15 :                     return ev;
     284             :                 case ET_ulong:
     285           0 :                     if (ev->u.ulval > SAL_MAX_INT32)
     286           0 :                         return NULL;
     287           0 :                     ev->u.lval = (sal_Int32)ev->u.ulval;
     288           0 :                     ev->et = ET_long;
     289           0 :                     return ev;
     290             :                 case ET_hyper:
     291       10502 :                     if (ev->u.hval < SAL_MIN_INT32 || ev->u.hval > SAL_MAX_INT32)
     292           0 :                         return NULL;
     293       10502 :                     ev->u.lval = (sal_Int32)ev->u.hval;
     294       10502 :                     ev->et = ET_long;
     295       10502 :                     return ev;
     296             :                 case ET_uhyper:
     297           0 :                     if (ev->u.uhval > SAL_MAX_INT32)
     298           0 :                         return NULL;
     299           0 :                     ev->u.lval = (sal_Int32)ev->u.uhval;
     300           0 :                     ev->et = ET_long;
     301           0 :                     return ev;
     302             :                 case ET_boolean:
     303           0 :                     ev->u.lval = (sal_Int32)ev->u.bval;
     304           0 :                     ev->et = ET_long;
     305           0 :                     return ev;
     306             :                 case ET_float:
     307           0 :                     if (ev->u.fval < SAL_MIN_INT32 || ev->u.fval > SAL_MAX_INT32)
     308           0 :                         return NULL;
     309           0 :                     ev->u.lval = (sal_Int32)ev->u.fval;
     310           0 :                     ev->et = ET_long;
     311           0 :                     return ev;
     312             :                 case ET_double:
     313           0 :                     if (ev->u.dval < SAL_MIN_INT32 || ev->u.dval > SAL_MAX_INT32)
     314           0 :                         return NULL;
     315           0 :                     ev->u.lval = (sal_Int32)ev->u.dval;
     316           0 :                     ev->et = ET_long;
     317           0 :                     return ev;
     318             :                 case ET_byte:
     319           0 :                     ev->u.lval = (sal_Int32) ev->u.byval;
     320           0 :                     ev->et = ET_long;
     321           0 :                     return ev;
     322             :                 default:
     323             :                     OSL_ASSERT(false);
     324           0 :                     return NULL;
     325             :             }
     326             :         case ET_ulong:
     327           2 :             switch (ev->et)
     328             :             {
     329             :                 case ET_short:
     330           0 :                     if (ev->u.sval < 0)
     331           0 :                         return NULL;
     332           0 :                     ev->u.ulval = (sal_uInt32)ev->u.sval;
     333           0 :                     ev->et = ET_ulong;
     334           0 :                     return ev;
     335             :                 case ET_ushort:
     336           0 :                     ev->u.ulval = (sal_uInt32)ev->u.usval;
     337           0 :                     ev->et = ET_ulong;
     338           0 :                     return ev;
     339             :                 case ET_long:
     340           0 :                     if (ev->u.lval < 0)
     341           0 :                         return NULL;
     342           0 :                     ev->u.ulval = (sal_uInt32)ev->u.lval;
     343           0 :                     ev->et = ET_ulong;
     344           0 :                     return ev;
     345             :                 case ET_ulong:
     346           0 :                     return ev;
     347             :                 case ET_hyper:
     348           2 :                     if (ev->u.hval < 0 || ev->u.hval > SAL_MAX_UINT32)
     349           0 :                         return NULL;
     350           2 :                     ev->u.lval = (sal_uInt32)ev->u.hval;
     351           2 :                     ev->et = ET_ulong;
     352           2 :                     return ev;
     353             :                 case ET_uhyper:
     354           0 :                     if (ev->u.uhval > SAL_MAX_UINT32)
     355           0 :                         return NULL;
     356           0 :                     ev->u.ulval = (sal_uInt32)ev->u.uhval;
     357           0 :                     ev->et = ET_ulong;
     358           0 :                     return ev;
     359             :                 case ET_boolean:
     360           0 :                     ev->u.ulval = (sal_uInt32)ev->u.bval;
     361           0 :                     ev->et = ET_ulong;
     362           0 :                     return ev;
     363             :                 case ET_float:
     364           0 :                     if (ev->u.fval < 0.0 || ev->u.fval > SAL_MAX_UINT32)
     365           0 :                         return NULL;
     366           0 :                     ev->u.ulval = (sal_uInt32)ev->u.fval;
     367           0 :                     ev->et = ET_ulong;
     368           0 :                     return ev;
     369             :                 case ET_double:
     370           0 :                     if (ev->u.dval < 0.0 || ev->u.dval > SAL_MAX_UINT32)
     371           0 :                         return NULL;
     372           0 :                     ev->u.ulval = (sal_uInt32)ev->u.dval;
     373           0 :                     ev->et = ET_ulong;
     374           0 :                     return ev;
     375             :                 case ET_byte:
     376           0 :                     ev->u.ulval = (sal_uInt32)ev->u.byval;
     377           0 :                     ev->et = ET_ulong;
     378           0 :                     return ev;
     379             :                 default:
     380             :                     OSL_ASSERT(false);
     381           0 :                     return NULL;
     382             :             }
     383             :         case ET_hyper:
     384           0 :             switch (ev->et)
     385             :             {
     386             :                 case ET_short:
     387           0 :                     ev->u.hval = (sal_Int64)ev->u.sval;
     388           0 :                     ev->et = ET_hyper;
     389           0 :                     return ev;
     390             :                 case ET_ushort:
     391           0 :                     ev->u.hval = (sal_Int64)ev->u.usval;
     392           0 :                     ev->et = ET_hyper;
     393           0 :                     return ev;
     394             :                 case ET_long:
     395           0 :                     ev->u.hval = (sal_Int64)ev->u.lval;
     396           0 :                     ev->et = ET_hyper;
     397           0 :                     return ev;
     398             :                 case ET_ulong:
     399           0 :                     ev->u.hval = (sal_Int64)ev->u.ulval;
     400           0 :                     ev->et = ET_hyper;
     401           0 :                     return ev;
     402             :                 case ET_hyper:
     403           0 :                     return ev;
     404             :                 case ET_uhyper:
     405           0 :                     if (ev->u.uhval > SAL_MAX_INT64)
     406           0 :                         return NULL;
     407           0 :                     ev->u.hval = (sal_Int64)ev->u.uhval;
     408           0 :                     ev->et = ET_long;
     409           0 :                     return ev;
     410             :                 case ET_boolean:
     411           0 :                     ev->u.hval = (sal_Int64)ev->u.bval;
     412           0 :                     ev->et = ET_hyper;
     413           0 :                     return ev;
     414             :                 case ET_float:
     415           0 :                     if (ev->u.fval < SAL_MIN_INT64 || ev->u.fval > SAL_MAX_INT64)
     416           0 :                         return NULL;
     417           0 :                     ev->u.hval = (sal_Int64)ev->u.fval;
     418           0 :                     ev->et = ET_hyper;
     419           0 :                     return ev;
     420             :                 case ET_double:
     421           0 :                     if (ev->u.dval < SAL_MIN_INT64 || ev->u.dval > SAL_MAX_INT64)
     422           0 :                         return NULL;
     423           0 :                     ev->u.hval = (sal_Int64)ev->u.dval;
     424           0 :                     ev->et = ET_hyper;
     425           0 :                     return ev;
     426             :                 case ET_byte:
     427           0 :                     ev->u.hval = (sal_Int64)ev->u.byval;
     428           0 :                     ev->et = ET_hyper;
     429           0 :                     return ev;
     430             :                 default:
     431             :                     OSL_ASSERT(false);
     432           0 :                     return NULL;
     433             :             }
     434             :         case ET_uhyper:
     435           1 :             switch (ev->et)
     436             :             {
     437             :                 case ET_short:
     438           0 :                     if (ev->u.sval < 0)
     439           0 :                         return NULL;
     440           0 :                     ev->u.uhval = (sal_uInt64)ev->u.sval;
     441           0 :                     ev->et = ET_uhyper;
     442           0 :                     return ev;
     443             :                 case ET_ushort:
     444           0 :                     ev->u.uhval = (sal_uInt64)ev->u.usval;
     445           0 :                     ev->et = ET_uhyper;
     446           0 :                     return ev;
     447             :                 case ET_long:
     448           0 :                     if (ev->u.lval < 0)
     449           0 :                         return NULL;
     450           0 :                     ev->u.uhval = (sal_uInt64)ev->u.lval;
     451           0 :                     ev->et = ET_uhyper;
     452           0 :                     return ev;
     453             :                 case ET_ulong:
     454           0 :                     ev->u.uhval = (sal_uInt64)ev->u.ulval;
     455           0 :                     ev->et = ET_uhyper;
     456           0 :                     return ev;
     457             :                 case ET_hyper:
     458           1 :                     if (ev->u.hval < 0)
     459           0 :                         return NULL;
     460           1 :                     ev->u.uhval = (sal_uInt64)ev->u.hval;
     461           1 :                     ev->et = ET_uhyper;
     462           1 :                     return ev;
     463             :                 case ET_uhyper:
     464           0 :                     return ev;
     465             :                 case ET_boolean:
     466           0 :                     ev->u.uhval = (sal_uInt64)ev->u.bval;
     467           0 :                     ev->et = ET_uhyper;
     468           0 :                     return ev;
     469             :                 case ET_float:
     470           0 :                     if (ev->u.fval < 0.0 || ev->u.fval > SAL_MAX_UINT64)
     471           0 :                         return NULL;
     472           0 :                     ev->u.uhval = (sal_uInt64)ev->u.fval;
     473           0 :                     ev->et = ET_uhyper;
     474           0 :                     return ev;
     475             :                 case ET_double:
     476           0 :                     if (ev->u.dval < 0.0 || ev->u.dval > SAL_MAX_UINT64)
     477           0 :                         return NULL;
     478           0 :                     ev->u.uhval = (sal_uInt64)ev->u.dval;
     479           0 :                     ev->et = ET_uhyper;
     480           0 :                     return ev;
     481             :                 case ET_byte:
     482           0 :                     ev->u.uhval = (sal_uInt64)ev->u.byval;
     483           0 :                     ev->et = ET_uhyper;
     484           0 :                     return ev;
     485             :                 default:
     486             :                     OSL_ASSERT(false);
     487           0 :                     return NULL;
     488             :             }
     489             :         case ET_boolean:
     490           0 :             switch (ev->et)
     491             :             {
     492             :                 case ET_short:
     493           0 :                     ev->u.bval = ev->u.sval != 0;
     494           0 :                     ev->et = ET_boolean;
     495           0 :                     return ev;
     496             :                 case ET_ushort:
     497           0 :                     ev->u.bval = ev->u.usval != 0;
     498           0 :                     ev->et = ET_boolean;
     499           0 :                     return ev;
     500             :                 case ET_long:
     501           0 :                     ev->u.bval = ev->u.lval != 0;
     502           0 :                     ev->et = ET_boolean;
     503           0 :                     return ev;
     504             :                 case ET_ulong:
     505           0 :                     ev->u.bval = ev->u.ulval != 0;
     506           0 :                     ev->et = ET_boolean;
     507           0 :                     return ev;
     508             :                 case ET_hyper:
     509           0 :                     ev->u.bval = ev->u.hval != 0;
     510           0 :                     ev->et = ET_boolean;
     511           0 :                     return ev;
     512             :                 case ET_uhyper:
     513           0 :                     ev->u.bval = ev->u.uhval != 0;
     514           0 :                     ev->et = ET_boolean;
     515           0 :                     return ev;
     516             :                 case ET_boolean:
     517           0 :                     return ev;
     518             :                 case ET_float:
     519           0 :                     ev->u.bval = ev->u.fval != 0.0;
     520           0 :                     ev->et = ET_boolean;
     521           0 :                     return ev;
     522             :                 case ET_double:
     523           0 :                     ev->u.bval = ev->u.dval != 0.0;
     524           0 :                     ev->et = ET_boolean;
     525           0 :                     return ev;
     526             :                 case ET_byte:
     527           0 :                     ev->u.bval = ev->u.byval != 0;
     528           0 :                     ev->et = ET_boolean;
     529           0 :                     return ev;
     530             :                 default:
     531             :                     OSL_ASSERT(false);
     532           0 :                     return NULL;
     533             :             }
     534             :         case ET_float:
     535          20 :             switch (ev->et)
     536             :             {
     537             :                 case ET_short:
     538           0 :                     ev->u.fval = (float)ev->u.sval;
     539           0 :                     ev->et = ET_float;
     540           0 :                     return ev;
     541             :                 case ET_ushort:
     542           0 :                     ev->u.fval = (float)ev->u.usval;
     543           0 :                     ev->et = ET_float;
     544           0 :                     return ev;
     545             :                 case ET_long:
     546           0 :                     ev->u.fval = (float)ev->u.lval;
     547           0 :                     ev->et = ET_float;
     548           0 :                     return ev;
     549             :                 case ET_ulong:
     550           0 :                     ev->u.fval = (float)ev->u.ulval;
     551           0 :                     ev->et = ET_float;
     552           0 :                     return ev;
     553             :                 case ET_hyper:
     554           0 :                     ev->u.fval = (float)ev->u.hval;
     555           0 :                     ev->et = ET_float;
     556           0 :                     return ev;
     557             :                 case ET_uhyper:
     558           0 :                     if ((float)ev->u.ulval > FLT_MAX)
     559           0 :                         return NULL;
     560           0 :                     ev->u.fval = (float)ev->u.ulval;
     561           0 :                     ev->et = ET_float;
     562           0 :                     return ev;
     563             :                 case ET_boolean:
     564           0 :                     ev->u.fval = ev->u.bval ? 1.0f : 0.0f;
     565           0 :                     ev->et = ET_float;
     566           0 :                     return ev;
     567             :                 case ET_float:
     568           0 :                     return ev;
     569             :                 case ET_double:
     570          20 :                     if ((float)ev->u.dval > FLT_MAX || (float)ev->u.dval < -FLT_MAX)
     571           0 :                         return NULL;
     572          20 :                     ev->u.fval = (float)ev->u.dval;
     573          20 :                     ev->et = ET_float;
     574          20 :                     return ev;
     575             :                 case ET_byte:
     576           0 :                     ev->u.fval = (float)ev->u.byval;
     577           0 :                     ev->et = ET_float;
     578           0 :                     return ev;
     579             :                 default:
     580             :                     OSL_ASSERT(false);
     581           0 :                     return NULL;
     582             :             }
     583             :         case ET_double:
     584         100 :             switch (ev->et)
     585             :             {
     586             :                 case ET_short:
     587          50 :                     ev->u.dval = (double)ev->u.sval;
     588          50 :                     ev->et = ET_double;
     589          50 :                     return ev;
     590             :                 case ET_ushort:
     591           0 :                     ev->u.dval = (double)ev->u.usval;
     592           0 :                     ev->et = ET_double;
     593           0 :                     return ev;
     594             :                 case ET_long:
     595           0 :                     ev->u.dval = (double)ev->u.lval;
     596           0 :                     ev->et = ET_double;
     597           0 :                     return ev;
     598             :                 case ET_ulong:
     599           0 :                     ev->u.dval = (double)ev->u.ulval;
     600           0 :                     ev->et = ET_double;
     601           0 :                     return ev;
     602             :                 case ET_hyper:
     603          50 :                     ev->u.dval = (double)ev->u.hval;
     604          50 :                     ev->et = ET_double;
     605          50 :                     return ev;
     606             :                 case ET_uhyper:
     607           0 :                     if ((double)ev->u.dval > FLT_MAX || (double)ev->u.dval < -FLT_MAX)
     608           0 :                         return NULL;
     609           0 :                     ev->u.dval = (double)ev->u.ulval;
     610           0 :                     ev->et = ET_double;
     611           0 :                     return ev;
     612             :                 case ET_boolean:
     613           0 :                     ev->u.dval = ev->u.bval ? 1.0 : 0.0;
     614           0 :                     ev->et = ET_double;
     615           0 :                     return ev;
     616             :                 case ET_float:
     617           0 :                     ev->u.dval = (double)ev->u.fval;
     618           0 :                     ev->et = ET_double;
     619           0 :                     return ev;
     620             :                 case ET_double:
     621           0 :                     return ev;
     622             :                 case ET_byte:
     623           0 :                     ev->u.dval = (double)ev->u.byval;
     624           0 :                     ev->et = ET_double;
     625           0 :                     return ev;
     626             :                 default:
     627             :                     OSL_ASSERT(false);
     628           0 :                     return NULL;
     629             :             }
     630             :         case ET_byte:
     631         488 :             switch (ev->et)
     632             :             {
     633             :                 case ET_short:
     634           0 :                     if (ev->u.sval < SAL_MIN_INT8 || ev->u.sval > SAL_MAX_UINT8)
     635           0 :                         return NULL;
     636           0 :                     ev->u.byval = (sal_uChar)ev->u.sval;
     637           0 :                     ev->et = ET_byte;
     638           0 :                     return ev;
     639             :                 case ET_ushort:
     640           0 :                     if (ev->u.usval > SAL_MAX_UINT8)
     641           0 :                         return NULL;
     642           0 :                     ev->u.byval = (sal_uChar)ev->u.usval;
     643           0 :                     ev->et = ET_byte;
     644           0 :                     return ev;
     645             :                 case ET_long:
     646           0 :                     if (ev->u.lval < SAL_MIN_INT8 || ev->u.lval > SAL_MAX_UINT8)
     647           0 :                         return NULL;
     648           0 :                     ev->u.byval = (sal_uChar) ev->u.lval;
     649           0 :                     ev->et = ET_byte;
     650           0 :                     return ev;
     651             :                 case ET_ulong:
     652           0 :                     if (ev->u.ulval > SAL_MAX_UINT8)
     653           0 :                         return NULL;
     654           0 :                     ev->u.byval = (sal_uChar) ev->u.ulval;
     655           0 :                     ev->et = ET_byte;
     656           0 :                     return ev;
     657             :                 case ET_hyper:
     658         488 :                     if (ev->u.hval < SAL_MIN_INT8 || ev->u.hval > SAL_MAX_UINT8)
     659           0 :                         return NULL;
     660         488 :                     ev->u.byval = (sal_uChar) ev->u.hval;
     661         488 :                     ev->et = ET_byte;
     662         488 :                     return ev;
     663             :                 case ET_uhyper:
     664           0 :                     if (ev->u.uhval > SAL_MAX_UINT8)
     665           0 :                         return NULL;
     666           0 :                     ev->u.byval = (sal_uChar) ev->u.uhval;
     667           0 :                     ev->et = ET_byte;
     668           0 :                     return ev;
     669             :                 case ET_boolean:
     670           0 :                     ev->u.byval = ev->u.bval ? 1 : 0;
     671           0 :                     ev->et = ET_byte;
     672           0 :                     return ev;
     673             :                 case ET_float:
     674           0 :                     if (ev->u.fval < SAL_MIN_INT8 || ev->u.fval > SAL_MAX_UINT8)
     675           0 :                         return NULL;
     676           0 :                     ev->u.byval = (sal_uChar) ev->u.fval;
     677           0 :                     ev->et = ET_byte;
     678           0 :                     return ev;
     679             :                 case ET_double:
     680           0 :                     if (ev->u.dval < SAL_MIN_INT8 || ev->u.dval > SAL_MAX_UINT8)
     681           0 :                         return NULL;
     682           0 :                     ev->u.byval = (sal_uChar) ev->u.dval;
     683           0 :                     ev->et = ET_byte;
     684           0 :                     return ev;
     685             :                 case ET_byte:
     686           0 :                     return ev;
     687             :                 default:
     688             :                     OSL_ASSERT(false);
     689           0 :                     return NULL;
     690             :             }
     691             :         default:
     692             :             OSL_ASSERT(false);
     693           0 :             return NULL;
     694             :     }
     695             : }
     696             : 
     697             : /*
     698             :  * Evaluate the expression with the evaluation kind requested. Supported
     699             :  * evaluation kinds are
     700             :  * - EK_const:      The expression must evaluate to a constant
     701             :  * - EK_positive_int:   The expression must further evaluate to a
     702             :  *          positive integer
     703             :  */
     704             : static AstExprValue *
     705     3529503 : eval_kind(AstExprValue *ev, EvalKind ek)
     706             : {
     707     3529503 :     if (ek == EK_const)
     708     3529503 :         return ev;
     709           0 :     if (ek == EK_positive_int)
     710           0 :         return coerce_value(ev, ET_ulong);
     711             : 
     712           0 :     return NULL;
     713             : }
     714             : 
     715       14169 : AstExprValue* AstExpression::coerce(ExprType t, sal_Bool bAssign)
     716             : {
     717             :     AstExprValue *copy;
     718             : 
     719             :     /*
     720             :      * Is it already of the right type?
     721             :      */
     722       14169 :     if (m_exprValue != NULL && m_exprValue->et == t)
     723          64 :         return m_exprValue;
     724             :     /*
     725             :      * OK, must coerce
     726             :      *
     727             :      * First, evaluate it, then try to coerce result type
     728             :      * If already evaluated, return the result
     729             :      */
     730       14105 :     m_exprValue = eval_internal(EK_const);
     731       14105 :     if (m_exprValue == NULL)
     732           0 :         return NULL;
     733             : 
     734             :     /*
     735             :      * Create a copy to contain coercion result
     736             :      */
     737       14105 :     copy = new AstExprValue;
     738             : 
     739       14105 :     copy->et = m_exprValue->et;
     740       14105 :     switch (m_exprValue->et)
     741             :     {
     742             :         case ET_short:
     743          67 :             copy->u.sval = m_exprValue->u.sval;
     744          67 :             break;
     745             :         case ET_ushort:
     746           0 :             copy->u.usval = m_exprValue->u.usval;
     747           0 :             break;
     748             :         case ET_long:
     749          15 :             copy->u.lval = m_exprValue->u.lval;
     750          15 :             break;
     751             :         case ET_ulong:
     752           0 :             copy->u.ulval = m_exprValue->u.ulval;
     753           0 :             break;
     754             :         case ET_hyper:
     755       13953 :             copy->u.hval = m_exprValue->u.hval;
     756       13953 :             break;
     757             :         case ET_uhyper:
     758           0 :             copy->u.uhval = m_exprValue->u.uhval;
     759           0 :             break;
     760             :         case ET_boolean:
     761           0 :             copy->u.bval = m_exprValue->u.bval;
     762           0 :             break;
     763             :         case ET_float:
     764           0 :             copy->u.fval = m_exprValue->u.fval;
     765           0 :             break;
     766             :         case ET_double:
     767          70 :             copy->u.dval = m_exprValue->u.dval;
     768          70 :             break;
     769             :           case ET_byte:
     770           0 :             copy->u.byval = m_exprValue->u.byval;
     771           0 :             break;
     772             :         default:
     773             :             OSL_ASSERT(false);
     774           0 :             break;
     775             :     }
     776             : 
     777       14105 :     AstExprValue* const coerced(coerce_value(copy, t));
     778       14105 :     if (!coerced)
     779           0 :         delete copy;
     780             : 
     781       14105 :     if (bAssign)
     782       14105 :         m_exprValue = coerced;
     783             : 
     784       14105 :     return coerced;
     785             : }
     786             : 
     787     1757584 : void AstExpression::evaluate(EvalKind ek)
     788             : {
     789     1757584 :     m_exprValue = eval_internal(ek);
     790     1757584 :     m_exprValue = eval_kind(m_exprValue, ek);
     791     1757584 : }
     792             : 
     793           0 : sal_Bool AstExpression::operator==(AstExpression *pExpr)
     794             : {
     795           0 :     sal_Bool bRet = sal_False;
     796           0 :     if (m_combOperator != pExpr->getCombOperator())
     797           0 :         return bRet;
     798           0 :     evaluate(EK_const);
     799           0 :     pExpr->evaluate(EK_const);
     800           0 :     if (m_exprValue == NULL || pExpr->getExprValue() == NULL)
     801           0 :         return bRet;
     802           0 :     if (m_exprValue->et != pExpr->getExprValue()->et)
     803           0 :         return bRet;
     804           0 :     switch (m_exprValue->et)
     805             :     {
     806             :         case ET_short:
     807           0 :             bRet = (m_exprValue->u.sval == pExpr->getExprValue()->u.sval) ? sal_True : sal_False;
     808           0 :             break;
     809             :         case ET_ushort:
     810           0 :             bRet = (m_exprValue->u.usval == pExpr->getExprValue()->u.usval) ? sal_True : sal_False;
     811           0 :             break;
     812             :         case ET_long:
     813           0 :             bRet = (m_exprValue->u.lval == pExpr->getExprValue()->u.lval) ? sal_True : sal_False;
     814           0 :             break;
     815             :         case ET_ulong:
     816           0 :             bRet = (m_exprValue->u.ulval == pExpr->getExprValue()->u.ulval) ? sal_True : sal_False;
     817           0 :             break;
     818             :         case ET_hyper:
     819           0 :             bRet = (m_exprValue->u.hval == pExpr->getExprValue()->u.hval) ? sal_True : sal_False;
     820           0 :             break;
     821             :         case ET_uhyper:
     822           0 :             bRet = (m_exprValue->u.uhval == pExpr->getExprValue()->u.uhval) ? sal_True : sal_False;
     823           0 :             break;
     824             :         case ET_float:
     825           0 :             bRet = (m_exprValue->u.fval == pExpr->getExprValue()->u.fval) ? sal_True : sal_False;
     826           0 :             break;
     827             :         case ET_double:
     828           0 :             bRet = (m_exprValue->u.dval == pExpr->getExprValue()->u.dval) ? sal_True : sal_False;
     829           0 :             break;
     830             :         case ET_byte:
     831           0 :             bRet = (m_exprValue->u.byval == pExpr->getExprValue()->u.byval) ? sal_True : sal_False;
     832           0 :             break;
     833             :         case ET_boolean:
     834           0 :             bRet = (m_exprValue->u.lval == pExpr->getExprValue()->u.lval) ? sal_True : sal_False;
     835           0 :             break;
     836             :         default:
     837             :             OSL_ASSERT(false);
     838           0 :             bRet = sal_False;
     839           0 :             break;
     840             :     }
     841             : 
     842           0 :     return bRet;
     843             : }
     844             : 
     845      878559 : sal_Bool AstExpression::compare(AstExpression *pExpr)
     846             : {
     847      878559 :     bool bRet = sal_False;
     848      878559 :     if (m_combOperator != pExpr->getCombOperator())
     849           0 :         return bRet;
     850      878559 :     evaluate(EK_const);
     851      878559 :     pExpr->evaluate(EK_const);
     852      878559 :     if (m_exprValue == NULL || pExpr->getExprValue() == NULL)
     853           0 :         return bRet;
     854      878559 :     if (m_exprValue->et != pExpr->getExprValue()->et)
     855           0 :         return bRet;
     856      878559 :     switch (m_exprValue->et)
     857             :     {
     858             :         case ET_short:
     859           0 :             bRet = (m_exprValue->u.sval == pExpr->getExprValue()->u.sval) ? sal_True : sal_False;
     860           0 :             break;
     861             :         case ET_ushort:
     862           0 :             bRet = (m_exprValue->u.usval == pExpr->getExprValue()->u.usval) ? sal_True : sal_False;
     863           0 :             break;
     864             :         case ET_long:
     865      878559 :             bRet = (m_exprValue->u.lval == pExpr->getExprValue()->u.lval) ? sal_True : sal_False;
     866      878559 :             break;
     867             :         case ET_ulong:
     868           0 :             bRet = (m_exprValue->u.ulval == pExpr->getExprValue()->u.ulval) ? sal_True : sal_False;
     869           0 :             break;
     870             :         case ET_hyper:
     871           0 :             bRet = (m_exprValue->u.hval == pExpr->getExprValue()->u.hval) ? sal_True : sal_False;
     872           0 :             break;
     873             :         case ET_uhyper:
     874           0 :             bRet = (m_exprValue->u.uhval == pExpr->getExprValue()->u.uhval) ? sal_True : sal_False;
     875           0 :             break;
     876             :         case ET_float:
     877           0 :             bRet = (m_exprValue->u.fval == pExpr->getExprValue()->u.fval) ? sal_True : sal_False;
     878           0 :             break;
     879             :         case ET_double:
     880           0 :             bRet = (m_exprValue->u.dval == pExpr->getExprValue()->u.dval) ? sal_True : sal_False;
     881           0 :             break;
     882             :         case ET_byte:
     883           0 :             bRet = (m_exprValue->u.byval == pExpr->getExprValue()->u.byval) ? sal_True : sal_False;
     884           0 :             break;
     885             :         case ET_boolean:
     886           0 :             bRet = (m_exprValue->u.lval == pExpr->getExprValue()->u.lval) ? sal_True : sal_False;
     887           0 :             break;
     888             :         default:
     889             :             OSL_ASSERT(false);
     890           0 :             bRet = sal_False;
     891           0 :             break;
     892             :     }
     893      878559 :     return bRet;
     894             : }
     895             : 
     896       77777 : void AstExpression::fillDefinitionDetails()
     897             : {
     898       77777 :     m_pScope = idlc()->scopes()->depth() > 0 ? idlc()->scopes()->top() : NULL;
     899       77777 :     m_lineNo = idlc()->getLineNumber();
     900       77777 :     m_fileName = idlc()->getFileName();
     901       77777 : }
     902             : 
     903     1771919 : AstExprValue* AstExpression::eval_internal(EvalKind ek)
     904             : {
     905             :     /*
     906             :      * Already evaluated?
     907             :      */
     908     1771919 :     if ( m_exprValue != NULL )
     909     1771755 :         return eval_kind(m_exprValue, ek);
     910             :     /*
     911             :      * OK, must evaluate operator
     912             :      */
     913         164 :     switch (m_combOperator)
     914             :     {
     915             :         case EC_add:
     916             :         case EC_minus:
     917             :         case EC_mul:
     918             :         case EC_div:
     919             :         case EC_mod:
     920          50 :             m_exprValue = eval_bin_op(ek);
     921          50 :             return eval_kind(m_exprValue, ek);
     922             :         case EC_or:
     923             :         case EC_xor:
     924             :         case EC_and:
     925             :         case EC_left:
     926             :         case EC_right:
     927          16 :             m_exprValue = eval_bit_op(ek);
     928          16 :             return eval_kind(m_exprValue, ek);
     929             :         case EC_u_plus:
     930             :         case EC_u_minus:
     931             :         case EC_bit_neg:
     932           0 :             m_exprValue = eval_un_op(ek);
     933           0 :             return eval_kind(m_exprValue, ek);
     934             :         case EC_symbol:
     935          98 :             m_exprValue = eval_symbol(ek);
     936          98 :             return eval_kind(m_exprValue, ek);
     937             :         case EC_none:
     938           0 :             return NULL;
     939             :     }
     940             : 
     941           0 :     return NULL;
     942             : }
     943             : 
     944          50 : AstExprValue* AstExpression::eval_bin_op(EvalKind ek)
     945             : {
     946          50 :     ExprType eType = ET_double;
     947             : 
     948          50 :     if ( m_combOperator == EC_mod )
     949           0 :         eType = ET_hyper;
     950             : 
     951          50 :     if (ek != EK_const && ek != EK_positive_int)
     952           0 :         return NULL;
     953          50 :     if (m_subExpr1 == NULL || m_subExpr2 == NULL)
     954           0 :         return NULL;
     955          50 :     m_subExpr1->setExprValue(m_subExpr1->eval_internal(ek));
     956          50 :     if (m_subExpr1->getExprValue() == NULL)
     957           0 :         return NULL;
     958          50 :     m_subExpr1->setExprValue(m_subExpr1->coerce(eType));
     959          50 :     if (m_subExpr1->getExprValue() == NULL)
     960           0 :         return NULL;
     961          50 :     m_subExpr2->setExprValue(m_subExpr2->eval_internal(ek));
     962          50 :     if (m_subExpr2->getExprValue() == NULL)
     963           0 :         return NULL;
     964          50 :     m_subExpr2->setExprValue(m_subExpr2->coerce(eType));
     965          50 :     if (m_subExpr2->getExprValue() == NULL)
     966           0 :         return NULL;
     967             : 
     968          50 :     std::auto_ptr< AstExprValue > retval(new AstExprValue());
     969          50 :     retval->et = eType;
     970             : 
     971          50 :     switch (m_combOperator)
     972             :     {
     973             :         case EC_mod:
     974           0 :             if (m_subExpr2->getExprValue()->u.hval == 0)
     975           0 :                 return NULL;
     976           0 :             retval->u.hval = m_subExpr1->getExprValue()->u.hval % m_subExpr2->getExprValue()->u.hval;
     977           0 :             break;
     978             :         case EC_add:
     979          50 :             retval->u.dval = m_subExpr1->getExprValue()->u.dval + m_subExpr2->getExprValue()->u.dval;
     980          50 :             break;
     981             :         case EC_minus:
     982           0 :             retval->u.dval = m_subExpr1->getExprValue()->u.dval - m_subExpr2->getExprValue()->u.dval;
     983           0 :             break;
     984             :         case EC_mul:
     985           0 :             retval->u.dval = m_subExpr1->getExprValue()->u.dval * m_subExpr2->getExprValue()->u.dval;
     986           0 :             break;
     987             :         case EC_div:
     988           0 :             if (m_subExpr2->getExprValue()->u.dval == 0.0)
     989           0 :                 return NULL;
     990           0 :             retval->u.dval = m_subExpr1->getExprValue()->u.dval / m_subExpr2->getExprValue()->u.dval;
     991           0 :             break;
     992             :         default:
     993           0 :             return NULL;
     994             :     }
     995             : 
     996          50 :     return retval.release();
     997             : }
     998             : 
     999          16 : AstExprValue* AstExpression::eval_bit_op(EvalKind ek)
    1000             : {
    1001          16 :     if (ek != EK_const && ek != EK_positive_int)
    1002           0 :         return NULL;
    1003          16 :     if (m_subExpr1 == NULL || m_subExpr2 == NULL)
    1004           0 :         return NULL;
    1005          16 :     m_subExpr1->setExprValue(m_subExpr1->eval_internal(ek));
    1006          16 :     if (m_subExpr1->getExprValue() == NULL)
    1007           0 :         return NULL;
    1008          16 :     m_subExpr1->setExprValue(m_subExpr1->coerce(ET_long));
    1009          16 :     if (m_subExpr1->getExprValue() == NULL)
    1010           0 :         return NULL;
    1011          16 :     m_subExpr2->setExprValue(m_subExpr2->eval_internal(ek));
    1012          16 :     if (m_subExpr2->getExprValue() == NULL)
    1013           0 :         return NULL;
    1014          16 :     m_subExpr2->setExprValue(m_subExpr2->coerce(ET_long));
    1015          16 :     if (m_subExpr2->getExprValue() == NULL)
    1016           0 :         return NULL;
    1017             : 
    1018             : SAL_WNODEPRECATED_DECLARATIONS_PUSH
    1019          16 :     std::auto_ptr< AstExprValue > retval(new AstExprValue());
    1020             : SAL_WNODEPRECATED_DECLARATIONS_POP
    1021          16 :     retval->et = ET_long;
    1022             : 
    1023          16 :     switch (m_combOperator)
    1024             :     {
    1025             :         case EC_or:
    1026          16 :             retval->u.lval = m_subExpr1->getExprValue()->u.lval | m_subExpr2->getExprValue()->u.lval;
    1027          16 :             break;
    1028             :         case EC_xor:
    1029           0 :             retval->u.lval = m_subExpr1->getExprValue()->u.lval ^ m_subExpr2->getExprValue()->u.lval;
    1030           0 :             break;
    1031             :         case EC_and:
    1032           0 :             retval->u.lval = m_subExpr1->getExprValue()->u.lval & m_subExpr2->getExprValue()->u.lval;
    1033           0 :             break;
    1034             :         case EC_left:
    1035           0 :             retval->u.lval = m_subExpr1->getExprValue()->u.lval << m_subExpr2->getExprValue()->u.lval;
    1036           0 :             break;
    1037             :         case EC_right:
    1038           0 :             retval->u.lval = m_subExpr1->getExprValue()->u.lval >> m_subExpr2->getExprValue()->u.lval;
    1039           0 :             break;
    1040             :         default:
    1041           0 :             return NULL;
    1042             :     }
    1043             : 
    1044          16 :     return retval.release();
    1045             : }
    1046             : 
    1047           0 : AstExprValue* AstExpression::eval_un_op(EvalKind ek)
    1048             : {
    1049           0 :     if (m_exprValue != NULL)
    1050           0 :         return m_exprValue;
    1051             : 
    1052           0 :     if (ek != EK_const && ek != EK_positive_int)
    1053           0 :         return NULL;
    1054           0 :     if (m_subExpr1 == NULL)
    1055           0 :         return NULL;
    1056           0 :     m_subExpr1->setExprValue(m_subExpr1->eval_internal(ek));
    1057           0 :     if (m_subExpr1->getExprValue() == NULL)
    1058           0 :         return NULL;
    1059           0 :     m_subExpr1->setExprValue(m_subExpr1->coerce(ET_double));
    1060           0 :     if (m_subExpr1->getExprValue() == NULL)
    1061           0 :         return NULL;
    1062             : 
    1063             : SAL_WNODEPRECATED_DECLARATIONS_PUSH
    1064           0 :     std::auto_ptr< AstExprValue > retval(new AstExprValue());
    1065             : SAL_WNODEPRECATED_DECLARATIONS_POP
    1066           0 :     retval->et = ET_double;
    1067             : 
    1068           0 :     switch (m_combOperator)
    1069             :     {
    1070             :         case EC_u_plus:
    1071           0 :             retval->u.lval = m_subExpr1->getExprValue()->u.lval;
    1072           0 :             break;
    1073             :         case EC_u_minus:
    1074           0 :             retval->u.lval = -(m_subExpr1->getExprValue()->u.lval);
    1075           0 :             break;
    1076             :         case EC_bit_neg:
    1077           0 :             m_subExpr1->setExprValue(m_subExpr1->coerce(ET_long));
    1078           0 :             if (m_subExpr1->getExprValue() == NULL)
    1079           0 :                 return NULL;
    1080           0 :             retval->u.lval = ~m_subExpr1->getExprValue()->u.lval;
    1081           0 :             break;
    1082             :         default:
    1083           0 :             return NULL;
    1084             :     }
    1085             : 
    1086           0 :     return retval.release();
    1087             : }
    1088             : 
    1089          98 : AstExprValue* AstExpression::eval_symbol(EvalKind ek)
    1090             : {
    1091          98 :     AstScope        *pScope = 0;
    1092             :     AstDeclaration  *pDecl;
    1093             :     AstConstant     *pConst;
    1094             : 
    1095             :     /*
    1096             :      * Is there a symbol stored?
    1097             :      */
    1098          98 :     if (m_pSymbolicName == NULL)
    1099             :     {
    1100           0 :         idlc()->error()->evalError(this);
    1101           0 :         return NULL;
    1102             :     }
    1103             :     /*
    1104             :      * Get current scope for lookup
    1105             :      */
    1106          98 :     if (idlc()->scopes()->depth() > 0)
    1107          98 :         pScope = idlc()->scopes()->topNonNull();
    1108          98 :     if ( !pScope )
    1109             :     {
    1110           0 :         idlc()->error()->lookupError(*m_pSymbolicName);
    1111           0 :         return NULL;
    1112             :     }
    1113             :     /*
    1114             :      * Do lookup
    1115             :      */
    1116          98 :     pDecl = pScope->lookupByName(*m_pSymbolicName);
    1117          98 :     if (pDecl == NULL)
    1118             :     {
    1119           0 :         idlc()->error()->lookupError(*m_pSymbolicName);
    1120           0 :         return NULL;
    1121             :     }
    1122             :     /*
    1123             :      * Is it a constant?
    1124             :      */
    1125          98 :     if (pDecl->getNodeType() != NT_const &&
    1126           0 :         pDecl->getNodeType() != NT_enum_val)
    1127             :     {
    1128           0 :         idlc()->error()->constantExpected(pDecl, *m_pSymbolicName);
    1129           0 :         return NULL;
    1130             :     }
    1131          98 :     if (!idlc()->error()->checkPublished(pDecl))
    1132             :     {
    1133           0 :         return NULL;
    1134             :     }
    1135             :     /*
    1136             :      * OK, now evaluate the constant we just got, to produce its value
    1137             :      */
    1138          98 :     pConst = static_cast< AstConstant* >(pDecl);
    1139          98 :     if (pConst == NULL)
    1140           0 :         return NULL;
    1141          98 :     return pConst->getConstValue()->eval_internal(ek);
    1142             : }
    1143             : 
    1144           0 : OString AstExpression::toString()
    1145             : {
    1146           0 :     OString exprStr;
    1147           0 :     if ( m_combOperator == EC_symbol )
    1148           0 :         return *m_pSymbolicName;
    1149             : 
    1150           0 :     if ( m_exprValue )
    1151             :     {
    1152           0 :         switch (m_exprValue->et)
    1153             :         {
    1154             :             case ET_short:
    1155           0 :                 return OString::valueOf((sal_Int32)m_exprValue->u.sval);
    1156             :             case ET_ushort:
    1157           0 :                 return OString::valueOf((sal_Int32)m_exprValue->u.usval);
    1158             :             case ET_long:
    1159           0 :                 return OString::valueOf(m_exprValue->u.lval);
    1160             :             case ET_ulong:
    1161           0 :                 return OString::valueOf((sal_Int32)m_exprValue->u.ulval);
    1162             :             case ET_hyper:
    1163           0 :                 return OString::valueOf(m_exprValue->u.hval);
    1164             :             case ET_uhyper:
    1165           0 :                 return OString::valueOf((sal_Int64)m_exprValue->u.uhval);
    1166             :             case ET_float:
    1167           0 :                 return OString::valueOf(m_exprValue->u.fval);
    1168             :             case ET_double:
    1169           0 :                 return OString::valueOf(m_exprValue->u.dval);
    1170             :             case ET_byte:
    1171           0 :                 return OString::valueOf((sal_Int32)m_exprValue->u.byval);
    1172             :             case ET_boolean:
    1173           0 :                 if ( m_exprValue->u.lval == 0)
    1174           0 :                     return OString("FALSE");
    1175             :                 else
    1176           0 :                     return OString("TRUE");
    1177             :             default:
    1178             :                 OSL_ASSERT(false);
    1179           0 :                 return OString();
    1180             :         }
    1181             :     }
    1182             : 
    1183           0 :     switch (m_combOperator)
    1184             :     {
    1185             :         case EC_u_plus:
    1186           0 :             exprStr += OString("+");
    1187           0 :             break;
    1188             :         case EC_u_minus:
    1189           0 :             exprStr += OString("-");
    1190           0 :             break;
    1191             :         case EC_bit_neg:
    1192           0 :             exprStr += OString("~");
    1193           0 :             break;
    1194             :         default:
    1195           0 :             break;
    1196             :     }
    1197           0 :     if ( m_subExpr1 )
    1198           0 :         exprStr += m_subExpr1->toString();
    1199           0 :     switch (m_combOperator)
    1200             :     {
    1201             :         case EC_add:
    1202           0 :             exprStr += OString(" + ");
    1203           0 :             break;
    1204             :         case EC_minus:
    1205           0 :             exprStr += OString(" - ");
    1206           0 :             break;
    1207             :         case EC_mul:
    1208           0 :             exprStr += OString(" * ");
    1209           0 :             break;
    1210             :         case EC_div:
    1211           0 :             exprStr += OString(" / ");
    1212           0 :             break;
    1213             :         case EC_mod:
    1214           0 :             exprStr += OString(" % ");
    1215           0 :             break;
    1216             :         case EC_or:
    1217           0 :             exprStr += OString(" | ");
    1218           0 :             break;
    1219             :         case EC_xor:
    1220           0 :             exprStr += OString(" ^ ");
    1221           0 :             break;
    1222             :         case EC_and:
    1223           0 :             exprStr += OString(" & ");
    1224           0 :             break;
    1225             :         case EC_left:
    1226           0 :             exprStr += OString(" << ");
    1227           0 :             break;
    1228             :         case EC_right:
    1229           0 :             exprStr += OString(" >> ");
    1230           0 :             break;
    1231             :         default:
    1232           0 :             break;
    1233             :     }
    1234             : 
    1235           0 :     if ( m_subExpr2 )
    1236           0 :         exprStr += m_subExpr2->toString();
    1237             : 
    1238           0 :     return exprStr;
    1239             : }
    1240             : 
    1241             : // Convert the type of an AST_Expression to a char *
    1242       11695 : const sal_Char* SAL_CALL exprTypeToString(ExprType t)
    1243             : {
    1244       11695 :     switch (t)
    1245             :     {
    1246             :         case ET_short:
    1247        2043 :             return "short";
    1248             :         case ET_ushort:
    1249           2 :             return "unsigned short";
    1250             :         case ET_long:
    1251        9347 :             return "long";
    1252             :         case ET_ulong:
    1253           2 :             return "unsigned long";
    1254             :         case ET_hyper:
    1255          31 :             return "hyper";
    1256             :         case ET_uhyper:
    1257           2 :             return "unsigned hyper";
    1258             :         case ET_float:
    1259          20 :             return "float";
    1260             :         case ET_double:
    1261           0 :             return "double";
    1262             :         case ET_char:
    1263           0 :             return "char";
    1264             :         case ET_byte:
    1265         248 :             return "byte";
    1266             :         case ET_boolean:
    1267           0 :             return "boolean";
    1268             :         case ET_string:
    1269           0 :             return "string";
    1270             :         case ET_any:
    1271           0 :             return "any";
    1272             :         case ET_type:
    1273           0 :             return "type";
    1274             :         case ET_void:
    1275           0 :             return "void";
    1276             :         case ET_none:
    1277           0 :             return "none";
    1278             :     }
    1279             : 
    1280           0 :     return ("unkown");
    1281             : }
    1282             : 
    1283             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10