summaryrefslogtreecommitdiff
path: root/chapter23/src/main/java/com/seaofnodes/simple/Var.java
blob: e13b85c5501d0f7856ee388b5fea4b1bf59d1ba6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
package com.seaofnodes.simple;

import com.seaofnodes.simple.type.*;


/**
 *  The tracked fields are now complex enough to deserve a array-of-structs layout
 */
public class Var {

    public final String _name;   // Declared name
    // These fields are not final for forward reference late updates or
    // promotions.
    public int _idx;             // index in containing scope
    private Type _type;          // Declared type
    public boolean _init;        // Explicit declaration initializer
    public boolean _final;       // Final field
    public boolean _fref;        // Forward ref
    public Parser.Lexer _loc;    // Source location

    public Var(int idx, String name, Type type, boolean xfinal, Parser.Lexer loc ) {
        this(idx,name,type,xfinal,loc,false);
    }
    public Var(int idx, String name, Type type, boolean xfinal, Parser.Lexer loc, boolean fref) {
        _idx = idx;
        _name = name;
        _type = type;
        _final = xfinal;
        _fref = fref;
        _loc = loc;
    }
    // Raw declared type, without resolving a forward reference while printing.
    public Type _type() { return _type; }
    public Type type() {
        if( !_type.isFRef() ) return _type;
        // Update self to no longer use the forward ref type
        Type def = Parser.TYPES.get(((TypeMemPtr)_type)._obj._name);
        return (_type=_type.meet(def));
    }

    // Forward reference variables (not types) must be BOTTOM and
    // distinct from inferred variables
    public boolean isFRef() { return _fref; }

    public void defFRef( Type type, boolean xfinal, Parser.Lexer loc ) {
        assert isFRef() && xfinal;
        _type = type;
        _final = true;
        _fref = false;
        _loc = loc;
    }

    @Override public String toString() {
        return _type.toString()+(_final ? " ": " !")+_name;
    }
}