Class DynamicObject.SetShapeFlagsNode

java.lang.Object
com.oracle.truffle.api.nodes.Node
com.oracle.truffle.api.object.DynamicObject.SetShapeFlagsNode
All Implemented Interfaces:
NodeInterface, Cloneable
Enclosing class:
DynamicObject

public abstract static class DynamicObject.SetShapeFlagsNode extends Node
Sets or updates language-specific object shape flags.
Since:
25.1
See Also:
  • Method Details

    • execute

      public final boolean execute(DynamicObject receiver, int newFlags)
      Sets language-specific object shape flags, changing the object's shape if need be. These flags may be used to tag objects that possess characteristics that need to be queried efficiently on fast and slow paths. For example, they can be used to mark objects as frozen. Only the lowest 16 bits (i.e. values in the range 0 to 65535) are allowed, the remaining bits are currently reserved.

      Usage example:

      Implementing a freeze object operation:

      abstract static class FreezeObjectNode extends Node {
          static final int FROZEN = 1;
      
          abstract void execute(DynamicObject receiver);
      
          @Specialization
          static void freeze(DynamicObject receiver,
                          @Cached DynamicObject.GetShapeFlagsNode getShapeFlagsNode,
                          @Cached DynamicObject.SetShapeFlagsNode setShapeFlagsNode) {
              int oldFlags = getShapeFlagsNode.execute(receiver);
              int newFlags = oldFlags | FROZEN;
              if (newFlags != oldFlags) {
                  setShapeFlagsNode.execute(receiver, newFlags);
              }
          }
      }
      
      Note that executeAdd(DynamicObject, int) is more efficient and convenient for that particular pattern.
      Parameters:
      newFlags - the flags to set; must be in the range from 0 to 65535 (inclusive).
      Returns:
      true if the object's shape changed, false if no change was made.
      Throws:
      IllegalArgumentException - if the flags are not in the allowed range.
      Since:
      25.1
      See Also:
    • executeAdd

      public final boolean executeAdd(DynamicObject receiver, int addedFlags)
      Adds language-specific object shape flags, changing the object's shape if need be.

      Usage example:

      Implementing a freeze object operation:

      abstract static class FreezeNode extends Node {
          static final int FROZEN = 1;
      
          abstract void execute(DynamicObject receiver);
      
          @Specialization
          static void freeze(DynamicObject receiver,
                          @Cached DynamicObject.SetShapeFlagsNode setShapeFlagsNode) {
              setShapeFlagsNode.executeAdd(receiver, FROZEN);
          }
      }
      
      Since:
      25.1
      See Also:
    • executeRemove

      public final boolean executeRemove(DynamicObject receiver, int removedFlags)
      Removes language-specific object shape flags, changing the object's shape if need be.
      Since:
      25.1
      See Also:
    • executeRemoveAndAdd

      public final boolean executeRemoveAndAdd(DynamicObject receiver, int removedFlags, int addedFlags)
      Removes, then adds language-specific object shape flags, changing the object's shape if need be.
      Since:
      25.1
      See Also:
    • create

      public static DynamicObject.SetShapeFlagsNode create()
      Since:
      25.1
    • getUncached

      public static DynamicObject.SetShapeFlagsNode getUncached()
      Since:
      25.1