예제 #1
0
  @TruffleBoundary
  @Specialization
  public void writeUncached(DynamicObject object, Object value) {
    object.updateShape();
    final Shape shape = object.getShape();
    final Property property = shape.getProperty(name);

    if (property == null) {
      object.define(name, value, 0);
    } else {
      property.setGeneric(object, value, shape);
    }
  }
예제 #2
0
 protected Shape transitionWithNewField(Shape oldShape, Object value) {
   // This duplicates quite a bit of DynamicObject.define(), but should be fixed in Truffle soon.
   final Property oldProperty = oldShape.getProperty(name);
   if (oldProperty != null) {
     if (oldProperty.getFlags() == 0 && oldProperty.getLocation().canSet(null, value)) {
       return oldShape; // already the right shape
     } else {
       DynamicObject copy = oldShape.getLayout().newInstance(oldShape);
       copy.define(name, value, 0);
       return copy.getShape();
     }
   } else {
     final Location location =
         oldShape
             .allocator()
             .locationForValue(
                 value, EnumSet.of(LocationModifier.Final, LocationModifier.NonNull));
     final Property newProperty = Property.create(name, location, 0);
     return oldShape.addProperty(newProperty);
   }
 }