19c60ef2a1034e9f8d111907e4fceb3a4ca2e7e69Ben Gruver/*
29c60ef2a1034e9f8d111907e4fceb3a4ca2e7e69Ben Gruver * Copyright 2012, Google Inc.
39c60ef2a1034e9f8d111907e4fceb3a4ca2e7e69Ben Gruver * All rights reserved.
49c60ef2a1034e9f8d111907e4fceb3a4ca2e7e69Ben Gruver *
59c60ef2a1034e9f8d111907e4fceb3a4ca2e7e69Ben Gruver * Redistribution and use in source and binary forms, with or without
69c60ef2a1034e9f8d111907e4fceb3a4ca2e7e69Ben Gruver * modification, are permitted provided that the following conditions are
79c60ef2a1034e9f8d111907e4fceb3a4ca2e7e69Ben Gruver * met:
89c60ef2a1034e9f8d111907e4fceb3a4ca2e7e69Ben Gruver *
99c60ef2a1034e9f8d111907e4fceb3a4ca2e7e69Ben Gruver *     * Redistributions of source code must retain the above copyright
109c60ef2a1034e9f8d111907e4fceb3a4ca2e7e69Ben Gruver * notice, this list of conditions and the following disclaimer.
119c60ef2a1034e9f8d111907e4fceb3a4ca2e7e69Ben Gruver *     * Redistributions in binary form must reproduce the above
129c60ef2a1034e9f8d111907e4fceb3a4ca2e7e69Ben Gruver * copyright notice, this list of conditions and the following disclaimer
139c60ef2a1034e9f8d111907e4fceb3a4ca2e7e69Ben Gruver * in the documentation and/or other materials provided with the
149c60ef2a1034e9f8d111907e4fceb3a4ca2e7e69Ben Gruver * distribution.
159c60ef2a1034e9f8d111907e4fceb3a4ca2e7e69Ben Gruver *     * Neither the name of Google Inc. nor the names of its
169c60ef2a1034e9f8d111907e4fceb3a4ca2e7e69Ben Gruver * contributors may be used to endorse or promote products derived from
179c60ef2a1034e9f8d111907e4fceb3a4ca2e7e69Ben Gruver * this software without specific prior written permission.
189c60ef2a1034e9f8d111907e4fceb3a4ca2e7e69Ben Gruver *
199c60ef2a1034e9f8d111907e4fceb3a4ca2e7e69Ben Gruver * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
209c60ef2a1034e9f8d111907e4fceb3a4ca2e7e69Ben Gruver * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
219c60ef2a1034e9f8d111907e4fceb3a4ca2e7e69Ben Gruver * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
229c60ef2a1034e9f8d111907e4fceb3a4ca2e7e69Ben Gruver * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
239c60ef2a1034e9f8d111907e4fceb3a4ca2e7e69Ben Gruver * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
249c60ef2a1034e9f8d111907e4fceb3a4ca2e7e69Ben Gruver * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
259c60ef2a1034e9f8d111907e4fceb3a4ca2e7e69Ben Gruver * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
269c60ef2a1034e9f8d111907e4fceb3a4ca2e7e69Ben Gruver * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
279c60ef2a1034e9f8d111907e4fceb3a4ca2e7e69Ben Gruver * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
289c60ef2a1034e9f8d111907e4fceb3a4ca2e7e69Ben Gruver * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
299c60ef2a1034e9f8d111907e4fceb3a4ca2e7e69Ben Gruver * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
309c60ef2a1034e9f8d111907e4fceb3a4ca2e7e69Ben Gruver */
319c60ef2a1034e9f8d111907e4fceb3a4ca2e7e69Ben Gruver
329c60ef2a1034e9f8d111907e4fceb3a4ca2e7e69Ben Gruverpackage org.jf.dexlib2.immutable.debug;
339c60ef2a1034e9f8d111907e4fceb3a4ca2e7e69Ben Gruver
349c60ef2a1034e9f8d111907e4fceb3a4ca2e7e69Ben Gruverimport org.jf.dexlib2.DebugItemType;
359bbcaae91fffe74cbc90608eaa98484192b11d77Ben Gruverimport org.jf.dexlib2.base.reference.BaseStringReference;
369bbcaae91fffe74cbc90608eaa98484192b11d77Ben Gruverimport org.jf.dexlib2.base.reference.BaseTypeReference;
379c60ef2a1034e9f8d111907e4fceb3a4ca2e7e69Ben Gruverimport org.jf.dexlib2.iface.debug.StartLocal;
389bbcaae91fffe74cbc90608eaa98484192b11d77Ben Gruverimport org.jf.dexlib2.iface.reference.StringReference;
399bbcaae91fffe74cbc90608eaa98484192b11d77Ben Gruverimport org.jf.dexlib2.iface.reference.TypeReference;
409c60ef2a1034e9f8d111907e4fceb3a4ca2e7e69Ben Gruver
419c60ef2a1034e9f8d111907e4fceb3a4ca2e7e69Ben Gruverimport javax.annotation.Nonnull;
429c60ef2a1034e9f8d111907e4fceb3a4ca2e7e69Ben Gruverimport javax.annotation.Nullable;
439c60ef2a1034e9f8d111907e4fceb3a4ca2e7e69Ben Gruver
449c60ef2a1034e9f8d111907e4fceb3a4ca2e7e69Ben Gruverpublic class ImmutableStartLocal extends ImmutableDebugItem implements StartLocal {
4522c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver    protected final int register;
4622c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver    @Nullable protected final String name;
4722c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver    @Nullable protected final String type;
4822c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver    @Nullable protected final String signature;
499c60ef2a1034e9f8d111907e4fceb3a4ca2e7e69Ben Gruver
509c60ef2a1034e9f8d111907e4fceb3a4ca2e7e69Ben Gruver    public ImmutableStartLocal(int codeAddress,
519c60ef2a1034e9f8d111907e4fceb3a4ca2e7e69Ben Gruver                               int register,
529c60ef2a1034e9f8d111907e4fceb3a4ca2e7e69Ben Gruver                               @Nullable String name,
539c60ef2a1034e9f8d111907e4fceb3a4ca2e7e69Ben Gruver                               @Nullable String type,
549c60ef2a1034e9f8d111907e4fceb3a4ca2e7e69Ben Gruver                               @Nullable String signature) {
559c60ef2a1034e9f8d111907e4fceb3a4ca2e7e69Ben Gruver        super(codeAddress);
569c60ef2a1034e9f8d111907e4fceb3a4ca2e7e69Ben Gruver        this.register = register;
579c60ef2a1034e9f8d111907e4fceb3a4ca2e7e69Ben Gruver        this.name = name;
589c60ef2a1034e9f8d111907e4fceb3a4ca2e7e69Ben Gruver        this.type = type;
599c60ef2a1034e9f8d111907e4fceb3a4ca2e7e69Ben Gruver        this.signature = signature;
609c60ef2a1034e9f8d111907e4fceb3a4ca2e7e69Ben Gruver    }
619c60ef2a1034e9f8d111907e4fceb3a4ca2e7e69Ben Gruver
629c60ef2a1034e9f8d111907e4fceb3a4ca2e7e69Ben Gruver    @Nonnull
639c60ef2a1034e9f8d111907e4fceb3a4ca2e7e69Ben Gruver    public static ImmutableStartLocal of(@Nonnull StartLocal startLocal) {
649c60ef2a1034e9f8d111907e4fceb3a4ca2e7e69Ben Gruver        if (startLocal instanceof  ImmutableStartLocal) {
659c60ef2a1034e9f8d111907e4fceb3a4ca2e7e69Ben Gruver            return (ImmutableStartLocal)startLocal;
669c60ef2a1034e9f8d111907e4fceb3a4ca2e7e69Ben Gruver        }
679c60ef2a1034e9f8d111907e4fceb3a4ca2e7e69Ben Gruver        return new ImmutableStartLocal(
689c60ef2a1034e9f8d111907e4fceb3a4ca2e7e69Ben Gruver                startLocal.getCodeAddress(),
699c60ef2a1034e9f8d111907e4fceb3a4ca2e7e69Ben Gruver                startLocal.getRegister(),
709c60ef2a1034e9f8d111907e4fceb3a4ca2e7e69Ben Gruver                startLocal.getName(),
71987ac1ed12be414a9d6594d80913490b387e8eeeBen Gruver                startLocal.getType(),
729c60ef2a1034e9f8d111907e4fceb3a4ca2e7e69Ben Gruver                startLocal.getSignature());
739c60ef2a1034e9f8d111907e4fceb3a4ca2e7e69Ben Gruver    }
749c60ef2a1034e9f8d111907e4fceb3a4ca2e7e69Ben Gruver
759c60ef2a1034e9f8d111907e4fceb3a4ca2e7e69Ben Gruver    @Override public int getRegister() { return register; }
769bbcaae91fffe74cbc90608eaa98484192b11d77Ben Gruver
779bbcaae91fffe74cbc90608eaa98484192b11d77Ben Gruver    @Nullable @Override public StringReference getNameReference() {
789bbcaae91fffe74cbc90608eaa98484192b11d77Ben Gruver        return name==null?null:new BaseStringReference() {
799bbcaae91fffe74cbc90608eaa98484192b11d77Ben Gruver            @Nonnull @Override public String getString() {
809bbcaae91fffe74cbc90608eaa98484192b11d77Ben Gruver                return name;
819bbcaae91fffe74cbc90608eaa98484192b11d77Ben Gruver            }
829bbcaae91fffe74cbc90608eaa98484192b11d77Ben Gruver        };
839bbcaae91fffe74cbc90608eaa98484192b11d77Ben Gruver    }
849bbcaae91fffe74cbc90608eaa98484192b11d77Ben Gruver
859bbcaae91fffe74cbc90608eaa98484192b11d77Ben Gruver    @Nullable @Override public TypeReference getTypeReference() {
869bbcaae91fffe74cbc90608eaa98484192b11d77Ben Gruver        return type==null?null:new BaseTypeReference() {
879bbcaae91fffe74cbc90608eaa98484192b11d77Ben Gruver            @Nonnull @Override public String getType() {
889bbcaae91fffe74cbc90608eaa98484192b11d77Ben Gruver                return type;
899bbcaae91fffe74cbc90608eaa98484192b11d77Ben Gruver            }
909bbcaae91fffe74cbc90608eaa98484192b11d77Ben Gruver        };
919bbcaae91fffe74cbc90608eaa98484192b11d77Ben Gruver    }
929bbcaae91fffe74cbc90608eaa98484192b11d77Ben Gruver
939bbcaae91fffe74cbc90608eaa98484192b11d77Ben Gruver    @Nullable @Override public StringReference getSignatureReference() {
949bbcaae91fffe74cbc90608eaa98484192b11d77Ben Gruver        return signature==null?null:new BaseStringReference() {
959bbcaae91fffe74cbc90608eaa98484192b11d77Ben Gruver            @Nonnull @Override public String getString() {
969bbcaae91fffe74cbc90608eaa98484192b11d77Ben Gruver                return signature;
979bbcaae91fffe74cbc90608eaa98484192b11d77Ben Gruver            }
989bbcaae91fffe74cbc90608eaa98484192b11d77Ben Gruver        };
999bbcaae91fffe74cbc90608eaa98484192b11d77Ben Gruver    }
1009bbcaae91fffe74cbc90608eaa98484192b11d77Ben Gruver
1019c60ef2a1034e9f8d111907e4fceb3a4ca2e7e69Ben Gruver    @Nullable @Override public String getName() { return name; }
1029c60ef2a1034e9f8d111907e4fceb3a4ca2e7e69Ben Gruver    @Nullable @Override public String getType() { return type; }
1039c60ef2a1034e9f8d111907e4fceb3a4ca2e7e69Ben Gruver    @Nullable @Override public String getSignature() { return signature; }
1049c60ef2a1034e9f8d111907e4fceb3a4ca2e7e69Ben Gruver
1059c60ef2a1034e9f8d111907e4fceb3a4ca2e7e69Ben Gruver    @Override public int getDebugItemType() { return DebugItemType.START_LOCAL; }
1069c60ef2a1034e9f8d111907e4fceb3a4ca2e7e69Ben Gruver}
107