Home | History | Annotate | Download | only in file
      1 /*
      2  * Copyright (C) 2007 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package com.android.dexgen.dex.file;
     18 
     19 import com.android.dexgen.rop.cst.CstType;
     20 import com.android.dexgen.rop.type.StdTypeList;
     21 import com.android.dexgen.rop.type.Type;
     22 import com.android.dexgen.rop.type.TypeList;
     23 import com.android.dexgen.util.AnnotatedOutput;
     24 import com.android.dexgen.util.Hex;
     25 
     26 /**
     27  * Representation of a list of class references.
     28  */
     29 public final class TypeListItem extends OffsettedItem {
     30     /** alignment requirement */
     31     private static final int ALIGNMENT = 4;
     32 
     33     /** element size in bytes */
     34     private static final int ELEMENT_SIZE = 2;
     35 
     36     /** header size in bytes */
     37     private static final int HEADER_SIZE = 4;
     38 
     39     /** {@code non-null;} the actual list */
     40     private final TypeList list;
     41 
     42     /**
     43      * Constructs an instance.
     44      *
     45      * @param list {@code non-null;} the actual list
     46      */
     47     public TypeListItem(TypeList list) {
     48         super(ALIGNMENT, (list.size() * ELEMENT_SIZE) + HEADER_SIZE);
     49 
     50         this.list = list;
     51     }
     52 
     53     /** {@inheritDoc} */
     54     @Override
     55     public int hashCode() {
     56         return StdTypeList.hashContents(list);
     57     }
     58 
     59     /** {@inheritDoc} */
     60     @Override
     61     public ItemType itemType() {
     62         return ItemType.TYPE_TYPE_LIST;
     63     }
     64 
     65     /** {@inheritDoc} */
     66     public void addContents(DexFile file) {
     67         TypeIdsSection typeIds = file.getTypeIds();
     68         int sz = list.size();
     69 
     70         for (int i = 0; i < sz; i++) {
     71             typeIds.intern(list.getType(i));
     72         }
     73     }
     74 
     75     /** {@inheritDoc} */
     76     @Override
     77     public String toHuman() {
     78         throw new RuntimeException("unsupported");
     79     }
     80 
     81     /**
     82      * Gets the underlying list.
     83      *
     84      * @return {@code non-null;} the list
     85      */
     86     public TypeList getList() {
     87         return list;
     88     }
     89 
     90     /** {@inheritDoc} */
     91     @Override
     92     protected void writeTo0(DexFile file, AnnotatedOutput out) {
     93         TypeIdsSection typeIds = file.getTypeIds();
     94         int sz = list.size();
     95 
     96         if (out.annotates()) {
     97             out.annotate(0, offsetString() + " type_list");
     98             out.annotate(HEADER_SIZE, "  size: " + Hex.u4(sz));
     99             for (int i = 0; i < sz; i++) {
    100                 Type one = list.getType(i);
    101                 int idx = typeIds.indexOf(one);
    102                 out.annotate(ELEMENT_SIZE,
    103                              "  " + Hex.u2(idx) + " // " + one.toHuman());
    104             }
    105         }
    106 
    107         out.writeInt(sz);
    108 
    109         for (int i = 0; i < sz; i++) {
    110             out.writeShort(typeIds.indexOf(list.getType(i)));
    111         }
    112     }
    113 
    114     /** {@inheritDoc} */
    115     @Override
    116     protected int compareTo0(OffsettedItem other) {
    117         TypeList thisList = this.list;
    118         TypeList otherList = ((TypeListItem) other).list;
    119 
    120         return StdTypeList.compareContents(thisList, otherList);
    121     }
    122 }
    123