LCOV - code coverage report
Current view: top level - idlc/source - astexpression.cxx (source / functions) Hit Total Coverage
Test: commit c8344322a7af75b84dd3ca8f78b05543a976dfd5 Lines: 205 772 26.6 %
Date: 2015-06-13 12:38:46 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 <osl/diagnose.h>
      27             : 
      28             : #include <limits.h>
      29             : #include <float.h>
      30             : #include <memory>
      31             : 
      32           6 : 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           6 :     , m_pSymbolicName(NULL)
      38             : {
      39           6 :     fillDefinitionDetails();
      40             : 
      41           6 : }
      42             : 
      43          41 : AstExpression::AstExpression(sal_Int32 l)
      44             :     : m_combOperator(EC_none)
      45             :     , m_subExpr1(NULL)
      46             :     , m_subExpr2(NULL)
      47             :     , m_exprValue(NULL)
      48          41 :     , m_pSymbolicName(NULL)
      49             : {
      50          41 :     fillDefinitionDetails();
      51             : 
      52          41 :     m_exprValue = new AstExprValue();
      53          41 :     m_exprValue->et = ET_long;
      54          41 :     m_exprValue->u.lval = l;
      55          41 : }
      56             : 
      57           1 : 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           1 :     , m_pSymbolicName(NULL)
      63             : {
      64           1 :     fillDefinitionDetails();
      65             : 
      66           1 :     m_exprValue = new AstExprValue();
      67           1 :     m_exprValue->et = et;
      68           1 :     m_exprValue->u.lval = l;
      69           1 : }
      70             : 
      71         102 : AstExpression::AstExpression(sal_Int64  h)
      72             :     : m_combOperator(EC_none)
      73             :     , m_subExpr1(NULL)
      74             :     , m_subExpr2(NULL)
      75             :     , m_exprValue(NULL)
      76         102 :     , m_pSymbolicName(NULL)
      77             : {
      78         102 :     fillDefinitionDetails();
      79             : 
      80         102 :     m_exprValue = new AstExprValue();
      81         102 :     m_exprValue->et = ET_hyper;
      82         102 :     m_exprValue->u.hval = h;
      83         102 : }
      84             : 
      85           6 : AstExpression::AstExpression(sal_uInt64 uh)
      86             :     : m_combOperator(EC_none)
      87             :     , m_subExpr1(NULL)
      88             :     , m_subExpr2(NULL)
      89             :     , m_exprValue(NULL)
      90           6 :     , m_pSymbolicName(NULL)
      91             : {
      92           6 :     fillDefinitionDetails();
      93             : 
      94           6 :     m_exprValue = new AstExprValue();
      95           6 :     m_exprValue->et = ET_uhyper;
      96           6 :     m_exprValue->u.uhval = uh;
      97           6 : }
      98             : 
      99           2 : AstExpression::AstExpression(double d)
     100             :     : m_combOperator(EC_none)
     101             :     , m_subExpr1(NULL)
     102             :     , m_subExpr2(NULL)
     103             :     , m_exprValue(NULL)
     104           2 :     , m_pSymbolicName(NULL)
     105             : {
     106           2 :     fillDefinitionDetails();
     107             : 
     108           2 :     m_exprValue = new AstExprValue();
     109           2 :     m_exprValue->et = ET_double;
     110           2 :     m_exprValue->u.dval = d;
     111           2 : }
     112             : 
     113           6 : AstExpression::AstExpression(OString* scopedName)
     114             :     : m_combOperator(EC_symbol)
     115             :     , m_subExpr1(NULL)
     116             :     , m_subExpr2(NULL)
     117             :     , m_exprValue(NULL)
     118           6 :     , m_pSymbolicName(scopedName)
     119             : {
     120           6 :     fillDefinitionDetails();
     121           6 : }
     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         105 : coerce_value(AstExprValue *ev, ExprType t)
     142             : {
     143         105 :     if (ev == NULL)
     144           0 :         return NULL;
     145             : 
     146         105 :     switch (t)
     147             :     {
     148             :         case ET_short:
     149          13 :             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          13 :                     if (ev->u.hval < SAL_MIN_INT16 || ev->u.hval > SAL_MAX_INT16)
     173           6 :                         return NULL;
     174           7 :                     ev->u.sval = (sal_Int16)ev->u.hval;
     175           7 :                     ev->et = ET_short;
     176           7 :                     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          12 :             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          12 :                     if (ev->u.hval < 0 || ev->u.hval > SAL_MAX_UINT16)
     232           6 :                         return NULL;
     233           6 :                     ev->u.usval = (sal_uInt16)ev->u.hval;
     234           6 :                     ev->et = ET_ushort;
     235           6 :                     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          28 :             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          23 :                     if (ev->u.hval < SAL_MIN_INT32 || ev->u.hval > SAL_MAX_INT32)
     287           6 :                         return NULL;
     288          17 :                     ev->u.lval = (sal_Int32)ev->u.hval;
     289          17 :                     ev->et = ET_long;
     290          17 :                     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           5 :                     if (ev->u.dval < SAL_MIN_INT32 || ev->u.dval > SAL_MAX_INT32)
     309           0 :                         return NULL;
     310           5 :                     ev->u.lval = (sal_Int32)ev->u.dval;
     311           5 :                     ev->et = ET_long;
     312           5 :                     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          12 :             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          12 :                     if (ev->u.hval < 0 || ev->u.hval > SAL_MAX_UINT32)
     344           6 :                         return NULL;
     345           6 :                     ev->u.lval = (sal_uInt32)ev->u.hval;
     346           6 :                     ev->et = ET_ulong;
     347           6 :                     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           3 :             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           3 :                     if (ev->u.uhval > SAL_MAX_INT64)
     401           3 :                         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           9 :             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           9 :                     if (ev->u.hval < 0)
     454           3 :                         return NULL;
     455           6 :                     ev->u.uhval = (sal_uInt64)ev->u.hval;
     456           6 :                     ev->et = ET_uhyper;
     457           6 :                     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           1 :             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           1 :                     if ((float)ev->u.dval > FLT_MAX || (float)ev->u.dval < -FLT_MAX)
     566           0 :                         return NULL;
     567           1 :                     ev->u.fval = (float)ev->u.dval;
     568           1 :                     ev->et = ET_float;
     569           1 :                     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          10 :             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           5 :                     ev->u.dval = (double)ev->u.lval;
     591           5 :                     ev->et = ET_double;
     592           5 :                     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           5 :                     ev->u.dval = (double)ev->u.hval;
     599           5 :                     ev->et = ET_double;
     600           5 :                     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          16 :             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          16 :                     if (ev->u.hval < SAL_MIN_INT8 || ev->u.hval > SAL_MAX_UINT8)
     654           6 :                         return NULL;
     655          10 :                     ev->u.byval = (unsigned char) ev->u.hval;
     656          10 :                     ev->et = ET_byte;
     657          10 :                     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           1 :             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         122 : eval_kind(AstExprValue *ev, EvalKind ek)
     701             : {
     702         122 :     if (ek == EK_const)
     703         122 :         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         121 : AstExprValue* AstExpression::coerce(ExprType t, bool bAssign)
     711             : {
     712             :     AstExprValue *copy;
     713             : 
     714             :     /*
     715             :      * Is it already of the right type?
     716             :      */
     717         121 :     if (m_exprValue != NULL && m_exprValue->et == t)
     718          15 :         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         106 :     m_exprValue = eval_internal(EK_const);
     726         106 :     if (m_exprValue == NULL)
     727           1 :         return NULL;
     728             : 
     729             :     /*
     730             :      * Create a copy to contain coercion result
     731             :      */
     732         105 :     copy = new AstExprValue;
     733             : 
     734         105 :     copy->et = m_exprValue->et;
     735         105 :     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           5 :             copy->u.lval = m_exprValue->u.lval;
     745           5 :             break;
     746             :         case ET_ulong:
     747           0 :             copy->u.ulval = m_exprValue->u.ulval;
     748           0 :             break;
     749             :         case ET_hyper:
     750          91 :             copy->u.hval = m_exprValue->u.hval;
     751          91 :             break;
     752             :         case ET_uhyper:
     753           3 :             copy->u.uhval = m_exprValue->u.uhval;
     754           3 :             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           6 :             copy->u.dval = m_exprValue->u.dval;
     763           6 :             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         105 :     AstExprValue* const coerced(coerce_value(copy, t));
     773         105 :     if (!coerced)
     774          37 :         delete copy;
     775             : 
     776         105 :     if (bAssign)
     777         105 :         m_exprValue = coerced;
     778             : 
     779         105 :     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;
     803           0 :             break;
     804             :         case ET_ushort:
     805           0 :             bRet = m_exprValue->u.usval == pExpr->getExprValue()->u.usval;
     806           0 :             break;
     807             :         case ET_long:
     808           0 :             bRet = m_exprValue->u.lval == pExpr->getExprValue()->u.lval;
     809           0 :             break;
     810             :         case ET_ulong:
     811           0 :             bRet = m_exprValue->u.ulval == pExpr->getExprValue()->u.ulval;
     812           0 :             break;
     813             :         case ET_hyper:
     814           0 :             bRet = m_exprValue->u.hval == pExpr->getExprValue()->u.hval;
     815           0 :             break;
     816             :         case ET_uhyper:
     817           0 :             bRet = m_exprValue->u.uhval == pExpr->getExprValue()->u.uhval;
     818           0 :             break;
     819             :         case ET_float:
     820           0 :             bRet = m_exprValue->u.fval == pExpr->getExprValue()->u.fval;
     821           0 :             break;
     822             :         case ET_double:
     823           0 :             bRet = m_exprValue->u.dval == pExpr->getExprValue()->u.dval;
     824           0 :             break;
     825             :         case ET_byte:
     826           0 :             bRet = m_exprValue->u.byval == pExpr->getExprValue()->u.byval;
     827           0 :             break;
     828             :         case ET_boolean:
     829           0 :             bRet = m_exprValue->u.lval == pExpr->getExprValue()->u.lval;
     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;
     855           0 :             break;
     856             :         case ET_ushort:
     857           0 :             bRet = m_exprValue->u.usval == pExpr->getExprValue()->u.usval;
     858           0 :             break;
     859             :         case ET_long:
     860           0 :             bRet = m_exprValue->u.lval == pExpr->getExprValue()->u.lval;
     861           0 :             break;
     862             :         case ET_ulong:
     863           0 :             bRet = m_exprValue->u.ulval == pExpr->getExprValue()->u.ulval;
     864           0 :             break;
     865             :         case ET_hyper:
     866           0 :             bRet = m_exprValue->u.hval == pExpr->getExprValue()->u.hval;
     867           0 :             break;
     868             :         case ET_uhyper:
     869           0 :             bRet = m_exprValue->u.uhval == pExpr->getExprValue()->u.uhval;
     870           0 :             break;
     871             :         case ET_float:
     872           0 :             bRet = m_exprValue->u.fval == pExpr->getExprValue()->u.fval;
     873           0 :             break;
     874             :         case ET_double:
     875           0 :             bRet = m_exprValue->u.dval == pExpr->getExprValue()->u.dval;
     876           0 :             break;
     877             :         case ET_byte:
     878           0 :             bRet = m_exprValue->u.byval == pExpr->getExprValue()->u.byval;
     879           0 :             break;
     880             :         case ET_boolean:
     881           0 :             bRet = m_exprValue->u.lval == pExpr->getExprValue()->u.lval;
     882           0 :             break;
     883             :         default:
     884             :             OSL_ASSERT(false);
     885           0 :             bRet = false;
     886           0 :             break;
     887             :     }
     888           0 :     return bRet;
     889             : }
     890             : 
     891         164 : void AstExpression::fillDefinitionDetails()
     892             : {
     893         164 :     m_pScope = idlc()->scopes()->depth() > 0 ? idlc()->scopes()->top() : NULL;
     894         164 :     m_lineNo = idlc()->getLineNumber();
     895         164 :     m_fileName = idlc()->getFileName();
     896         164 : }
     897             : 
     898         122 : AstExprValue* AstExpression::eval_internal(EvalKind ek)
     899             : {
     900             :     /*
     901             :      * Already evaluated?
     902             :      */
     903         122 :     if ( m_exprValue != NULL )
     904         110 :         return eval_kind(m_exprValue, ek);
     905             :     /*
     906             :      * OK, must evaluate operator
     907             :      */
     908          12 :     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           6 :             m_exprValue = eval_bin_op(ek);
     916           6 :             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           6 :             m_exprValue = eval_symbol(ek);
     931           6 :             return eval_kind(m_exprValue, ek);
     932             :         case EC_none:
     933           0 :             return NULL;
     934             :     }
     935             : 
     936           0 :     return NULL;
     937             : }
     938             : 
     939           6 : AstExprValue* AstExpression::eval_bin_op(EvalKind ek)
     940             : {
     941           6 :     ExprType eType = ET_double;
     942             : 
     943           6 :     if ( m_combOperator == EC_mod )
     944           0 :         eType = ET_hyper;
     945             : 
     946           6 :     if (ek != EK_const && ek != EK_positive_int)
     947           0 :         return NULL;
     948           6 :     if (m_subExpr1 == NULL || m_subExpr2 == NULL)
     949           0 :         return NULL;
     950           6 :     m_subExpr1->setExprValue(m_subExpr1->eval_internal(ek));
     951           6 :     if (m_subExpr1->getExprValue() == NULL)
     952           1 :         return NULL;
     953           5 :     m_subExpr1->setExprValue(m_subExpr1->coerce(eType));
     954           5 :     if (m_subExpr1->getExprValue() == NULL)
     955           0 :         return NULL;
     956           5 :     m_subExpr2->setExprValue(m_subExpr2->eval_internal(ek));
     957           5 :     if (m_subExpr2->getExprValue() == NULL)
     958           0 :         return NULL;
     959           5 :     m_subExpr2->setExprValue(m_subExpr2->coerce(eType));
     960           5 :     if (m_subExpr2->getExprValue() == NULL)
     961           0 :         return NULL;
     962             : 
     963           5 :     std::unique_ptr< AstExprValue > retval(new AstExprValue());
     964           5 :     retval->et = eType;
     965             : 
     966           5 :     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           5 :             retval->u.dval = m_subExpr1->getExprValue()->u.dval + m_subExpr2->getExprValue()->u.dval;
     975           5 :             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           5 :     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           0 :     std::unique_ptr< AstExprValue > retval(new AstExprValue());
    1014           0 :     retval->et = ET_long;
    1015             : 
    1016           0 :     switch (m_combOperator)
    1017             :     {
    1018             :         case EC_or:
    1019           0 :             retval->u.lval = m_subExpr1->getExprValue()->u.lval | m_subExpr2->getExprValue()->u.lval;
    1020           0 :             break;
    1021             :         case EC_xor:
    1022           0 :             retval->u.lval = m_subExpr1->getExprValue()->u.lval ^ m_subExpr2->getExprValue()->u.lval;
    1023           0 :             break;
    1024             :         case EC_and:
    1025           0 :             retval->u.lval = m_subExpr1->getExprValue()->u.lval & m_subExpr2->getExprValue()->u.lval;
    1026           0 :             break;
    1027             :         case EC_left:
    1028           0 :             retval->u.lval = m_subExpr1->getExprValue()->u.lval << m_subExpr2->getExprValue()->u.lval;
    1029           0 :             break;
    1030             :         case EC_right:
    1031           0 :             retval->u.lval = m_subExpr1->getExprValue()->u.lval >> m_subExpr2->getExprValue()->u.lval;
    1032           0 :             break;
    1033             :         default:
    1034           0 :             return NULL;
    1035             :     }
    1036             : 
    1037           0 :     return retval.release();
    1038             : }
    1039             : 
    1040           0 : AstExprValue* AstExpression::eval_un_op(EvalKind ek)
    1041             : {
    1042           0 :     if (m_exprValue != NULL)
    1043           0 :         return m_exprValue;
    1044             : 
    1045           0 :     if (ek != EK_const && ek != EK_positive_int)
    1046           0 :         return NULL;
    1047           0 :     if (m_subExpr1 == NULL)
    1048           0 :         return NULL;
    1049           0 :     m_subExpr1->setExprValue(m_subExpr1->eval_internal(ek));
    1050           0 :     if (m_subExpr1->getExprValue() == NULL)
    1051           0 :         return NULL;
    1052           0 :     m_subExpr1->setExprValue(m_subExpr1->coerce(ET_double));
    1053           0 :     if (m_subExpr1->getExprValue() == NULL)
    1054           0 :         return NULL;
    1055             : 
    1056           0 :     std::unique_ptr< AstExprValue > retval(new AstExprValue());
    1057           0 :     retval->et = ET_double;
    1058             : 
    1059           0 :     switch (m_combOperator)
    1060             :     {
    1061             :         case EC_u_plus:
    1062           0 :             retval->u.lval = m_subExpr1->getExprValue()->u.lval;
    1063           0 :             break;
    1064             :         case EC_u_minus:
    1065           0 :             retval->u.lval = -(m_subExpr1->getExprValue()->u.lval);
    1066           0 :             break;
    1067             :         case EC_bit_neg:
    1068           0 :             m_subExpr1->setExprValue(m_subExpr1->coerce(ET_long));
    1069           0 :             if (m_subExpr1->getExprValue() == NULL)
    1070           0 :                 return NULL;
    1071           0 :             retval->u.lval = ~m_subExpr1->getExprValue()->u.lval;
    1072           0 :             break;
    1073             :         default:
    1074           0 :             return NULL;
    1075             :     }
    1076             : 
    1077           0 :     return retval.release();
    1078             : }
    1079             : 
    1080           6 : AstExprValue* AstExpression::eval_symbol(EvalKind ek)
    1081             : {
    1082           6 :     AstScope        *pScope = 0;
    1083             :     AstDeclaration  *pDecl;
    1084             :     AstConstant     *pConst;
    1085             : 
    1086             :     /*
    1087             :      * Is there a symbol stored?
    1088             :      */
    1089           6 :     if (m_pSymbolicName == NULL)
    1090             :     {
    1091           0 :         ErrorHandler::evalError(this);
    1092           0 :         return NULL;
    1093             :     }
    1094             :     /*
    1095             :      * Get current scope for lookup
    1096             :      */
    1097           6 :     if (idlc()->scopes()->depth() > 0)
    1098           6 :         pScope = idlc()->scopes()->topNonNull();
    1099           6 :     if ( !pScope )
    1100             :     {
    1101           0 :         ErrorHandler::lookupError(*m_pSymbolicName);
    1102           0 :         return NULL;
    1103             :     }
    1104             :     /*
    1105             :      * Do lookup
    1106             :      */
    1107           6 :     pDecl = pScope->lookupByName(*m_pSymbolicName);
    1108           6 :     if (pDecl == NULL)
    1109             :     {
    1110           0 :         ErrorHandler::lookupError(*m_pSymbolicName);
    1111           0 :         return NULL;
    1112             :     }
    1113             :     /*
    1114             :      * Is it a constant?
    1115             :      */
    1116           6 :     if (pDecl->getNodeType() != NT_const &&
    1117           0 :         pDecl->getNodeType() != NT_enum_val)
    1118             :     {
    1119           0 :         ErrorHandler::constantExpected(pDecl, *m_pSymbolicName);
    1120           0 :         return NULL;
    1121             :     }
    1122           6 :     if (!ErrorHandler::checkPublished(pDecl))
    1123             :     {
    1124           1 :         return NULL;
    1125             :     }
    1126             :     /*
    1127             :      * OK, now evaluate the constant we just got, to produce its value
    1128             :      */
    1129           5 :     pConst = static_cast< AstConstant* >(pDecl);
    1130           5 :     return pConst->getConstValue()->eval_internal(ek);
    1131             : }
    1132             : 
    1133          40 : OString AstExpression::toString()
    1134             : {
    1135          40 :     OString exprStr;
    1136          40 :     if ( m_combOperator == EC_symbol )
    1137           1 :         return m_pSymbolicName ? *m_pSymbolicName : OString("<Undefined Name>");
    1138             : 
    1139          39 :     if ( m_exprValue )
    1140             :     {
    1141           1 :         switch (m_exprValue->et)
    1142             :         {
    1143             :             case ET_short:
    1144           0 :                 return OString::number(m_exprValue->u.sval);
    1145             :             case ET_ushort:
    1146           0 :                 return OString::number(m_exprValue->u.usval);
    1147             :             case ET_long:
    1148           0 :                 return OString::number(m_exprValue->u.lval);
    1149             :             case ET_ulong:
    1150           0 :                 return OString::number(m_exprValue->u.ulval);
    1151             :             case ET_hyper:
    1152           1 :                 return OString::number(m_exprValue->u.hval);
    1153             :             case ET_uhyper:
    1154           0 :                 return OString::number(m_exprValue->u.uhval);
    1155             :             case ET_float:
    1156           0 :                 return OString::number(m_exprValue->u.fval);
    1157             :             case ET_double:
    1158           0 :                 return OString::number(m_exprValue->u.dval);
    1159             :             case ET_byte:
    1160           0 :                 return OString::number(m_exprValue->u.byval);
    1161             :             case ET_boolean:
    1162           0 :                 if ( m_exprValue->u.lval == 0)
    1163           0 :                     return OString("FALSE");
    1164             :                 else
    1165           0 :                     return OString("TRUE");
    1166             :             default:
    1167             :                 OSL_ASSERT(false);
    1168           0 :                 return OString();
    1169             :         }
    1170             :     }
    1171             : 
    1172          38 :     switch (m_combOperator)
    1173             :     {
    1174             :         case EC_u_plus:
    1175           0 :             exprStr += OString("+");
    1176           0 :             break;
    1177             :         case EC_u_minus:
    1178           0 :             exprStr += OString("-");
    1179           0 :             break;
    1180             :         case EC_bit_neg:
    1181           0 :             exprStr += OString("~");
    1182           0 :             break;
    1183             :         default:
    1184          38 :             break;
    1185             :     }
    1186          38 :     if ( m_subExpr1 )
    1187           1 :         exprStr += m_subExpr1->toString();
    1188          38 :     switch (m_combOperator)
    1189             :     {
    1190             :         case EC_add:
    1191           1 :             exprStr += OString(" + ");
    1192           1 :             break;
    1193             :         case EC_minus:
    1194           0 :             exprStr += OString(" - ");
    1195           0 :             break;
    1196             :         case EC_mul:
    1197           0 :             exprStr += OString(" * ");
    1198           0 :             break;
    1199             :         case EC_div:
    1200           0 :             exprStr += OString(" / ");
    1201           0 :             break;
    1202             :         case EC_mod:
    1203           0 :             exprStr += OString(" % ");
    1204           0 :             break;
    1205             :         case EC_or:
    1206           0 :             exprStr += OString(" | ");
    1207           0 :             break;
    1208             :         case EC_xor:
    1209           0 :             exprStr += OString(" ^ ");
    1210           0 :             break;
    1211             :         case EC_and:
    1212           0 :             exprStr += OString(" & ");
    1213           0 :             break;
    1214             :         case EC_left:
    1215           0 :             exprStr += OString(" << ");
    1216           0 :             break;
    1217             :         case EC_right:
    1218           0 :             exprStr += OString(" >> ");
    1219           0 :             break;
    1220             :         default:
    1221          37 :             break;
    1222             :     }
    1223             : 
    1224          38 :     if ( m_subExpr2 )
    1225           1 :         exprStr += m_subExpr2->toString();
    1226             : 
    1227          38 :     return exprStr;
    1228             : }
    1229             : 
    1230             : // Convert the type of an AST_Expression to a char *
    1231         104 : const sal_Char* SAL_CALL exprTypeToString(ExprType t)
    1232             : {
    1233         104 :     switch (t)
    1234             :     {
    1235             :         case ET_short:
    1236          13 :             return "short";
    1237             :         case ET_ushort:
    1238          12 :             return "unsigned short";
    1239             :         case ET_long:
    1240          28 :             return "long";
    1241             :         case ET_ulong:
    1242          12 :             return "unsigned long";
    1243             :         case ET_hyper:
    1244          10 :             return "hyper";
    1245             :         case ET_uhyper:
    1246           9 :             return "unsigned hyper";
    1247             :         case ET_float:
    1248           1 :             return "float";
    1249             :         case ET_double:
    1250           1 :             return "double";
    1251             :         case ET_char:
    1252           0 :             return "char";
    1253             :         case ET_byte:
    1254          16 :             return "byte";
    1255             :         case ET_boolean:
    1256           1 :             return "boolean";
    1257             :         case ET_string:
    1258           0 :             return "string";
    1259             :         case ET_any:
    1260           0 :             return "any";
    1261             :         case ET_type:
    1262           0 :             return "type";
    1263             :         case ET_void:
    1264           0 :             return "void";
    1265             :         case ET_none:
    1266           1 :             return "none";
    1267             :     }
    1268             : 
    1269           0 :     return ("unknown");
    1270             : }
    1271             : 
    1272             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.11