Package com.oracle.truffle.api.object

## Class Shape

- java.lang.Object
- - com.oracle.truffle.api.object.Shape

Direct Known Subclasses:
  `ShapeImpl`

    public abstract class Shape
    extends java.lang.Object

Shape objects create a mapping of Property objects to Locations. Shapes are immutable; adding or deleting a property yields a new Shape which links to the old one. This allows inline caching to simply check the identity of an object's Shape to determine if the cache is valid. There is one exception to this immutability, the transition map, but that is used simply to assure that an identical series of property additions and deletions will yield the same Shape object.

See Also:
  `DynamicObject`, `Property`, `Location`

### Nested Class Summary

Nested Classes
`static class` `Shape.Allocator`
`static interface` `Shape.Pred<T>` Represents a predicate (boolean-valued function) of one argument.

### Constructor Summary

Constructors
`Shape()`

### Method Summary

All Methods Instance Methods Abstract Methods Concrete Methods
`<R> R` `accept​(ShapeVisitor<R> visitor)`
`abstract Shape` `addProperty​(Property property)` Add a new property in the map, yielding a new or cached Shape object.
`abstract Shape.Allocator` `allocator()` Obtain an `Shape.Allocator` instance for the purpose of allocating locations.
`abstract Shape` `append​(Property oldProperty)` Append the property, relocating it to the next allocated location.
`abstract Shape` `changeType​(ObjectType newOps)` Change the shape's type, yielding a new shape.
`abstract boolean` `check​(DynamicObject subject)` Check whether this shape is identical to the given shape.
`abstract Shape` `copyOverPropertiesInternal​(Shape destination)` For copying over properties after exchanging the prototype of an object.
`abstract DynamicObjectFactory` `createFactory()` Create a `DynamicObjectFactory` for creating instances of this shape.
`abstract Shape` `createSeparateShape​(java.lang.Object sharedData)` Clone off a separate shape with new shared data.
`abstract java.lang.Object` `getData()` Get the shape's custom data.
`abstract int` `getId()`
`abstract java.util.List<java.lang.Object>` `getKeyList()` Get a list of all property keys in insertion order.
`abstract java.util.List<java.lang.Object>` `getKeyList​(Shape.Pred<Property> filter)` Get a filtered list of property keys in insertion order.
`abstract java.lang.Iterable<java.lang.Object>` `getKeys()` Get all property keys in insertion order.
`abstract Property` `getLastProperty()` Get the last added property.
`abstract Layout` `getLayout()` Get the shape's layout.
`abstract Assumption` `getLeafAssumption()` Get an assumption that the shape is a leaf.
`abstract java.lang.Object` `getMutex()` Get mutex object shared by related shapes, i.e.
`abstract int` `getObjectArrayCapacity()`
`abstract int` `getObjectArraySize()`
`abstract int` `getObjectFieldSize()`
`abstract ObjectType` `getObjectType()` Get the shape's operations.
`abstract Shape` `getParent()`
`abstract int` `getPrimitiveArrayCapacity()`
`abstract int` `getPrimitiveArraySize()`
`abstract int` `getPrimitiveFieldSize()`
`abstract java.lang.Iterable<Property>` `getProperties()` An `Iterable` over the shape's properties in insertion order.
`abstract Property` `getProperty​(java.lang.Object key)` Get a property entry by key.
`abstract int` `getPropertyCount()` Get number of properties in this shape.
`abstract java.util.List<Property>` `getPropertyList()` Get a list of all properties that this Shape stores.
`abstract java.util.List<Property>` `getPropertyList​(Shape.Pred<Property> filter)` Get a list of properties that this Shape stores.
`abstract java.util.List<Property>` `getPropertyListInternal​(boolean ascending)` Returns all (also hidden) property objects in this shape.
`abstract Shape` `getRoot()` Get the root shape.
`abstract java.lang.Object` `getSharedData()` Get the shape's shared data.
`abstract Assumption` `getValidAssumption()` Get an assumption that the shape is valid.
`abstract boolean` `hasPrimitiveArray()`
`abstract boolean` `hasProperty​(java.lang.Object key)` Check whether the shape has a property with the given key.
`abstract boolean` `hasTransitionWithKey​(java.lang.Object key)` Query whether the shape has a transition with the given key.
`abstract boolean` `isLeaf()` Check whether this shape is a leaf in the transition graph, i.e.
`abstract boolean` `isRelated​(Shape other)` Are these two shapes related, i.e.
`abstract boolean` `isValid()` Check whether this shape is valid.
`abstract DynamicObject` `newInstance()` Create a new `DynamicObject` instance with this shape.
`abstract Shape` `removeProperty​(Property property)` Remove the given property from the shape.
`abstract Shape` `replaceProperty​(Property oldProperty, Property newProperty)` Replace a property in the shape.
`abstract Shape` `reservePrimitiveExtensionArray()` Reserve the primitive extension array field.
`abstract Shape` `tryMerge​(Shape other)`

### Methods inherited from class java.lang.Object

`clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

### Constructor Detail

#### Shape

    public Shape()

### Method Detail

#### getProperty

    public abstract Property getProperty​(java.lang.Object key)

Get a property entry by key.

Parameters:
  `key` - the identifier to look up
Returns:
  a Property object, or null if not found

#### addProperty

    public abstract Shape addProperty​(Property property)

Add a new property in the map, yielding a new or cached Shape object.

Parameters:
  `property` - the property to add
Returns:
  the new Shape

#### getProperties

    public abstract java.lang.Iterable<Property> getProperties()

An `Iterable` over the shape's properties in insertion order.

#### getPropertyList

    public abstract java.util.List<Property> getPropertyList​(Shape.Pred<Property> filter)

Get a list of properties that this Shape stores.

Returns:
  list of properties

#### getPropertyList

    public abstract java.util.List<Property> getPropertyList()

Get a list of all properties that this Shape stores.

Returns:
  list of properties

#### getPropertyListInternal

    public abstract java.util.List<Property> getPropertyListInternal​(boolean ascending)

Returns all (also hidden) property objects in this shape.

Parameters:
  `ascending` - desired order (`true` for insertion order, `false` for reverse insertion order)

#### getKeyList

    public abstract java.util.List<java.lang.Object> getKeyList​(Shape.Pred<Property> filter)

Get a filtered list of property keys in insertion order.

#### getKeyList

    public abstract java.util.List<java.lang.Object> getKeyList()

Get a list of all property keys in insertion order.

#### getKeys

    public abstract java.lang.Iterable<java.lang.Object> getKeys()

Get all property keys in insertion order.

#### getValidAssumption

    public abstract Assumption getValidAssumption()

Get an assumption that the shape is valid.

#### isValid

    public abstract boolean isValid()

Check whether this shape is valid.

#### getLeafAssumption

    public abstract Assumption getLeafAssumption()

Get an assumption that the shape is a leaf.

#### isLeaf

    public abstract boolean isLeaf()

Check whether this shape is a leaf in the transition graph, i.e. transitionless.

#### getParent

    public abstract Shape getParent()

Returns:
  the parent shape or `null` if none.

#### hasProperty

    public abstract boolean hasProperty​(java.lang.Object key)

Check whether the shape has a property with the given key.

#### removeProperty

    public abstract Shape removeProperty​(Property property)

Remove the given property from the shape.

#### replaceProperty

    public abstract Shape replaceProperty​(Property oldProperty,
                                          Property newProperty)

Replace a property in the shape.

#### getLastProperty

    public abstract Property getLastProperty()

Get the last added property.

#### getId

    public abstract int getId()

#### append

    public abstract Shape append​(Property oldProperty)

Append the property, relocating it to the next allocated location.

#### allocator

    public abstract Shape.Allocator allocator()

Obtain an `Shape.Allocator` instance for the purpose of allocating locations.

#### copyOverPropertiesInternal

    public abstract Shape copyOverPropertiesInternal​(Shape destination)

For copying over properties after exchanging the prototype of an object.

#### getPropertyCount

    public abstract int getPropertyCount()

Get number of properties in this shape.

#### getObjectType

    public abstract ObjectType getObjectType()

Get the shape's operations.

#### getRoot

    public abstract Shape getRoot()

Get the root shape.

#### check

    public abstract boolean check​(DynamicObject subject)

Check whether this shape is identical to the given shape.

#### getLayout

    public abstract Layout getLayout()

Get the shape's layout.

#### getData

    public abstract java.lang.Object getData()

Get the shape's custom data.

#### getSharedData

    public abstract java.lang.Object getSharedData()

Get the shape's shared data.

#### hasTransitionWithKey

    public abstract boolean hasTransitionWithKey​(java.lang.Object key)

Query whether the shape has a transition with the given key.

#### createSeparateShape

    public abstract Shape createSeparateShape​(java.lang.Object sharedData)

Clone off a separate shape with new shared data.

#### changeType

    public abstract Shape changeType​(ObjectType newOps)

Change the shape's type, yielding a new shape.

#### reservePrimitiveExtensionArray

    public abstract Shape reservePrimitiveExtensionArray()

Reserve the primitive extension array field.

#### newInstance

    public abstract DynamicObject newInstance()

Create a new `DynamicObject` instance with this shape.

#### createFactory

    public abstract DynamicObjectFactory createFactory()

Create a `DynamicObjectFactory` for creating instances of this shape.

#### getMutex

    public abstract java.lang.Object getMutex()

Get mutex object shared by related shapes, i.e. shapes with a common root.

#### getObjectArraySize

    public abstract int getObjectArraySize()

#### getObjectFieldSize

    public abstract int getObjectFieldSize()

#### getPrimitiveArraySize

    public abstract int getPrimitiveArraySize()

#### getPrimitiveFieldSize

    public abstract int getPrimitiveFieldSize()

#### getObjectArrayCapacity

    public abstract int getObjectArrayCapacity()

#### getPrimitiveArrayCapacity

    public abstract int getPrimitiveArrayCapacity()

#### hasPrimitiveArray

    public abstract boolean hasPrimitiveArray()

#### isRelated

    public abstract boolean isRelated​(Shape other)

Are these two shapes related, i.e. do they have the same root?

Parameters:
  `other` - Shape to compare to
Returns:
  true if one shape is an upcast of the other, or the Shapes are equal

#### tryMerge

    public abstract Shape tryMerge​(Shape other)

#### accept

    public <R> R accept​(ShapeVisitor<R> visitor)