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

Generated by: LCOV version 1.10