src/share/classes/com/sun/tools/corba/se/idl/toJavaPortable/TCOffsets.java

Thu, 31 Aug 2017 18:10:36 +0800

author
aoqi
date
Thu, 31 Aug 2017 18:10:36 +0800
changeset 748
6845b95cba6b
parent 158
91006f157c46
parent 0
7ef37b2cdcad
permissions
-rw-r--r--

merge

     1 /*
     2  * Copyright (c) 1999, Oracle and/or its affiliates. All rights reserved.
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     4  *
     5  * This code is free software; you can redistribute it and/or modify it
     6  * under the terms of the GNU General Public License version 2 only, as
     7  * published by the Free Software Foundation.  Oracle designates this
     8  * particular file as subject to the "Classpath" exception as provided
     9  * by Oracle in the LICENSE file that accompanied this code.
    10  *
    11  * This code is distributed in the hope that it will be useful, but WITHOUT
    12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    14  * version 2 for more details (a copy is included in the LICENSE file that
    15  * accompanied this code).
    16  *
    17  * You should have received a copy of the GNU General Public License version
    18  * 2 along with this work; if not, write to the Free Software Foundation,
    19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    20  *
    21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    22  * or visit www.oracle.com if you need additional information or have any
    23  * questions.
    24  */
    25 /*
    26  * COMPONENT_NAME: idl.toJava
    27  *
    28  * ORIGINS: 27
    29  *
    30  * Licensed Materials - Property of IBM
    31  * 5639-D57 (C) COPYRIGHT International Business Machines Corp. 1997, 1999
    32  * RMI-IIOP v1.0
    33  *
    34  */
    36 package com.sun.tools.corba.se.idl.toJavaPortable;
    38 // NOTES:
    40 import java.util.Enumeration;
    41 import java.util.Hashtable;
    43 import com.sun.tools.corba.se.idl.*;
    45 // This class is passed through the JavaGenerator.HelperType methods.
    46 // It is ONLY used when a recursive sequence is detected. ie.
    47 //
    48 //   struct S1
    49 //   {
    50 //     sequence <S1> others;
    51 //   };
    53 /**
    54  *
    55  **/
    56 public class TCOffsets
    57 {
    58   /**
    59    * Return -1 if the given name is not in the list of types.
    60    **/
    61   public int offset (String name)
    62   {
    63     Integer value = (Integer)tcs.get (name);
    64     return value == null ? -1 : value.intValue ();
    65   } // offset
    67   /**
    68    *
    69    **/
    70   public void set (SymtabEntry entry)
    71   {
    72     if (entry == null)
    73       offset += 8;
    74     else
    75     {
    76       tcs.put (entry.fullName (), new Integer (offset));
    77       offset += 4;
    78       String repID = Util.stripLeadingUnderscoresFromID (entry.repositoryID ().ID ());
    79       if (entry instanceof InterfaceEntry)
    80         offset += alignStrLen (repID) + alignStrLen (entry.name ());
    81       else if (entry instanceof StructEntry)
    82         offset += alignStrLen (repID) + alignStrLen (entry.name ()) + 4;
    83       else if (entry instanceof UnionEntry)
    84         offset += alignStrLen (repID) + alignStrLen (entry.name ()) + 12;
    85       else if (entry instanceof EnumEntry)
    86       {
    87         offset += alignStrLen (repID) + alignStrLen (entry.name ()) + 4;
    88         Enumeration e = ((EnumEntry)entry).elements ().elements ();
    89         while (e.hasMoreElements ())
    90           offset += alignStrLen ((String)e.nextElement ());
    91       }
    92       else if (entry instanceof StringEntry)
    93         offset += 4;
    94       else if (entry instanceof TypedefEntry)
    95       {
    96         offset += alignStrLen (repID) + alignStrLen (entry.name ());
    97         if (((TypedefEntry)entry).arrayInfo ().size () != 0)
    98           offset += 8;
    99       }
   100     }
   101   } // set
   103   /**
   104    * Return the full length of the string type:  4 byte length, x bytes for
   105    * string + 1 for the null terminator, align it so it ends on a 4-byte
   106    * boundary.  This method assumes the string starts at a 4-byte boundary
   107    * since it doesn't do any leading alignment.
   108    **/
   109   public int alignStrLen (String string)
   110   {
   111     int len = string.length () + 1;
   112     int align = 4 - (len % 4);
   113     if (align == 4) align = 0;
   114     return len + align + 4;
   115   } // alignStrLen
   117   /**
   118    *
   119    **/
   120   public void setMember (SymtabEntry entry)
   121   {
   122     offset += alignStrLen (entry.name ());
   123     if (((TypedefEntry)entry).arrayInfo ().size () != 0)
   124       offset += 4;
   125   } // setMember
   127   /**
   128    *
   129    **/
   130   public int currentOffset ()
   131   {
   132     return offset;
   133   } // currentOffset
   135   /**
   136    *
   137    **/
   138   public void bumpCurrentOffset (int value)
   139   {
   140     offset += value;
   141   } // bumpCurrentOffset
   143   private Hashtable tcs    = new Hashtable ();
   144   private int       offset = 0;
   145 } // class TCOffsets

mercurial