1b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang/*
2b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * ProGuard -- shrinking, optimization, obfuscation, and preverification
3b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang *             of Java bytecode.
4b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang *
5b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
6b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang *
7b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * This program is free software; you can redistribute it and/or modify it
8b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * under the terms of the GNU General Public License as published by the Free
9b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * Software Foundation; either version 2 of the License, or (at your option)
10b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * any later version.
11b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang *
12b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * This program is distributed in the hope that it will be useful, but WITHOUT
13b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
15b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * more details.
16b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang *
17b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * You should have received a copy of the GNU General Public License along
18b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * with this program; if not, write to the Free Software Foundation, Inc.,
19b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang */
21b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wangpackage proguard.classfile.attribute;
22b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
23b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wangimport proguard.classfile.*;
24b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wangimport proguard.classfile.constant.visitor.ConstantVisitor;
25b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
26b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang/**
27b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * Representation of a bootstrap method.
28b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang *
29b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @author Eric Lafortune
30b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang */
31b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wangpublic class BootstrapMethodInfo implements VisitorAccepter
32b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang{
33b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    public int   u2methodHandleIndex;
34b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    public int   u2methodArgumentCount;
35b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    public int[] u2methodArguments;
36b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
37b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    /**
38b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang     * An extra field in which visitors can store information.
39b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang     */
40b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    public Object visitorInfo;
41b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
42b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
43b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    /**
44b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang     * Creates an uninitialized BootstrapMethodInfo.
45b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang     */
46b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    public BootstrapMethodInfo()
47b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    {
48b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    }
49b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
50b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
51b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    /**
52b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang     * Creates an initialized BootstrapMethodInfo.
53b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang     */
54b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    public BootstrapMethodInfo(int   u2methodHandleIndex,
55b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang                               int   u2methodArgumentCount,
56b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang                               int[] u2methodArguments)
57b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    {
58b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        this.u2methodHandleIndex   = u2methodHandleIndex;
59b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        this.u2methodArgumentCount = u2methodArgumentCount;
60b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        this.u2methodArguments     = u2methodArguments;
61b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    }
62b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
63b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
64b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    /**
65b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang     * Applies the given constant pool visitor to the argument constants of the
66b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang     * bootstrap method.
67b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang     */
68b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    public void methodArgumentsAccept(Clazz clazz, ConstantVisitor constantVisitor)
69b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    {
70b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        for (int index = 0; index < u2methodArgumentCount; index++)
71b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        {
72b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            clazz.constantPoolEntryAccept(u2methodArguments[index],
73b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang                                          constantVisitor);
74b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        }
75b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    }
76b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
77b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
78b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    // Implementations for VisitorAccepter.
79b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
80b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    public Object getVisitorInfo()
81b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    {
82b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        return visitorInfo;
83b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    }
84b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
85b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    public void setVisitorInfo(Object visitorInfo)
86b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    {
87b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        this.visitorInfo = visitorInfo;
88b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    }
89b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang}
90