src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/ir/VarNode.java

Print this page




  28 import jdk.nashorn.internal.ir.annotations.Immutable;
  29 import jdk.nashorn.internal.ir.visitor.NodeVisitor;
  30 import jdk.nashorn.internal.parser.Token;
  31 
  32 /**
  33  * Node represents a var/let declaration.
  34  */
  35 @Immutable
  36 public final class VarNode extends Statement implements Assignment<IdentNode> {
  37     private static final long serialVersionUID = 1L;
  38 
  39     /** Var name. */
  40     private final IdentNode name;
  41 
  42     /** Initialization expression. */
  43     private final Expression init;
  44 
  45     /** Is this a var statement (as opposed to a "var" in a for loop statement) */
  46     private final int flags;
  47 







  48     /** Flag for ES6 LET declaration */
  49     public static final int IS_LET                       = 1 << 0;
  50 
  51     /** Flag for ES6 CONST declaration */
  52     public static final int IS_CONST                     = 1 << 1;
  53 
  54     /** Flag that determines if this is the last function declaration in a function
  55      *  This is used to micro optimize the placement of return value assignments for
  56      *  a program node */
  57     public static final int IS_LAST_FUNCTION_DECLARATION = 1 << 2;
  58 
  59     /**
  60      * Constructor
  61      *
  62      * @param lineNumber line number
  63      * @param token      token
  64      * @param finish     finish
  65      * @param name       name of variable
  66      * @param init       init node or null if just a declaration
  67      */
  68     public VarNode(final int lineNumber, final long token, final int finish, final IdentNode name, final Expression init) {
  69         this(lineNumber, token, finish, name, init, 0);
  70     }
  71 
  72     private VarNode(final VarNode varNode, final IdentNode name, final Expression init, final int flags) {
  73         super(varNode);

  74         this.name = init == null ? name : name.setIsInitializedHere();
  75         this.init = init;
  76         this.flags = flags;
  77     }
  78 
  79     /**
  80      * Constructor
  81      *
  82      * @param lineNumber line number
  83      * @param token      token
  84      * @param finish     finish
  85      * @param name       name of variable
  86      * @param init       init node or null if just a declaration
  87      * @param flags      flags
  88      */
  89     public VarNode(final int lineNumber, final long token, final int finish, final IdentNode name, final Expression init, final int flags) {
  90         super(lineNumber, token, finish);

  91 














  92         this.name  = init == null ? name : name.setIsInitializedHere();
  93         this.init  = init;
  94         this.flags = flags;





  95     }
  96 
  97     @Override
  98     public boolean isAssignment() {
  99         return hasInit();
 100     }
 101 
 102     @Override
 103     public IdentNode getAssignmentDest() {
 104         return isAssignment() ? name : null;
 105     }
 106 
 107     @Override
 108     public VarNode setAssignmentDest(final IdentNode n) {
 109         return setName(n);
 110     }
 111 
 112     @Override
 113     public Expression getAssignmentSource() {
 114         return isAssignment() ? getInit() : null;




  28 import jdk.nashorn.internal.ir.annotations.Immutable;
  29 import jdk.nashorn.internal.ir.visitor.NodeVisitor;
  30 import jdk.nashorn.internal.parser.Token;
  31 
  32 /**
  33  * Node represents a var/let declaration.
  34  */
  35 @Immutable
  36 public final class VarNode extends Statement implements Assignment<IdentNode> {
  37     private static final long serialVersionUID = 1L;
  38 
  39     /** Var name. */
  40     private final IdentNode name;
  41 
  42     /** Initialization expression. */
  43     private final Expression init;
  44 
  45     /** Is this a var statement (as opposed to a "var" in a for loop statement) */
  46     private final int flags;
  47 
  48     /**
  49      * source order id to be used for this node. If this is -1, then we
  50      * the default which is start position of this node. See also the
  51      * method Node::getSourceOrder.
  52      */
  53     private final int sourceOrder;
  54 
  55     /** Flag for ES6 LET declaration */
  56     public static final int IS_LET                       = 1 << 0;
  57 
  58     /** Flag for ES6 CONST declaration */
  59     public static final int IS_CONST                     = 1 << 1;
  60 
  61     /** Flag that determines if this is the last function declaration in a function
  62      *  This is used to micro optimize the placement of return value assignments for
  63      *  a program node */
  64     public static final int IS_LAST_FUNCTION_DECLARATION = 1 << 2;
  65 
  66     /**
  67      * Constructor
  68      *
  69      * @param lineNumber line number
  70      * @param token      token
  71      * @param finish     finish
  72      * @param name       name of variable
  73      * @param init       init node or null if just a declaration
  74      */
  75     public VarNode(final int lineNumber, final long token, final int finish, final IdentNode name, final Expression init) {
  76         this(lineNumber, token, finish, name, init, 0);
  77     }
  78 
  79     private VarNode(final VarNode varNode, final IdentNode name, final Expression init, final int flags) {
  80         super(varNode);
  81         this.sourceOrder = -1;
  82         this.name = init == null ? name : name.setIsInitializedHere();
  83         this.init = init;
  84         this.flags = flags;
  85     }
  86 
  87     /**
  88      * Constructor
  89      *
  90      * @param lineNumber  line number
  91      * @param token       token
  92      * @param finish      finish
  93      * @param name        name of variable
  94      * @param init        init node or null if just a declaration
  95      * @param flags       flags
  96      */
  97     public VarNode(final int lineNumber, final long token, final int finish, final IdentNode name, final Expression init, final int flags) {
  98         this(lineNumber, token, -1, finish, name, init, flags);
  99     }
 100 
 101     /**
 102      * Constructor
 103      *
 104      * @param lineNumber  line number
 105      * @param token       token
 106      * @param sourceOrder source order
 107      * @param finish      finish
 108      * @param name        name of variable
 109      * @param init        init node or null if just a declaration
 110      * @param flags       flags
 111      */
 112     public VarNode(final int lineNumber, final long token, final int sourceOrder, final int finish, final IdentNode name, final Expression init, final int flags) {
 113         super(lineNumber, token, finish);
 114         this.sourceOrder = sourceOrder;
 115         this.name  = init == null ? name : name.setIsInitializedHere();
 116         this.init  = init;
 117         this.flags = flags;
 118     }
 119 
 120     @Override
 121     public int getSourceOrder() {
 122         return sourceOrder == -1? super.getSourceOrder() : sourceOrder;
 123     }
 124 
 125     @Override
 126     public boolean isAssignment() {
 127         return hasInit();
 128     }
 129 
 130     @Override
 131     public IdentNode getAssignmentDest() {
 132         return isAssignment() ? name : null;
 133     }
 134 
 135     @Override
 136     public VarNode setAssignmentDest(final IdentNode n) {
 137         return setName(n);
 138     }
 139 
 140     @Override
 141     public Expression getAssignmentSource() {
 142         return isAssignment() ? getInit() : null;