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 Modifier and Type Class Description static class
Shape.Allocator
static interface
Shape.Pred<T>
Represents a predicate (boolean-valued function) of one argument.
-
Constructor Summary
Constructors Constructor Description Shape()
-
Method Summary
All Methods Instance Methods Abstract Methods Concrete Methods Modifier and Type Method Description <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 anShape.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 aDynamicObjectFactory
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()
AnIterable
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 newDynamicObject
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)
-
-
-
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()
AnIterable
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 anShape.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 newDynamicObject
instance with this shape.
-
createFactory
public abstract DynamicObjectFactory createFactory()
Create aDynamicObjectFactory
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
-
accept
public <R> R accept(ShapeVisitor<R> visitor)
-
-