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

Generated by: LCOV version 1.10