vm/src/main/java/org/apidesign/vm4brwsr/Variable.java
author Lubomir Nerad <lubomir.nerad@oracle.com>
Fri, 07 Dec 2012 15:02:35 +0100
branchregisters
changeset 281 f2352e0b713e
child 307 eaf4e8387065
permissions -rw-r--r--
Type specific stack 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
    public static final int TYPE_INT = 0;
lubomir@281
    22
    public static final int TYPE_LONG = 1;
lubomir@281
    23
    public static final int TYPE_FLOAT = 2;
lubomir@281
    24
    public static final int TYPE_DOUBLE = 3;
lubomir@281
    25
    public static final int TYPE_REF = 4;
lubomir@281
    26
lubomir@281
    27
    public static final int LAST_TYPE = TYPE_REF;
lubomir@281
    28
lubomir@281
    29
    private static final String STACK_VAR_PREFIX = "st";
lubomir@281
    30
lubomir@281
    31
    private final String name;
lubomir@281
    32
    private final int type;
lubomir@281
    33
    private final int index;
lubomir@281
    34
lubomir@281
    35
    private static final char[] TYPE_IDS = { 'I', 'L', 'F', 'D', 'A' };
lubomir@281
    36
lubomir@281
    37
    private Variable(final String prefix, final int type, final int index) {
lubomir@281
    38
        this.name = prefix + TYPE_IDS[type] + index;
lubomir@281
    39
        this.type = type;
lubomir@281
    40
        this.index = index;
lubomir@281
    41
    }
lubomir@281
    42
lubomir@281
    43
    public static Variable getStackVariable(
lubomir@281
    44
            final int type, final int index) {
lubomir@281
    45
        // TODO: precreate frequently used variables
lubomir@281
    46
        return new Variable(STACK_VAR_PREFIX, type, index);
lubomir@281
    47
    }
lubomir@281
    48
lubomir@281
    49
    public String getName() {
lubomir@281
    50
        return name;
lubomir@281
    51
    }
lubomir@281
    52
lubomir@281
    53
    public int getType() {
lubomir@281
    54
        return type;
lubomir@281
    55
    }
lubomir@281
    56
lubomir@281
    57
    public int getIndex() {
lubomir@281
    58
        return index;
lubomir@281
    59
    }
lubomir@281
    60
lubomir@281
    61
    public boolean isCategory2() {
lubomir@281
    62
        return (type == TYPE_LONG) || (type == TYPE_DOUBLE);
lubomir@281
    63
    }
lubomir@281
    64
lubomir@281
    65
    @Override
lubomir@281
    66
    public int length() {
lubomir@281
    67
        return name.length();
lubomir@281
    68
    }
lubomir@281
    69
lubomir@281
    70
    @Override
lubomir@281
    71
    public char charAt(final int index) {
lubomir@281
    72
        return name.charAt(index);
lubomir@281
    73
    }
lubomir@281
    74
lubomir@281
    75
    @Override
lubomir@281
    76
    public CharSequence subSequence(final int start, final int end) {
lubomir@281
    77
        return name.subSequence(start, end);
lubomir@281
    78
    }
lubomir@281
    79
lubomir@281
    80
    @Override
lubomir@281
    81
    public int hashCode() {
lubomir@281
    82
        return name.hashCode();
lubomir@281
    83
    }
lubomir@281
    84
lubomir@281
    85
    @Override
lubomir@281
    86
    public boolean equals(final Object other) {
lubomir@281
    87
        if (this == other) {
lubomir@281
    88
            return true;
lubomir@281
    89
        }
lubomir@281
    90
        if (!(other instanceof Variable)) {
lubomir@281
    91
            return false;
lubomir@281
    92
        }
lubomir@281
    93
lubomir@281
    94
        return name.equals(((Variable) other).name);
lubomir@281
    95
    }
lubomir@281
    96
lubomir@281
    97
    @Override
lubomir@281
    98
    public String toString() {
lubomir@281
    99
        return name;
lubomir@281
   100
    }
lubomir@281
   101
}