summaryrefslogtreecommitdiff
path: root/src/main/java/com/seaofnodes/simple/node/ProjNode.java
blob: 4b29cc3c6a02543c16f4773fd2a569ba46b34e2f (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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
package com.seaofnodes.simple.node;

import com.seaofnodes.print.ExprPrinter;

import com.seaofnodes.simple.codegen.Serialize;
import com.seaofnodes.simple.type.Type;
import com.seaofnodes.simple.type.TypeMem;
import com.seaofnodes.simple.type.TypeTuple;
import com.seaofnodes.simple.util.BAOS;
import java.util.HashMap;
import java.util.IdentityHashMap;

public class ProjNode extends Node implements Proj {

    // Which slice of the incoming multipart value
    public final int _idx;

    // Debugging label
    public final String _label;

    public ProjNode(Node ctrl, int idx, String label) {
        super(new Node[]{ctrl});
        _idx = idx;
        _label = label;
    }
    public ProjNode(ProjNode p) { super(p); _idx = p._idx; _label = p._label; }
    @Override public Tag serialTag() { return Tag.Proj; }
    @Override public void packed( BAOS baos, HashMap<String,Integer> strs, HashMap<Type,Integer> types, IdentityHashMap<Node, Integer> anodes ) {
        baos.packed1(_idx);
        baos.packed2(_label==null ? 0 : strs.get(_label));
    }
    static Node make( BAOS bais, String[] strs )  {
        return new ProjNode(null, bais.packed1(), strs[bais.packed2()] );
    }

    @Override public String label() { return _label; }

    @Override
    protected ExprPrinter<Node> _print1(ExprPrinter<Node> p) {
        if( _label != null )  return p.p(_label);
        if( in(0) instanceof CallEndNode cend && cend.call()!=null )
            return p.n(cend.call());
        return p.p("LONELY PROJ");
    }

    @Override public CFGNode cfg0() {
        return in(0) instanceof CFGNode cfg ? cfg : in(0).cfg0();
    }

    @Override public boolean isMem() { return _type instanceof TypeMem; }

    @Override
    public Type compute() {
        Type t = in(0)._type;
        return t instanceof TypeTuple tt ? tt._types[_idx] : t.oob();
    }

    @Override public Node idealize() { return ((MultiNode)in(0)).pcopy(_idx); }

    @Override
    public boolean eq( Node n ) { return _idx == ((ProjNode)n)._idx; }

    @Override
    int hash() { return _idx; }

    @Override public int idx() { return _idx; }

    @Override public void gather( HashMap<String,Integer> strs ) {
        Serialize.gather(strs,_label);
    }
}