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 strs, HashMap types, IdentityHashMap 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 _print1(ExprPrinter 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 strs ) { Serialize.gather(strs,_label); } }