LCOV - code coverage report
Current view: top level - codemaker/source/javamaker - javatype.cxx (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 1220 1316 92.7 %
Date: 2012-08-25 Functions: 46 46 100.0 %
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: 1240 2196 56.5 %

           Branch data     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 "javatype.hxx"
      22                 :            : 
      23                 :            : #include "classfile.hxx"
      24                 :            : #include "javaoptions.hxx"
      25                 :            : 
      26                 :            : #include "codemaker/exceptiontree.hxx"
      27                 :            : #include "codemaker/generatedtypeset.hxx"
      28                 :            : #include "codemaker/global.hxx"
      29                 :            : #include "codemaker/options.hxx"
      30                 :            : #include "codemaker/typemanager.hxx"
      31                 :            : #include "codemaker/unotype.hxx"
      32                 :            : #include "codemaker/commonjava.hxx"
      33                 :            : 
      34                 :            : #include "osl/diagnose.h"
      35                 :            : #include "registry/reader.hxx"
      36                 :            : #include "registry/refltype.hxx"
      37                 :            : #include "registry/types.h"
      38                 :            : #include "rtl/strbuf.hxx"
      39                 :            : #include "rtl/string.h"
      40                 :            : #include "rtl/string.hxx"
      41                 :            : #include "rtl/textcvt.h"
      42                 :            : #include "rtl/textenc.h"
      43                 :            : #include "rtl/ustring.h"
      44                 :            : #include "rtl/ustring.hxx"
      45                 :            : #include "sal/types.h"
      46                 :            : 
      47                 :            : #include <algorithm>
      48                 :            : #include <list>
      49                 :            : #include <map>
      50                 :            : #include <memory>
      51                 :            : #include <set>
      52                 :            : #include <utility>
      53                 :            : #include <vector>
      54                 :            : 
      55                 :            : using codemaker::javamaker::ClassFile;
      56                 :            : 
      57                 :            : namespace {
      58                 :            : 
      59                 :            : // helper function for createUnoName
      60                 :        279 : void appendUnoName(
      61                 :            :     TypeManager const & manager, rtl::OString const & nucleus, sal_Int32 rank,
      62                 :            :     std::vector< rtl::OString > const & arguments, rtl::OStringBuffer * buffer)
      63                 :            : {
      64                 :            :     OSL_ASSERT(rank >= 0 && buffer != 0);
      65         [ +  + ]:        345 :     for (sal_Int32 i = 0; i < rank; ++i) {
      66                 :         66 :         buffer->append(RTL_CONSTASCII_STRINGPARAM("[]"));
      67                 :            :     }
      68         [ +  - ]:        279 :     buffer->append(nucleus.replace('/', '.'));
      69         [ +  + ]:        279 :     if (!arguments.empty()) {
      70                 :        123 :         buffer->append('<');
      71 [ +  + ][ +  - ]:        566 :         for (std::vector< rtl::OString >::const_iterator i(arguments.begin());
      72                 :        283 :              i != arguments.end(); ++i)
      73                 :            :         {
      74 [ +  - ][ +  + ]:        160 :             if (i != arguments.begin()) {
      75         [ +  - ]:         37 :                 buffer->append(',');
      76                 :            :             }
      77                 :            :             RTTypeClass argTypeClass;
      78                 :        160 :             rtl::OString argNucleus;
      79                 :            :             sal_Int32 argRank;
      80         [ +  - ]:        160 :             std::vector< rtl::OString > argArgs;
      81                 :            :             codemaker::decomposeAndResolve(
      82                 :        160 :                 manager, *i, true, false, false, &argTypeClass, &argNucleus,
      83         [ +  - ]:        160 :                 &argRank, &argArgs);
      84         [ +  - ]:        160 :             appendUnoName(manager, argNucleus, argRank, argArgs, buffer);
      85                 :        160 :         }
      86                 :        123 :         buffer->append('>');
      87                 :            :     }
      88                 :        279 : }
      89                 :            : 
      90                 :            : // Translate the name of a UNO type registry entity (enum type, plain struct
      91                 :            : // type, polymorphic struct type template, or interface type, decomposed into
      92                 :            : // nucleus, rank, and arguments) into a core UNO type name:
      93                 :        119 : rtl::OString createUnoName(
      94                 :            :     TypeManager const & manager, rtl::OString const & nucleus, sal_Int32 rank,
      95                 :            :     std::vector< rtl::OString > const & arguments)
      96                 :            : {
      97                 :        119 :     rtl::OStringBuffer buf;
      98         [ +  - ]:        119 :     appendUnoName(manager, nucleus, rank, arguments, &buf);
      99                 :        119 :     return buf.makeStringAndClear();
     100                 :            : }
     101                 :            : 
     102                 :            : /**
     103                 :            :    Set of UTF-8--encoded names of UNO type registry entities a given UNO type
     104                 :            :    registry entity depends on.
     105                 :            : 
     106                 :            :    UNO type registry entities are enum types, plain struct types, polymorphic
     107                 :            :    struct type templates, exception types, interface types, typedefs, modules,
     108                 :            :    constant groupds, single-interface--based services, accumulation-based
     109                 :            :    services, interface-based singletons, and service-based singletons.
     110                 :            :  */
     111                 :            : typedef std::set< rtl::OString > Dependencies;
     112                 :            : 
     113                 :            : enum SpecialType {
     114                 :            :     SPECIAL_TYPE_NONE,
     115                 :            :     SPECIAL_TYPE_ANY,
     116                 :            :     SPECIAL_TYPE_UNSIGNED,
     117                 :            :     SPECIAL_TYPE_INTERFACE
     118                 :            : };
     119                 :            : 
     120                 :      11350 : bool isSpecialType(SpecialType special) {
     121                 :      11350 :     return special >= SPECIAL_TYPE_UNSIGNED;
     122                 :            : }
     123                 :            : 
     124                 :        361 : rtl::OString translateUnoTypeToJavaFullyQualifiedName(
     125                 :            :     rtl::OString const & type, rtl::OString const & prefix)
     126                 :            : {
     127                 :        361 :     sal_Int32 i = type.lastIndexOf('/') + 1;
     128                 :            :     return type.copy(0, i) +
     129         [ +  - ]:        361 :         codemaker::java::translateUnoToJavaIdentifier(type.copy(i), prefix);
     130                 :            : }
     131                 :            : 
     132                 :     127915 : struct PolymorphicUnoType {
     133                 :      27841 :     PolymorphicUnoType(): kind(KIND_NONE) {}
     134                 :            : 
     135                 :            :     enum Kind { KIND_NONE, KIND_STRUCT, KIND_SEQUENCE };
     136                 :            :     Kind kind;
     137                 :            :     rtl::OString name;
     138                 :            : };
     139                 :            : 
     140                 :            : SpecialType translateUnoTypeToDescriptor(
     141                 :            :     TypeManager const & manager, rtl::OString const & type, bool array,
     142                 :            :     bool classType, Dependencies * dependencies,
     143                 :            :     rtl::OStringBuffer * descriptor, rtl::OStringBuffer * signature,
     144                 :            :     bool * needsSignature, PolymorphicUnoType * polymorphicUnoType);
     145                 :            : 
     146                 :      48237 : SpecialType translateUnoTypeToDescriptor(
     147                 :            :     TypeManager const & manager, codemaker::UnoType::Sort sort,
     148                 :            :     RTTypeClass typeClass, rtl::OString const & nucleus, sal_Int32 rank,
     149                 :            :     std::vector< rtl::OString > const & arguments, bool array, bool classType,
     150                 :            :     Dependencies * dependencies, rtl::OStringBuffer * descriptor,
     151                 :            :     rtl::OStringBuffer * signature, bool * needsSignature,
     152                 :            :     PolymorphicUnoType * polymorphicUnoType)
     153                 :            : {
     154                 :            :     OSL_ASSERT(rank >= 0 && (signature == 0) == (needsSignature == 0));
     155 [ +  + ][ -  + ]:      48237 :     if (rank > 0xFF - (array ? 1 : 0)) {
     156                 :            :         throw CannotDumpException(
     157                 :            :             rtl::OString(
     158                 :            :                 RTL_CONSTASCII_STRINGPARAM(
     159                 :          0 :                     "Too many array dimensions for Java class file format")));
     160                 :            :     }
     161         [ +  + ]:      48237 :     if (array) {
     162                 :        379 :         ++rank;
     163                 :            :     }
     164         [ +  + ]:      52075 :     for (sal_Int32 i = 0; i < rank; ++i) {
     165         [ +  + ]:       3838 :         if (descriptor != 0) {
     166                 :       3813 :             descriptor->append('[');
     167                 :            :         }
     168         [ +  + ]:       3838 :         if (signature != 0) {
     169                 :       3539 :             signature->append('[');
     170                 :            :         }
     171                 :            :     }
     172         [ +  + ]:      48237 :     if (sort == codemaker::UnoType::SORT_COMPLEX) {
     173                 :            :         //TODO: check that nucleus is a valid (Java-modified UTF-8) identifier
     174                 :      12192 :         rtl::OString superClass;
     175         [ +  + ]:      31294 :         if (typeClass == RT_TYPE_INTERFACE
           [ +  +  +  + ]
     176                 :            :             && (nucleus
     177                 :            :                 == rtl::OString(
     178         [ +  + ]:      19102 :                     RTL_CONSTASCII_STRINGPARAM("com/sun/star/uno/XInterface"))))
     179                 :            :         {
     180         [ +  + ]:       1007 :             if (descriptor != 0) {
     181                 :            :                 descriptor->append(
     182                 :            :                     rtl::OString(
     183         [ +  - ]:       1005 :                         RTL_CONSTASCII_STRINGPARAM("Ljava/lang/Object;")));
     184                 :            :             }
     185         [ +  + ]:       1007 :             if (signature != 0) {
     186                 :            :                 signature->append(
     187                 :            :                     rtl::OString(
     188         [ +  - ]:       1005 :                         RTL_CONSTASCII_STRINGPARAM("Ljava/lang/Object;")));
     189                 :            :             }
     190         [ +  + ]:       1007 :             if (polymorphicUnoType != 0) {
     191                 :        252 :                 polymorphicUnoType->kind = PolymorphicUnoType::KIND_NONE;
     192                 :            :             }
     193                 :       1007 :             return SPECIAL_TYPE_INTERFACE;
     194                 :            :         } else {
     195         [ +  + ]:      11185 :             if (dependencies != 0) {
     196         [ +  - ]:      10805 :                 dependencies->insert(nucleus);
     197                 :            :             }
     198         [ +  + ]:      11185 :             if (descriptor != 0) {
     199         [ +  - ]:      11149 :                 descriptor->append('L');
     200         [ +  - ]:      11149 :                 descriptor->append(nucleus);
     201         [ +  - ]:      11149 :                 descriptor->append(';');
     202                 :            :             }
     203         [ +  + ]:      11185 :             if (signature != 0) {
     204         [ +  - ]:      10671 :                 signature->append('L');
     205         [ +  - ]:      10671 :                 signature->append(nucleus);
     206         [ +  + ]:      10671 :                 if (!arguments.empty()) {
     207         [ +  - ]:        139 :                     signature->append('<');
     208 [ +  - ][ +  + ]:        630 :                     for (std::vector< rtl::OString >::const_iterator i(
     209                 :        139 :                              arguments.begin());
     210                 :        315 :                          i != arguments.end(); ++i)
     211                 :            :                     {
     212                 :            :                         translateUnoTypeToDescriptor(
     213                 :        176 :                             manager, *i, false, true, dependencies, 0,
     214         [ +  - ]:        176 :                             signature, needsSignature, 0);
     215                 :            :                     }
     216         [ +  - ]:        139 :                     signature->append('>');
     217                 :        139 :                     *needsSignature = true;
     218                 :            :                 }
     219         [ +  - ]:      10671 :                 signature->append(';');
     220                 :            :             }
     221         [ +  + ]:      11185 :             if (polymorphicUnoType != 0) {
     222         [ +  + ]:       8173 :                 if (arguments.empty()) {
     223                 :       8127 :                     polymorphicUnoType->kind = PolymorphicUnoType::KIND_NONE;
     224                 :            :                 } else {
     225                 :            :                     polymorphicUnoType->kind = rank == 0
     226                 :            :                         ? PolymorphicUnoType::KIND_STRUCT
     227         [ +  + ]:         46 :                         : PolymorphicUnoType::KIND_SEQUENCE;
     228                 :            :                     polymorphicUnoType->name = createUnoName(
     229         [ +  - ]:         46 :                         manager, nucleus, rank, arguments);
     230                 :            :                 }
     231                 :            :             }
     232                 :      11185 :             return SPECIAL_TYPE_NONE;
     233                 :      12192 :         }
     234                 :            :     } else {
     235                 :            :         static rtl::OString const
     236                 :            :             simpleTypeDescriptors[codemaker::UnoType::SORT_ANY + 1][2] = {
     237                 :            :                 { rtl::OString(RTL_CONSTASCII_STRINGPARAM("V")),
     238                 :            :                   rtl::OString(RTL_CONSTASCII_STRINGPARAM("Ljava/lang/Void;"))
     239                 :            :                 },
     240                 :            :                 { rtl::OString(RTL_CONSTASCII_STRINGPARAM("Z")),
     241                 :            :                   rtl::OString(
     242                 :            :                       RTL_CONSTASCII_STRINGPARAM("Ljava/lang/Boolean;"))
     243                 :            :                 },
     244                 :            :                 { rtl::OString(RTL_CONSTASCII_STRINGPARAM("B")),
     245                 :            :                   rtl::OString(RTL_CONSTASCII_STRINGPARAM("Ljava/lang/Byte;"))
     246                 :            :                 },
     247                 :            :                 { rtl::OString(RTL_CONSTASCII_STRINGPARAM("S")),
     248                 :            :                   rtl::OString(RTL_CONSTASCII_STRINGPARAM("Ljava/lang/Short;"))
     249                 :            :                 },
     250                 :            :                 { rtl::OString(RTL_CONSTASCII_STRINGPARAM("S")),
     251                 :            :                   rtl::OString(RTL_CONSTASCII_STRINGPARAM("Ljava/lang/Short;"))
     252                 :            :                 },
     253                 :            :                 { rtl::OString(RTL_CONSTASCII_STRINGPARAM("I")),
     254                 :            :                   rtl::OString(
     255                 :            :                       RTL_CONSTASCII_STRINGPARAM("Ljava/lang/Integer;"))
     256                 :            :                 },
     257                 :            :                 { rtl::OString(RTL_CONSTASCII_STRINGPARAM("I")),
     258                 :            :                   rtl::OString(
     259                 :            :                       RTL_CONSTASCII_STRINGPARAM("Ljava/lang/Integer;"))
     260                 :            :                 },
     261                 :            :                 { rtl::OString(RTL_CONSTASCII_STRINGPARAM("J")),
     262                 :            :                   rtl::OString(RTL_CONSTASCII_STRINGPARAM("Ljava/lang/Long;"))
     263                 :            :                 },
     264                 :            :                 { rtl::OString(RTL_CONSTASCII_STRINGPARAM("J")),
     265                 :            :                   rtl::OString(RTL_CONSTASCII_STRINGPARAM("Ljava/lang/Long;"))
     266                 :            :                 },
     267                 :            :                 { rtl::OString(RTL_CONSTASCII_STRINGPARAM("F")),
     268                 :            :                   rtl::OString(RTL_CONSTASCII_STRINGPARAM("Ljava/lang/Float;"))
     269                 :            :                 },
     270                 :            :                 { rtl::OString(RTL_CONSTASCII_STRINGPARAM("D")),
     271                 :            :                   rtl::OString(RTL_CONSTASCII_STRINGPARAM("Ljava/lang/Double;"))
     272                 :            :                 },
     273                 :            :                 { rtl::OString(RTL_CONSTASCII_STRINGPARAM("C")),
     274                 :            :                   rtl::OString(
     275                 :            :                       RTL_CONSTASCII_STRINGPARAM("Ljava/lang/Character;"))
     276                 :            :                 },
     277                 :            :                 { rtl::OString(
     278                 :            :                       RTL_CONSTASCII_STRINGPARAM("Ljava/lang/String;")),
     279                 :            :                   rtl::OString(RTL_CONSTASCII_STRINGPARAM("Ljava/lang/String;"))
     280                 :            :                 },
     281                 :            :                 { rtl::OString(
     282                 :            :                       RTL_CONSTASCII_STRINGPARAM("Lcom/sun/star/uno/Type;")),
     283                 :            :                   rtl::OString(
     284                 :            :                       RTL_CONSTASCII_STRINGPARAM("Lcom/sun/star/uno/Type;"))
     285                 :            :                 },
     286                 :            :                 { rtl::OString(
     287                 :            :                       RTL_CONSTASCII_STRINGPARAM("Ljava/lang/Object;")),
     288                 :            :                   rtl::OString(
     289                 :            :                       RTL_CONSTASCII_STRINGPARAM("Ljava/lang/Object;"))
     290 [ +  + ][ +  - ]:      36231 :                 } };
                 [ +  + ]
     291                 :            :         rtl::OString const & s
     292 [ +  + ][ +  + ]:      36045 :             = simpleTypeDescriptors[sort][rank == 0 && classType];
     293         [ +  + ]:      36045 :         if (descriptor != 0) {
     294                 :      35907 :             descriptor->append(s);
     295                 :            :         }
     296         [ +  + ]:      36045 :         if (signature != 0) {
     297                 :      35894 :             signature->append(s);
     298                 :            :         }
     299         [ +  + ]:      36045 :         if (polymorphicUnoType != 0) {
     300                 :      19403 :             polymorphicUnoType->kind = PolymorphicUnoType::KIND_NONE;
     301                 :            :         }
     302                 :            :         static SpecialType const
     303                 :            :             simpleTypeSpecials[codemaker::UnoType::SORT_ANY + 1] = {
     304                 :            :                 SPECIAL_TYPE_NONE, SPECIAL_TYPE_NONE, SPECIAL_TYPE_NONE,
     305                 :            :                 SPECIAL_TYPE_NONE, SPECIAL_TYPE_UNSIGNED, SPECIAL_TYPE_NONE,
     306                 :            :                 SPECIAL_TYPE_UNSIGNED, SPECIAL_TYPE_NONE, SPECIAL_TYPE_UNSIGNED,
     307                 :            :                 SPECIAL_TYPE_NONE, SPECIAL_TYPE_NONE, SPECIAL_TYPE_NONE,
     308                 :            :                 SPECIAL_TYPE_NONE, SPECIAL_TYPE_NONE, SPECIAL_TYPE_ANY };
     309                 :      48237 :         return simpleTypeSpecials[sort];
     310                 :            :     }
     311                 :            : }
     312                 :            : 
     313                 :      47570 : SpecialType translateUnoTypeToDescriptor(
     314                 :            :     TypeManager const & manager, rtl::OString const & type, bool array,
     315                 :            :     bool classType, Dependencies * dependencies,
     316                 :            :     rtl::OStringBuffer * descriptor, rtl::OStringBuffer * signature,
     317                 :            :     bool * needsSignature, PolymorphicUnoType * polymorphicUnoType)
     318                 :            : {
     319                 :            :     RTTypeClass typeClass;
     320                 :      47570 :     rtl::OString nucleus;
     321                 :            :     sal_Int32 rank;
     322         [ +  - ]:      47570 :     std::vector< rtl::OString > args;
     323                 :            :     codemaker::UnoType::Sort sort = codemaker::decomposeAndResolve(
     324         [ +  - ]:      47570 :         manager, type, true, true, false, &typeClass, &nucleus, &rank, &args);
     325                 :            :     OSL_ASSERT(rank < SAL_MAX_INT32);
     326                 :            :     return translateUnoTypeToDescriptor(
     327                 :            :         manager, sort, typeClass, nucleus, rank, args, array, classType,
     328                 :            :         dependencies, descriptor, signature, needsSignature,
     329         [ +  - ]:      47570 :         polymorphicUnoType);
     330                 :            : }
     331                 :            : 
     332                 :      13742 : SpecialType getFieldDescriptor(
     333                 :            :     TypeManager const & manager, Dependencies * dependencies,
     334                 :            :     rtl::OString const & type, rtl::OString * descriptor,
     335                 :            :     rtl::OString * signature, PolymorphicUnoType * polymorphicUnoType)
     336                 :            : {
     337                 :            :     OSL_ASSERT(dependencies != 0 && descriptor != 0);
     338                 :      13742 :     rtl::OStringBuffer desc;
     339                 :      13742 :     rtl::OStringBuffer sig;
     340                 :      13742 :     bool needsSig = false;
     341                 :            :     SpecialType specialType = translateUnoTypeToDescriptor(
     342                 :            :         manager, type, false, false, dependencies, &desc, &sig, &needsSig,
     343         [ +  - ]:      13742 :         polymorphicUnoType);
     344                 :      13742 :     *descriptor = desc.makeStringAndClear();
     345         [ +  + ]:      13742 :     if (signature != 0) {
     346         [ +  + ]:      10185 :         if (needsSig) {
     347                 :          4 :             *signature = sig.makeStringAndClear();
     348                 :            :         } else {
     349                 :      10181 :             *signature = rtl::OString();
     350                 :            :         }
     351                 :            :     }
     352                 :      13742 :     return specialType;
     353                 :            : }
     354                 :            : 
     355                 :      15167 : class MethodDescriptor {
     356                 :            : public:
     357                 :            :     MethodDescriptor(
     358                 :            :         TypeManager const & manager, Dependencies * dependencies,
     359                 :            :         rtl::OString const & returnType, SpecialType * specialReturnType,
     360                 :            :         PolymorphicUnoType * polymorphicUnoType);
     361                 :            : 
     362                 :            :     SpecialType addParameter(
     363                 :            :         rtl::OString const & type, bool array, bool dependency,
     364                 :            :         PolymorphicUnoType * polymorphicUnoType);
     365                 :            : 
     366                 :            :     void addTypeParameter(rtl::OString const & name);
     367                 :            : 
     368                 :            :     rtl::OString getDescriptor() const;
     369                 :            : 
     370                 :            :     rtl::OString getSignature() const;
     371                 :            : 
     372                 :            : private:
     373                 :            :     TypeManager const & m_manager;
     374                 :            :     Dependencies * m_dependencies;
     375                 :            :     rtl::OStringBuffer m_descriptorStart;
     376                 :            :     rtl::OString m_descriptorEnd;
     377                 :            :     rtl::OStringBuffer m_signatureStart;
     378                 :            :     rtl::OString m_signatureEnd;
     379                 :            :     bool m_needsSignature;
     380                 :            : };
     381                 :            : 
     382                 :      15167 : MethodDescriptor::MethodDescriptor(
     383                 :            :     TypeManager const & manager, Dependencies * dependencies,
     384                 :            :     rtl::OString const & returnType, SpecialType * specialReturnType,
     385                 :            :     PolymorphicUnoType * polymorphicUnoType):
     386                 :      15167 :     m_manager(manager), m_dependencies(dependencies), m_needsSignature(false)
     387                 :            : {
     388                 :            :     OSL_ASSERT(dependencies != 0);
     389         [ +  - ]:      15167 :     m_descriptorStart.append('(');
     390         [ +  - ]:      15167 :     m_signatureStart.append('(');
     391                 :      15167 :     rtl::OStringBuffer descEnd;
     392         [ +  - ]:      15167 :     descEnd.append(')');
     393                 :      15167 :     rtl::OStringBuffer sigEnd;
     394         [ +  - ]:      15167 :     sigEnd.append(')');
     395                 :            :     SpecialType special = translateUnoTypeToDescriptor(
     396                 :            :         m_manager, returnType, false, false, m_dependencies, &descEnd, &sigEnd,
     397         [ +  - ]:      15167 :         &m_needsSignature, polymorphicUnoType);
     398                 :      15167 :     m_descriptorEnd = descEnd.makeStringAndClear();
     399                 :      15167 :     m_signatureEnd = sigEnd.makeStringAndClear();
     400         [ +  + ]:      15167 :     if (specialReturnType != 0) {
     401                 :      12543 :         *specialReturnType = special;
     402                 :      15167 :     }
     403                 :      15167 : }
     404                 :            : 
     405                 :      18485 : SpecialType MethodDescriptor::addParameter(
     406                 :            :     rtl::OString const & type, bool array, bool dependency,
     407                 :            :     PolymorphicUnoType * polymorphicUnoType)
     408                 :            : {
     409                 :            :     return translateUnoTypeToDescriptor(
     410                 :            :         m_manager, type, array, false, dependency ? m_dependencies : 0,
     411                 :            :         &m_descriptorStart, &m_signatureStart, &m_needsSignature,
     412         [ +  + ]:      18485 :         polymorphicUnoType);
     413                 :            : }
     414                 :            : 
     415                 :         13 : void MethodDescriptor::addTypeParameter(rtl::OString const & name) {
     416                 :         13 :     m_descriptorStart.append(RTL_CONSTASCII_STRINGPARAM("Ljava/lang/Object;"));
     417                 :         13 :     m_signatureStart.append('T');
     418                 :         13 :     m_signatureStart.append(name);
     419                 :         13 :     m_signatureStart.append(';');
     420                 :         13 :     m_needsSignature = true;
     421                 :         13 : }
     422                 :            : 
     423                 :      16560 : rtl::OString MethodDescriptor::getDescriptor() const {
     424         [ +  - ]:      16560 :     rtl::OStringBuffer buf(m_descriptorStart);
     425         [ +  - ]:      16560 :     buf.append(m_descriptorEnd);
     426                 :      16560 :     return buf.makeStringAndClear();
     427                 :            : }
     428                 :            : 
     429                 :      15167 : rtl::OString MethodDescriptor::getSignature() const {
     430         [ +  + ]:      15167 :     if (m_needsSignature) {
     431         [ +  - ]:         64 :         rtl::OStringBuffer buf(m_signatureStart);
     432         [ +  - ]:         64 :         buf.append(m_signatureEnd);
     433                 :         64 :         return buf.makeStringAndClear();
     434                 :            :     } else {
     435                 :      15167 :         return rtl::OString();
     436                 :            :     }
     437                 :            : }
     438                 :            : 
     439                 :      83432 : class TypeInfo {
     440                 :            : public:
     441                 :            :     enum Kind { KIND_MEMBER, KIND_ATTRIBUTE, KIND_METHOD, KIND_PARAMETER };
     442                 :            : 
     443                 :            :     // Same values as in com/sun/star/lib/uno/typeinfo/TypeInfo.java:
     444                 :            :     enum Flags {
     445                 :            :         FLAG_READONLY = 0x008, FLAG_BOUND = 0x100, FLAG_ONEWAY = 0x010
     446                 :            :     };
     447                 :            : 
     448                 :            :     // KIND_MEMBER:
     449                 :            :     TypeInfo(
     450                 :            :         rtl::OString const & name, SpecialType specialType, sal_Int32 index,
     451                 :            :         PolymorphicUnoType const & polymorphicUnoType,
     452                 :            :         sal_Int32 typeParameterIndex);
     453                 :            : 
     454                 :            :     // KIND_ATTRIBUTE/METHOD:
     455                 :            :     TypeInfo(
     456                 :            :         Kind kind, rtl::OString const & name, SpecialType specialType,
     457                 :            :         Flags flags, sal_Int32 index,
     458                 :            :         PolymorphicUnoType const & polymorphicUnoType);
     459                 :            : 
     460                 :            :     // KIND_PARAMETER:
     461                 :            :     TypeInfo(
     462                 :            :         rtl::OString const & parameterName, SpecialType specialType,
     463                 :            :         bool inParameter, bool outParameter, rtl::OString const & methodName,
     464                 :            :         sal_Int32 index, PolymorphicUnoType const & polymorphicUnoType);
     465                 :            : 
     466                 :            :     sal_uInt16 generateCode(ClassFile::Code & code, Dependencies * dependencies)
     467                 :            :         const;
     468                 :            : 
     469                 :            :     void generatePolymorphicUnoTypeCode(
     470                 :            :         ClassFile::Code & code, Dependencies * dependencies) const;
     471                 :            : 
     472                 :            : private:
     473                 :            :     Kind m_kind;
     474                 :            :     rtl::OString m_name;
     475                 :            :     sal_Int32 m_flags;
     476                 :            :     sal_Int32 m_index;
     477                 :            :     rtl::OString m_methodName;
     478                 :            :     PolymorphicUnoType m_polymorphicUnoType;
     479                 :            :     sal_Int32 m_typeParameterIndex;
     480                 :            : };
     481                 :            : 
     482                 :      16642 : sal_Int32 translateSpecialTypeFlags(
     483                 :            :     SpecialType specialType, bool inParameter, bool outParameter)
     484                 :            : {
     485                 :            :     static sal_Int32 const specialTypeFlags[SPECIAL_TYPE_INTERFACE + 1] = {
     486                 :            :         0, 0x0040 /* ANY */, 0x0004 /* UNSIGNED */, 0x0080 /* INTERFACE */ };
     487                 :      16642 :     sal_Int32 flags = specialTypeFlags[specialType];
     488         [ +  + ]:      16642 :     if (inParameter) {
     489                 :        295 :         flags |= 0x0001; /* IN */
     490                 :            :     }
     491         [ +  + ]:      16642 :     if (outParameter) {
     492                 :        378 :         flags |= 0x0002; /* OUT */
     493                 :            :     }
     494                 :      16642 :     return flags;
     495                 :            : }
     496                 :            : 
     497                 :       3570 : TypeInfo::TypeInfo(
     498                 :            :     rtl::OString const & name, SpecialType specialType, sal_Int32 index,
     499                 :            :     PolymorphicUnoType const & polymorphicUnoType,
     500                 :            :     sal_Int32 typeParameterIndex):
     501                 :            :     m_kind(KIND_MEMBER), m_name(name),
     502                 :       3570 :     m_flags(translateSpecialTypeFlags(specialType, false, false)),
     503                 :            :     m_index(index), m_polymorphicUnoType(polymorphicUnoType),
     504                 :       7140 :     m_typeParameterIndex(typeParameterIndex)
     505                 :            : {
     506                 :            :     OSL_ASSERT(
     507                 :            :         polymorphicUnoType.kind == PolymorphicUnoType::KIND_NONE
     508                 :            :         ? typeParameterIndex >= -1 : typeParameterIndex == -1);
     509                 :       3570 : }
     510                 :            : 
     511                 :      12543 : TypeInfo::TypeInfo(
     512                 :            :     Kind kind, rtl::OString const & name, SpecialType specialType,
     513                 :            :     Flags flags, sal_Int32 index,
     514                 :            :     PolymorphicUnoType const & polymorphicUnoType):
     515                 :            :     m_kind(kind), m_name(name),
     516                 :      12543 :     m_flags(flags | translateSpecialTypeFlags(specialType, false, false)),
     517                 :      25086 :     m_index(index), m_polymorphicUnoType(polymorphicUnoType)
     518                 :            : {
     519                 :            :     OSL_ASSERT(kind == KIND_ATTRIBUTE || kind == KIND_METHOD);
     520                 :      12543 : }
     521                 :            : 
     522                 :        529 : TypeInfo::TypeInfo(
     523                 :            :     rtl::OString const & parameterName, SpecialType specialType,
     524                 :            :     bool inParameter, bool outParameter, rtl::OString const & methodName,
     525                 :            :     sal_Int32 index, PolymorphicUnoType const & polymorphicUnoType):
     526                 :            :     m_kind(KIND_PARAMETER), m_name(parameterName),
     527                 :        529 :     m_flags(translateSpecialTypeFlags(specialType, inParameter, outParameter)),
     528                 :            :     m_index(index), m_methodName(methodName),
     529                 :       1058 :     m_polymorphicUnoType(polymorphicUnoType)
     530                 :        529 : {}
     531                 :            : 
     532                 :      16642 : sal_uInt16 TypeInfo::generateCode(
     533                 :            :     ClassFile::Code & code, Dependencies * dependencies) const
     534                 :            : {
     535                 :            :     OSL_ASSERT(dependencies != 0);
     536   [ +  +  +  +  :      16642 :     switch (m_kind) {
                      - ]
     537                 :            :     case KIND_MEMBER:
     538                 :            :         code.instrNew(
     539                 :            :             rtl::OString(
     540                 :            :                 RTL_CONSTASCII_STRINGPARAM(
     541         [ +  - ]:       3570 :                     "com/sun/star/lib/uno/typeinfo/MemberTypeInfo")));
     542                 :       3570 :         code.instrDup();
     543                 :       3570 :         code.loadStringConstant(m_name);
     544                 :       3570 :         code.loadIntegerConstant(m_index);
     545                 :       3570 :         code.loadIntegerConstant(m_flags);
     546         [ +  + ]:       3570 :         if (m_polymorphicUnoType.kind != PolymorphicUnoType::KIND_NONE) {
     547                 :          4 :             generatePolymorphicUnoTypeCode(code, dependencies);
     548                 :          4 :             code.loadIntegerConstant(m_typeParameterIndex);
     549                 :            :             code.instrInvokespecial(
     550                 :            :                 rtl::OString(
     551                 :            :                     RTL_CONSTASCII_STRINGPARAM(
     552                 :            :                         "com/sun/star/lib/uno/typeinfo/MemberTypeInfo")),
     553                 :            :                 rtl::OString(RTL_CONSTASCII_STRINGPARAM("<init>")),
     554                 :            :                 rtl::OString(
     555                 :            :                     RTL_CONSTASCII_STRINGPARAM(
     556         [ +  - ]:          4 :                         "(Ljava/lang/String;IILcom/sun/star/uno/Type;I)V")));
     557                 :          4 :             return 8;
     558         [ +  + ]:       3566 :         } else if (m_typeParameterIndex >= 0) {
     559                 :         13 :             code.instrAconstNull();
     560                 :         13 :             code.loadIntegerConstant(m_typeParameterIndex);
     561                 :            :             code.instrInvokespecial(
     562                 :            :                 rtl::OString(
     563                 :            :                     RTL_CONSTASCII_STRINGPARAM(
     564                 :            :                         "com/sun/star/lib/uno/typeinfo/MemberTypeInfo")),
     565                 :            :                 rtl::OString(RTL_CONSTASCII_STRINGPARAM("<init>")),
     566                 :            :                 rtl::OString(
     567                 :            :                     RTL_CONSTASCII_STRINGPARAM(
     568         [ +  - ]:         13 :                         "(Ljava/lang/String;IILcom/sun/star/uno/Type;I)V")));
     569                 :         13 :             return 6;
     570                 :            :         } else {
     571                 :            :             code.instrInvokespecial(
     572                 :            :                 rtl::OString(
     573                 :            :                     RTL_CONSTASCII_STRINGPARAM(
     574                 :            :                         "com/sun/star/lib/uno/typeinfo/MemberTypeInfo")),
     575                 :            :                 rtl::OString(RTL_CONSTASCII_STRINGPARAM("<init>")),
     576                 :            :                 rtl::OString(
     577         [ +  - ]:       3553 :                     RTL_CONSTASCII_STRINGPARAM("(Ljava/lang/String;II)V")));
     578                 :       3553 :             return 4;
     579                 :            :         }
     580                 :            : 
     581                 :            :     case KIND_ATTRIBUTE:
     582                 :            :         code.instrNew(
     583                 :            :             rtl::OString(
     584                 :            :                 RTL_CONSTASCII_STRINGPARAM(
     585         [ +  - ]:       1116 :                     "com/sun/star/lib/uno/typeinfo/AttributeTypeInfo")));
     586                 :       1116 :         code.instrDup();
     587                 :       1116 :         code.loadStringConstant(m_name);
     588                 :       1116 :         code.loadIntegerConstant(m_index);
     589                 :       1116 :         code.loadIntegerConstant(m_flags);
     590         [ +  + ]:       1116 :         if (m_polymorphicUnoType.kind != PolymorphicUnoType::KIND_NONE) {
     591                 :          8 :             generatePolymorphicUnoTypeCode(code, dependencies);
     592                 :            :             code.instrInvokespecial(
     593                 :            :                 rtl::OString(
     594                 :            :                     RTL_CONSTASCII_STRINGPARAM(
     595                 :            :                         "com/sun/star/lib/uno/typeinfo/AttributeTypeInfo")),
     596                 :            :                 rtl::OString(RTL_CONSTASCII_STRINGPARAM("<init>")),
     597                 :            :                 rtl::OString(
     598                 :            :                     RTL_CONSTASCII_STRINGPARAM(
     599         [ +  - ]:          8 :                         "(Ljava/lang/String;IILcom/sun/star/uno/Type;)V")));
     600                 :          8 :             return 8;
     601                 :            :         } else {
     602                 :            :             code.instrInvokespecial(
     603                 :            :                 rtl::OString(
     604                 :            :                     RTL_CONSTASCII_STRINGPARAM(
     605                 :            :                         "com/sun/star/lib/uno/typeinfo/AttributeTypeInfo")),
     606                 :            :                 rtl::OString(RTL_CONSTASCII_STRINGPARAM("<init>")),
     607                 :            :                 rtl::OString(
     608         [ +  - ]:       1108 :                     RTL_CONSTASCII_STRINGPARAM("(Ljava/lang/String;II)V")));
     609                 :       1108 :             return 4;
     610                 :            :         }
     611                 :            : 
     612                 :            :     case KIND_METHOD:
     613                 :            :         code.instrNew(
     614                 :            :             rtl::OString(
     615                 :            :                 RTL_CONSTASCII_STRINGPARAM(
     616         [ +  - ]:      11427 :                     "com/sun/star/lib/uno/typeinfo/MethodTypeInfo")));
     617                 :      11427 :         code.instrDup();
     618                 :      11427 :         code.loadStringConstant(m_name);
     619                 :      11427 :         code.loadIntegerConstant(m_index);
     620                 :      11427 :         code.loadIntegerConstant(m_flags);
     621         [ +  + ]:      11427 :         if (m_polymorphicUnoType.kind != PolymorphicUnoType::KIND_NONE) {
     622                 :         28 :             generatePolymorphicUnoTypeCode(code, dependencies);
     623                 :            :             code.instrInvokespecial(
     624                 :            :                 rtl::OString(
     625                 :            :                     RTL_CONSTASCII_STRINGPARAM(
     626                 :            :                         "com/sun/star/lib/uno/typeinfo/MethodTypeInfo")),
     627                 :            :                 rtl::OString(RTL_CONSTASCII_STRINGPARAM("<init>")),
     628                 :            :                 rtl::OString(
     629                 :            :                     RTL_CONSTASCII_STRINGPARAM(
     630         [ +  - ]:         28 :                         "(Ljava/lang/String;IILcom/sun/star/uno/Type;)V")));
     631                 :         28 :             return 8;
     632                 :            :         } else {
     633                 :            :             code.instrInvokespecial(
     634                 :            :                 rtl::OString(
     635                 :            :                     RTL_CONSTASCII_STRINGPARAM(
     636                 :            :                         "com/sun/star/lib/uno/typeinfo/MethodTypeInfo")),
     637                 :            :                 rtl::OString(RTL_CONSTASCII_STRINGPARAM("<init>")),
     638                 :            :                 rtl::OString(
     639         [ +  - ]:      11399 :                     RTL_CONSTASCII_STRINGPARAM("(Ljava/lang/String;II)V")));
     640                 :      11399 :             return 4;
     641                 :            :         }
     642                 :            : 
     643                 :            :     case KIND_PARAMETER:
     644                 :            :         code.instrNew(
     645                 :            :             rtl::OString(
     646                 :            :                 RTL_CONSTASCII_STRINGPARAM(
     647         [ +  - ]:        529 :                     "com/sun/star/lib/uno/typeinfo/ParameterTypeInfo")));
     648                 :        529 :         code.instrDup();
     649                 :        529 :         code.loadStringConstant(m_name);
     650                 :        529 :         code.loadStringConstant(m_methodName);
     651                 :        529 :         code.loadIntegerConstant(m_index);
     652                 :        529 :         code.loadIntegerConstant(m_flags);
     653         [ +  + ]:        529 :         if (m_polymorphicUnoType.kind != PolymorphicUnoType::KIND_NONE) {
     654                 :          6 :             generatePolymorphicUnoTypeCode(code, dependencies);
     655                 :            :             code.instrInvokespecial(
     656                 :            :                 rtl::OString(
     657                 :            :                     RTL_CONSTASCII_STRINGPARAM(
     658                 :            :                         "com/sun/star/lib/uno/typeinfo/ParameterTypeInfo")),
     659                 :            :                 rtl::OString(RTL_CONSTASCII_STRINGPARAM("<init>")),
     660                 :            :                 rtl::OString(
     661                 :            :                     RTL_CONSTASCII_STRINGPARAM(
     662                 :            :                         "(Ljava/lang/String;Ljava/lang/String;II"
     663         [ +  - ]:          6 :                         "Lcom/sun/star/uno/Type;)V")));
     664                 :          6 :             return 9;
     665                 :            :         } else {
     666                 :            :             code.instrInvokespecial(
     667                 :            :                 rtl::OString(
     668                 :            :                     RTL_CONSTASCII_STRINGPARAM(
     669                 :            :                         "com/sun/star/lib/uno/typeinfo/ParameterTypeInfo")),
     670                 :            :                 rtl::OString(RTL_CONSTASCII_STRINGPARAM("<init>")),
     671                 :            :                 rtl::OString(
     672                 :            :                     RTL_CONSTASCII_STRINGPARAM(
     673         [ +  - ]:        523 :                         "(Ljava/lang/String;Ljava/lang/String;II)V")));
     674                 :        523 :             return 5;
     675                 :            :         }
     676                 :            : 
     677                 :            :     default:
     678                 :            :         OSL_ASSERT(false);
     679                 :      16642 :         return 0;
     680                 :            :     }
     681                 :            : }
     682                 :            : 
     683                 :         46 : void TypeInfo::generatePolymorphicUnoTypeCode(
     684                 :            :     ClassFile::Code & code, Dependencies * dependencies) const
     685                 :            : {
     686                 :            :     OSL_ASSERT(
     687                 :            :         dependencies != 0
     688                 :            :         && m_polymorphicUnoType.kind != PolymorphicUnoType::KIND_NONE);
     689                 :            :     code.instrNew(
     690         [ +  - ]:         46 :         rtl::OString(RTL_CONSTASCII_STRINGPARAM("com/sun/star/uno/Type")));
     691                 :         46 :     code.instrDup();
     692                 :         46 :     code.loadStringConstant(m_polymorphicUnoType.name);
     693         [ +  + ]:         46 :     if (m_polymorphicUnoType.kind == PolymorphicUnoType::KIND_STRUCT) {
     694                 :            :         code.instrGetstatic(
     695                 :            :             rtl::OString(
     696                 :            :                 RTL_CONSTASCII_STRINGPARAM("com/sun/star/uno/TypeClass")),
     697                 :            :             rtl::OString(RTL_CONSTASCII_STRINGPARAM("STRUCT")),
     698                 :            :             rtl::OString(
     699         [ +  - ]:         40 :                 RTL_CONSTASCII_STRINGPARAM("Lcom/sun/star/uno/TypeClass;")));
     700                 :            :     } else {
     701                 :            :         code.instrGetstatic(
     702                 :            :             rtl::OString(
     703                 :            :                 RTL_CONSTASCII_STRINGPARAM("com/sun/star/uno/TypeClass")),
     704                 :            :             rtl::OString(RTL_CONSTASCII_STRINGPARAM("SEQUENCE")),
     705                 :            :             rtl::OString(
     706         [ +  - ]:          6 :                 RTL_CONSTASCII_STRINGPARAM("Lcom/sun/star/uno/TypeClass;")));
     707                 :            :     }
     708                 :            :     dependencies->insert(
     709         [ +  - ]:         46 :         rtl::OString(RTL_CONSTASCII_STRINGPARAM("com/sun/star/uno/TypeClass")));
     710                 :            :     code.instrInvokespecial(
     711                 :            :         rtl::OString(RTL_CONSTASCII_STRINGPARAM("com/sun/star/uno/Type")),
     712                 :            :         rtl::OString(RTL_CONSTASCII_STRINGPARAM("<init>")),
     713                 :            :         rtl::OString(
     714                 :            :             RTL_CONSTASCII_STRINGPARAM(
     715         [ +  - ]:         46 :                 "(Ljava/lang/String;Lcom/sun/star/uno/TypeClass;)V")));
     716                 :         46 : }
     717                 :            : 
     718                 :       6200 : void writeClassFile(
     719                 :            :     JavaOptions /*TODO const*/ & options, rtl::OString const & type,
     720                 :            :     ClassFile const & classFile)
     721                 :            : {
     722                 :       6200 :     rtl::OString path;
     723 [ +  - ][ +  - ]:       6200 :     if (options.isValid(rtl::OString(RTL_CONSTASCII_STRINGPARAM("-O")))) {
     724                 :            :         path = options.getOption(
     725         [ +  - ]:       6200 :             rtl::OString(RTL_CONSTASCII_STRINGPARAM("-O")));
     726                 :            :     }
     727                 :            :     rtl::OString filename(
     728                 :            :         createFileNameFromType(
     729         [ +  - ]:       6200 :             path, type, rtl::OString(RTL_CONSTASCII_STRINGPARAM(".class"))));
     730                 :       6200 :     bool check = false;
     731 [ +  + ][ +  - ]:       6200 :     if (fileExists(filename)) {
     732 [ +  - ][ -  + ]:        416 :         if (options.isValid(rtl::OString(RTL_CONSTASCII_STRINGPARAM("-G")))) {
     733                 :       6200 :             return;
     734                 :            :         }
     735                 :            :         check = options.isValid(
     736         [ +  - ]:        416 :             rtl::OString(RTL_CONSTASCII_STRINGPARAM("-Gc")));
     737                 :            :     }
     738         [ +  - ]:       6200 :     FileStream tempfile;
     739 [ +  - ][ +  - ]:       6200 :     tempfile.createTempFile(getTempDir(filename));
     740 [ -  + ][ +  - ]:       6200 :     if (!tempfile.isValid()) {
     741                 :            :         throw CannotDumpException(
     742                 :            :             rtl::OString(
     743                 :            :                 RTL_CONSTASCII_STRINGPARAM("Cannot create temporary file for "))
     744                 :          0 :             + filename);
     745                 :            :     }
     746                 :       6200 :     rtl::OString tempname(tempfile.getName());
     747                 :            :     try {
     748         [ +  - ]:       6200 :         classFile.write(tempfile);
     749                 :          0 :     } catch (...) {
     750                 :            :         // Remove existing file for consistency:
     751   [ #  #  #  # ]:          0 :         if (fileExists(filename)) {
     752         [ #  # ]:          0 :             removeTypeFile(filename);
     753                 :            :         }
     754         [ #  # ]:          0 :         tempfile.close();
     755         [ #  # ]:          0 :         removeTypeFile(tempname);
     756                 :          0 :         throw;
     757                 :            :     }
     758         [ +  - ]:       6200 :     tempfile.close();
     759 [ +  - ][ -  + ]:       6200 :     if (!makeValidTypeFile(filename, tempname, check)) {
     760                 :          0 :         rtl::OStringBuffer msg;
     761         [ #  # ]:          0 :         msg.append(RTL_CONSTASCII_STRINGPARAM("Cannot create "));
     762         [ #  # ]:          0 :         msg.append(filename);
     763         [ #  # ]:          0 :         msg.append(RTL_CONSTASCII_STRINGPARAM(" from temporary file "));
     764         [ #  # ]:          0 :         msg.append(tempname);
     765                 :          0 :         throw CannotDumpException(msg.makeStringAndClear());
     766 [ +  - ][ -  + ]:       6200 :     }
                 [ +  - ]
     767                 :            : }
     768                 :            : 
     769                 :       4716 : void addTypeInfo(
     770                 :            :     rtl::OString const & className, std::vector< TypeInfo > const & typeInfo,
     771                 :            :     Dependencies * dependencies, ClassFile * classFile)
     772                 :            : {
     773                 :            :     OSL_ASSERT(dependencies != 0 && classFile != 0);
     774                 :       4716 :     std::vector< TypeInfo >::size_type typeInfos = typeInfo.size();
     775         [ -  + ]:       4716 :     if (typeInfos > SAL_MAX_INT32) {
     776                 :            :         throw CannotDumpException(
     777                 :            :             rtl::OString(
     778                 :            :                 RTL_CONSTASCII_STRINGPARAM(
     779                 :          0 :                     "UNOTYPEINFO array too big for Java class file format")));
     780                 :            :     }
     781         [ +  + ]:       4716 :     if (typeInfos != 0) {
     782                 :            :         classFile->addField(
     783                 :            :             static_cast< ClassFile::AccessFlags >(
     784                 :            :                 ClassFile::ACC_PUBLIC | ClassFile::ACC_STATIC
     785                 :            :                 | ClassFile::ACC_FINAL),
     786                 :            :             rtl::OString(RTL_CONSTASCII_STRINGPARAM("UNOTYPEINFO")),
     787                 :            :             rtl::OString(
     788                 :            :                 RTL_CONSTASCII_STRINGPARAM(
     789                 :            :                     "[Lcom/sun/star/lib/uno/typeinfo/TypeInfo;")),
     790         [ +  - ]:       4320 :             0, rtl::OString());
     791                 :            :         SAL_WNODEPRECATED_DECLARATIONS_PUSH
     792         [ +  - ]:       4320 :         std::auto_ptr< ClassFile::Code > code(classFile->newCode());
     793                 :            :         SAL_WNODEPRECATED_DECLARATIONS_POP
     794         [ +  - ]:       4320 :         code->loadIntegerConstant(static_cast< sal_Int32 >(typeInfos));
     795                 :            :         code->instrAnewarray(
     796                 :            :             rtl::OString(
     797                 :            :                 RTL_CONSTASCII_STRINGPARAM(
     798         [ +  - ]:       4320 :                     "com/sun/star/lib/uno/typeinfo/TypeInfo")));
     799                 :       4320 :         sal_Int32 index = 0;
     800                 :       4320 :         sal_uInt16 stack = 0;
     801 [ +  - ][ +  + ]:      41924 :         for (std::vector< TypeInfo >::const_iterator i(typeInfo.begin());
     802                 :      20962 :              i != typeInfo.end(); ++i)
     803                 :            :         {
     804         [ +  - ]:      16642 :             code->instrDup();
     805         [ +  - ]:      16642 :             code->loadIntegerConstant(index++);
     806 [ +  - ][ +  - ]:      16642 :             stack = std::max(stack, i->generateCode(*code, dependencies));
     807         [ +  - ]:      16642 :             code->instrAastore();
     808                 :            :         }
     809                 :            :         code->instrPutstatic(
     810                 :            :             className, rtl::OString(RTL_CONSTASCII_STRINGPARAM("UNOTYPEINFO")),
     811                 :            :             rtl::OString(
     812                 :            :                 RTL_CONSTASCII_STRINGPARAM(
     813         [ +  - ]:       4320 :                     "[Lcom/sun/star/lib/uno/typeinfo/TypeInfo;")));
     814         [ +  - ]:       4320 :         code->instrReturn();
     815         [ -  + ]:       4320 :         if (stack > SAL_MAX_UINT16 - 4) {
     816                 :            :             throw CannotDumpException(
     817                 :            :                 rtl::OString(
     818                 :            :                     RTL_CONSTASCII_STRINGPARAM(
     819                 :          0 :                         "Stack too big for Java class file format")));
     820                 :            :         }
     821                 :       4320 :         code->setMaxStackAndLocals(static_cast< sal_uInt16 >(stack + 4), 0);
     822                 :            :         classFile->addMethod(
     823                 :            :             static_cast< ClassFile::AccessFlags >(
     824                 :            :                 ClassFile::ACC_PRIVATE | ClassFile::ACC_STATIC),
     825                 :            :             rtl::OString(RTL_CONSTASCII_STRINGPARAM("<clinit>")),
     826                 :       4320 :             rtl::OString(RTL_CONSTASCII_STRINGPARAM("()V")), code.get(),
     827         [ +  - ]:       8640 :             std::vector< rtl::OString >(), rtl::OString());
           [ +  -  +  - ]
     828                 :            :     }
     829                 :       4716 : }
     830                 :            : 
     831                 :            : typedef void (* handleUnoTypeRegistryEntityFunction)(
     832                 :            :     TypeManager const & manager, JavaOptions /*TODO const*/ & options,
     833                 :            :     typereg::Reader const & reader, Dependencies * dependencies);
     834                 :            : 
     835                 :        409 : void handleEnumType(
     836                 :            :     SAL_UNUSED_PARAMETER TypeManager const &,
     837                 :            :     JavaOptions /*TODO const*/ & options, typereg::Reader const & reader,
     838                 :            :     SAL_UNUSED_PARAMETER Dependencies *)
     839                 :            : {
     840                 :        409 :     sal_uInt16 fields = reader.getFieldCount();
     841   [ +  -  +  -  :       1227 :     if (fields == 0 || reader.getSuperTypeCount() != 0
           -  + ][ -  + ]
                 [ +  - ]
     842                 :        818 :         || reader.getMethodCount() != 0 || reader.getReferenceCount() != 0)
     843                 :            :     {
     844                 :            :         throw CannotDumpException(
     845                 :          0 :             rtl::OString(RTL_CONSTASCII_STRINGPARAM("Bad type information")));
     846                 :            :             //TODO
     847                 :            :     }
     848 [ +  - ][ +  - ]:        409 :     rtl::OString className(codemaker::convertString(reader.getTypeName()));
     849                 :            :     SAL_WNODEPRECATED_DECLARATIONS_PUSH
     850                 :            :     std::auto_ptr< ClassFile > cf(
     851                 :            :         new ClassFile(
     852                 :            :             static_cast< ClassFile::AccessFlags >(
     853                 :            :                 ClassFile::ACC_PUBLIC | ClassFile::ACC_FINAL
     854                 :            :                 | ClassFile::ACC_SUPER),
     855                 :            :             className,
     856                 :            :             rtl::OString(RTL_CONSTASCII_STRINGPARAM("com/sun/star/uno/Enum")),
     857 [ +  - ][ +  - ]:        409 :             rtl::OString()));
     858                 :            :     SAL_WNODEPRECATED_DECLARATIONS_POP
     859                 :        409 :     rtl::OStringBuffer buf;
     860         [ +  - ]:        409 :     buf.append('L');
     861         [ +  - ]:        409 :     buf.append(className);
     862         [ +  - ]:        409 :     buf.append(';');
     863                 :        409 :     rtl::OString classDescriptor(buf.makeStringAndClear());
     864         [ +  + ]:       3230 :     {for (sal_uInt16 i = 0; i < fields; ++i) {
     865         [ +  - ]:       2821 :         RTConstValue fieldValue(reader.getFieldValue(i));
     866   [ +  -  +  -  :      11284 :         if (fieldValue.m_type != RT_TYPE_INT32
           -  + ][ -  + ]
     867                 :       2821 :             || reader.getFieldFlags(i) != RT_ACCESS_CONST
     868 [ +  - ][ +  - ]:       5642 :             || reader.getFieldTypeName(i).getLength() != 0)
                 [ #  # ]
     869                 :            :         {
     870                 :            :             throw CannotDumpException(
     871                 :            :                 rtl::OString(
     872                 :          0 :                     RTL_CONSTASCII_STRINGPARAM("Bad type information"))); //TODO
     873                 :            :         }
     874                 :            :         rtl::OString fieldName(
     875 [ +  - ][ +  - ]:       2821 :             codemaker::convertString(reader.getFieldName(i)));
     876                 :            :         cf->addField(
     877                 :            :             static_cast< ClassFile::AccessFlags >(
     878                 :            :                 ClassFile::ACC_PUBLIC | ClassFile::ACC_STATIC
     879                 :            :                 | ClassFile::ACC_FINAL),
     880         [ +  - ]:       2821 :             fieldName, classDescriptor, 0, rtl::OString());
     881                 :            :         cf->addField(
     882                 :            :             static_cast< ClassFile::AccessFlags >(
     883                 :            :                 ClassFile::ACC_PUBLIC | ClassFile::ACC_STATIC
     884                 :            :                 | ClassFile::ACC_FINAL),
     885                 :            :             fieldName + rtl::OString(RTL_CONSTASCII_STRINGPARAM("_value")),
     886                 :            :             rtl::OString(RTL_CONSTASCII_STRINGPARAM("I")),
     887 [ +  - ][ +  - ]:       2821 :             cf->addIntegerInfo(fieldValue.m_value.aLong), rtl::OString());
     888                 :       2821 :     }}
     889                 :            :     SAL_WNODEPRECATED_DECLARATIONS_PUSH
     890         [ +  - ]:        409 :     std::auto_ptr< ClassFile::Code > code(cf->newCode());
     891                 :            :     SAL_WNODEPRECATED_DECLARATIONS_POP
     892         [ +  - ]:        409 :     code->loadLocalReference(0);
     893         [ +  - ]:        409 :     code->loadLocalInteger(1);
     894                 :            :     code->instrInvokespecial(
     895                 :            :         rtl::OString(RTL_CONSTASCII_STRINGPARAM("com/sun/star/uno/Enum")),
     896                 :            :         rtl::OString(RTL_CONSTASCII_STRINGPARAM("<init>")),
     897         [ +  - ]:        409 :         rtl::OString(RTL_CONSTASCII_STRINGPARAM("(I)V")));
     898         [ +  - ]:        409 :     code->instrReturn();
     899                 :        409 :     code->setMaxStackAndLocals(2, 2);
     900                 :            :     cf->addMethod(
     901                 :            :         ClassFile::ACC_PRIVATE,
     902                 :            :         rtl::OString(RTL_CONSTASCII_STRINGPARAM("<init>")),
     903                 :        409 :         rtl::OString(RTL_CONSTASCII_STRINGPARAM("(I)V")), code.get(),
     904   [ +  -  +  - ]:        818 :         std::vector< rtl::OString >(), rtl::OString());
     905         [ +  - ]:        409 :     code.reset(cf->newCode());
     906                 :            :     code->instrGetstatic(
     907                 :            :         className,
     908 [ +  - ][ +  - ]:        409 :         codemaker::convertString(reader.getFieldName(0)), classDescriptor);
                 [ +  - ]
     909         [ +  - ]:        409 :     code->instrAreturn();
     910                 :        409 :     code->setMaxStackAndLocals(1, 0);
     911                 :            :     cf->addMethod(
     912                 :            :         static_cast< ClassFile::AccessFlags >(
     913                 :            :             ClassFile::ACC_PUBLIC | ClassFile::ACC_STATIC),
     914                 :            :         rtl::OString(RTL_CONSTASCII_STRINGPARAM("getDefault")),
     915                 :            :         rtl::OString(RTL_CONSTASCII_STRINGPARAM("()")) + classDescriptor,
     916 [ +  - ][ +  - ]:        409 :         code.get(), std::vector< rtl::OString >(), rtl::OString());
     917         [ +  - ]:        409 :     code.reset(cf->newCode());
     918         [ +  - ]:        409 :     code->loadLocalInteger(0);
     919         [ +  - ]:        409 :     std::map< sal_Int32, rtl::OString > map;
     920                 :        409 :     sal_Int32 min = SAL_MAX_INT32;
     921                 :        409 :     sal_Int32 max = SAL_MIN_INT32;
     922         [ +  + ]:       3230 :     {for (sal_uInt16 i = 0; i < fields; ++i) {
     923         [ +  - ]:       2821 :         sal_Int32 value = reader.getFieldValue(i).m_value.aLong;
     924         [ +  - ]:       2821 :         min = std::min(min, value);
     925         [ +  - ]:       2821 :         max = std::max(max, value);
     926                 :            :         map.insert(
     927                 :            :             std::map< sal_Int32, rtl::OString >::value_type(
     928 [ +  - ][ +  - ]:       2821 :                 value, codemaker::convertString(reader.getFieldName(i))));
                 [ +  - ]
     929                 :            :     }}
     930                 :        409 :     sal_uInt64 size = static_cast< sal_uInt64 >(map.size());
     931 [ -  + ][ +  + ]:        409 :     if ((static_cast< sal_uInt64 >(max) - static_cast< sal_uInt64 >(min)
     932                 :            :          <= 2 * size)
     933                 :            :         || size > SAL_MAX_INT32)
     934                 :            :     {
     935                 :            :         SAL_WNODEPRECATED_DECLARATIONS_PUSH
     936         [ +  - ]:        407 :         std::auto_ptr< ClassFile::Code > defCode(cf->newCode());
     937                 :            :         SAL_WNODEPRECATED_DECLARATIONS_POP
     938         [ +  - ]:        407 :         defCode->instrAconstNull();
     939         [ +  - ]:        407 :         defCode->instrAreturn();
     940         [ +  - ]:        407 :         std::list< ClassFile::Code * > blocks;
     941                 :            :             //FIXME: pointers contained in blocks may leak
     942                 :        407 :         sal_Int32 last = SAL_MAX_INT32;
     943         [ +  + ]:       6308 :         for (std::map< sal_Int32, rtl::OString >::iterator i(map.begin());
     944                 :       3154 :              i != map.end(); ++i)
     945                 :            :         {
     946                 :       2747 :             sal_Int32 value = i->first;
     947         [ +  + ]:       2747 :             if (last != SAL_MAX_INT32) {
     948         [ +  + ]:       2348 :                 for (sal_Int32 j = last + 1; j < value; ++j) {
     949         [ +  - ]:          8 :                     blocks.push_back(0);
     950                 :            :                 }
     951                 :            :             }
     952                 :       2747 :             last = value;
     953                 :            :             SAL_WNODEPRECATED_DECLARATIONS_PUSH
     954         [ +  - ]:       2747 :             std::auto_ptr< ClassFile::Code > blockCode(cf->newCode());
     955                 :            :             SAL_WNODEPRECATED_DECLARATIONS_POP
     956         [ +  - ]:       2747 :             blockCode->instrGetstatic(className, i->second, classDescriptor);
     957         [ +  - ]:       2747 :             blockCode->instrAreturn();
     958         [ +  - ]:       2747 :             blocks.push_back(blockCode.get());
     959                 :       2747 :             blockCode.release();
     960         [ +  - ]:       2747 :         }
     961         [ +  - ]:        407 :         code->instrTableswitch(defCode.get(), min, blocks);
     962         [ +  + ]:       6324 :         {for (std::list< ClassFile::Code * >::iterator i(blocks.begin());
     963                 :       3162 :               i != blocks.end(); ++i)
     964                 :            :         {
     965 [ +  + ][ +  - ]:       2755 :             delete *i;
     966         [ +  - ]:        407 :         }}
     967                 :            :     } else{
     968                 :            :         SAL_WNODEPRECATED_DECLARATIONS_PUSH
     969         [ +  - ]:          2 :         std::auto_ptr< ClassFile::Code > defCode(cf->newCode());
     970                 :            :         SAL_WNODEPRECATED_DECLARATIONS_POP
     971         [ +  - ]:          2 :         defCode->instrAconstNull();
     972         [ +  - ]:          2 :         defCode->instrAreturn();
     973         [ +  - ]:          2 :         std::list< std::pair< sal_Int32, ClassFile::Code * > > blocks;
     974                 :            :             //FIXME: pointers contained in blocks may leak
     975         [ +  + ]:        152 :         for (std::map< sal_Int32, rtl::OString >::iterator i(map.begin());
     976                 :         76 :              i != map.end(); ++i)
     977                 :            :         {
     978                 :            :             SAL_WNODEPRECATED_DECLARATIONS_PUSH
     979         [ +  - ]:         74 :             std::auto_ptr< ClassFile::Code > blockCode(cf->newCode());
     980                 :            :             SAL_WNODEPRECATED_DECLARATIONS_POP
     981         [ +  - ]:         74 :             blockCode->instrGetstatic(className, i->second, classDescriptor);
     982         [ +  - ]:         74 :             blockCode->instrAreturn();
     983         [ +  - ]:         74 :             blocks.push_back(std::make_pair(i->first, blockCode.get()));
     984                 :         74 :             blockCode.release();
     985         [ +  - ]:         74 :         }
     986         [ +  - ]:          2 :         code->instrLookupswitch(defCode.get(), blocks);
     987         [ +  + ]:        152 :         {for (std::list< std::pair< sal_Int32, ClassFile::Code * > >::iterator
     988                 :          2 :                   i(blocks.begin());
     989                 :         76 :               i != blocks.end(); ++i)
     990                 :            :         {
     991 [ +  - ][ +  - ]:         74 :             delete i->second;
     992         [ +  - ]:          2 :         }}
     993                 :            :     }
     994                 :        409 :     code->setMaxStackAndLocals(1, 1);
     995                 :            :     cf->addMethod(
     996                 :            :         static_cast< ClassFile::AccessFlags >(
     997                 :            :             ClassFile::ACC_PUBLIC | ClassFile::ACC_STATIC),
     998                 :            :         rtl::OString(RTL_CONSTASCII_STRINGPARAM("fromInt")),
     999                 :            :         rtl::OString(RTL_CONSTASCII_STRINGPARAM("(I)")) + classDescriptor,
    1000 [ +  - ][ +  - ]:        409 :         code.get(), std::vector< rtl::OString >(), rtl::OString());
    1001         [ +  - ]:        409 :     code.reset(cf->newCode());
    1002         [ +  + ]:       3230 :     {for (sal_uInt16 i = 0; i < fields; ++i) {
    1003         [ +  - ]:       2821 :         code->instrNew(className);
    1004         [ +  - ]:       2821 :         code->instrDup();
    1005 [ +  - ][ +  - ]:       2821 :         code->loadIntegerConstant(reader.getFieldValue(i).m_value.aLong);
    1006                 :            :         code->instrInvokespecial(
    1007                 :            :             className, rtl::OString(RTL_CONSTASCII_STRINGPARAM("<init>")),
    1008         [ +  - ]:       2821 :             rtl::OString(RTL_CONSTASCII_STRINGPARAM("(I)V")));
    1009                 :            :         code->instrPutstatic(
    1010                 :            :             className,
    1011                 :            :             codemaker::convertString(reader.getFieldName(i)),
    1012 [ +  - ][ +  - ]:       2821 :             classDescriptor);
                 [ +  - ]
    1013                 :            :     }}
    1014         [ +  - ]:        409 :     code->instrReturn();
    1015                 :        409 :     code->setMaxStackAndLocals(3, 0);
    1016                 :            :     cf->addMethod(
    1017                 :            :         static_cast< ClassFile::AccessFlags >(
    1018                 :            :             ClassFile::ACC_PRIVATE | ClassFile::ACC_STATIC),
    1019                 :            :         rtl::OString(RTL_CONSTASCII_STRINGPARAM("<clinit>")),
    1020                 :        409 :         rtl::OString(RTL_CONSTASCII_STRINGPARAM("()V")), code.get(),
    1021   [ +  -  +  - ]:        818 :         std::vector< rtl::OString >(), rtl::OString());
    1022 [ +  - ][ +  - ]:        409 :     writeClassFile(options, className, *cf.get());
                 [ +  - ]
    1023                 :        409 : }
    1024                 :            : 
    1025                 :       3570 : void addField(
    1026                 :            :     TypeManager const & manager, Dependencies * dependencies,
    1027                 :            :     ClassFile * classFile, std::vector< TypeInfo > * typeInfo,
    1028                 :            :     sal_Int32 typeParameterIndex, rtl::OString const & type,
    1029                 :            :     rtl::OString const & name, sal_Int32 index)
    1030                 :            : {
    1031                 :            :     OSL_ASSERT(dependencies != 0 && classFile != 0 && typeInfo != 0);
    1032                 :       3570 :     rtl::OString descriptor;
    1033                 :       3570 :     rtl::OString signature;
    1034                 :            :     SpecialType specialType;
    1035                 :       3570 :     PolymorphicUnoType polymorphicUnoType;
    1036         [ +  + ]:       3570 :     if (typeParameterIndex >= 0) {
    1037                 :            :         descriptor = rtl::OString(
    1038                 :         13 :             RTL_CONSTASCII_STRINGPARAM("Ljava/lang/Object;"));
    1039                 :         13 :         rtl::OStringBuffer buf;
    1040         [ +  - ]:         13 :         buf.append('T');
    1041         [ +  - ]:         13 :         buf.append(type);
    1042         [ +  - ]:         13 :         buf.append(';');
    1043                 :         13 :         signature = buf.makeStringAndClear();
    1044                 :         13 :         specialType = SPECIAL_TYPE_NONE; //TODO: SPECIAL_TYPE_TYPE_PARAMETER?
    1045                 :            :     } else {
    1046                 :            :         specialType = getFieldDescriptor(
    1047                 :            :             manager, dependencies, type, &descriptor, &signature,
    1048         [ +  - ]:       3557 :             &polymorphicUnoType);
    1049                 :            :     }
    1050         [ +  - ]:       3570 :     classFile->addField(ClassFile::ACC_PUBLIC, name, descriptor, 0, signature);
    1051                 :            :     typeInfo->push_back(
    1052                 :            :         TypeInfo(
    1053         [ +  - ]:       3570 :             name, specialType, index, polymorphicUnoType, typeParameterIndex));
    1054                 :       3570 : }
    1055                 :            : 
    1056                 :       3886 : sal_uInt16 addFieldInit(
    1057                 :            :     TypeManager const & manager, rtl::OString const & className,
    1058                 :            :     rtl::OString const & fieldName, bool typeParameter,
    1059                 :            :     rtl::OString const & fieldType, Dependencies * dependencies,
    1060                 :            :     ClassFile::Code * code)
    1061                 :            : {
    1062                 :            :     OSL_ASSERT(dependencies != 0 && code != 0);
    1063         [ +  + ]:       3886 :     if (typeParameter) {
    1064                 :         13 :         return 0;
    1065                 :            :     } else {
    1066                 :            :         RTTypeClass typeClass;
    1067                 :       3873 :         rtl::OString nucleus;
    1068                 :            :         sal_Int32 rank;
    1069         [ +  - ]:       3873 :         std::vector< rtl::OString > args;
    1070                 :            :         codemaker::UnoType::Sort sort = codemaker::decomposeAndResolve(
    1071                 :            :             manager, fieldType, true, false, false, &typeClass, &nucleus, &rank,
    1072         [ +  - ]:       3873 :             &args);
    1073         [ +  + ]:       3873 :         if (rank == 0) {
    1074   [ +  +  +  +  :       3608 :             switch (sort) {
                      + ]
    1075                 :            :             case codemaker::UnoType::SORT_STRING:
    1076         [ +  - ]:        954 :                 code->loadLocalReference(0);
    1077         [ +  - ]:        954 :                 code->loadStringConstant(rtl::OString());
    1078                 :            :                 code->instrPutfield(
    1079                 :            :                     className, fieldName,
    1080                 :            :                     rtl::OString(
    1081         [ +  - ]:        954 :                         RTL_CONSTASCII_STRINGPARAM("Ljava/lang/String;")));
    1082                 :        954 :                 return 2;
    1083                 :            : 
    1084                 :            :             case codemaker::UnoType::SORT_TYPE:
    1085         [ +  - ]:         10 :                 code->loadLocalReference(0);
    1086                 :            :                 code->instrGetstatic(
    1087                 :            :                     rtl::OString(
    1088                 :            :                         RTL_CONSTASCII_STRINGPARAM("com/sun/star/uno/Type")),
    1089                 :            :                     rtl::OString(RTL_CONSTASCII_STRINGPARAM("VOID")),
    1090                 :            :                     rtl::OString(
    1091         [ +  - ]:         10 :                         RTL_CONSTASCII_STRINGPARAM("Lcom/sun/star/uno/Type;")));
    1092                 :            :                 code->instrPutfield(
    1093                 :            :                     className, fieldName,
    1094                 :            :                     rtl::OString(
    1095         [ +  - ]:         10 :                         RTL_CONSTASCII_STRINGPARAM("Lcom/sun/star/uno/Type;")));
    1096                 :         10 :                 return 2;
    1097                 :            : 
    1098                 :            :             case codemaker::UnoType::SORT_ANY:
    1099         [ +  - ]:        194 :                 code->loadLocalReference(0);
    1100                 :            :                 code->instrGetstatic(
    1101                 :            :                     rtl::OString(
    1102                 :            :                         RTL_CONSTASCII_STRINGPARAM("com/sun/star/uno/Any")),
    1103                 :            :                     rtl::OString(RTL_CONSTASCII_STRINGPARAM("VOID")),
    1104                 :            :                     rtl::OString(
    1105         [ +  - ]:        194 :                         RTL_CONSTASCII_STRINGPARAM("Lcom/sun/star/uno/Any;")));
    1106                 :            :                 code->instrPutfield(
    1107                 :            :                     className, fieldName,
    1108                 :            :                     rtl::OString(
    1109         [ +  - ]:        194 :                         RTL_CONSTASCII_STRINGPARAM("Ljava/lang/Object;")));
    1110                 :        194 :                 return 2;
    1111                 :            : 
    1112                 :            :             case codemaker::UnoType::SORT_COMPLEX:
    1113      [ +  +  + ]:        594 :                 switch (typeClass) {
    1114                 :            :                 case RT_TYPE_ENUM:
    1115                 :            :                     {
    1116         [ +  - ]:        157 :                         code->loadLocalReference(0);
    1117         [ +  - ]:        157 :                         typereg::Reader reader(manager.getTypeReader(nucleus));
    1118         [ -  + ]:        157 :                         if (reader.getFieldCount() == 0) {
    1119                 :            :                             throw CannotDumpException(
    1120                 :            :                                 rtl::OString(
    1121                 :            :                                     RTL_CONSTASCII_STRINGPARAM(
    1122                 :          0 :                                         "Bad type information"))); //TODO
    1123                 :            :                         }
    1124                 :        157 :                         rtl::OStringBuffer descBuf;
    1125                 :            :                         translateUnoTypeToDescriptor(
    1126                 :            :                             manager, sort, typeClass, nucleus, 0,
    1127                 :            :                             std::vector< rtl::OString >(), false, false,
    1128 [ +  - ][ +  - ]:        157 :                             dependencies, &descBuf, 0, 0, 0);
    1129                 :        157 :                         rtl::OString desc(descBuf.makeStringAndClear());
    1130                 :            :                         code->instrGetstatic(
    1131                 :            :                             nucleus,
    1132                 :            :                             codemaker::convertString(reader.getFieldName(0)),
    1133 [ +  - ][ +  - ]:        157 :                             desc);
                 [ +  - ]
    1134         [ +  - ]:        157 :                         code->instrPutfield(className, fieldName, desc);
    1135                 :        157 :                         return 2;
    1136                 :            :                     }
    1137                 :            : 
    1138                 :            :                 case RT_TYPE_STRUCT:
    1139                 :            :                     {
    1140         [ +  - ]:        228 :                         code->loadLocalReference(0);
    1141         [ +  - ]:        228 :                         code->instrNew(nucleus);
    1142         [ +  - ]:        228 :                         code->instrDup();
    1143                 :            :                         code->instrInvokespecial(
    1144                 :            :                             nucleus,
    1145                 :            :                             rtl::OString(RTL_CONSTASCII_STRINGPARAM("<init>")),
    1146         [ +  - ]:        228 :                             rtl::OString(RTL_CONSTASCII_STRINGPARAM("()V")));
    1147                 :        228 :                         rtl::OStringBuffer desc;
    1148                 :            :                         translateUnoTypeToDescriptor(
    1149                 :            :                             manager, sort, typeClass, nucleus, 0,
    1150                 :            :                             std::vector< rtl::OString >(), false, false,
    1151 [ +  - ][ +  - ]:        228 :                             dependencies, &desc, 0, 0, 0);
    1152                 :            :                         code->instrPutfield(
    1153         [ +  - ]:        228 :                             className, fieldName, desc.makeStringAndClear());
    1154                 :        228 :                         return 3;
    1155                 :            :                     }
    1156                 :            : 
    1157                 :            :                 default:
    1158                 :            :                     OSL_ASSERT(typeClass == RT_TYPE_INTERFACE);
    1159                 :        209 :                     return 0;
    1160                 :            :                 }
    1161                 :            : 
    1162                 :            :             default:
    1163                 :       1856 :                 return 0;
    1164                 :            :             }
    1165                 :            :         } else {
    1166         [ +  - ]:        265 :             code->loadLocalReference(0);
    1167         [ +  - ]:        265 :             code->loadIntegerConstant(0);
    1168         [ +  + ]:        265 :             if (rank == 1) {
    1169 [ +  - ][ +  + ]:        248 :                 if (sort >= codemaker::UnoType::SORT_BOOLEAN
    1170                 :            :                     && sort <= codemaker::UnoType::SORT_CHAR)
    1171                 :            :                 {
    1172         [ +  - ]:         67 :                     code->instrNewarray(sort);
    1173                 :            :                 } else {
    1174                 :            :                     code->instrAnewarray(
    1175                 :            :                         codemaker::java::translateUnoToJavaType(sort, typeClass,
    1176 [ +  - ][ +  - ]:        248 :                                                                 nucleus, 0));
    1177                 :            :                 }
    1178                 :            :             } else {
    1179                 :         17 :                 rtl::OStringBuffer desc;
    1180                 :            :                 translateUnoTypeToDescriptor(
    1181                 :            :                     manager, sort, typeClass, nucleus, rank - 1,
    1182                 :            :                     std::vector< rtl::OString >(), false, false, dependencies,
    1183 [ +  - ][ +  - ]:         17 :                     &desc, 0, 0, 0);
    1184         [ +  - ]:         17 :                 code->instrAnewarray(desc.makeStringAndClear());
    1185                 :            :             }
    1186                 :        265 :             rtl::OStringBuffer desc;
    1187                 :            :             translateUnoTypeToDescriptor(
    1188                 :            :                 manager, sort, typeClass, nucleus, rank,
    1189                 :            :                 std::vector< rtl::OString >(), false, false, dependencies,
    1190 [ +  - ][ +  - ]:        265 :                 &desc, 0, 0, 0);
    1191                 :            :             code->instrPutfield(
    1192         [ +  - ]:        265 :                 className, fieldName, desc.makeStringAndClear());
    1193                 :        265 :             return 2;
    1194                 :       3886 :         }
    1195                 :            :     }
    1196                 :            : }
    1197                 :            : 
    1198                 :       5041 : sal_uInt16 addLoadLocal(
    1199                 :            :     TypeManager const & manager, ClassFile::Code * code, sal_uInt16 * index,
    1200                 :            :     bool typeParameter, rtl::OString const & type, bool any,
    1201                 :            :     Dependencies * dependencies)
    1202                 :            : {
    1203                 :            :     OSL_ASSERT(
    1204                 :            :         code != 0 && index != 0 && !(typeParameter && any)
    1205                 :            :         && dependencies != 0);
    1206                 :       5041 :     sal_uInt16 stack = 1;
    1207                 :       5041 :     sal_uInt16 size = 1;
    1208         [ +  + ]:       5041 :     if (typeParameter) {
    1209                 :         13 :         code->loadLocalReference(*index);
    1210                 :         13 :         stack = size = 1;
    1211                 :            :     } else {
    1212                 :            :         RTTypeClass typeClass;
    1213                 :       5028 :         rtl::OString nucleus;
    1214                 :            :         sal_Int32 rank;
    1215         [ +  - ]:       5028 :         std::vector< rtl::OString > args;
    1216                 :            :         codemaker::UnoType::Sort sort = codemaker::decomposeAndResolve(
    1217         [ +  - ]:       5028 :             manager, type, true, false, false, &typeClass, &nucleus, &rank, &args);
    1218         [ +  + ]:       5028 :         if (rank == 0) {
    1219   [ +  +  +  +  :       4732 :             switch (sort) {
          +  +  +  +  +  
             +  +  +  +  
                      - ]
    1220                 :            :             case codemaker::UnoType::SORT_BOOLEAN:
    1221         [ +  + ]:        419 :                 if (any) {
    1222                 :            :                     code->instrNew(
    1223                 :            :                         rtl::OString(
    1224         [ +  - ]:         11 :                             RTL_CONSTASCII_STRINGPARAM("java/lang/Boolean")));
    1225         [ +  - ]:         11 :                     code->instrDup();
    1226         [ +  - ]:         11 :                     code->loadLocalInteger(*index);
    1227                 :            :                     code->instrInvokespecial(
    1228                 :            :                         rtl::OString(
    1229                 :            :                             RTL_CONSTASCII_STRINGPARAM("java/lang/Boolean")),
    1230                 :            :                         rtl::OString(RTL_CONSTASCII_STRINGPARAM("<init>")),
    1231         [ +  - ]:         11 :                         rtl::OString(RTL_CONSTASCII_STRINGPARAM("(Z)V")));
    1232                 :         11 :                     stack = 3;
    1233                 :            :                 } else {
    1234         [ +  - ]:        408 :                     code->loadLocalInteger(*index);
    1235                 :        408 :                     stack = 1;
    1236                 :            :                 }
    1237                 :        419 :                 size = 1;
    1238                 :        419 :                 break;
    1239                 :            : 
    1240                 :            :             case codemaker::UnoType::SORT_BYTE:
    1241         [ +  + ]:        140 :                 if (any) {
    1242                 :            :                     code->instrNew(
    1243                 :            :                         rtl::OString(
    1244         [ +  - ]:          1 :                             RTL_CONSTASCII_STRINGPARAM("java/lang/Byte")));
    1245         [ +  - ]:          1 :                     code->instrDup();
    1246         [ +  - ]:          1 :                     code->loadLocalInteger(*index);
    1247                 :            :                     code->instrInvokespecial(
    1248                 :            :                         rtl::OString(
    1249                 :            :                             RTL_CONSTASCII_STRINGPARAM("java/lang/Byte")),
    1250                 :            :                         rtl::OString(RTL_CONSTASCII_STRINGPARAM("<init>")),
    1251         [ +  - ]:          1 :                         rtl::OString(RTL_CONSTASCII_STRINGPARAM("(B)V")));
    1252                 :          1 :                     stack = 3;
    1253                 :            :                 } else {
    1254         [ +  - ]:        139 :                     code->loadLocalInteger(*index);
    1255                 :        139 :                     stack = 1;
    1256                 :            :                 }
    1257                 :        140 :                 size = 1;
    1258                 :        140 :                 break;
    1259                 :            : 
    1260                 :            :             case codemaker::UnoType::SORT_SHORT:
    1261         [ +  + ]:        279 :                 if (any) {
    1262                 :            :                     code->instrNew(
    1263                 :            :                         rtl::OString(
    1264         [ +  - ]:          7 :                             RTL_CONSTASCII_STRINGPARAM("java/lang/Short")));
    1265         [ +  - ]:          7 :                     code->instrDup();
    1266         [ +  - ]:          7 :                     code->loadLocalInteger(*index);
    1267                 :            :                     code->instrInvokespecial(
    1268                 :            :                         rtl::OString(
    1269                 :            :                             RTL_CONSTASCII_STRINGPARAM("java/lang/Short")),
    1270                 :            :                         rtl::OString(RTL_CONSTASCII_STRINGPARAM("<init>")),
    1271         [ +  - ]:          7 :                         rtl::OString(RTL_CONSTASCII_STRINGPARAM("(S)V")));
    1272                 :          7 :                     stack = 3;
    1273                 :            :                 } else {
    1274         [ +  - ]:        272 :                     code->loadLocalInteger(*index);
    1275                 :        272 :                     stack = 1;
    1276                 :            :                 }
    1277                 :        279 :                 size = 1;
    1278                 :        279 :                 break;
    1279                 :            : 
    1280                 :            :             case codemaker::UnoType::SORT_UNSIGNED_SHORT:
    1281         [ +  + ]:         97 :                 if (any) {
    1282                 :            :                     code->instrNew(
    1283                 :            :                         rtl::OString(
    1284                 :            :                             RTL_CONSTASCII_STRINGPARAM(
    1285         [ +  - ]:          1 :                                 "com/sun/star/uno/Any")));
    1286         [ +  - ]:          1 :                     code->instrDup();
    1287                 :            :                     code->instrGetstatic(
    1288                 :            :                         rtl::OString(
    1289                 :            :                             RTL_CONSTASCII_STRINGPARAM(
    1290                 :            :                                 "com/sun/star/uno/Type")),
    1291                 :            :                         rtl::OString(
    1292                 :            :                             RTL_CONSTASCII_STRINGPARAM("UNSIGNED_SHORT")),
    1293                 :            :                         rtl::OString(
    1294                 :            :                             RTL_CONSTASCII_STRINGPARAM(
    1295         [ +  - ]:          1 :                                 "Lcom/sun/star/uno/Type;")));
    1296                 :            :                     code->instrNew(
    1297                 :            :                         rtl::OString(
    1298         [ +  - ]:          1 :                             RTL_CONSTASCII_STRINGPARAM("java/lang/Short")));
    1299         [ +  - ]:          1 :                     code->instrDup();
    1300         [ +  - ]:          1 :                     code->loadLocalInteger(*index);
    1301                 :            :                     code->instrInvokespecial(
    1302                 :            :                         rtl::OString(
    1303                 :            :                             RTL_CONSTASCII_STRINGPARAM("java/lang/Short")),
    1304                 :            :                         rtl::OString(RTL_CONSTASCII_STRINGPARAM("<init>")),
    1305         [ +  - ]:          1 :                         rtl::OString(RTL_CONSTASCII_STRINGPARAM("(S)V")));
    1306                 :            :                     code->instrInvokespecial(
    1307                 :            :                         rtl::OString(
    1308                 :            :                             RTL_CONSTASCII_STRINGPARAM("com/sun/star/uno/Any")),
    1309                 :            :                         rtl::OString(RTL_CONSTASCII_STRINGPARAM("<init>")),
    1310                 :            :                         rtl::OString(
    1311                 :            :                             RTL_CONSTASCII_STRINGPARAM(
    1312                 :            :                                 "(Lcom/sun/star/uno/Type;Ljava/lang/Object;)"
    1313         [ +  - ]:          1 :                                 "V")));
    1314                 :          1 :                     stack = 6;
    1315                 :            :                 } else {
    1316         [ +  - ]:         96 :                     code->loadLocalInteger(*index);
    1317                 :         96 :                     stack = 1;
    1318                 :            :                 }
    1319                 :         97 :                 size = 1;
    1320                 :         97 :                 break;
    1321                 :            : 
    1322                 :            :             case codemaker::UnoType::SORT_LONG:
    1323         [ +  + ]:        687 :                 if (any) {
    1324                 :            :                     code->instrNew(
    1325                 :            :                         rtl::OString(
    1326         [ +  - ]:         19 :                             RTL_CONSTASCII_STRINGPARAM("java/lang/Integer")));
    1327         [ +  - ]:         19 :                     code->instrDup();
    1328         [ +  - ]:         19 :                     code->loadLocalInteger(*index);
    1329                 :            :                     code->instrInvokespecial(
    1330                 :            :                         rtl::OString(
    1331                 :            :                             RTL_CONSTASCII_STRINGPARAM("java/lang/Integer")),
    1332                 :            :                         rtl::OString(RTL_CONSTASCII_STRINGPARAM("<init>")),
    1333         [ +  - ]:         19 :                         rtl::OString(RTL_CONSTASCII_STRINGPARAM("(I)V")));
    1334                 :         19 :                     stack = 3;
    1335                 :            :                 } else {
    1336         [ +  - ]:        668 :                     code->loadLocalInteger(*index);
    1337                 :        668 :                     stack = 1;
    1338                 :            :                 }
    1339                 :        687 :                 size = 1;
    1340                 :        687 :                 break;
    1341                 :            : 
    1342                 :            :             case codemaker::UnoType::SORT_UNSIGNED_LONG:
    1343         [ +  + ]:         79 :                 if (any) {
    1344                 :            :                     code->instrNew(
    1345                 :            :                         rtl::OString(
    1346                 :            :                             RTL_CONSTASCII_STRINGPARAM(
    1347         [ +  - ]:          1 :                                 "com/sun/star/uno/Any")));
    1348         [ +  - ]:          1 :                     code->instrDup();
    1349                 :            :                     code->instrGetstatic(
    1350                 :            :                         rtl::OString(
    1351                 :            :                             RTL_CONSTASCII_STRINGPARAM(
    1352                 :            :                                 "com/sun/star/uno/Type")),
    1353                 :            :                         rtl::OString(
    1354                 :            :                             RTL_CONSTASCII_STRINGPARAM("UNSIGNED_LONG")),
    1355                 :            :                         rtl::OString(
    1356                 :            :                             RTL_CONSTASCII_STRINGPARAM(
    1357         [ +  - ]:          1 :                                 "Lcom/sun/star/uno/Type;")));
    1358                 :            :                     code->instrNew(
    1359                 :            :                         rtl::OString(
    1360         [ +  - ]:          1 :                             RTL_CONSTASCII_STRINGPARAM("java/lang/Integer")));
    1361         [ +  - ]:          1 :                     code->instrDup();
    1362         [ +  - ]:          1 :                     code->loadLocalInteger(*index);
    1363                 :            :                     code->instrInvokespecial(
    1364                 :            :                         rtl::OString(
    1365                 :            :                             RTL_CONSTASCII_STRINGPARAM("java/lang/Integer")),
    1366                 :            :                         rtl::OString(RTL_CONSTASCII_STRINGPARAM("<init>")),
    1367         [ +  - ]:          1 :                         rtl::OString(RTL_CONSTASCII_STRINGPARAM("(I)V")));
    1368                 :            :                     code->instrInvokespecial(
    1369                 :            :                         rtl::OString(
    1370                 :            :                             RTL_CONSTASCII_STRINGPARAM("com/sun/star/uno/Any")),
    1371                 :            :                         rtl::OString(RTL_CONSTASCII_STRINGPARAM("<init>")),
    1372                 :            :                         rtl::OString(
    1373                 :            :                             RTL_CONSTASCII_STRINGPARAM(
    1374                 :            :                                 "(Lcom/sun/star/uno/Type;Ljava/lang/Object;)"
    1375         [ +  - ]:          1 :                                 "V")));
    1376                 :          1 :                     stack = 6;
    1377                 :            :                 } else {
    1378         [ +  - ]:         78 :                     code->loadLocalInteger(*index);
    1379                 :         78 :                     stack = 1;
    1380                 :            :                 }
    1381                 :         79 :                 size = 1;
    1382                 :         79 :                 break;
    1383                 :            : 
    1384                 :            :             case codemaker::UnoType::SORT_HYPER:
    1385         [ +  + ]:         45 :                 if (any) {
    1386                 :            :                     code->instrNew(
    1387                 :            :                         rtl::OString(
    1388         [ +  - ]:          1 :                             RTL_CONSTASCII_STRINGPARAM("java/lang/Long")));
    1389         [ +  - ]:          1 :                     code->instrDup();
    1390         [ +  - ]:          1 :                     code->loadLocalLong(*index);
    1391                 :            :                     code->instrInvokespecial(
    1392                 :            :                         rtl::OString(
    1393                 :            :                             RTL_CONSTASCII_STRINGPARAM("java/lang/Long")),
    1394                 :            :                         rtl::OString(RTL_CONSTASCII_STRINGPARAM("<init>")),
    1395         [ +  - ]:          1 :                         rtl::OString(RTL_CONSTASCII_STRINGPARAM("(J)V")));
    1396                 :          1 :                     stack = 4;
    1397                 :            :                 } else {
    1398         [ +  - ]:         44 :                     code->loadLocalLong(*index);
    1399                 :         44 :                     stack = 2;
    1400                 :            :                 }
    1401                 :         45 :                 size = 2;
    1402                 :         45 :                 break;
    1403                 :            : 
    1404                 :            :             case codemaker::UnoType::SORT_UNSIGNED_HYPER:
    1405         [ +  + ]:         15 :                 if (any) {
    1406                 :            :                     code->instrNew(
    1407                 :            :                         rtl::OString(
    1408                 :            :                             RTL_CONSTASCII_STRINGPARAM(
    1409         [ +  - ]:          1 :                                 "com/sun/star/uno/Any")));
    1410         [ +  - ]:          1 :                     code->instrDup();
    1411                 :            :                     code->instrGetstatic(
    1412                 :            :                         rtl::OString(
    1413                 :            :                             RTL_CONSTASCII_STRINGPARAM(
    1414                 :            :                                 "com/sun/star/uno/Type")),
    1415                 :            :                         rtl::OString(
    1416                 :            :                             RTL_CONSTASCII_STRINGPARAM("UNSIGNED_HYPER")),
    1417                 :            :                         rtl::OString(
    1418                 :            :                             RTL_CONSTASCII_STRINGPARAM(
    1419         [ +  - ]:          1 :                                 "Lcom/sun/star/uno/Type;")));
    1420                 :            :                     code->instrNew(
    1421                 :            :                         rtl::OString(
    1422         [ +  - ]:          1 :                             RTL_CONSTASCII_STRINGPARAM("java/lang/Long")));
    1423         [ +  - ]:          1 :                     code->instrDup();
    1424         [ +  - ]:          1 :                     code->loadLocalLong(*index);
    1425                 :            :                     code->instrInvokespecial(
    1426                 :            :                         rtl::OString(
    1427                 :            :                             RTL_CONSTASCII_STRINGPARAM("java/lang/Long")),
    1428                 :            :                         rtl::OString(RTL_CONSTASCII_STRINGPARAM("<init>")),
    1429         [ +  - ]:          1 :                         rtl::OString(RTL_CONSTASCII_STRINGPARAM("(J)V")));
    1430                 :            :                     code->instrInvokespecial(
    1431                 :            :                         rtl::OString(
    1432                 :            :                             RTL_CONSTASCII_STRINGPARAM("com/sun/star/uno/Any")),
    1433                 :            :                         rtl::OString(RTL_CONSTASCII_STRINGPARAM("<init>")),
    1434                 :            :                         rtl::OString(
    1435                 :            :                             RTL_CONSTASCII_STRINGPARAM(
    1436                 :            :                                 "(Lcom/sun/star/uno/Type;Ljava/lang/Object;)"
    1437         [ +  - ]:          1 :                                 "V")));
    1438                 :          1 :                     stack = 7;
    1439                 :            :                 } else {
    1440         [ +  - ]:         14 :                     code->loadLocalLong(*index);
    1441                 :         14 :                     stack = 2;
    1442                 :            :                 }
    1443                 :         15 :                 size = 2;
    1444                 :         15 :                 break;
    1445                 :            : 
    1446                 :            :             case codemaker::UnoType::SORT_FLOAT:
    1447         [ +  + ]:         32 :                 if (any) {
    1448                 :            :                     code->instrNew(
    1449                 :            :                         rtl::OString(
    1450         [ +  - ]:          1 :                             RTL_CONSTASCII_STRINGPARAM("java/lang/Float")));
    1451         [ +  - ]:          1 :                     code->instrDup();
    1452         [ +  - ]:          1 :                     code->loadLocalFloat(*index);
    1453                 :            :                     code->instrInvokespecial(
    1454                 :            :                         rtl::OString(
    1455                 :            :                             RTL_CONSTASCII_STRINGPARAM("java/lang/Float")),
    1456                 :            :                         rtl::OString(RTL_CONSTASCII_STRINGPARAM("<init>")),
    1457         [ +  - ]:          1 :                         rtl::OString(RTL_CONSTASCII_STRINGPARAM("(F)V")));
    1458                 :          1 :                     stack = 3;
    1459                 :            :                 } else {
    1460         [ +  - ]:         31 :                     code->loadLocalFloat(*index);
    1461                 :         31 :                     stack = 1;
    1462                 :            :                 }
    1463                 :         32 :                 size = 1;
    1464                 :         32 :                 break;
    1465                 :            : 
    1466                 :            :             case codemaker::UnoType::SORT_DOUBLE:
    1467         [ +  + ]:        225 :                 if (any) {
    1468                 :            :                     code->instrNew(
    1469                 :            :                         rtl::OString(
    1470         [ +  - ]:          1 :                             RTL_CONSTASCII_STRINGPARAM("java/lang/Double")));
    1471         [ +  - ]:          1 :                     code->instrDup();
    1472         [ +  - ]:          1 :                     code->loadLocalDouble(*index);
    1473                 :            :                     code->instrInvokespecial(
    1474                 :            :                         rtl::OString(
    1475                 :            :                             RTL_CONSTASCII_STRINGPARAM("java/lang/Double")),
    1476                 :            :                         rtl::OString(RTL_CONSTASCII_STRINGPARAM("<init>")),
    1477         [ +  - ]:          1 :                         rtl::OString(RTL_CONSTASCII_STRINGPARAM("(D)V")));
    1478                 :          1 :                     stack = 4;
    1479                 :            :                 } else {
    1480         [ +  - ]:        224 :                     code->loadLocalDouble(*index);
    1481                 :        224 :                     stack = 2;
    1482                 :            :                 }
    1483                 :        225 :                 size = 2;
    1484                 :        225 :                 break;
    1485                 :            : 
    1486                 :            :             case codemaker::UnoType::SORT_CHAR:
    1487         [ +  + ]:         27 :                 if (any) {
    1488                 :            :                     code->instrNew(
    1489                 :            :                         rtl::OString(
    1490         [ +  - ]:          1 :                             RTL_CONSTASCII_STRINGPARAM("java/lang/Character")));
    1491         [ +  - ]:          1 :                     code->instrDup();
    1492         [ +  - ]:          1 :                     code->loadLocalInteger(*index);
    1493                 :            :                     code->instrInvokespecial(
    1494                 :            :                         rtl::OString(
    1495                 :            :                             RTL_CONSTASCII_STRINGPARAM("java/lang/Character")),
    1496                 :            :                         rtl::OString(RTL_CONSTASCII_STRINGPARAM("<init>")),
    1497         [ +  - ]:          1 :                         rtl::OString(RTL_CONSTASCII_STRINGPARAM("(C)V")));
    1498                 :          1 :                     stack = 3;
    1499                 :            :                 } else {
    1500         [ +  - ]:         26 :                     code->loadLocalInteger(*index);
    1501                 :         26 :                     stack = 1;
    1502                 :            :                 }
    1503                 :         27 :                 size = 1;
    1504                 :         27 :                 break;
    1505                 :            : 
    1506                 :            :             case codemaker::UnoType::SORT_STRING:
    1507                 :            :             case codemaker::UnoType::SORT_TYPE:
    1508                 :            :             case codemaker::UnoType::SORT_ANY:
    1509         [ +  - ]:       1201 :                 code->loadLocalReference(*index);
    1510                 :       1201 :                 stack = size = 1;
    1511                 :       1201 :                 break;
    1512                 :            : 
    1513                 :            :             case codemaker::UnoType::SORT_COMPLEX:
    1514   [ +  +  +  - ]:       1486 :                 switch (typeClass) {
    1515                 :            :                 case RT_TYPE_ENUM:
    1516                 :            :                     // Assuming that no Java types are derived from Java types
    1517                 :            :                     // that are directly derived from com.sun.star.uno.Enum:
    1518         [ +  - ]:        264 :                     code->loadLocalReference(*index);
    1519                 :        264 :                     stack = size = 1;
    1520                 :        264 :                     break;
    1521                 :            : 
    1522                 :            :                 case RT_TYPE_STRUCT:
    1523         [ +  + ]:        268 :                     if (any) {
    1524                 :            :                         code->instrNew(
    1525                 :            :                             rtl::OString(
    1526                 :            :                                 RTL_CONSTASCII_STRINGPARAM(
    1527         [ +  - ]:         44 :                                     "com/sun/star/uno/Any")));
    1528         [ +  - ]:         44 :                         code->instrDup();
    1529                 :            :                         code->instrNew(
    1530                 :            :                             rtl::OString(
    1531                 :            :                                 RTL_CONSTASCII_STRINGPARAM(
    1532         [ +  - ]:         44 :                                     "com/sun/star/uno/Type")));
    1533         [ +  - ]:         44 :                         code->instrDup();
    1534                 :            :                         code->loadStringConstant(
    1535 [ +  - ][ +  - ]:         44 :                             createUnoName(manager, nucleus, rank, args));
    1536                 :            :                         code->instrGetstatic(
    1537                 :            :                             rtl::OString(
    1538                 :            :                                 RTL_CONSTASCII_STRINGPARAM(
    1539                 :            :                                     "com/sun/star/uno/TypeClass")),
    1540                 :            :                             rtl::OString(RTL_CONSTASCII_STRINGPARAM("STRUCT")),
    1541                 :            :                             rtl::OString(
    1542                 :            :                                 RTL_CONSTASCII_STRINGPARAM(
    1543         [ +  - ]:         44 :                                     "Lcom/sun/star/uno/TypeClass;")));
    1544                 :            :                         dependencies->insert(
    1545                 :            :                             rtl::OString(
    1546                 :            :                                 RTL_CONSTASCII_STRINGPARAM(
    1547         [ +  - ]:         44 :                                     "com/sun/star/uno/TypeClass")));
    1548                 :            :                         code->instrInvokespecial(
    1549                 :            :                             rtl::OString(
    1550                 :            :                                 RTL_CONSTASCII_STRINGPARAM(
    1551                 :            :                                     "com/sun/star/uno/Type")),
    1552                 :            :                             rtl::OString(RTL_CONSTASCII_STRINGPARAM("<init>")),
    1553                 :            :                             rtl::OString(
    1554                 :            :                                 RTL_CONSTASCII_STRINGPARAM(
    1555                 :            :                                     "(Ljava/lang/String;"
    1556         [ +  - ]:         44 :                                     "Lcom/sun/star/uno/TypeClass;)V")));
    1557         [ +  - ]:         44 :                         code->loadLocalReference(*index);
    1558                 :            :                         code->instrInvokespecial(
    1559                 :            :                             rtl::OString(
    1560                 :            :                                 RTL_CONSTASCII_STRINGPARAM(
    1561                 :            :                                     "com/sun/star/uno/Any")),
    1562                 :            :                             rtl::OString(RTL_CONSTASCII_STRINGPARAM("<init>")),
    1563                 :            :                             rtl::OString(
    1564                 :            :                                 RTL_CONSTASCII_STRINGPARAM(
    1565                 :            :                                     "(Lcom/sun/star/uno/Type;"
    1566         [ +  - ]:         44 :                                     "Ljava/lang/Object;)V")));
    1567                 :         44 :                         stack = 6;
    1568                 :            :                     } else {
    1569         [ +  - ]:        224 :                         code->loadLocalReference(*index);
    1570                 :        224 :                         stack = 1;
    1571                 :            :                     }
    1572                 :        268 :                     size = 1;
    1573                 :        268 :                     break;
    1574                 :            : 
    1575                 :            :                 case RT_TYPE_INTERFACE:
    1576   [ +  +  +  + ]:       1995 :                     if (any
                 [ +  + ]
    1577                 :            :                         && (nucleus
    1578                 :            :                             != rtl::OString(
    1579                 :            :                                 RTL_CONSTASCII_STRINGPARAM(
    1580         [ +  + ]:       1041 :                                     "com/sun/star/uno/XInterface"))))
    1581                 :            :                     {
    1582                 :            :                         code->instrNew(
    1583                 :            :                             rtl::OString(
    1584                 :            :                                 RTL_CONSTASCII_STRINGPARAM(
    1585         [ +  - ]:         82 :                                     "com/sun/star/uno/Any")));
    1586         [ +  - ]:         82 :                         code->instrDup();
    1587                 :            :                         code->instrNew(
    1588                 :            :                             rtl::OString(
    1589                 :            :                                 RTL_CONSTASCII_STRINGPARAM(
    1590         [ +  - ]:         82 :                                     "com/sun/star/uno/Type")));
    1591         [ +  - ]:         82 :                         code->instrDup();
    1592         [ +  - ]:         82 :                         code->loadStringConstant(nucleus.replace('/', '.'));
    1593                 :            :                         code->instrGetstatic(
    1594                 :            :                             rtl::OString(
    1595                 :            :                                 RTL_CONSTASCII_STRINGPARAM(
    1596                 :            :                                     "com/sun/star/uno/TypeClass")),
    1597                 :            :                             rtl::OString(
    1598                 :            :                                 RTL_CONSTASCII_STRINGPARAM("INTERFACE")),
    1599                 :            :                             rtl::OString(
    1600                 :            :                                 RTL_CONSTASCII_STRINGPARAM(
    1601         [ +  - ]:         82 :                                     "Lcom/sun/star/uno/TypeClass;")));
    1602                 :            :                         dependencies->insert(
    1603                 :            :                             rtl::OString(
    1604                 :            :                                 RTL_CONSTASCII_STRINGPARAM(
    1605         [ +  - ]:         82 :                                     "com/sun/star/uno/TypeClass")));
    1606                 :            :                         code->instrInvokespecial(
    1607                 :            :                             rtl::OString(
    1608                 :            :                                 RTL_CONSTASCII_STRINGPARAM(
    1609                 :            :                                     "com/sun/star/uno/Type")),
    1610                 :            :                             rtl::OString(RTL_CONSTASCII_STRINGPARAM("<init>")),
    1611                 :            :                             rtl::OString(
    1612                 :            :                                 RTL_CONSTASCII_STRINGPARAM(
    1613                 :            :                                     "(Ljava/lang/String;"
    1614         [ +  - ]:         82 :                                     "Lcom/sun/star/uno/TypeClass;)V")));
    1615         [ +  - ]:         82 :                         code->loadLocalReference(*index);
    1616                 :            :                         code->instrInvokespecial(
    1617                 :            :                             rtl::OString(
    1618                 :            :                                 RTL_CONSTASCII_STRINGPARAM(
    1619                 :            :                                     "com/sun/star/uno/Any")),
    1620                 :            :                             rtl::OString(RTL_CONSTASCII_STRINGPARAM("<init>")),
    1621                 :            :                             rtl::OString(
    1622                 :            :                                 RTL_CONSTASCII_STRINGPARAM(
    1623                 :            :                                     "(Lcom/sun/star/uno/Type;"
    1624         [ +  - ]:         82 :                                     "Ljava/lang/Object;)V")));
    1625                 :         82 :                         stack = 6;
    1626                 :            :                     } else {
    1627         [ +  - ]:        872 :                         code->loadLocalReference(*index);
    1628                 :        872 :                         stack = 1;
    1629                 :            :                     }
    1630                 :        954 :                     size = 1;
    1631                 :        954 :                     break;
    1632                 :            : 
    1633                 :            :                 default:
    1634                 :            :                     OSL_ASSERT(false);
    1635                 :          0 :                     break;
    1636                 :            :                 }
    1637                 :       1486 :                 break;
    1638                 :            : 
    1639                 :            :             default:
    1640                 :            :                 OSL_ASSERT(false);
    1641                 :       4732 :                 break;
    1642                 :            :             }
    1643                 :            :         } else {
    1644                 :        296 :             bool wrap = false;
    1645         [ +  + ]:        296 :             if (any) {
    1646   [ +  +  +  - ]:         49 :                 switch (sort) {
    1647                 :            :                 case codemaker::UnoType::SORT_BOOLEAN:
    1648                 :            :                 case codemaker::UnoType::SORT_BYTE:
    1649                 :            :                 case codemaker::UnoType::SORT_SHORT:
    1650                 :            :                 case codemaker::UnoType::SORT_LONG:
    1651                 :            :                 case codemaker::UnoType::SORT_HYPER:
    1652                 :            :                 case codemaker::UnoType::SORT_FLOAT:
    1653                 :            :                 case codemaker::UnoType::SORT_DOUBLE:
    1654                 :            :                 case codemaker::UnoType::SORT_CHAR:
    1655                 :            :                 case codemaker::UnoType::SORT_STRING:
    1656                 :            :                 case codemaker::UnoType::SORT_TYPE:
    1657                 :            :                         // assuming that no Java types are derived from
    1658                 :            :                         // com.sun.star.uno.Type
    1659                 :         19 :                     break;
    1660                 :            : 
    1661                 :            :                 case codemaker::UnoType::SORT_UNSIGNED_SHORT:
    1662                 :            :                 case codemaker::UnoType::SORT_UNSIGNED_LONG:
    1663                 :            :                 case codemaker::UnoType::SORT_UNSIGNED_HYPER:
    1664                 :            :                 case codemaker::UnoType::SORT_ANY:
    1665                 :          9 :                     wrap = true;
    1666                 :          9 :                     break;
    1667                 :            : 
    1668                 :            :                 case codemaker::UnoType::SORT_COMPLEX:
    1669      [ +  +  - ]:         21 :                     switch (typeClass) {
    1670                 :            :                     case RT_TYPE_ENUM:
    1671                 :            :                             // assuming that no Java types are derived from Java
    1672                 :            :                             // types that are directly derived from
    1673                 :            :                             // com.sun.star.uno.Enum
    1674                 :          1 :                         break;
    1675                 :            : 
    1676                 :            :                     case RT_TYPE_STRUCT:
    1677                 :            :                     case RT_TYPE_INTERFACE:
    1678                 :         20 :                         wrap = true;
    1679                 :         20 :                         break;
    1680                 :            : 
    1681                 :            :                     default:
    1682                 :            :                         OSL_ASSERT(false);
    1683                 :          0 :                         break;
    1684                 :            :                     }
    1685                 :         21 :                     break;
    1686                 :            : 
    1687                 :            :                 default:
    1688                 :            :                     OSL_ASSERT(false);
    1689                 :         49 :                     break;
    1690                 :            :                 }
    1691                 :            :             }
    1692         [ +  + ]:        296 :             if (wrap) {
    1693                 :            :                 code->instrNew(
    1694                 :            :                     rtl::OString(
    1695         [ +  - ]:         29 :                         RTL_CONSTASCII_STRINGPARAM("com/sun/star/uno/Any")));
    1696         [ +  - ]:         29 :                 code->instrDup();
    1697                 :            :                 code->instrNew(
    1698                 :            :                     rtl::OString(
    1699         [ +  - ]:         29 :                         RTL_CONSTASCII_STRINGPARAM("com/sun/star/uno/Type")));
    1700         [ +  - ]:         29 :                 code->instrDup();
    1701                 :            :                 code->loadStringConstant(
    1702 [ +  - ][ +  - ]:         29 :                     createUnoName(manager, nucleus, rank, args));
    1703                 :            :                 code->instrInvokespecial(
    1704                 :            :                     rtl::OString(
    1705                 :            :                         RTL_CONSTASCII_STRINGPARAM("com/sun/star/uno/Type")),
    1706                 :            :                     rtl::OString(RTL_CONSTASCII_STRINGPARAM("<init>")),
    1707                 :            :                     rtl::OString(
    1708         [ +  - ]:         29 :                         RTL_CONSTASCII_STRINGPARAM("(Ljava/lang/String;)V")));
    1709         [ +  - ]:         29 :                 code->loadLocalReference(*index);
    1710                 :            :                 code->instrInvokespecial(
    1711                 :            :                     rtl::OString(
    1712                 :            :                         RTL_CONSTASCII_STRINGPARAM("com/sun/star/uno/Any")),
    1713                 :            :                     rtl::OString(RTL_CONSTASCII_STRINGPARAM("<init>")),
    1714                 :            :                     rtl::OString(
    1715                 :            :                         RTL_CONSTASCII_STRINGPARAM(
    1716         [ +  - ]:         29 :                             "(Lcom/sun/star/uno/Type;Ljava/lang/Object;)V")));
    1717                 :         29 :                 stack = 5;
    1718                 :            :             } else {
    1719         [ +  - ]:        267 :                 code->loadLocalReference(*index);
    1720                 :        267 :                 stack = 1;
    1721                 :            :             }
    1722                 :        296 :             size = 1;
    1723                 :       5028 :         }
    1724                 :            :     }
    1725         [ -  + ]:       5041 :     if (*index > SAL_MAX_UINT16 - size) {
    1726                 :            :         throw CannotDumpException(
    1727                 :            :             rtl::OString(
    1728                 :            :                 RTL_CONSTASCII_STRINGPARAM(
    1729                 :          0 :                     "Too many local variables for Java class file format")));
    1730                 :            :     }
    1731                 :       5041 :     *index = *index + size;
    1732                 :       5041 :     return stack;
    1733                 :            : }
    1734                 :            : 
    1735                 :       1102 : void addBaseArguments(
    1736                 :            :     TypeManager const & manager, Dependencies * dependencies,
    1737                 :            :     MethodDescriptor * methodDescriptor, ClassFile::Code * code,
    1738                 :            :     RTTypeClass typeClass, rtl::OString const & type, sal_uInt16 * index)
    1739                 :            : {
    1740                 :            :     OSL_ASSERT(
    1741                 :            :         dependencies != 0 && methodDescriptor != 0 && code != 0 && index != 0);
    1742         [ +  - ]:       1102 :     typereg::Reader reader(manager.getTypeReader(type));
    1743 [ +  - ][ +  -  :       5510 :     if (!reader.isValid() || reader.getTypeClass() != typeClass
          +  -  +  -  -  
              + ][ -  + ]
    1744 [ +  - ][ +  - ]:       2204 :         || codemaker::convertString(reader.getTypeName()) != type
         [ +  - ][ +  - ]
           [ #  #  #  # ]
    1745                 :       2204 :         || reader.getMethodCount() != 0 || reader.getReferenceCount() != 0)
    1746                 :            :     {
    1747                 :            :         throw CannotDumpException(
    1748                 :          0 :             rtl::OString(RTL_CONSTASCII_STRINGPARAM("Bad type information")));
    1749                 :            :             //TODO
    1750                 :            :     }
    1751                 :       1102 :     sal_uInt16 superTypes = reader.getSuperTypeCount();
    1752                 :       1102 :     sal_uInt16 fields = reader.getFieldCount();
    1753                 :       1102 :     sal_uInt16 firstField = 0;
    1754         [ +  + ]:       1102 :     if (type
    1755                 :            :         == rtl::OString(
    1756                 :       1102 :             RTL_CONSTASCII_STRINGPARAM("com/sun/star/uno/Exception")))
    1757                 :            :     {
    1758 [ +  - ][ +  - ]:        493 :         if (typeClass != RT_TYPE_EXCEPTION || superTypes != 0 || fields != 2) {
                 [ -  + ]
    1759                 :            :             throw CannotDumpException(
    1760                 :            :                 rtl::OString(
    1761                 :          0 :                     RTL_CONSTASCII_STRINGPARAM("Bad type information"))); //TODO
    1762                 :            :         }
    1763                 :        493 :         firstField = 1;
    1764                 :            :     } else {
    1765 [ +  + ][ +  - ]:        609 :         if (
         [ +  - ][ +  + ]
                 [ -  + ]
    1766                 :            :             (typeClass == RT_TYPE_STRUCT && (superTypes > 1 || fields == 0)) ||
    1767                 :            :             (typeClass == RT_TYPE_EXCEPTION && superTypes != 1)
    1768                 :            :            )
    1769                 :            :         {
    1770                 :            :             throw CannotDumpException(
    1771                 :            :                 rtl::OString(
    1772                 :          0 :                     RTL_CONSTASCII_STRINGPARAM("Bad type information"))); //TODO
    1773                 :            :         }
    1774         [ +  + ]:        609 :         if (superTypes == 1) {
    1775                 :            :             addBaseArguments(
    1776                 :            :                 manager, dependencies, methodDescriptor, code, typeClass,
    1777 [ +  - ][ +  - ]:        383 :                 codemaker::convertString(reader.getSuperTypeName(0)), index);
                 [ +  - ]
    1778                 :            :         }
    1779                 :            :     }
    1780         [ +  + ]:       2258 :     for (sal_uInt16 i = firstField; i < fields; ++i) {
    1781 [ +  - ][ +  - ]:       1156 :         if (reader.getFieldFlags(i) != RT_ACCESS_READWRITE
         [ -  + ][ +  - ]
           [ -  +  #  # ]
    1782                 :            :             || reader.getFieldValue(i).m_type != RT_TYPE_NONE)
    1783                 :            :         {
    1784                 :            :             throw CannotDumpException(
    1785                 :            :                 rtl::OString(
    1786                 :          0 :                     RTL_CONSTASCII_STRINGPARAM("Bad type information"))); //TODO
    1787                 :            :         }
    1788                 :            :         rtl::OString fieldType(
    1789 [ +  - ][ +  - ]:       1156 :             codemaker::convertString(reader.getFieldTypeName(i)));
    1790         [ +  - ]:       1156 :         methodDescriptor->addParameter(fieldType, false, true, 0);
    1791                 :            :         addLoadLocal(
    1792         [ +  - ]:       1156 :             manager, code, index, false, fieldType, false, dependencies);
    1793                 :       2258 :     }
    1794                 :       1102 : }
    1795                 :            : 
    1796                 :       3570 : sal_uInt16 addDirectArgument(
    1797                 :            :     TypeManager const & manager, Dependencies * dependencies,
    1798                 :            :     MethodDescriptor * methodDescriptor, ClassFile::Code * code,
    1799                 :            :     sal_uInt16 * index, rtl::OString const & className,
    1800                 :            :     rtl::OString const & fieldName, bool typeParameter,
    1801                 :            :     rtl::OString const & fieldType)
    1802                 :            : {
    1803                 :            :     OSL_ASSERT(
    1804                 :            :         dependencies != 0 && methodDescriptor != 0 && code != 0 && index != 0);
    1805                 :       3570 :     rtl::OString desc;
    1806         [ +  + ]:       3570 :     if (typeParameter) {
    1807         [ +  - ]:         13 :         methodDescriptor->addTypeParameter(fieldType);
    1808                 :         13 :         desc = rtl::OString(RTL_CONSTASCII_STRINGPARAM("Ljava/lang/Object;"));
    1809                 :            :     } else {
    1810         [ +  - ]:       3557 :         methodDescriptor->addParameter(fieldType, false, true, 0);
    1811         [ +  - ]:       3557 :         getFieldDescriptor(manager, dependencies, fieldType, &desc, 0, 0);
    1812                 :            :     }
    1813         [ +  - ]:       3570 :     code->loadLocalReference(0);
    1814                 :            :     sal_uInt16 stack = addLoadLocal(
    1815         [ +  - ]:       3570 :         manager, code, index, typeParameter, fieldType, false, dependencies);
    1816         [ +  - ]:       3570 :     code->instrPutfield(className, fieldName, desc);
    1817                 :       3570 :     return stack + 1;
    1818                 :            : }
    1819                 :            : 
    1820                 :       1393 : void handleAggregatingType(
    1821                 :            :     TypeManager const & manager, JavaOptions /*TODO const*/ & options,
    1822                 :            :     typereg::Reader const & reader, Dependencies * dependencies)
    1823                 :            : {
    1824                 :            :     OSL_ASSERT(dependencies != 0);
    1825         [ -  + ]:       1393 :     if (reader.getMethodCount() != 0)
    1826                 :            :     {
    1827                 :            :         throw CannotDumpException(
    1828                 :          0 :             rtl::OString(RTL_CONSTASCII_STRINGPARAM("Bad type information")));
    1829                 :            :             //TODO
    1830                 :            :     }
    1831                 :       1393 :     RTTypeClass typeClass = reader.getTypeClass();
    1832 [ +  - ][ +  - ]:       1393 :     rtl::OString className(codemaker::convertString(reader.getTypeName()));
    1833                 :       1393 :     sal_uInt16 superTypes = reader.getSuperTypeCount();
    1834                 :       1393 :     sal_uInt16 fields = reader.getFieldCount();
    1835                 :       1393 :     sal_uInt16 firstField = 0;
    1836                 :       1393 :     sal_uInt16 references = reader.getReferenceCount();
    1837                 :       1393 :     bool runtimeException = false;
    1838                 :       1393 :     rtl::OString superClass;
    1839         [ +  + ]:       1393 :     if (className
    1840                 :            :         == rtl::OString(
    1841                 :       1393 :             RTL_CONSTASCII_STRINGPARAM("com/sun/star/uno/Exception")))
    1842                 :            :     {
    1843 [ +  - ][ +  - ]:          2 :         if (typeClass != RT_TYPE_EXCEPTION || superTypes != 0 || fields != 2
         [ +  - ][ -  + ]
    1844                 :            :             || references != 0)
    1845                 :            :         {
    1846                 :            :             throw CannotDumpException(
    1847                 :            :                 rtl::OString(
    1848                 :          0 :                     RTL_CONSTASCII_STRINGPARAM("Bad type information"))); //TODO
    1849                 :            :         }
    1850                 :          2 :         firstField = 1;
    1851                 :            :         superClass = rtl::OString(
    1852                 :          2 :             RTL_CONSTASCII_STRINGPARAM("java/lang/Exception"));
    1853         [ +  + ]:       1391 :     } else if (className
    1854                 :            :                == rtl::OString(
    1855                 :            :                    RTL_CONSTASCII_STRINGPARAM(
    1856                 :       1391 :                        "com/sun/star/uno/RuntimeException")))
    1857                 :            :     {
    1858 [ +  - ][ +  - ]:          2 :         if (typeClass != RT_TYPE_EXCEPTION || superTypes != 1 || fields != 0
         [ +  - ][ -  + ]
    1859                 :            :             || references != 0)
    1860                 :            :         {
    1861                 :            :             throw CannotDumpException(
    1862                 :            :                 rtl::OString(
    1863                 :          0 :                     RTL_CONSTASCII_STRINGPARAM("Bad type information"))); //TODO
    1864                 :            :         }
    1865                 :          2 :         superTypes = 0;
    1866                 :            :         superClass = rtl::OString(
    1867                 :          2 :             RTL_CONSTASCII_STRINGPARAM("java/lang/RuntimeException"));
    1868                 :          2 :         runtimeException = true;
    1869                 :            :     } else {
    1870 [ +  + ][ +  - ]:       1389 :         if (
         [ +  + ][ +  - ]
         [ +  - ][ +  + ]
                 [ -  + ]
    1871                 :            :              (
    1872                 :            :               typeClass == RT_TYPE_STRUCT &&
    1873                 :            :               (
    1874                 :            :                fields == 0 ||
    1875                 :            :                (references == 0 ? superTypes > 1 : superTypes != 0)
    1876                 :            :               )
    1877                 :            :              ) ||
    1878                 :            :              (typeClass == RT_TYPE_EXCEPTION && superTypes != 1)
    1879                 :            :            )
    1880                 :            :         {
    1881                 :            :             throw CannotDumpException(
    1882                 :            :                 rtl::OString(
    1883                 :          0 :                     RTL_CONSTASCII_STRINGPARAM("Bad type information"))); //TODO
    1884                 :            :         }
    1885         [ +  + ]:       1389 :         if (superTypes == 0) {
    1886                 :            :             superClass = rtl::OString(
    1887                 :        670 :                 RTL_CONSTASCII_STRINGPARAM("java/lang/Object"));
    1888                 :            :         } else {
    1889 [ +  - ][ +  - ]:        719 :             superClass = codemaker::convertString(reader.getSuperTypeName(0));
    1890         [ +  - ]:        719 :             dependencies->insert(superClass);
    1891                 :            :         }
    1892                 :            :     }
    1893                 :       1393 :     rtl::OString sig;
    1894         [ +  - ]:       1393 :     std::map< rtl::OString, sal_Int32 > typeParameters;
    1895         [ +  + ]:       1393 :     if (references != 0) {
    1896                 :         10 :         rtl::OStringBuffer buf;
    1897         [ +  - ]:         10 :         buf.append('<');
    1898         [ +  + ]:         23 :         for (sal_uInt16 i = 0; i < references; ++i) {
    1899   [ +  -  -  + ]:         26 :             if (reader.getReferenceFlags(i) != RT_ACCESS_INVALID
                 [ -  + ]
    1900                 :         13 :                 || reader.getReferenceSort(i) != RT_REF_TYPE_PARAMETER)
    1901                 :            :             {
    1902                 :            :                 throw CannotDumpException(
    1903                 :            :                     rtl::OString(
    1904                 :          0 :                         RTL_CONSTASCII_STRINGPARAM("Bad type information")));
    1905                 :            :                     //TODO
    1906                 :            :             }
    1907                 :            :             rtl::OString name(
    1908 [ +  - ][ +  - ]:         13 :                 codemaker::convertString(reader.getReferenceTypeName(i)));
    1909         [ +  - ]:         13 :             buf.append(name);
    1910         [ +  - ]:         13 :             buf.append(RTL_CONSTASCII_STRINGPARAM(":Ljava/lang/Object;"));
    1911         [ -  + ]:         13 :             if (!typeParameters.insert(
    1912                 :            :                     std::map< rtl::OString, sal_Int32 >::value_type(name, i)).
    1913         [ +  - ]:         13 :                 second)
    1914                 :            :             {
    1915                 :            :                 throw CannotDumpException(
    1916                 :            :                     rtl::OString(
    1917                 :          0 :                         RTL_CONSTASCII_STRINGPARAM("Bad type information")));
    1918                 :            :                     //TODO
    1919                 :            :             }
    1920                 :         13 :         }
    1921         [ +  - ]:         10 :         buf.append(RTL_CONSTASCII_STRINGPARAM(">Ljava/lang/Object;"));
    1922                 :         10 :         sig = buf.makeStringAndClear();
    1923                 :            :     }
    1924                 :            :     SAL_WNODEPRECATED_DECLARATIONS_PUSH
    1925                 :            :     std::auto_ptr< ClassFile > cf(
    1926                 :            :         new ClassFile(
    1927                 :            :             static_cast< ClassFile::AccessFlags >(
    1928                 :            :                 ClassFile::ACC_PUBLIC | ClassFile::ACC_SUPER),
    1929 [ +  - ][ +  - ]:       1393 :             className, superClass, sig));
    1930                 :            :     SAL_WNODEPRECATED_DECLARATIONS_POP
    1931         [ +  - ]:       1393 :     std::vector< TypeInfo > typeInfo;
    1932         [ +  + ]:       4961 :     {for (sal_uInt16 i = firstField; i < fields; ++i) {
    1933                 :       3568 :         RTFieldAccess flags = reader.getFieldFlags(i);
    1934 [ +  - ][ +  + ]:       3568 :         if ((flags != RT_ACCESS_READWRITE
         [ +  - ][ +  - ]
         [ -  + ][ +  - ]
           [ -  +  #  # ]
                 [ +  + ]
    1935                 :            :              && flags != (RT_ACCESS_READWRITE | RT_ACCESS_PARAMETERIZED_TYPE))
    1936                 :            :             || ((flags & RT_ACCESS_PARAMETERIZED_TYPE) != 0 && references == 0)
    1937                 :            :             || reader.getFieldValue(i).m_type != RT_TYPE_NONE)
    1938                 :            :         {
    1939                 :            :             throw CannotDumpException(
    1940                 :            :                 rtl::OString(
    1941                 :          0 :                     RTL_CONSTASCII_STRINGPARAM("Bad type information"))); //TODO
    1942                 :            :         }
    1943                 :            :         rtl::OString type(
    1944 [ +  - ][ +  - ]:       3568 :             codemaker::convertString(reader.getFieldTypeName(i)));
    1945                 :            :         sal_Int32 typeParameterIndex;
    1946         [ +  + ]:       3568 :         if ((flags & RT_ACCESS_PARAMETERIZED_TYPE) == 0) {
    1947                 :       3555 :             typeParameterIndex = -1;
    1948                 :            :         } else {
    1949                 :            :             std::map< rtl::OString, sal_Int32 >::iterator it(
    1950         [ +  - ]:         13 :                 typeParameters.find(type));
    1951         [ -  + ]:         13 :             if (it == typeParameters.end()) {
    1952                 :            :                 throw CannotDumpException(
    1953                 :            :                     rtl::OString(
    1954                 :          0 :                         RTL_CONSTASCII_STRINGPARAM("Bad type information")));
    1955                 :            :                     //TODO
    1956                 :            :             }
    1957                 :         13 :             typeParameterIndex = it->second;
    1958                 :            :         }
    1959                 :            :         addField(
    1960                 :            :             manager, dependencies, cf.get(), &typeInfo, typeParameterIndex,
    1961 [ +  - ][ +  - ]:       3568 :             type, codemaker::convertString(reader.getFieldName(i)), i - firstField);
                 [ +  - ]
    1962                 :       3568 :     }}
    1963         [ +  + ]:       1393 :     if (runtimeException) {
    1964                 :            :         addField(
    1965                 :            :             manager, dependencies, cf.get(), &typeInfo, -1,
    1966                 :            :             rtl::OString(
    1967                 :            :                 RTL_CONSTASCII_STRINGPARAM("com/sun/star/uno/XInterface")),
    1968         [ +  - ]:          2 :             rtl::OString(RTL_CONSTASCII_STRINGPARAM("Context")), 0);
    1969                 :            :     }
    1970                 :            :     SAL_WNODEPRECATED_DECLARATIONS_PUSH
    1971         [ +  - ]:       1393 :     std::auto_ptr< ClassFile::Code > code(cf->newCode());
    1972                 :            :     SAL_WNODEPRECATED_DECLARATIONS_POP
    1973         [ +  - ]:       1393 :     code->loadLocalReference(0);
    1974                 :            :     code->instrInvokespecial(
    1975                 :            :         superClass, rtl::OString(RTL_CONSTASCII_STRINGPARAM("<init>")),
    1976         [ +  - ]:       1393 :         rtl::OString(RTL_CONSTASCII_STRINGPARAM("()V")));
    1977                 :       1393 :     sal_uInt16 stack = 0;
    1978         [ +  + ]:       4961 :     {for (sal_uInt16 i = firstField; i < fields; ++i) {
    1979                 :            :         stack = std::max(
    1980                 :            :             stack,
    1981                 :            :             addFieldInit(
    1982                 :            :                 manager, className,
    1983                 :            :                 codemaker::convertString(reader.getFieldName(i)),
    1984                 :       3568 :                 (reader.getFieldFlags(i) & RT_ACCESS_PARAMETERIZED_TYPE) != 0,
    1985                 :            :                 codemaker::convertString(reader.getFieldTypeName(i)),
    1986         [ +  - ]:       7136 :                 dependencies, code.get()));
           [ +  -  +  - ]
         [ +  - ][ +  - ]
                 [ +  - ]
    1987                 :            :     }}
    1988         [ +  + ]:       1393 :     if (runtimeException) {
    1989                 :            :         stack = std::max(
    1990                 :            :             stack,
    1991                 :            :             addFieldInit(
    1992                 :            :                 manager, className,
    1993                 :            :                 rtl::OString(RTL_CONSTASCII_STRINGPARAM("Context")), false,
    1994                 :            :                 rtl::OString(
    1995                 :            :                     RTL_CONSTASCII_STRINGPARAM("com/sun/star/uno/XInterface")),
    1996 [ +  - ][ +  - ]:          2 :                 dependencies, code.get()));
    1997                 :            :     }
    1998         [ +  - ]:       1393 :     code->instrReturn();
    1999                 :       1393 :     code->setMaxStackAndLocals(stack + 1, 1);
    2000                 :            :     cf->addMethod(
    2001                 :            :         ClassFile::ACC_PUBLIC,
    2002                 :            :         rtl::OString(RTL_CONSTASCII_STRINGPARAM("<init>")),
    2003                 :       1393 :         rtl::OString(RTL_CONSTASCII_STRINGPARAM("()V")), code.get(),
    2004   [ +  -  +  - ]:       2786 :         std::vector< rtl::OString >(), rtl::OString());
    2005         [ +  + ]:       1393 :     if (typeClass == RT_TYPE_EXCEPTION) {
    2006         [ +  - ]:        497 :         code.reset(cf->newCode());
    2007         [ +  - ]:        497 :         code->loadLocalReference(0);
    2008         [ +  - ]:        497 :         code->loadLocalReference(1);
    2009                 :            :         code->instrInvokespecial(
    2010                 :            :             superClass, rtl::OString(RTL_CONSTASCII_STRINGPARAM("<init>")),
    2011         [ +  - ]:        497 :             rtl::OString(RTL_CONSTASCII_STRINGPARAM("(Ljava/lang/String;)V")));
    2012                 :        497 :         stack = 0;
    2013         [ +  + ]:        811 :         for (sal_uInt16 i = firstField; i < fields; ++i) {
    2014                 :            :             stack = std::max(
    2015                 :            :                 stack,
    2016                 :            :                 addFieldInit(
    2017                 :            :                     manager, className,
    2018                 :            :                     codemaker::convertString(reader.getFieldName(i)),
    2019                 :        314 :                     ((reader.getFieldFlags(i) & RT_ACCESS_PARAMETERIZED_TYPE)
    2020                 :            :                      != 0),
    2021                 :            :                     codemaker::convertString(reader.getFieldTypeName(i)),
    2022         [ +  - ]:        628 :                     dependencies, code.get()));
           [ +  -  +  - ]
         [ +  - ][ +  - ]
                 [ +  - ]
    2023                 :            :         }
    2024         [ +  + ]:        497 :         if (runtimeException) {
    2025                 :            :             stack = std::max(
    2026                 :            :                 stack,
    2027                 :            :                 addFieldInit(
    2028                 :            :                     manager, className,
    2029                 :            :                     rtl::OString(RTL_CONSTASCII_STRINGPARAM("Context")), false,
    2030                 :            :                     rtl::OString(
    2031                 :            :                         RTL_CONSTASCII_STRINGPARAM(
    2032                 :            :                             "com/sun/star/uno/XInterface")),
    2033 [ +  - ][ +  - ]:          2 :                     dependencies, code.get()));
    2034                 :            :         }
    2035         [ +  - ]:        497 :         code->instrReturn();
    2036                 :        497 :         code->setMaxStackAndLocals(stack + 2, 2);
    2037                 :            :         cf->addMethod(
    2038                 :            :             ClassFile::ACC_PUBLIC,
    2039                 :            :             rtl::OString(RTL_CONSTASCII_STRINGPARAM("<init>")),
    2040                 :            :             rtl::OString(RTL_CONSTASCII_STRINGPARAM("(Ljava/lang/String;)V")),
    2041 [ +  - ][ +  - ]:        497 :             code.get(), std::vector< rtl::OString >(), rtl::OString());
    2042                 :            :     }
    2043                 :            :     MethodDescriptor desc(
    2044                 :            :         manager, dependencies, rtl::OString(RTL_CONSTASCII_STRINGPARAM("void")),
    2045         [ +  - ]:       1393 :         0, 0);
    2046         [ +  - ]:       1393 :     code.reset(cf->newCode());
    2047         [ +  - ]:       1393 :     code->loadLocalReference(0);
    2048                 :       1393 :     sal_uInt16 index = 1;
    2049         [ +  + ]:       1393 :     if (typeClass == RT_TYPE_EXCEPTION) {
    2050                 :            :         desc.addParameter(
    2051         [ +  - ]:        497 :             rtl::OString(RTL_CONSTASCII_STRINGPARAM("string")), false, true, 0);
    2052         [ +  - ]:        497 :         code->loadLocalReference(index++);
    2053                 :            :     }
    2054         [ +  + ]:       1393 :     if (superTypes != 0) {
    2055                 :            :         addBaseArguments(
    2056                 :            :             manager, dependencies, &desc, code.get(), typeClass, superClass,
    2057         [ +  - ]:        719 :             &index);
    2058                 :            :     }
    2059                 :            :     code->instrInvokespecial(
    2060                 :            :         superClass, rtl::OString(RTL_CONSTASCII_STRINGPARAM("<init>")),
    2061 [ +  - ][ +  - ]:       1393 :         desc.getDescriptor());
    2062                 :       1393 :     sal_uInt16 maxSize = index;
    2063         [ +  + ]:       4961 :     {for (sal_uInt16 i = firstField; i < fields; ++i) {
    2064                 :            :         maxSize = std::max(
    2065                 :            :             maxSize,
    2066                 :            :             addDirectArgument(
    2067                 :            :                 manager, dependencies, &desc, code.get(), &index, className,
    2068                 :            :                 codemaker::convertString(reader.getFieldName(i)),
    2069                 :       3568 :                 (reader.getFieldFlags(i) & RT_ACCESS_PARAMETERIZED_TYPE) != 0,
    2070         [ +  - ]:       7136 :                 codemaker::convertString(reader.getFieldTypeName(i))));
           [ +  -  +  - ]
         [ +  - ][ +  - ]
                 [ +  - ]
    2071                 :            :     }}
    2072         [ +  + ]:       1393 :     if (runtimeException) {
    2073                 :            :         maxSize = std::max(
    2074                 :            :             maxSize,
    2075                 :            :             addDirectArgument(
    2076                 :            :                 manager, dependencies, &desc, code.get(), &index, className,
    2077                 :            :                 rtl::OString(RTL_CONSTASCII_STRINGPARAM("Context")), false,
    2078                 :            :                 rtl::OString(
    2079                 :            :                     RTL_CONSTASCII_STRINGPARAM(
    2080 [ +  - ][ +  - ]:          2 :                         "com/sun/star/uno/XInterface"))));
    2081                 :            :     }
    2082         [ +  - ]:       1393 :     code->instrReturn();
    2083                 :       1393 :     code->setMaxStackAndLocals(maxSize, index);
    2084                 :            :     cf->addMethod(
    2085                 :            :         ClassFile::ACC_PUBLIC,
    2086                 :            :         rtl::OString(RTL_CONSTASCII_STRINGPARAM("<init>")),
    2087                 :       1393 :         desc.getDescriptor(), code.get(), std::vector< rtl::OString >(),
    2088   [ +  -  +  - ]:       2786 :         desc.getSignature());
         [ +  - ][ +  - ]
    2089         [ +  - ]:       1393 :     addTypeInfo(className, typeInfo, dependencies, cf.get());
    2090 [ +  - ][ +  - ]:       1393 :     writeClassFile(options, className, *cf.get());
                 [ +  - ]
    2091                 :       1393 : }
    2092                 :            : 
    2093                 :      11972 : void createExceptionsAttribute(
    2094                 :            :     TypeManager const & manager, typereg::Reader const & reader,
    2095                 :            :     sal_uInt16 methodIndex, Dependencies * dependencies,
    2096                 :            :     std::vector< rtl::OString > * exceptions, codemaker::ExceptionTree * tree)
    2097                 :            : {
    2098                 :            :     OSL_ASSERT(dependencies != 0 && exceptions != 0);
    2099                 :      11972 :     sal_uInt16 n = reader.getMethodExceptionCount(methodIndex);
    2100         [ +  + ]:      17747 :     for (sal_uInt16 i = 0; i < n; ++i) {
    2101                 :            :         rtl::OString type(
    2102                 :            :             codemaker::convertString(
    2103 [ +  - ][ +  - ]:       5775 :                 reader.getMethodExceptionTypeName(methodIndex, i)));
    2104         [ +  - ]:       5775 :         dependencies->insert(type);
    2105         [ +  - ]:       5775 :         exceptions->push_back(type);
    2106         [ +  + ]:       5775 :         if (tree != 0) {
    2107         [ +  - ]:         90 :             tree->add(type, manager);
    2108                 :            :         }
    2109                 :       5775 :     }
    2110                 :      11972 : }
    2111                 :            : 
    2112                 :       3323 : void handleInterfaceType(
    2113                 :            :     TypeManager const & manager, JavaOptions /*TODO const*/ & options,
    2114                 :            :     typereg::Reader const & reader, Dependencies * dependencies)
    2115                 :            : {
    2116                 :            :     OSL_ASSERT(dependencies != 0);
    2117                 :            : 
    2118 [ +  - ][ +  - ]:       3323 :     rtl::OString className(codemaker::convertString(reader.getTypeName()));
    2119                 :       3323 :     sal_uInt16 superTypes = reader.getSuperTypeCount();
    2120                 :       3323 :     sal_uInt16 fields = reader.getFieldCount();
    2121                 :       3323 :     sal_uInt16 methods = reader.getMethodCount();
    2122         [ +  + ]:       3323 :     if (className
    2123                 :            :         == rtl::OString(
    2124                 :       3323 :             RTL_CONSTASCII_STRINGPARAM("com/sun/star/uno/XInterface")))
    2125                 :            :     {
    2126 [ +  - ][ +  - ]:          2 :         if (superTypes != 0 || fields != 0 || methods != 3) {
                 [ -  + ]
    2127                 :            :             throw CannotDumpException(
    2128                 :            :                 rtl::OString(
    2129                 :          0 :                     RTL_CONSTASCII_STRINGPARAM("Bad type information"))); //TODO
    2130                 :            :         }
    2131                 :          2 :         methods = 0;
    2132         [ -  + ]:       3321 :     } else if (superTypes == 0) {
    2133                 :            :         throw CannotDumpException(
    2134                 :          0 :             rtl::OString(RTL_CONSTASCII_STRINGPARAM("Bad type information")));
    2135                 :            :             //TODO
    2136                 :            :     }
    2137                 :            :     SAL_WNODEPRECATED_DECLARATIONS_PUSH
    2138                 :            :     std::auto_ptr< ClassFile > cf(
    2139                 :            :         new ClassFile(
    2140                 :            :             static_cast< ClassFile::AccessFlags >(
    2141                 :            :                 ClassFile::ACC_PUBLIC | ClassFile::ACC_INTERFACE
    2142                 :            :                 | ClassFile::ACC_ABSTRACT),
    2143                 :            :             className,
    2144                 :            :             rtl::OString(RTL_CONSTASCII_STRINGPARAM("java/lang/Object")),
    2145 [ +  - ][ +  - ]:       3323 :             rtl::OString()));
    2146                 :            :     SAL_WNODEPRECATED_DECLARATIONS_POP
    2147         [ +  + ]:       6907 :     {for (sal_uInt16 i = 0; i < superTypes; ++i) {
    2148 [ +  - ][ +  - ]:       3584 :         rtl::OString t(codemaker::convertString(reader.getSuperTypeName(i)));
    2149         [ +  - ]:       3584 :         dependencies->insert(t);
    2150         [ +  - ]:       3584 :         cf->addInterface(t);
    2151                 :       3584 :     }}
    2152                 :            :     // As a special case, let com.sun.star.lang.XEventListener extend
    2153                 :            :     // java.util.EventListener ("A tagging interface that all event listener
    2154                 :            :     // interfaces must extend"):
    2155         [ +  + ]:       3323 :     if (className ==
    2156                 :            :         rtl::OString(
    2157                 :       3323 :             RTL_CONSTASCII_STRINGPARAM("com/sun/star/lang/XEventListener")))
    2158                 :            :     {
    2159                 :            :         cf->addInterface(
    2160                 :            :             rtl::OString(
    2161         [ +  - ]:          2 :                 RTL_CONSTASCII_STRINGPARAM("java/util/EventListener")));
    2162                 :            :     }
    2163         [ +  - ]:       3323 :     std::vector< TypeInfo > typeInfo;
    2164                 :       3323 :     sal_Int32 index = 0;
    2165         [ +  + ]:       4439 :     {for (sal_uInt16 i = 0; i < fields; ++i) {
    2166                 :       1116 :         RTFieldAccess flags = reader.getFieldFlags(i);
    2167                 :            :         //TODO: ok if both READONLY and BOUND?
    2168 [ +  - ][ +  - ]:       1116 :         if (((((flags & RT_ACCESS_READWRITE) != 0)
         [ -  + ][ +  - ]
           [ -  +  #  # ]
                 [ +  - ]
    2169                 :            :               ^ ((flags & RT_ACCESS_READONLY) != 0))
    2170                 :            :              == 0)
    2171                 :            :             || ((flags
    2172                 :            :                  & ~(RT_ACCESS_READWRITE | RT_ACCESS_READONLY
    2173                 :            :                      | RT_ACCESS_BOUND))
    2174                 :            :                 != 0)
    2175                 :            :             || reader.getFieldValue(i).m_type != RT_TYPE_NONE)
    2176                 :            :         {
    2177                 :            :             throw CannotDumpException(
    2178                 :            :                 rtl::OString(
    2179                 :          0 :                     RTL_CONSTASCII_STRINGPARAM("Bad type information"))); //TODO
    2180                 :            :         }
    2181                 :            :         //TODO: exploit the fact that attribute getter/setter methods preceed
    2182                 :            :         // real methods
    2183         [ +  - ]:       1116 :         rtl::OUString attrNameUtf16(reader.getFieldName(i));
    2184                 :       1116 :         sal_uInt16 getter = SAL_MAX_UINT16;
    2185                 :       1116 :         sal_uInt16 setter = SAL_MAX_UINT16;
    2186         [ +  + ]:      20854 :         for (sal_uInt16 j = 0; j < methods; ++j) {
    2187                 :      19738 :             RTMethodMode mflags = reader.getMethodFlags(j);
    2188   [ +  +  +  + ]:      55774 :             if ((mflags == RT_MODE_ATTRIBUTE_GET
         [ +  + ][ +  + ]
    2189                 :            :                  || mflags == RT_MODE_ATTRIBUTE_SET)
    2190 [ +  - ][ +  + ]:      36036 :                 && reader.getMethodName(j) == attrNameUtf16)
                 [ #  # ]
    2191                 :            :             {
    2192         [ +  - ]:        756 :                 if (reader.getMethodReturnTypeName(j) != "void"
           [ +  -  +  - ]
         [ +  + ][ -  + ]
         [ +  - ][ -  + ]
                 [ +  - ]
           [ -  +  #  # ]
    2193                 :        378 :                     || reader.getMethodParameterCount(j) != 0
    2194                 :            :                     || (mflags == RT_MODE_ATTRIBUTE_GET
    2195                 :            :                         ? getter != SAL_MAX_UINT16
    2196                 :            :                         : (setter != SAL_MAX_UINT16
    2197                 :            :                            || (flags & RT_ACCESS_READONLY) != 0)))
    2198                 :            :                 {
    2199                 :            :                     throw CannotDumpException(
    2200                 :            :                         rtl::OString(
    2201                 :            :                             RTL_CONSTASCII_STRINGPARAM(
    2202                 :          0 :                                 "Bad type information"))); //TODO
    2203                 :            :                 }
    2204                 :            :                 OSL_ASSERT(j != SAL_MAX_UINT16);
    2205         [ +  + ]:        378 :                 (mflags == RT_MODE_ATTRIBUTE_GET ? getter : setter) = j;
    2206                 :            :             }
    2207                 :            :         }
    2208                 :            :         rtl::OString fieldType(
    2209 [ +  - ][ +  - ]:       1116 :             codemaker::convertString(reader.getFieldTypeName(i)));
    2210                 :            :         SpecialType specialType;
    2211                 :       1116 :         PolymorphicUnoType polymorphicUnoType;
    2212                 :            :         MethodDescriptor gdesc(
    2213                 :            :             manager, dependencies, fieldType, &specialType,
    2214         [ +  - ]:       1116 :             &polymorphicUnoType);
    2215         [ +  - ]:       1116 :         std::vector< rtl::OString > exc;
    2216         [ +  + ]:       1116 :         if (getter != SAL_MAX_UINT16) {
    2217                 :            :             createExceptionsAttribute(
    2218         [ +  - ]:        167 :                 manager, reader, getter, dependencies, &exc, 0);
    2219                 :            :         }
    2220         [ +  - ]:       1116 :         rtl::OString attrName(codemaker::convertString(attrNameUtf16));
    2221                 :            :         cf->addMethod(
    2222                 :            :             static_cast< ClassFile::AccessFlags >(
    2223                 :            :                 ClassFile::ACC_PUBLIC | ClassFile::ACC_ABSTRACT),
    2224                 :            :             rtl::OString(RTL_CONSTASCII_STRINGPARAM("get")) + attrName,
    2225 [ +  - ][ +  - ]:       1116 :             gdesc.getDescriptor(), 0, exc, gdesc.getSignature());
                 [ +  - ]
    2226         [ +  + ]:       1116 :         if ((flags & RT_ACCESS_READONLY) == 0) {
    2227                 :            :             MethodDescriptor sdesc(
    2228                 :            :                 manager, dependencies,
    2229         [ +  - ]:        851 :                 rtl::OString(RTL_CONSTASCII_STRINGPARAM("void")), 0, 0);
    2230         [ +  - ]:        851 :             sdesc.addParameter(fieldType, false, true, 0);
    2231         [ +  - ]:        851 :             std::vector< rtl::OString > exc2;
    2232         [ +  + ]:        851 :             if (setter != SAL_MAX_UINT16) {
    2233                 :            :                 createExceptionsAttribute(
    2234         [ +  - ]:        211 :                     manager, reader, setter, dependencies, &exc2, 0);
    2235                 :            :             }
    2236                 :            :             cf->addMethod(
    2237                 :            :                 static_cast< ClassFile::AccessFlags >(
    2238                 :            :                     ClassFile::ACC_PUBLIC | ClassFile::ACC_ABSTRACT),
    2239                 :            :                 rtl::OString(RTL_CONSTASCII_STRINGPARAM("set")) + attrName,
    2240 [ +  - ][ +  - ]:        851 :                 sdesc.getDescriptor(), 0, exc2, sdesc.getSignature());
                 [ +  - ]
    2241                 :            :         }
    2242                 :            :         typeInfo.push_back(
    2243                 :            :             TypeInfo(
    2244                 :            :                 TypeInfo::KIND_ATTRIBUTE, attrName, specialType,
    2245                 :            :                 static_cast< TypeInfo::Flags >(
    2246                 :            :                     ((flags & RT_ACCESS_READONLY) == 0
    2247                 :            :                      ? 0 : TypeInfo::FLAG_READONLY)
    2248                 :            :                     | ((flags & RT_ACCESS_BOUND) == 0
    2249                 :            :                        ? 0 : TypeInfo::FLAG_BOUND)),
    2250 [ +  + ][ +  + ]:       1116 :                 index, polymorphicUnoType));
                 [ +  - ]
    2251         [ +  + ]:       1116 :         index += ((flags & RT_ACCESS_READONLY) == 0 ? 2 : 1);
    2252                 :       1116 :     }}
    2253         [ +  + ]:      15128 :     {for (sal_uInt16 i = 0; i < methods; ++i) {
    2254                 :      11805 :         RTMethodMode flags = reader.getMethodFlags(i);
    2255      [ +  +  - ]:      11805 :         switch (flags) {
    2256                 :            :         case RT_MODE_ONEWAY:
    2257                 :            :         case RT_MODE_TWOWAY:
    2258                 :            :             {
    2259                 :            :                 rtl::OString methodName(
    2260 [ +  - ][ +  - ]:      11427 :                     codemaker::convertString(reader.getMethodName(i)));
    2261                 :            :                 SpecialType specialReturnType;
    2262                 :      11427 :                 PolymorphicUnoType polymorphicUnoReturnType;
    2263                 :            :                 MethodDescriptor desc(
    2264                 :            :                     manager, dependencies,
    2265                 :            :                     codemaker::convertString(
    2266                 :            :                         reader.getMethodReturnTypeName(i)),
    2267 [ +  - ][ +  - ]:      11427 :                     &specialReturnType, &polymorphicUnoReturnType);
                 [ +  - ]
    2268                 :            :                 typeInfo.push_back(
    2269                 :            :                     TypeInfo(
    2270                 :            :                         TypeInfo::KIND_METHOD, methodName, specialReturnType,
    2271                 :            :                         static_cast< TypeInfo::Flags >(
    2272                 :            :                             flags == RT_MODE_ONEWAY
    2273                 :            :                             ? TypeInfo::FLAG_ONEWAY : 0),
    2274 [ +  - ][ +  + ]:      11427 :                         index++, polymorphicUnoReturnType));
    2275         [ +  + ]:      23155 :                 for (sal_uInt16 j = 0; j < reader.getMethodParameterCount(i);
    2276                 :            :                      ++j)
    2277                 :            :                 {
    2278                 :            :                     bool in;
    2279                 :            :                     bool out;
    2280   [ +  +  +  - ]:      11728 :                     switch (reader.getMethodParameterFlags(i, j)) {
    2281                 :            :                     case RT_PARAM_IN:
    2282                 :      11350 :                         in = true;
    2283                 :      11350 :                         out = false;
    2284                 :      11350 :                         break;
    2285                 :            : 
    2286                 :            :                     case RT_PARAM_OUT:
    2287                 :        234 :                         in = false;
    2288                 :        234 :                         out = true;
    2289                 :        234 :                         break;
    2290                 :            : 
    2291                 :            :                     case RT_PARAM_INOUT:
    2292                 :        144 :                         in = true;
    2293                 :        144 :                         out = true;
    2294                 :        144 :                         break;
    2295                 :            : 
    2296                 :            :                     default:
    2297                 :            :                         throw CannotDumpException(
    2298                 :            :                             rtl::OString(
    2299                 :            :                                 RTL_CONSTASCII_STRINGPARAM(
    2300                 :          0 :                                     "Bad type information"))); //TODO
    2301                 :            :                     }
    2302                 :      11728 :                     PolymorphicUnoType polymorphicUnoType;
    2303                 :            :                     SpecialType specialType = desc.addParameter(
    2304                 :            :                         codemaker::convertString(
    2305                 :            :                             reader.getMethodParameterTypeName(i, j)),
    2306 [ +  - ][ +  - ]:      11728 :                         out, true, &polymorphicUnoType);
                 [ +  - ]
    2307 [ +  + ][ +  + ]:      11728 :                     if (out || isSpecialType(specialType)
         [ +  + ][ +  + ]
    2308                 :            :                         || (polymorphicUnoType.kind
    2309                 :            :                             != PolymorphicUnoType::KIND_NONE))
    2310                 :            :                     {
    2311                 :            :                         typeInfo.push_back(
    2312                 :            :                             TypeInfo(
    2313                 :            :                                 codemaker::convertString(
    2314                 :            :                                     reader.getMethodParameterName(i, j)),
    2315                 :            :                                 specialType, in, out, methodName, j,
    2316 [ +  - ][ +  - ]:        529 :                                 polymorphicUnoType));
                 [ +  - ]
    2317                 :            :                     }
    2318                 :      11728 :                 }
    2319         [ +  - ]:      11427 :                 std::vector< rtl::OString > exc2;
    2320                 :            :                 createExceptionsAttribute(
    2321         [ +  - ]:      11427 :                     manager, reader, i, dependencies, &exc2, 0);
    2322                 :            :                 cf->addMethod(
    2323                 :            :                     static_cast< ClassFile::AccessFlags >(
    2324                 :            :                         ClassFile::ACC_PUBLIC | ClassFile::ACC_ABSTRACT),
    2325                 :            :                     methodName, desc.getDescriptor(), 0, exc2,
    2326 [ +  - ][ +  - ]:      11427 :                     desc.getSignature());
                 [ +  - ]
    2327                 :      11427 :                 break;
    2328                 :            :             }
    2329                 :            : 
    2330                 :            :         case RT_MODE_ATTRIBUTE_GET:
    2331                 :            :         case RT_MODE_ATTRIBUTE_SET:
    2332                 :            :             {
    2333                 :            :                 //TODO: exploit the fact that attribute getter/setter methods
    2334                 :            :                 // are ordered the same way as the attribute fields themselves
    2335         [ +  - ]:        378 :                 rtl::OUString methodNameUtf16(reader.getMethodName(i));
    2336                 :        378 :                 bool found = false;
    2337         [ +  - ]:       8509 :                 for (sal_uInt16 j = 0; j < fields; ++j) {
    2338 [ +  - ][ +  + ]:       8509 :                     if (reader.getFieldName(j) == methodNameUtf16) {
    2339                 :        378 :                         found = true;
    2340                 :        378 :                         break;
    2341                 :            :                     }
    2342                 :            :                 }
    2343         [ +  - ]:        378 :                 if (found) {
    2344                 :            :                     break;
    2345         [ -  + ]:        378 :                 }
    2346                 :            :             }
    2347                 :            :         default:
    2348                 :            :             throw CannotDumpException(
    2349                 :            :                 rtl::OString(
    2350                 :          0 :                     RTL_CONSTASCII_STRINGPARAM("Bad type information"))); //TODO
    2351                 :            :         }
    2352                 :            :     }}
    2353         [ +  - ]:       3323 :     addTypeInfo(className, typeInfo, dependencies, cf.get());
    2354 [ +  - ][ +  - ]:       3323 :     writeClassFile(options, className, *cf.get());
    2355                 :       3323 : }
    2356                 :            : 
    2357                 :         63 : void handleTypedef(
    2358                 :            :     TypeManager const & manager,
    2359                 :            :     SAL_UNUSED_PARAMETER JavaOptions /*TODO const*/ &,
    2360                 :            :     typereg::Reader const & reader, Dependencies * dependencies)
    2361                 :            : {
    2362                 :            :     OSL_ASSERT(dependencies != 0);
    2363 [ +  - ][ +  -  :        189 :     if (reader.getSuperTypeCount() != 1 || reader.getFieldCount() != 0
             +  -  -  + ]
                 [ -  + ]
    2364                 :        126 :         || reader.getMethodCount() != 0 || reader.getReferenceCount() != 0)
    2365                 :            :     {
    2366                 :            :         throw CannotDumpException(
    2367                 :          0 :             rtl::OString(RTL_CONSTASCII_STRINGPARAM("Bad type information")));
    2368                 :            :             //TODO
    2369                 :            :     }
    2370                 :            :     RTTypeClass typeClass;
    2371                 :         63 :     rtl::OString nucleus;
    2372                 :            :     sal_Int32 rank;
    2373         [ +  - ]:         63 :     std::vector< rtl::OString > args;
    2374         [ +  + ]:         63 :     if (codemaker::decomposeAndResolve(
    2375                 :            :             manager, codemaker::convertString(reader.getSuperTypeName(0)),
    2376 [ +  - ][ +  - ]:         63 :             false, false, false, &typeClass, &nucleus, &rank, &args)
                 [ +  - ]
    2377                 :            :         == codemaker::UnoType::SORT_COMPLEX)
    2378                 :            :     {
    2379      [ +  +  - ]:         31 :         switch (typeClass) {
    2380                 :            :         case RT_TYPE_STRUCT:
    2381         [ -  + ]:         27 :             if (!args.empty()) {
    2382                 :            :                 throw CannotDumpException(
    2383                 :            :                     rtl::OString(
    2384                 :          0 :                         RTL_CONSTASCII_STRINGPARAM("Bad type information")));
    2385                 :            :                     //TODO
    2386                 :            :             }
    2387                 :            :         case RT_TYPE_ENUM:
    2388                 :            :         case RT_TYPE_INTERFACE:
    2389                 :            :         case RT_TYPE_TYPEDEF:
    2390         [ +  - ]:         31 :             dependencies->insert(nucleus);
    2391                 :         31 :             break;
    2392                 :            : 
    2393                 :            :         default:
    2394                 :            :             OSL_ASSERT(false);
    2395                 :         31 :             break;
    2396                 :            :         }
    2397                 :         63 :     }
    2398                 :         63 : }
    2399                 :            : 
    2400                 :       6628 : void addConstant(
    2401                 :            :     TypeManager const & manager, typereg::Reader const & reader,
    2402                 :            :     bool publishable, sal_uInt16 index, Dependencies * dependencies,
    2403                 :            :     ClassFile * classFile)
    2404                 :            : {
    2405                 :            :     OSL_ASSERT(dependencies != 0 && classFile != 0);
    2406                 :       6628 :     RTFieldAccess flags = reader.getFieldFlags(index);
    2407 [ #  # ][ #  # ]:       6628 :     if (flags != RT_ACCESS_CONST
                 [ -  + ]
    2408                 :          0 :         && (!publishable || flags != (RT_ACCESS_CONST | RT_ACCESS_PUBLISHED)))
    2409                 :            :     {
    2410                 :            :         throw CannotDumpException(
    2411                 :          0 :             rtl::OString(RTL_CONSTASCII_STRINGPARAM("Bad type information")));
    2412                 :            :             //TODO
    2413                 :            :     }
    2414         [ +  - ]:       6628 :     RTConstValue fieldValue(reader.getFieldValue(index));
    2415                 :            :     sal_uInt16 valueIndex;
    2416                 :            :     RTTypeClass typeClass;
    2417                 :       6628 :     rtl::OString nucleus;
    2418                 :            :     sal_Int32 rank;
    2419         [ +  - ]:       6628 :     std::vector< rtl::OString > args;
    2420   [ -  +  +  -  :       6628 :     switch (codemaker::decomposeAndResolve(
          +  +  +  -  +  
                   -  - ]
    2421                 :            :                 manager,
    2422                 :            :                 codemaker::convertString(reader.getFieldTypeName(index)),
    2423 [ +  - ][ +  - ]:       6628 :                 true, false, false, &typeClass, &nucleus, &rank, &args))
                 [ +  - ]
    2424                 :            :     {
    2425                 :            :     case codemaker::UnoType::SORT_BOOLEAN:
    2426         [ #  # ]:          0 :         if (fieldValue.m_type != RT_TYPE_BOOL) {
    2427                 :            :             throw CannotDumpException(
    2428                 :            :                 rtl::OString(
    2429                 :          0 :                     RTL_CONSTASCII_STRINGPARAM("Bad type information"))); //TODO
    2430                 :            :         }
    2431         [ #  # ]:          0 :         valueIndex = classFile->addIntegerInfo(fieldValue.m_value.aBool);
    2432                 :          0 :         break;
    2433                 :            : 
    2434                 :            :     case codemaker::UnoType::SORT_BYTE:
    2435         [ -  + ]:        490 :         if (fieldValue.m_type != RT_TYPE_BYTE) {
    2436                 :            :             throw CannotDumpException(
    2437                 :            :                 rtl::OString(
    2438                 :          0 :                     RTL_CONSTASCII_STRINGPARAM("Bad type information"))); //TODO
    2439                 :            :         }
    2440         [ +  - ]:        490 :         valueIndex = classFile->addIntegerInfo(fieldValue.m_value.aByte);
    2441                 :        490 :         break;
    2442                 :            : 
    2443                 :            :     case codemaker::UnoType::SORT_SHORT:
    2444         [ -  + ]:       4096 :         if (fieldValue.m_type != RT_TYPE_INT16) {
    2445                 :            :             throw CannotDumpException(
    2446                 :            :                 rtl::OString(
    2447                 :          0 :                     RTL_CONSTASCII_STRINGPARAM("Bad type information"))); //TODO
    2448                 :            :         }
    2449         [ +  - ]:       4096 :         valueIndex = classFile->addIntegerInfo(fieldValue.m_value.aShort);
    2450                 :       4096 :         break;
    2451                 :            : 
    2452                 :            :     case codemaker::UnoType::SORT_UNSIGNED_SHORT:
    2453                 :            :     case codemaker::UnoType::SORT_CHAR:
    2454         [ #  # ]:          0 :         if (fieldValue.m_type != RT_TYPE_UINT16) {
    2455                 :            :             throw CannotDumpException(
    2456                 :            :                 rtl::OString(
    2457                 :          0 :                     RTL_CONSTASCII_STRINGPARAM("Bad type information"))); //TODO
    2458                 :            :         }
    2459         [ #  # ]:          0 :         valueIndex = classFile->addIntegerInfo(fieldValue.m_value.aUShort);
    2460                 :          0 :         break;
    2461                 :            : 
    2462                 :            :     case codemaker::UnoType::SORT_LONG:
    2463         [ -  + ]:       1866 :         if (fieldValue.m_type != RT_TYPE_INT32) {
    2464                 :            :             throw CannotDumpException(
    2465                 :            :                 rtl::OString(
    2466                 :          0 :                     RTL_CONSTASCII_STRINGPARAM("Bad type information"))); //TODO
    2467                 :            :         }
    2468         [ +  - ]:       1866 :         valueIndex = classFile->addIntegerInfo(fieldValue.m_value.aLong);
    2469                 :       1866 :         break;
    2470                 :            : 
    2471                 :            :     case codemaker::UnoType::SORT_UNSIGNED_LONG:
    2472         [ -  + ]:         78 :         if (fieldValue.m_type != RT_TYPE_UINT32) {
    2473                 :            :             throw CannotDumpException(
    2474                 :            :                 rtl::OString(
    2475                 :          0 :                     RTL_CONSTASCII_STRINGPARAM("Bad type information"))); //TODO
    2476                 :            :         }
    2477                 :            :         valueIndex = classFile->addIntegerInfo(
    2478         [ +  - ]:         78 :             static_cast< sal_Int32 >(fieldValue.m_value.aULong));
    2479                 :         78 :         break;
    2480                 :            : 
    2481                 :            :     case codemaker::UnoType::SORT_HYPER:
    2482         [ -  + ]:         58 :         if (fieldValue.m_type != RT_TYPE_INT64) {
    2483                 :            :             throw CannotDumpException(
    2484                 :            :                 rtl::OString(
    2485                 :          0 :                     RTL_CONSTASCII_STRINGPARAM("Bad type information"))); //TODO
    2486                 :            :         }
    2487         [ +  - ]:         58 :         valueIndex = classFile->addLongInfo(fieldValue.m_value.aHyper);
    2488                 :         58 :         break;
    2489                 :            : 
    2490                 :            :     case codemaker::UnoType::SORT_UNSIGNED_HYPER:
    2491         [ #  # ]:          0 :         if (fieldValue.m_type != RT_TYPE_UINT64) {
    2492                 :            :             throw CannotDumpException(
    2493                 :            :                 rtl::OString(
    2494                 :          0 :                     RTL_CONSTASCII_STRINGPARAM("Bad type information"))); //TODO
    2495                 :            :         }
    2496                 :            :         valueIndex = classFile->addLongInfo(
    2497         [ #  # ]:          0 :             static_cast< sal_Int64 >(fieldValue.m_value.aUHyper));
    2498                 :          0 :         break;
    2499                 :            : 
    2500                 :            :     case codemaker::UnoType::SORT_FLOAT:
    2501         [ -  + ]:         40 :         if (fieldValue.m_type != RT_TYPE_FLOAT) {
    2502                 :            :             throw CannotDumpException(
    2503                 :            :                 rtl::OString(
    2504                 :          0 :                     RTL_CONSTASCII_STRINGPARAM("Bad type information"))); //TODO
    2505                 :            :         }
    2506         [ +  - ]:         40 :         valueIndex = classFile->addFloatInfo(fieldValue.m_value.aFloat);
    2507                 :         40 :         break;
    2508                 :            : 
    2509                 :            :     case codemaker::UnoType::SORT_DOUBLE:
    2510         [ #  # ]:          0 :         if (fieldValue.m_type != RT_TYPE_DOUBLE) {
    2511                 :            :             throw CannotDumpException(
    2512                 :            :                 rtl::OString(
    2513                 :          0 :                     RTL_CONSTASCII_STRINGPARAM("Bad type information"))); //TODO
    2514                 :            :         }
    2515         [ #  # ]:          0 :         valueIndex = classFile->addDoubleInfo(fieldValue.m_value.aDouble);
    2516                 :          0 :         break;
    2517                 :            : 
    2518                 :            :     default:
    2519                 :            :         throw CannotDumpException(
    2520                 :          0 :             rtl::OString(RTL_CONSTASCII_STRINGPARAM("Bad type information")));
    2521                 :            :             //TODO
    2522                 :            :     }
    2523                 :       6628 :     rtl::OString desc;
    2524                 :       6628 :     rtl::OString sig;
    2525                 :            :     getFieldDescriptor(
    2526                 :            :         manager, dependencies,
    2527                 :            :         codemaker::convertString(reader.getFieldTypeName(index)),
    2528 [ +  - ][ +  - ]:       6628 :         &desc, &sig, 0);
                 [ +  - ]
    2529                 :            :     classFile->addField(
    2530                 :            :         static_cast< ClassFile::AccessFlags >(
    2531                 :            :             ClassFile::ACC_PUBLIC | ClassFile::ACC_STATIC
    2532                 :            :             | ClassFile::ACC_FINAL),
    2533                 :            :         codemaker::convertString(reader.getFieldName(index)),
    2534 [ +  - ][ +  - ]:       6628 :         desc, valueIndex, sig);
                 [ +  - ]
    2535                 :       6628 : }
    2536                 :            : 
    2537                 :        714 : void handleConstantGroup(
    2538                 :            :     TypeManager const & manager, JavaOptions /*TODO const*/ & options,
    2539                 :            :     typereg::Reader const & reader, Dependencies * dependencies)
    2540                 :            : {
    2541                 :            :     OSL_ASSERT(dependencies != 0);
    2542         [ +  - ]:       1428 :     if (reader.getSuperTypeCount() != 0 || reader.getMethodCount() != 0
           [ +  -  -  + ]
                 [ -  + ]
    2543                 :        714 :         || reader.getReferenceCount() != 0)
    2544                 :            :     {
    2545                 :            :         throw CannotDumpException(
    2546                 :          0 :             rtl::OString(RTL_CONSTASCII_STRINGPARAM("Bad type information")));
    2547                 :            :             //TODO
    2548                 :            :     }
    2549 [ +  - ][ +  - ]:        714 :     rtl::OString className(codemaker::convertString(reader.getTypeName()));
    2550                 :            :     SAL_WNODEPRECATED_DECLARATIONS_PUSH
    2551                 :            :     std::auto_ptr< ClassFile > cf(
    2552                 :            :         new ClassFile(
    2553                 :            :             static_cast< ClassFile::AccessFlags >(
    2554                 :            :                 ClassFile::ACC_PUBLIC | ClassFile::ACC_INTERFACE
    2555                 :            :                 | ClassFile::ACC_ABSTRACT),
    2556                 :            :             className,
    2557                 :            :             rtl::OString(RTL_CONSTASCII_STRINGPARAM("java/lang/Object")),
    2558 [ +  - ][ +  - ]:        714 :             rtl::OString()));
    2559                 :            :     SAL_WNODEPRECATED_DECLARATIONS_POP
    2560                 :        714 :     sal_uInt16 fields = reader.getFieldCount();
    2561         [ +  + ]:       7342 :     for (sal_uInt16 i = 0; i < fields; ++i) {
    2562         [ +  - ]:       6628 :         addConstant(manager, reader, false, i, dependencies, cf.get());
    2563                 :            :     }
    2564 [ +  - ][ +  - ]:        714 :     writeClassFile(options, className, *cf.get());
    2565                 :        714 : }
    2566                 :            : 
    2567                 :        296 : void handleModule(
    2568                 :            :     TypeManager const & manager, JavaOptions /*TODO const*/ & options,
    2569                 :            :     typereg::Reader const & reader, Dependencies * dependencies)
    2570                 :            : {
    2571                 :            :     OSL_ASSERT(dependencies != 0);
    2572         [ +  - ]:        592 :     if (reader.getSuperTypeCount() != 0 || reader.getMethodCount() != 0
           [ +  -  -  + ]
                 [ -  + ]
    2573                 :        296 :         || reader.getReferenceCount() != 0)
    2574                 :            :     {
    2575                 :            :         throw CannotDumpException(
    2576                 :          0 :             rtl::OString(RTL_CONSTASCII_STRINGPARAM("Bad type information")));
    2577                 :            :             //TODO
    2578                 :            :     }
    2579 [ +  - ][ +  - ]:        296 :     rtl::OStringBuffer buf(codemaker::convertString(reader.getTypeName()));
                 [ +  - ]
    2580         [ +  - ]:        296 :     buf.append('/');
    2581                 :        296 :     rtl::OString prefix(buf.makeStringAndClear());
    2582                 :        296 :     sal_uInt16 fields = reader.getFieldCount();
    2583         [ -  + ]:        296 :     for (sal_uInt16 i = 0; i < fields; ++i) {
    2584                 :            :         rtl::OString className(
    2585 [ #  # ][ #  # ]:          0 :             prefix + codemaker::convertString(reader.getFieldName(i)));
    2586                 :            :         SAL_WNODEPRECATED_DECLARATIONS_PUSH
    2587                 :            :         std::auto_ptr< ClassFile > cf(
    2588                 :            :             new ClassFile(
    2589                 :            :                 static_cast< ClassFile::AccessFlags >(
    2590                 :            :                     ClassFile::ACC_PUBLIC | ClassFile::ACC_INTERFACE
    2591                 :            :                     | ClassFile::ACC_ABSTRACT),
    2592                 :            :                 className,
    2593                 :            :                 rtl::OString(RTL_CONSTASCII_STRINGPARAM("java/lang/Object")),
    2594 [ #  # ][ #  # ]:          0 :                 rtl::OString()));
    2595                 :            :         SAL_WNODEPRECATED_DECLARATIONS_POP
    2596         [ #  # ]:          0 :         addConstant(manager, reader, true, i, dependencies, cf.get());
    2597         [ #  # ]:          0 :         writeClassFile(options, className, *cf.get());
    2598         [ #  # ]:        296 :     }
    2599                 :        296 : }
    2600                 :            : 
    2601                 :        426 : void addExceptionHandlers(
    2602                 :            :     codemaker::ExceptionTreeNode const * node,
    2603                 :            :     ClassFile::Code::Position start, ClassFile::Code::Position end,
    2604                 :            :     ClassFile::Code::Position handler, ClassFile::Code * code)
    2605                 :            : {
    2606                 :            :     OSL_ASSERT(node != 0 && code != 0);
    2607         [ +  + ]:        426 :     if (node->present) {
    2608                 :         72 :         code->addException(start, end, handler, node->name);
    2609                 :            :     } else {
    2610 [ +  - ][ +  + ]:        852 :         for (codemaker::ExceptionTreeNode::Children::const_iterator i(
    2611                 :        354 :                  node->children.begin());
    2612                 :        426 :              i != node->children.end(); ++i)
    2613                 :            :         {
    2614         [ +  - ]:         72 :             addExceptionHandlers(*i, start, end, handler, code);
    2615                 :            :         }
    2616                 :            :     }
    2617                 :        426 : }
    2618                 :            : 
    2619                 :        360 : void addConstructor(
    2620                 :            :     TypeManager const & manager, rtl::OString const & realJavaBaseName,
    2621                 :            :     rtl::OString const & unoName, rtl::OString const & className,
    2622                 :            :     typereg::Reader const & reader, sal_uInt16 methodIndex,
    2623                 :            :     rtl::OString const & methodName, rtl::OString const & returnType,
    2624                 :            :     bool defaultConstructor, Dependencies * dependencies, ClassFile * classFile)
    2625                 :            : {
    2626                 :            :     OSL_ASSERT(dependencies != 0 && classFile != 0);
    2627         [ +  - ]:        360 :     MethodDescriptor desc(manager, dependencies, returnType, 0, 0);
    2628                 :            :     desc.addParameter(
    2629                 :            :         rtl::OString(
    2630                 :            :             RTL_CONSTASCII_STRINGPARAM("com/sun/star/uno/XComponentContext")),
    2631         [ +  - ]:        360 :         false, false, 0);
    2632                 :            :     SAL_WNODEPRECATED_DECLARATIONS_PUSH
    2633         [ +  - ]:        360 :     std::auto_ptr< ClassFile::Code > code(classFile->newCode());
    2634                 :            :     SAL_WNODEPRECATED_DECLARATIONS_POP
    2635         [ +  - ]:        360 :     code->loadLocalReference(0);
    2636                 :            :     // stack: context
    2637                 :            :     code->instrInvokestatic(
    2638                 :            :         className, rtl::OString(RTL_CONSTASCII_STRINGPARAM("$getFactory")),
    2639                 :            :         rtl::OString(
    2640                 :            :             RTL_CONSTASCII_STRINGPARAM(
    2641                 :            :                 "(Lcom/sun/star/uno/XComponentContext;)"
    2642         [ +  - ]:        360 :                 "Lcom/sun/star/lang/XMultiComponentFactory;")));
    2643                 :            :     // stack: factory
    2644         [ +  - ]:        360 :     code->loadStringConstant(unoName);
    2645                 :            :     // stack: factory serviceName
    2646         [ +  - ]:        360 :     codemaker::ExceptionTree tree;
    2647                 :            :     ClassFile::Code::Position tryStart;
    2648                 :            :     ClassFile::Code::Position tryEnd;
    2649         [ +  - ]:        360 :     std::vector< rtl::OString > exc;
    2650                 :            :     sal_uInt16 stack;
    2651                 :        360 :     sal_uInt16 localIndex = 1;
    2652                 :            :     ClassFile::AccessFlags access = static_cast< ClassFile::AccessFlags >(
    2653                 :        360 :         ClassFile::ACC_PUBLIC | ClassFile::ACC_STATIC);
    2654         [ +  + ]:        360 :     if (defaultConstructor) {
    2655         [ +  - ]:        193 :         code->loadLocalReference(0);
    2656                 :            :         // stack: factory serviceName context
    2657         [ +  - ]:        193 :         tryStart = code->getPosition();
    2658                 :            :         code->instrInvokeinterface(
    2659                 :            :             rtl::OString(
    2660                 :            :                 RTL_CONSTASCII_STRINGPARAM(
    2661                 :            :                     "com/sun/star/lang/XMultiComponentFactory")),
    2662                 :            :             rtl::OString(
    2663                 :            :                 RTL_CONSTASCII_STRINGPARAM(
    2664                 :            :                     "createInstanceWithContext")),
    2665                 :            :             rtl::OString(
    2666                 :            :                 RTL_CONSTASCII_STRINGPARAM(
    2667                 :            :                     "(Ljava/lang/String;Lcom/sun/star/uno/XComponentContext;)"
    2668                 :            :                     "Ljava/lang/Object;")),
    2669         [ +  - ]:        193 :             3);
    2670         [ +  - ]:        193 :         tryEnd = code->getPosition();
    2671                 :            :         // stack: instance
    2672                 :        193 :         stack = 3;
    2673                 :            :     } else {
    2674                 :        167 :         sal_uInt16 parameters = reader.getMethodParameterCount(methodIndex);
    2675 [ +  + ][ +  +  :        402 :         if (parameters == 1
             +  +  +  - ]
    2676                 :         67 :             && (reader.getMethodParameterFlags(methodIndex, 0)
    2677                 :            :                 == (RT_PARAM_IN | RT_PARAM_REST))
    2678                 :            :             && (reader.getMethodParameterTypeName(methodIndex, 0)
    2679 [ +  - ][ +  - ]:        168 :                 == rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("any"))))
         [ +  + ][ +  + ]
           [ #  #  #  # ]
    2680                 :            :         {
    2681                 :            :             desc.addParameter(
    2682         [ +  - ]:          1 :                 rtl::OString(RTL_CONSTASCII_STRINGPARAM("any")), true, true, 0);
    2683         [ +  - ]:          1 :             code->loadLocalReference(localIndex++);
    2684                 :            :             // stack: factory serviceName args
    2685                 :          1 :             stack = 4;
    2686                 :            :             access = static_cast< ClassFile::AccessFlags >(
    2687                 :          1 :                 access | ClassFile::ACC_VARARGS);
    2688                 :            :         } else {
    2689         [ +  - ]:        166 :             code->loadIntegerConstant(parameters);
    2690                 :            :             // stack: factory serviceName N
    2691                 :            :             code->instrAnewarray(
    2692         [ +  - ]:        166 :                 rtl::OString(RTL_CONSTASCII_STRINGPARAM("java/lang/Object")));
    2693                 :            :             // stack: factory serviceName args
    2694                 :        166 :             stack = 0;
    2695         [ +  + ]:        481 :             for (sal_uInt16 i = 0; i < parameters; ++i) {
    2696                 :            :                 RTParamMode flags = reader.getMethodParameterFlags(
    2697                 :        315 :                     methodIndex, i);
    2698                 :            :                 rtl::OString paramType(
    2699                 :            :                     codemaker::convertString(
    2700 [ +  - ][ +  - ]:        315 :                         reader.getMethodParameterTypeName(methodIndex, i)));
    2701 [ #  # ][ -  + ]:        630 :                 if ((flags != RT_PARAM_IN
           [ #  #  #  # ]
         [ -  + ][ -  + ]
    2702                 :            :                      && flags != (RT_PARAM_IN | RT_PARAM_REST))
    2703                 :            :                     || ((flags & RT_PARAM_REST) != 0
    2704                 :            :                         && (parameters != 1
    2705                 :            :                             || (paramType
    2706                 :            :                                 != rtl::OString(
    2707         [ -  + ]:        315 :                                     RTL_CONSTASCII_STRINGPARAM("any"))))))
    2708                 :            :                 {
    2709                 :            :                     throw CannotDumpException(
    2710                 :            :                         rtl::OString(
    2711                 :            :                             RTL_CONSTASCII_STRINGPARAM(
    2712                 :          0 :                                 "Bad type information"))); //TODO
    2713                 :            :                 }
    2714         [ +  - ]:        315 :                 desc.addParameter(paramType, false, true, 0);
    2715         [ +  - ]:        315 :                 code->instrDup();
    2716                 :            :                 // stack: factory serviceName args args
    2717         [ +  - ]:        315 :                 code->loadIntegerConstant(i);
    2718                 :            :                 // stack: factory serviceName args args i
    2719                 :            :                 stack = std::max(
    2720                 :            :                     stack,
    2721                 :            :                     addLoadLocal(
    2722                 :            :                         manager, code.get(), &localIndex, false, paramType,
    2723 [ +  - ][ +  - ]:        315 :                         true, dependencies));
    2724                 :            :                 // stack: factory serviceName args args i any
    2725         [ +  - ]:        315 :                 code->instrAastore();
    2726                 :            :                 // stack: factory serviceName args
    2727                 :        315 :             }
    2728                 :        166 :             stack += 5;
    2729                 :            :         }
    2730         [ +  - ]:        167 :         code->loadLocalReference(0);
    2731                 :            :         // stack: factory serviceName args context
    2732         [ +  - ]:        167 :         tryStart = code->getPosition();
    2733                 :            :         code->instrInvokeinterface(
    2734                 :            :             rtl::OString(
    2735                 :            :                 RTL_CONSTASCII_STRINGPARAM(
    2736                 :            :                     "com/sun/star/lang/XMultiComponentFactory")),
    2737                 :            :             rtl::OString(
    2738                 :            :                 RTL_CONSTASCII_STRINGPARAM(
    2739                 :            :                     "createInstanceWithArgumentsAndContext")),
    2740                 :            :             rtl::OString(
    2741                 :            :                 RTL_CONSTASCII_STRINGPARAM(
    2742                 :            :                     "(Ljava/lang/String;[Ljava/lang/Object;"
    2743                 :            :                     "Lcom/sun/star/uno/XComponentContext;)Ljava/lang/Object;")),
    2744         [ +  - ]:        167 :             4);
    2745         [ +  - ]:        167 :         tryEnd = code->getPosition();
    2746                 :            :         // stack: instance
    2747                 :            :         createExceptionsAttribute(
    2748         [ +  - ]:        167 :             manager, reader, methodIndex, dependencies, &exc, &tree);
    2749                 :            :     }
    2750         [ +  - ]:        360 :     code->loadLocalReference(0);
    2751                 :            :     // stack: instance context
    2752                 :            :     code->instrInvokestatic(
    2753                 :            :         className, rtl::OString(RTL_CONSTASCII_STRINGPARAM("$castInstance")),
    2754                 :            :         rtl::OString(
    2755                 :            :             RTL_CONSTASCII_STRINGPARAM(
    2756                 :            :                 "(Ljava/lang/Object;Lcom/sun/star/uno/XComponentContext;)"
    2757         [ +  - ]:        360 :                 "Ljava/lang/Object;")));
    2758                 :            :     // stack: instance
    2759         [ +  - ]:        360 :     code->instrCheckcast(returnType);
    2760                 :            :     // stack: instance
    2761         [ +  - ]:        360 :     code->instrAreturn();
    2762         [ +  + ]:        360 :     if (!tree.getRoot()->present) {
    2763         [ +  - ]:        354 :         ClassFile::Code::Position pos1 = code->getPosition();
    2764                 :            :         // stack: e
    2765                 :            :         code->instrInvokevirtual(
    2766                 :            :             rtl::OString(RTL_CONSTASCII_STRINGPARAM("java/lang/Throwable")),
    2767                 :            :             rtl::OString(RTL_CONSTASCII_STRINGPARAM("toString")),
    2768         [ +  - ]:        354 :             rtl::OString(RTL_CONSTASCII_STRINGPARAM("()Ljava/lang/String;")));
    2769                 :            :         // stack: str
    2770         [ +  - ]:        354 :         localIndex = std::max< sal_uInt16 >(localIndex, 2);
    2771         [ +  - ]:        354 :         code->storeLocalReference(1);
    2772                 :            :         // stack: -
    2773                 :            :         code->instrNew(
    2774                 :            :             rtl::OString(
    2775                 :            :                 RTL_CONSTASCII_STRINGPARAM(
    2776         [ +  - ]:        354 :                     "com/sun/star/uno/DeploymentException")));
    2777                 :            :         // stack: ex
    2778         [ +  - ]:        354 :         code->instrDup();
    2779                 :            :         // stack: ex ex
    2780                 :        354 :         rtl::OStringBuffer msg;
    2781                 :            :         msg.append(
    2782                 :            :             RTL_CONSTASCII_STRINGPARAM(
    2783         [ +  - ]:        354 :                 "component context fails to supply service "));
    2784         [ +  - ]:        354 :         msg.append(unoName);
    2785         [ +  - ]:        354 :         msg.append(RTL_CONSTASCII_STRINGPARAM(" of type "));
    2786         [ +  - ]:        354 :         msg.append(realJavaBaseName);
    2787         [ +  - ]:        354 :         msg.append(RTL_CONSTASCII_STRINGPARAM(": "));
    2788         [ +  - ]:        354 :         code->loadStringConstant(msg.makeStringAndClear());
    2789                 :            :         // stack: ex ex "..."
    2790         [ +  - ]:        354 :         code->loadLocalReference(1);
    2791                 :            :         // stack: ex ex "..." str
    2792                 :            :         code->instrInvokevirtual(
    2793                 :            :             rtl::OString(RTL_CONSTASCII_STRINGPARAM("java/lang/String")),
    2794                 :            :             rtl::OString(RTL_CONSTASCII_STRINGPARAM("concat")),
    2795                 :            :             rtl::OString(
    2796                 :            :                 RTL_CONSTASCII_STRINGPARAM(
    2797         [ +  - ]:        354 :                     "(Ljava/lang/String;)Ljava/lang/String;")));
    2798                 :            :         // stack: ex ex "..."
    2799         [ +  - ]:        354 :         code->loadLocalReference(0);
    2800                 :            :         // stack: ex ex "..." context
    2801                 :            :         code->instrInvokespecial(
    2802                 :            :             rtl::OString(
    2803                 :            :                 RTL_CONSTASCII_STRINGPARAM(
    2804                 :            :                     "com/sun/star/uno/DeploymentException")),
    2805                 :            :             rtl::OString(RTL_CONSTASCII_STRINGPARAM("<init>")),
    2806                 :            :             rtl::OString(
    2807                 :            :                 RTL_CONSTASCII_STRINGPARAM(
    2808         [ +  - ]:        354 :                     "(Ljava/lang/String;Ljava/lang/Object;)V")));
    2809                 :            :         // stack: ex
    2810         [ +  - ]:        354 :         ClassFile::Code::Position pos2 = code->getPosition();
    2811         [ +  - ]:        354 :         code->instrAthrow();
    2812                 :            :         addExceptionHandlers(
    2813         [ +  - ]:        354 :             tree.getRoot(), tryStart, tryEnd, pos2, code.get());
    2814                 :            :         code->addException(
    2815                 :            :             tryStart, tryEnd, pos1,
    2816                 :            :             rtl::OString(
    2817         [ +  - ]:        354 :                 RTL_CONSTASCII_STRINGPARAM("com/sun/star/uno/Exception")));
    2818                 :            :         dependencies->insert(
    2819                 :            :             rtl::OString(
    2820         [ +  - ]:        354 :                 RTL_CONSTASCII_STRINGPARAM("com/sun/star/uno/Exception")));
    2821         [ +  - ]:        354 :         stack = std::max< sal_uInt16 >(stack, 4);
    2822                 :            :     }
    2823                 :        360 :     code->setMaxStackAndLocals(stack, localIndex);
    2824                 :            :     classFile->addMethod(
    2825                 :        360 :         access, methodName, desc.getDescriptor(), code.get(), exc,
    2826 [ +  - ][ +  - ]:        720 :         desc.getSignature());
                 [ +  - ]
           [ +  -  +  - ]
    2827                 :        360 : }
    2828                 :            : 
    2829                 :       2620 : void handleService(
    2830                 :            :     TypeManager const & manager, JavaOptions /*TODO const*/ & options,
    2831                 :            :     typereg::Reader const & reader, Dependencies * dependencies)
    2832                 :            : {
    2833                 :            :     OSL_ASSERT(dependencies != 0);
    2834                 :       2620 :     sal_uInt16 superTypes = reader.getSuperTypeCount();
    2835                 :       2620 :     sal_uInt16 methods = reader.getMethodCount();
    2836   [ +  -  +  -  :       3302 :     if (superTypes == 0
           -  + ][ -  + ]
                 [ +  + ]
    2837                 :            :         ? methods != 0
    2838                 :        341 :         : (superTypes != 1 || reader.getFieldCount() != 0
    2839                 :        341 :            || reader.getReferenceCount() != 0))
    2840                 :            :     {
    2841                 :            :         throw CannotDumpException(
    2842                 :          0 :             rtl::OString(RTL_CONSTASCII_STRINGPARAM("Bad type information")));
    2843                 :            :             //TODO
    2844                 :            :     }
    2845         [ +  + ]:       2620 :     if (superTypes == 0) {
    2846                 :       2620 :         return;
    2847                 :            :     }
    2848 [ +  - ][ +  - ]:        341 :     rtl::OString unoName(codemaker::convertString(reader.getTypeName()));
    2849                 :            :     rtl::OString className(
    2850                 :            :         translateUnoTypeToJavaFullyQualifiedName(
    2851         [ +  - ]:        341 :             unoName, rtl::OString(RTL_CONSTASCII_STRINGPARAM("service"))));
    2852                 :        341 :     unoName = unoName.replace('/', '.');
    2853                 :            :     SAL_WNODEPRECATED_DECLARATIONS_PUSH
    2854                 :            :     std::auto_ptr< ClassFile > cf(
    2855                 :            :         new ClassFile(
    2856                 :            :             static_cast< ClassFile::AccessFlags >(
    2857                 :            :                 ClassFile::ACC_PUBLIC | ClassFile::ACC_FINAL
    2858                 :            :                 | ClassFile::ACC_SUPER),
    2859                 :            :             className,
    2860                 :            :             rtl::OString(RTL_CONSTASCII_STRINGPARAM("java/lang/Object")),
    2861 [ +  - ][ +  - ]:        341 :             rtl::OString()));
    2862                 :            :     SAL_WNODEPRECATED_DECLARATIONS_POP
    2863         [ +  + ]:        341 :     if (methods > 0) {
    2864                 :            :         rtl::OString base(codemaker::convertString(
    2865 [ +  - ][ +  - ]:        301 :                               reader.getSuperTypeName(0)));
    2866                 :        301 :         rtl::OString realJavaBaseName(base.replace('/', '.'));
    2867         [ +  - ]:        301 :         dependencies->insert(base);
    2868                 :            :         dependencies->insert(
    2869                 :            :             rtl::OString(
    2870                 :            :                 RTL_CONSTASCII_STRINGPARAM(
    2871         [ +  - ]:        301 :                     "com/sun/star/lang/XMultiComponentFactory")));
    2872                 :            :         dependencies->insert(
    2873                 :            :             rtl::OString(
    2874                 :            :                 RTL_CONSTASCII_STRINGPARAM(
    2875         [ +  - ]:        301 :                     "com/sun/star/uno/DeploymentException")));
    2876                 :            :         dependencies->insert(
    2877                 :            :             rtl::OString(
    2878         [ +  - ]:        301 :                 RTL_CONSTASCII_STRINGPARAM("com/sun/star/uno/TypeClass")));
    2879                 :            :         dependencies->insert(
    2880                 :            :             rtl::OString(
    2881                 :            :                 RTL_CONSTASCII_STRINGPARAM(
    2882         [ +  - ]:        301 :                     "com/sun/star/uno/XComponentContext")));
    2883         [ +  + ]:        661 :         for (sal_uInt16 i = 0; i < methods; ++i) {
    2884                 :            :             rtl::OString name(codemaker::convertString(
    2885 [ +  - ][ +  - ]:        360 :                                   reader.getMethodName(i)));
    2886                 :        360 :             bool defaultCtor = name.getLength() == 0;
    2887 [ +  + ][ +  -  :       1466 :             if (reader.getMethodFlags(i) != RT_MODE_TWOWAY
             +  -  -  + ]
                 [ -  + ]
           [ +  -  +  - ]
    2888 [ +  - ][ +  - ]:        720 :                 || (reader.getMethodReturnTypeName(i) != "void")
                 [ #  # ]
    2889                 :            :                 || (defaultCtor
    2890                 :        193 :                     && (methods != 1 || reader.getMethodParameterCount(i) != 0
    2891                 :        193 :                         || reader.getMethodExceptionCount(i) != 0)))
    2892                 :            :             {
    2893                 :            :                 throw CannotDumpException(
    2894                 :            :                     rtl::OString(
    2895                 :          0 :                         RTL_CONSTASCII_STRINGPARAM("Bad type information")));
    2896                 :            :                     //TODO
    2897                 :            :             }
    2898         [ +  + ]:        360 :             if (defaultCtor) {
    2899                 :        193 :                 name = rtl::OString(RTL_CONSTASCII_STRINGPARAM("create"));
    2900                 :            :             } else {
    2901                 :            :                 name = codemaker::java::translateUnoToJavaIdentifier(
    2902         [ +  - ]:        167 :                     name, rtl::OString(RTL_CONSTASCII_STRINGPARAM("method")));
    2903                 :            :             }
    2904                 :            :             addConstructor(
    2905                 :            :                 manager, realJavaBaseName, unoName, className, reader, i, name,
    2906         [ +  - ]:        360 :                 base, defaultCtor, dependencies, cf.get());
    2907                 :        360 :         }
    2908                 :            :         // Synthetic getFactory method:
    2909                 :            :         {
    2910                 :            :             SAL_WNODEPRECATED_DECLARATIONS_PUSH
    2911         [ +  - ]:        301 :             std::auto_ptr< ClassFile::Code > code(cf->newCode());
    2912                 :            :             SAL_WNODEPRECATED_DECLARATIONS_POP
    2913         [ +  - ]:        301 :             code->loadLocalReference(0);
    2914                 :            :             // stack: context
    2915                 :            :             code->instrInvokeinterface(
    2916                 :            :                 rtl::OString(
    2917                 :            :                     RTL_CONSTASCII_STRINGPARAM(
    2918                 :            :                         "com/sun/star/uno/XComponentContext")),
    2919                 :            :                 rtl::OString(RTL_CONSTASCII_STRINGPARAM("getServiceManager")),
    2920                 :            :                 rtl::OString(
    2921                 :            :                     RTL_CONSTASCII_STRINGPARAM(
    2922                 :            :                         "()Lcom/sun/star/lang/XMultiComponentFactory;")),
    2923         [ +  - ]:        301 :                 1);
    2924                 :            :             // stack: factory
    2925         [ +  - ]:        301 :             code->instrDup();
    2926                 :            :             // stack: factory factory
    2927         [ +  - ]:        301 :             ClassFile::Code::Branch branch = code->instrIfnull();
    2928                 :            :             // stack: factory
    2929         [ +  - ]:        301 :             code->instrAreturn();
    2930         [ +  - ]:        301 :             code->branchHere(branch);
    2931         [ +  - ]:        301 :             code->instrPop();
    2932                 :            :             // stack: -
    2933                 :            :             code->instrNew(
    2934                 :            :                 rtl::OString(
    2935                 :            :                     RTL_CONSTASCII_STRINGPARAM(
    2936         [ +  - ]:        301 :                         "com/sun/star/uno/DeploymentException")));
    2937                 :            :             // stack: ex
    2938         [ +  - ]:        301 :             code->instrDup();
    2939                 :            :             // stack: ex ex
    2940                 :            :             code->loadStringConstant(
    2941                 :            :                 rtl::OString(
    2942                 :            :                     RTL_CONSTASCII_STRINGPARAM(
    2943         [ +  - ]:        301 :                         "component context fails to supply service manager")));
    2944                 :            :             // stack: ex ex "..."
    2945         [ +  - ]:        301 :             code->loadLocalReference(0);
    2946                 :            :             // stack: ex ex "..." context
    2947                 :            :             code->instrInvokespecial(
    2948                 :            :                 rtl::OString(
    2949                 :            :                     RTL_CONSTASCII_STRINGPARAM(
    2950                 :            :                         "com/sun/star/uno/DeploymentException")),
    2951                 :            :                 rtl::OString(RTL_CONSTASCII_STRINGPARAM("<init>")),
    2952                 :            :                 rtl::OString(
    2953                 :            :                     RTL_CONSTASCII_STRINGPARAM(
    2954         [ +  - ]:        301 :                         "(Ljava/lang/String;Ljava/lang/Object;)V")));
    2955                 :            :             // stack: ex
    2956         [ +  - ]:        301 :             code->instrAthrow();
    2957                 :        301 :             code->setMaxStackAndLocals(4, 1);
    2958                 :            :             cf->addMethod(
    2959                 :            :                 static_cast< ClassFile::AccessFlags >(
    2960                 :            :                     ClassFile::ACC_PRIVATE | ClassFile::ACC_STATIC
    2961                 :            :                     | ClassFile::ACC_SYNTHETIC),
    2962                 :            :                 rtl::OString(RTL_CONSTASCII_STRINGPARAM("$getFactory")),
    2963                 :            :                 rtl::OString(
    2964                 :            :                     RTL_CONSTASCII_STRINGPARAM(
    2965                 :            :                         "(Lcom/sun/star/uno/XComponentContext;)"
    2966                 :            :                         "Lcom/sun/star/lang/XMultiComponentFactory;")),
    2967 [ +  - ][ +  - ]:        301 :                 code.get(), std::vector< rtl::OString >(), rtl::OString());
                 [ +  - ]
    2968                 :            :         }
    2969                 :            :         // Synthetic castInstance method:
    2970                 :            :         {
    2971                 :            :             SAL_WNODEPRECATED_DECLARATIONS_PUSH
    2972         [ +  - ]:        301 :             std::auto_ptr< ClassFile::Code > code(cf->newCode());
    2973                 :            :             SAL_WNODEPRECATED_DECLARATIONS_POP
    2974                 :            :             code->instrNew(
    2975                 :            :                 rtl::OString(
    2976         [ +  - ]:        301 :                     RTL_CONSTASCII_STRINGPARAM("com/sun/star/uno/Type")));
    2977                 :            :             // stack: type
    2978         [ +  - ]:        301 :             code->instrDup();
    2979                 :            :             // stack: type type
    2980         [ +  - ]:        301 :             code->loadStringConstant(realJavaBaseName);
    2981                 :            :             // stack: type type "..."
    2982                 :            :             code->instrGetstatic(
    2983                 :            :                 rtl::OString(
    2984                 :            :                     RTL_CONSTASCII_STRINGPARAM("com/sun/star/uno/TypeClass")),
    2985                 :            :                 rtl::OString(RTL_CONSTASCII_STRINGPARAM("INTERFACE")),
    2986                 :            :                 rtl::OString(
    2987                 :            :                     RTL_CONSTASCII_STRINGPARAM(
    2988         [ +  - ]:        301 :                         "Lcom/sun/star/uno/TypeClass;")));
    2989                 :            :             // stack: type type "..." INTERFACE
    2990                 :            :             code->instrInvokespecial(
    2991                 :            :                 rtl::OString(
    2992                 :            :                     RTL_CONSTASCII_STRINGPARAM("com/sun/star/uno/Type")),
    2993                 :            :                 rtl::OString(RTL_CONSTASCII_STRINGPARAM("<init>")),
    2994                 :            :                 rtl::OString(
    2995                 :            :                     RTL_CONSTASCII_STRINGPARAM(
    2996         [ +  - ]:        301 :                         "(Ljava/lang/String;Lcom/sun/star/uno/TypeClass;)V")));
    2997                 :            :             // stack: type
    2998         [ +  - ]:        301 :             code->loadLocalReference(0);
    2999                 :            :             // stack: type instance
    3000                 :            :             code->instrInvokestatic(
    3001                 :            :                 rtl::OString(
    3002                 :            :                     RTL_CONSTASCII_STRINGPARAM("com/sun/star/uno/UnoRuntime")),
    3003                 :            :                 rtl::OString(RTL_CONSTASCII_STRINGPARAM("queryInterface")),
    3004                 :            :                 rtl::OString(
    3005                 :            :                     RTL_CONSTASCII_STRINGPARAM(
    3006                 :            :                         "(Lcom/sun/star/uno/Type;Ljava/lang/Object;)"
    3007         [ +  - ]:        301 :                         "Ljava/lang/Object;")));
    3008                 :            :             // stack: instance
    3009         [ +  - ]:        301 :             code->instrDup();
    3010                 :            :             // stack: instance instance
    3011         [ +  - ]:        301 :             ClassFile::Code::Branch branch = code->instrIfnull();
    3012                 :            :             // stack: instance
    3013         [ +  - ]:        301 :             code->instrAreturn();
    3014         [ +  - ]:        301 :             code->branchHere(branch);
    3015         [ +  - ]:        301 :             code->instrPop();
    3016                 :            :             // stack: -
    3017                 :            :             code->instrNew(
    3018                 :            :                 rtl::OString(
    3019                 :            :                     RTL_CONSTASCII_STRINGPARAM(
    3020         [ +  - ]:        301 :                         "com/sun/star/uno/DeploymentException")));
    3021                 :            :             // stack: ex
    3022         [ +  - ]:        301 :             code->instrDup();
    3023                 :            :             // stack: ex ex
    3024                 :        301 :             rtl::OStringBuffer msg;
    3025                 :            :             msg.append(
    3026                 :            :                 RTL_CONSTASCII_STRINGPARAM(
    3027         [ +  - ]:        301 :                     "component context fails to supply service "));
    3028         [ +  - ]:        301 :             msg.append(unoName);
    3029         [ +  - ]:        301 :             msg.append(RTL_CONSTASCII_STRINGPARAM(" of type "));
    3030         [ +  - ]:        301 :             msg.append(realJavaBaseName);
    3031         [ +  - ]:        301 :             code->loadStringConstant(msg.makeStringAndClear());
    3032                 :            :             // stack: ex ex "..."
    3033         [ +  - ]:        301 :             code->loadLocalReference(1);
    3034                 :            :             // stack: ex ex "..." context
    3035                 :            :             code->instrInvokespecial(
    3036                 :            :                 rtl::OString(
    3037                 :            :                     RTL_CONSTASCII_STRINGPARAM(
    3038                 :            :                         "com/sun/star/uno/DeploymentException")),
    3039                 :            :                 rtl::OString(RTL_CONSTASCII_STRINGPARAM("<init>")),
    3040                 :            :                 rtl::OString(
    3041                 :            :                     RTL_CONSTASCII_STRINGPARAM(
    3042         [ +  - ]:        301 :                         "(Ljava/lang/String;Ljava/lang/Object;)V")));
    3043                 :            :             // stack: ex
    3044         [ +  - ]:        301 :             code->instrAthrow();
    3045                 :        301 :             code->setMaxStackAndLocals(4, 2);
    3046                 :            :             cf->addMethod(
    3047                 :            :                 static_cast< ClassFile::AccessFlags >(
    3048                 :            :                     ClassFile::ACC_PRIVATE | ClassFile::ACC_STATIC
    3049                 :            :                     | ClassFile::ACC_SYNTHETIC),
    3050                 :            :                 rtl::OString(RTL_CONSTASCII_STRINGPARAM("$castInstance")),
    3051                 :            :                 rtl::OString(
    3052                 :            :                     RTL_CONSTASCII_STRINGPARAM(
    3053                 :            :                         "(Ljava/lang/Object;Lcom/sun/star/uno/"
    3054                 :            :                         "XComponentContext;)Ljava/lang/Object;")),
    3055 [ +  - ][ +  - ]:        301 :                 code.get(), std::vector< rtl::OString >(), rtl::OString());
                 [ +  - ]
    3056                 :        301 :         }
    3057                 :            :     }
    3058 [ +  - ][ +  - ]:       2620 :     writeClassFile(options, className, *cf.get());
    3059                 :            : }
    3060                 :            : 
    3061                 :         28 : void handleSingleton(
    3062                 :            :     TypeManager const & manager, JavaOptions /*TODO const*/ & options,
    3063                 :            :     typereg::Reader const & reader, Dependencies * dependencies)
    3064                 :            : {
    3065                 :            :     OSL_ASSERT(dependencies != 0);
    3066 [ +  - ][ +  -  :         84 :     if (reader.getSuperTypeCount() != 1 || reader.getFieldCount() != 0
             +  -  -  + ]
                 [ -  + ]
    3067                 :         56 :         || reader.getMethodCount() != 0 || reader.getReferenceCount() != 0)
    3068                 :            :     {
    3069                 :            :         throw CannotDumpException(
    3070                 :          0 :             rtl::OString(RTL_CONSTASCII_STRINGPARAM("Bad type information")));
    3071                 :            :             //TODO
    3072                 :            :     }
    3073 [ +  - ][ +  - ]:         28 :     rtl::OString base(codemaker::convertString(reader.getSuperTypeName(0)));
    3074                 :         28 :     rtl::OString realJavaBaseName(base.replace('/', '.'));
    3075      [ +  +  - ]:         28 :     switch (manager.getTypeReader(base).getTypeClass()) {
                 [ +  - ]
    3076                 :            :     case RT_TYPE_INTERFACE:
    3077                 :         28 :         break;
    3078                 :            : 
    3079                 :            :     case RT_TYPE_SERVICE:
    3080                 :         28 :         return;
    3081                 :            : 
    3082                 :            :     default:
    3083                 :            :         throw CannotDumpException(
    3084                 :          0 :             rtl::OString(RTL_CONSTASCII_STRINGPARAM("Bad type information")));
    3085                 :            :             //TODO
    3086                 :            :     }
    3087         [ +  - ]:         20 :     dependencies->insert(base);
    3088 [ +  - ][ +  - ]:         20 :     rtl::OString unoName(codemaker::convertString(reader.getTypeName()));
    3089                 :            :     rtl::OString className(
    3090                 :            :         translateUnoTypeToJavaFullyQualifiedName(
    3091         [ +  - ]:         20 :             unoName, rtl::OString(RTL_CONSTASCII_STRINGPARAM("singleton"))));
    3092                 :         20 :     unoName = unoName.replace('/', '.');
    3093                 :            :     dependencies->insert(
    3094                 :            :         rtl::OString(
    3095                 :            :             RTL_CONSTASCII_STRINGPARAM(
    3096         [ +  - ]:         20 :                 "com/sun/star/uno/DeploymentException")));
    3097                 :            :     dependencies->insert(
    3098         [ +  - ]:         20 :         rtl::OString(RTL_CONSTASCII_STRINGPARAM("com/sun/star/uno/TypeClass")));
    3099                 :            :     dependencies->insert(
    3100                 :            :         rtl::OString(
    3101         [ +  - ]:         20 :             RTL_CONSTASCII_STRINGPARAM("com/sun/star/uno/XComponentContext")));
    3102                 :            :     SAL_WNODEPRECATED_DECLARATIONS_PUSH
    3103                 :            :     std::auto_ptr< ClassFile > cf(
    3104                 :            :         new ClassFile(
    3105                 :            :             static_cast< ClassFile::AccessFlags >(
    3106                 :            :                 ClassFile::ACC_PUBLIC | ClassFile::ACC_FINAL
    3107                 :            :                 | ClassFile::ACC_SUPER),
    3108                 :            :             className,
    3109                 :            :             rtl::OString(RTL_CONSTASCII_STRINGPARAM("java/lang/Object")),
    3110 [ +  - ][ +  - ]:         20 :             rtl::OString()));
    3111                 :            :     SAL_WNODEPRECATED_DECLARATIONS_POP
    3112         [ +  - ]:         20 :     MethodDescriptor desc(manager, dependencies, base, 0, 0);
    3113                 :            :     desc.addParameter(
    3114                 :            :         rtl::OString(
    3115                 :            :             RTL_CONSTASCII_STRINGPARAM("com/sun/star/uno/XComponentContext")),
    3116         [ +  - ]:         20 :         false, false, 0);
    3117                 :            :     SAL_WNODEPRECATED_DECLARATIONS_PUSH
    3118         [ +  - ]:         20 :     std::auto_ptr< ClassFile::Code > code(cf->newCode());
    3119                 :            :     SAL_WNODEPRECATED_DECLARATIONS_POP
    3120         [ +  - ]:         20 :     code->loadLocalReference(0);
    3121                 :            :     // stack: context
    3122                 :            :     code->loadStringConstant(
    3123         [ +  - ]:         20 :         rtl::OString(RTL_CONSTASCII_STRINGPARAM("/singletons/")) + unoName);
    3124                 :            :     // stack: context "..."
    3125                 :            :     code->instrInvokeinterface(
    3126                 :            :         rtl::OString(
    3127                 :            :             RTL_CONSTASCII_STRINGPARAM("com/sun/star/uno/XComponentContext")),
    3128                 :            :         rtl::OString(RTL_CONSTASCII_STRINGPARAM("getValueByName")),
    3129                 :            :         rtl::OString(
    3130                 :            :             RTL_CONSTASCII_STRINGPARAM(
    3131                 :            :                 "(Ljava/lang/String;)Ljava/lang/Object;")),
    3132         [ +  - ]:         20 :         2);
    3133                 :            :     // stack: value
    3134         [ +  - ]:         20 :     code->instrDup();
    3135                 :            :     // stack: value value
    3136                 :            :     code->instrInstanceof(
    3137         [ +  - ]:         20 :         rtl::OString(RTL_CONSTASCII_STRINGPARAM("com/sun/star/uno/Any")));
    3138                 :            :     // stack: value 0/1
    3139         [ +  - ]:         20 :     ClassFile::Code::Branch branch1 = code->instrIfeq();
    3140                 :            :     // stack: value
    3141                 :            :     code->instrCheckcast(
    3142         [ +  - ]:         20 :         rtl::OString(RTL_CONSTASCII_STRINGPARAM("com/sun/star/uno/Any")));
    3143                 :            :     // stack: value
    3144         [ +  - ]:         20 :     code->instrDup();
    3145                 :            :     // stack: value value
    3146                 :            :     code->instrInvokevirtual(
    3147                 :            :         rtl::OString(RTL_CONSTASCII_STRINGPARAM("com/sun/star/uno/Any")),
    3148                 :            :         rtl::OString(RTL_CONSTASCII_STRINGPARAM("getType")),
    3149         [ +  - ]:         20 :         rtl::OString(RTL_CONSTASCII_STRINGPARAM("()Lcom/sun/star/uno/Type;")));
    3150                 :            :     // stack: value type
    3151                 :            :     code->instrInvokevirtual(
    3152                 :            :         rtl::OString(RTL_CONSTASCII_STRINGPARAM("com/sun/star/uno/Type")),
    3153                 :            :         rtl::OString(RTL_CONSTASCII_STRINGPARAM("getTypeClass")),
    3154                 :            :         rtl::OString(
    3155         [ +  - ]:         20 :             RTL_CONSTASCII_STRINGPARAM("()Lcom/sun/star/uno/TypeClass;")));
    3156                 :            :     // stack: value typeClass
    3157                 :            :     code->instrGetstatic(
    3158                 :            :         rtl::OString(RTL_CONSTASCII_STRINGPARAM("com/sun/star/uno/TypeClass")),
    3159                 :            :         rtl::OString(RTL_CONSTASCII_STRINGPARAM("INTERFACE")),
    3160                 :            :         rtl::OString(
    3161         [ +  - ]:         20 :             RTL_CONSTASCII_STRINGPARAM("Lcom/sun/star/uno/TypeClass;")));
    3162                 :            :     // stack: value typeClass INTERFACE
    3163         [ +  - ]:         20 :     ClassFile::Code::Branch branch2 = code->instrIfAcmpne();
    3164                 :            :     // stack: value
    3165                 :            :     code->instrInvokevirtual(
    3166                 :            :         rtl::OString(RTL_CONSTASCII_STRINGPARAM("com/sun/star/uno/Any")),
    3167                 :            :         rtl::OString(RTL_CONSTASCII_STRINGPARAM("getObject")),
    3168         [ +  - ]:         20 :         rtl::OString(RTL_CONSTASCII_STRINGPARAM("()Ljava/lang/Object;")));
    3169                 :            :     // stack: value
    3170         [ +  - ]:         20 :     code->branchHere(branch1);
    3171                 :            :     code->instrNew(
    3172         [ +  - ]:         20 :         rtl::OString(RTL_CONSTASCII_STRINGPARAM("com/sun/star/uno/Type")));
    3173                 :            :     // stack: value type
    3174         [ +  - ]:         20 :     code->instrDup();
    3175                 :            :     // stack: value type type
    3176         [ +  - ]:         20 :     code->loadStringConstant(realJavaBaseName);
    3177                 :            :     // stack: value type type "..."
    3178                 :            :     code->instrGetstatic(
    3179                 :            :         rtl::OString(RTL_CONSTASCII_STRINGPARAM("com/sun/star/uno/TypeClass")),
    3180                 :            :         rtl::OString(RTL_CONSTASCII_STRINGPARAM("INTERFACE")),
    3181                 :            :         rtl::OString(
    3182         [ +  - ]:         20 :             RTL_CONSTASCII_STRINGPARAM("Lcom/sun/star/uno/TypeClass;")));
    3183                 :            :     // stack: value type type "..." INTERFACE
    3184                 :            :     code->instrInvokespecial(
    3185                 :            :         rtl::OString(RTL_CONSTASCII_STRINGPARAM("com/sun/star/uno/Type")),
    3186                 :            :         rtl::OString(RTL_CONSTASCII_STRINGPARAM("<init>")),
    3187                 :            :         rtl::OString(
    3188                 :            :             RTL_CONSTASCII_STRINGPARAM(
    3189         [ +  - ]:         20 :                 "(Ljava/lang/String;Lcom/sun/star/uno/TypeClass;)V")));
    3190                 :            :     // stack: value type
    3191         [ +  - ]:         20 :     code->instrSwap();
    3192                 :            :     // stack: type value
    3193                 :            :     code->instrInvokestatic(
    3194                 :            :         rtl::OString(RTL_CONSTASCII_STRINGPARAM("com/sun/star/uno/UnoRuntime")),
    3195                 :            :         rtl::OString(RTL_CONSTASCII_STRINGPARAM("queryInterface")),
    3196                 :            :         rtl::OString(
    3197                 :            :             RTL_CONSTASCII_STRINGPARAM(
    3198                 :            :                 "(Lcom/sun/star/uno/Type;Ljava/lang/Object;)"
    3199         [ +  - ]:         20 :                 "Ljava/lang/Object;")));
    3200                 :            :     // stack: instance
    3201         [ +  - ]:         20 :     code->instrDup();
    3202                 :            :     // stack: instance instance
    3203         [ +  - ]:         20 :     ClassFile::Code::Branch branch3 = code->instrIfnull();
    3204                 :            :     // stack: instance
    3205         [ +  - ]:         20 :     code->instrCheckcast(base);
    3206                 :            :     // stack: instance
    3207         [ +  - ]:         20 :     code->instrAreturn();
    3208         [ +  - ]:         20 :     code->branchHere(branch2);
    3209         [ +  - ]:         20 :     code->branchHere(branch3);
    3210         [ +  - ]:         20 :     code->instrPop();
    3211                 :            :     // stack: -
    3212                 :            :     code->instrNew(
    3213                 :            :         rtl::OString(
    3214                 :            :             RTL_CONSTASCII_STRINGPARAM(
    3215         [ +  - ]:         20 :                 "com/sun/star/uno/DeploymentException")));
    3216                 :            :     // stack: ex
    3217         [ +  - ]:         20 :     code->instrDup();
    3218                 :            :     // stack: ex ex
    3219                 :         20 :     rtl::OStringBuffer msg;
    3220                 :            :     msg.append(
    3221                 :            :         RTL_CONSTASCII_STRINGPARAM(
    3222         [ +  - ]:         20 :             "component context fails to supply singleton "));
    3223         [ +  - ]:         20 :     msg.append(unoName);
    3224         [ +  - ]:         20 :     msg.append(RTL_CONSTASCII_STRINGPARAM(" of type "));
    3225         [ +  - ]:         20 :     msg.append(realJavaBaseName);
    3226         [ +  - ]:         20 :     code->loadStringConstant(msg.makeStringAndClear());
    3227                 :            :     // stack: ex ex "..."
    3228         [ +  - ]:         20 :     code->loadLocalReference(0);
    3229                 :            :     // stack: ex ex "..." context
    3230                 :            :     code->instrInvokespecial(
    3231                 :            :         rtl::OString(
    3232                 :            :             RTL_CONSTASCII_STRINGPARAM("com/sun/star/uno/DeploymentException")),
    3233                 :            :         rtl::OString(RTL_CONSTASCII_STRINGPARAM("<init>")),
    3234                 :            :         rtl::OString(
    3235                 :            :             RTL_CONSTASCII_STRINGPARAM(
    3236         [ +  - ]:         20 :                 "(Ljava/lang/String;Ljava/lang/Object;)V")));
    3237                 :            :     // stack: ex
    3238         [ +  - ]:         20 :     code->instrAthrow();
    3239                 :         20 :     code->setMaxStackAndLocals(5, 1);
    3240                 :            :     cf->addMethod(
    3241                 :            :         static_cast< ClassFile::AccessFlags >(
    3242                 :            :             ClassFile::ACC_PUBLIC | ClassFile::ACC_STATIC),
    3243                 :            :         rtl::OString(RTL_CONSTASCII_STRINGPARAM("get")), desc.getDescriptor(),
    3244 [ +  - ][ +  - ]:         20 :         code.get(), std::vector< rtl::OString >(), desc.getSignature());
         [ +  - ][ +  - ]
    3245 [ +  - ][ +  - ]:         28 :     writeClassFile(options, className, *cf.get());
         [ +  + ][ +  + ]
                 [ +  - ]
    3246                 :            : }
    3247                 :            : 
    3248                 :            : }
    3249                 :            : 
    3250                 :      13288 : bool produceType(
    3251                 :            :     rtl::OString const & type, TypeManager const & manager,
    3252                 :            :     codemaker::GeneratedTypeSet & generated, JavaOptions * options)
    3253                 :            : {
    3254                 :            :     OSL_ASSERT(options != 0);
    3255   [ +  +  +  - ]:      53140 :     if (type.equals("/")
         [ +  + ][ +  - ]
         [ +  - ][ +  +  
             #  #  #  # ]
    3256 [ +  - ][ +  + ]:      26570 :         || type.equals(manager.getBase())
                 [ #  # ]
    3257         [ +  - ]:      13282 :         || generated.contains(type))
    3258                 :            :     {
    3259                 :      11216 :         return true;
    3260                 :            :     }
    3261                 :       2072 :     sal_Bool extra = sal_False;
    3262         [ +  - ]:       2072 :     typereg::Reader reader(manager.getTypeReader(type, &extra));
    3263         [ +  + ]:       2072 :     if (extra) {
    3264         [ +  - ]:        166 :         generated.add(type);
    3265                 :        166 :         return true;
    3266                 :            :     }
    3267         [ -  + ]:       1906 :     if (!reader.isValid()) {
    3268                 :          0 :         return false;
    3269                 :            :     }
    3270                 :            : 
    3271                 :            :     handleUnoTypeRegistryEntityFunction handler;
    3272   [ +  +  +  -  :       1906 :     switch (reader.getTypeClass()) {
             -  -  -  -  
                      - ]
    3273                 :            :     case RT_TYPE_ENUM:
    3274                 :        152 :         handler = handleEnumType;
    3275                 :        152 :         break;
    3276                 :            : 
    3277                 :            :     case RT_TYPE_STRUCT:
    3278                 :            :     case RT_TYPE_EXCEPTION:
    3279                 :        638 :         handler = handleAggregatingType;
    3280                 :        638 :         break;
    3281                 :            : 
    3282                 :            :     case RT_TYPE_INTERFACE:
    3283                 :       1116 :         handler = handleInterfaceType;
    3284                 :       1116 :         break;
    3285                 :            : 
    3286                 :            :     case RT_TYPE_TYPEDEF:
    3287                 :          0 :         handler = handleTypedef;
    3288                 :          0 :         break;
    3289                 :            : 
    3290                 :            :     case RT_TYPE_CONSTANTS:
    3291                 :          0 :         handler = handleConstantGroup;
    3292                 :          0 :         break;
    3293                 :            : 
    3294                 :            :     case RT_TYPE_MODULE:
    3295                 :          0 :         handler = handleModule;
    3296                 :          0 :         break;
    3297                 :            : 
    3298                 :            :     case RT_TYPE_SERVICE:
    3299                 :          0 :         handler = handleService;
    3300                 :          0 :         break;
    3301                 :            : 
    3302                 :            :     case RT_TYPE_SINGLETON:
    3303                 :          0 :         handler = handleSingleton;
    3304                 :          0 :         break;
    3305                 :            : 
    3306                 :            :     default:
    3307                 :          0 :         return false;
    3308                 :            :     }
    3309         [ +  - ]:       1906 :     Dependencies deps;
    3310         [ +  - ]:       1906 :     handler(manager, *options, reader, &deps);
    3311         [ +  - ]:       1906 :     generated.add(type);
    3312 [ +  - ][ +  - ]:       1906 :     if (!options->isValid(rtl::OString(RTL_CONSTASCII_STRINGPARAM("-nD")))) {
    3313         [ +  + ]:       6121 :         for (Dependencies::iterator i(deps.begin()); i != deps.end(); ++i) {
    3314 [ +  - ][ -  + ]:       4215 :             if (!produceType(*i, manager, generated, options)) {
    3315                 :          0 :                 return false;
    3316                 :            :             }
    3317                 :            :         }
    3318                 :            :     }
    3319                 :      13288 :     return true;
    3320                 :            : }
    3321                 :            : 
    3322                 :       8846 : bool produceType(
    3323                 :            :     RegistryKey & rTypeKey, bool bIsExtraType, TypeManager const & manager,
    3324                 :            :     codemaker::GeneratedTypeSet & generated, JavaOptions * options)
    3325                 :            : {
    3326         [ +  - ]:       8846 :     ::rtl::OString typeName = manager.getTypeName(rTypeKey);
    3327                 :            : 
    3328                 :            :     OSL_ASSERT(options != 0);
    3329   [ +  -  +  - ]:      35384 :     if (typeName.equals("/")
         [ +  + ][ +  - ]
         [ +  - ][ +  +  
             #  #  #  # ]
    3330 [ +  - ][ +  - ]:      17692 :         || typeName.equals(manager.getBase())
                 [ #  # ]
    3331         [ +  - ]:       8846 :         || generated.contains(typeName))
    3332                 :            :     {
    3333                 :       1906 :         return true;
    3334                 :            :     }
    3335         [ +  - ]:       6940 :     typereg::Reader reader(manager.getTypeReader(rTypeKey));
    3336         [ -  + ]:       6940 :     if (bIsExtraType) {
    3337         [ #  # ]:          0 :         generated.add(typeName);
    3338                 :          0 :         return true;
    3339                 :            :     }
    3340         [ -  + ]:       6940 :     if (!reader.isValid()) {
    3341                 :          0 :         return false;
    3342                 :            :     }
    3343                 :            :     handleUnoTypeRegistryEntityFunction handler;
    3344   [ +  +  +  +  :       6940 :     switch (reader.getTypeClass()) {
             +  +  +  +  
                      - ]
    3345                 :            :     case RT_TYPE_ENUM:
    3346                 :        257 :         handler = handleEnumType;
    3347                 :        257 :         break;
    3348                 :            : 
    3349                 :            :     case RT_TYPE_STRUCT:
    3350                 :            :     case RT_TYPE_EXCEPTION:
    3351                 :        755 :         handler = handleAggregatingType;
    3352                 :        755 :         break;
    3353                 :            : 
    3354                 :            :     case RT_TYPE_INTERFACE:
    3355                 :       2207 :         handler = handleInterfaceType;
    3356                 :       2207 :         break;
    3357                 :            : 
    3358                 :            :     case RT_TYPE_TYPEDEF:
    3359                 :         63 :         handler = handleTypedef;
    3360                 :         63 :         break;
    3361                 :            : 
    3362                 :            :     case RT_TYPE_CONSTANTS:
    3363                 :        714 :         handler = handleConstantGroup;
    3364                 :        714 :         break;
    3365                 :            : 
    3366                 :            :     case RT_TYPE_MODULE:
    3367                 :        296 :         handler = handleModule;
    3368                 :        296 :         break;
    3369                 :            : 
    3370                 :            :     case RT_TYPE_SERVICE:
    3371                 :       2620 :         handler = handleService;
    3372                 :       2620 :         break;
    3373                 :            : 
    3374                 :            :     case RT_TYPE_SINGLETON:
    3375                 :         28 :         handler = handleSingleton;
    3376                 :         28 :         break;
    3377                 :            : 
    3378                 :            :     default:
    3379                 :          0 :         return false;
    3380                 :            :     }
    3381         [ +  - ]:       6940 :     Dependencies deps;
    3382         [ +  - ]:       6940 :     handler(manager, *options, reader, &deps);
    3383         [ +  - ]:       6940 :     generated.add(typeName);
    3384 [ +  - ][ +  + ]:       6940 :     if (!options->isValid(rtl::OString(RTL_CONSTASCII_STRINGPARAM("-nD")))) {
    3385         [ +  + ]:      15957 :         for (Dependencies::iterator i(deps.begin()); i != deps.end(); ++i) {
    3386 [ +  - ][ -  + ]:       9067 :             if (!produceType(*i, manager, generated, options)) {
    3387                 :          0 :                 return false;
    3388                 :            :             }
    3389                 :            :         }
    3390                 :            :     }
    3391                 :       8846 :     return true;
    3392                 :            : }
    3393                 :            : 
    3394                 :            : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10