vm/src/main/java/org/apidesign/vm4brwsr/Variable.java
author Lubomir Nerad <lubomir.nerad@oracle.com>
Wed, 12 Dec 2012 11:04:02 +0100
branchregisters
changeset 307 eaf4e8387065
parent 281 f2352e0b713e
child 310 ec7d8bc17725
permissions -rw-r--r--
Type specific local variables
lubomir@281
     1
/**
lubomir@281
     2
 * Back 2 Browser Bytecode Translator
lubomir@281
     3
 * Copyright (C) 2012 Jaroslav Tulach <jaroslav.tulach@apidesign.org>
lubomir@281
     4
 *
lubomir@281
     5
 * This program is free software: you can redistribute it and/or modify
lubomir@281
     6
 * it under the terms of the GNU General Public License as published by
lubomir@281
     7
 * the Free Software Foundation, version 2 of the License.
lubomir@281
     8
 *
lubomir@281
     9
 * This program is distributed in the hope that it will be useful,
lubomir@281
    10
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
lubomir@281
    11
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
lubomir@281
    12
 * GNU General Public License for more details.
lubomir@281
    13
 *
lubomir@281
    14
 * You should have received a copy of the GNU General Public License
lubomir@281
    15
 * along with this program. Look for COPYING file in the top folder.
lubomir@281
    16
 * If not, see http://opensource.org/licenses/GPL-2.0.
lubomir@281
    17
 */
lubomir@281
    18
package org.apidesign.vm4brwsr;
lubomir@281
    19
lubomir@281
    20
public final class Variable implements CharSequence {
lubomir@281
    21
    private static final String STACK_VAR_PREFIX = "st";
lubomir@307
    22
    private static final String LOCAL_VAR_PREFIX = "lc";
lubomir@281
    23
lubomir@281
    24
    private final String name;
lubomir@281
    25
    private final int type;
lubomir@281
    26
    private final int index;
lubomir@281
    27
lubomir@281
    28
    private static final char[] TYPE_IDS = { 'I', 'L', 'F', 'D', 'A' };
lubomir@281
    29
lubomir@281
    30
    private Variable(final String prefix, final int type, final int index) {
lubomir@281
    31
        this.name = prefix + TYPE_IDS[type] + index;
lubomir@281
    32
        this.type = type;
lubomir@281
    33
        this.index = index;
lubomir@281
    34
    }
lubomir@281
    35
lubomir@281
    36
    public static Variable getStackVariable(
lubomir@281
    37
            final int type, final int index) {
lubomir@281
    38
        // TODO: precreate frequently used variables
lubomir@281
    39
        return new Variable(STACK_VAR_PREFIX, type, index);
lubomir@281
    40
    }
lubomir@281
    41
lubomir@307
    42
    public static Variable getLocalVariable(
lubomir@307
    43
            final int type, final int index) {
lubomir@307
    44
        // TODO: precreate frequently used variables
lubomir@307
    45
        return new Variable(LOCAL_VAR_PREFIX, type, index);
lubomir@307
    46
    }
lubomir@307
    47
lubomir@281
    48
    public String getName() {
lubomir@281
    49
        return name;
lubomir@281
    50
    }
lubomir@281
    51
lubomir@281
    52
    public int getType() {
lubomir@281
    53
        return type;
lubomir@281
    54
    }
lubomir@281
    55
lubomir@281
    56
    public int getIndex() {
lubomir@281
    57
        return index;
lubomir@281
    58
    }
lubomir@281
    59
lubomir@281
    60
    public boolean isCategory2() {
lubomir@307
    61
        return VarType.isCategory2(type);
lubomir@281
    62
    }
lubomir@281
    63
lubomir@281
    64
    @Override
lubomir@281
    65
    public int length() {
lubomir@281
    66
        return name.length();
lubomir@281
    67
    }
lubomir@281
    68
lubomir@281
    69
    @Override
lubomir@281
    70
    public char charAt(final int index) {
lubomir@281
    71
        return name.charAt(index);
lubomir@281
    72
    }
lubomir@281
    73
lubomir@281
    74
    @Override
lubomir@281
    75
    public CharSequence subSequence(final int start, final int end) {
lubomir@281
    76
        return name.subSequence(start, end);
lubomir@281
    77
    }
lubomir@281
    78
lubomir@281
    79
    @Override
lubomir@281
    80
    public int hashCode() {
lubomir@281
    81
        return name.hashCode();
lubomir@281
    82
    }
lubomir@281
    83
lubomir@281
    84
    @Override
lubomir@281
    85
    public boolean equals(final Object other) {
lubomir@281
    86
        if (this == other) {
lubomir@281
    87
            return true;
lubomir@281
    88
        }
lubomir@281
    89
        if (!(other instanceof Variable)) {
lubomir@281
    90
            return false;
lubomir@281
    91
        }
lubomir@281
    92
lubomir@281
    93
        return name.equals(((Variable) other).name);
lubomir@281
    94
    }
lubomir@281
    95
lubomir@281
    96
    @Override
lubomir@281
    97
    public String toString() {
lubomir@281
    98
        return name;
lubomir@281
    99
    }
lubomir@281
   100
}