예제 #1
0
 protected static List<Property> getObjectProperties(Shape shape) {
   final List<Property> objectProperties = new ArrayList<>();
   // User properties only, ShareInternalFieldsNode do the rest
   for (Property property : shape.getProperties()) {
     if (property.getLocation().canStore(SOME_OBJECT)) {
       objectProperties.add(property);
     }
   }
   return objectProperties;
 }
예제 #2
0
 private void setSlowCase(DynamicObject store, Object value) {
   Shape oldShape = store.getShape();
   Shape newShape = oldShape.defineProperty(getKey(), value, getFlags());
   if (store.updateShape()) {
     oldShape = store.getShape();
   }
   assert newShape.isValid() && oldShape.isValid();
   Property newProperty = newShape.getProperty(getKey());
   newProperty.setSafe(store, value, oldShape, newShape);
 }
예제 #3
0
  protected Location getLocation(DynamicObject object, Object value) {
    object.updateShape();
    final Shape oldShape = object.getShape();
    final Property property = oldShape.getProperty(name);

    if (property != null && property.getLocation().canSet(object, value)) {
      return property.getLocation();
    } else {
      return null;
    }
  }
예제 #4
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);
    }
  }
예제 #5
0
  private void setWithShapeSlowCase(
      DynamicObject store, Object value, Shape currentShape, Shape nextShape) {
    Shape oldShape = currentShape;
    if (store.updateShape()) {
      oldShape = store.getShape();
    }
    LayoutStrategy strategy = ((LayoutImpl) currentShape.getLayout()).getStrategy();
    LayoutStrategy.ShapeAndProperty newShapeAndProperty =
        strategy.generalizeProperty(this, value, (ShapeImpl) oldShape, (ShapeImpl) nextShape);
    if (store.updateShape()) {
      oldShape = store.getShape();
    }

    Shape newNextShape = newShapeAndProperty.getShape();
    Property newProperty = newShapeAndProperty.getProperty();

    assert newNextShape.isValid() && oldShape.isValid();
    newProperty.setSafe(store, value, oldShape, newNextShape);
  }
예제 #6
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);
   }
 }
예제 #7
0
  @Override
  public boolean isSame(Property obj) {
    if (this == obj) {
      return true;
    }
    if (obj == null) {
      return false;
    }
    if (getClass() != obj.getClass()) {
      return false;
    }

    PropertyImpl other = (PropertyImpl) obj;
    return key.equals(other.key) && flags == other.flags;
  }
 @Override
 Object execute(DynamicObject receiver, String name, Object value) {
   Property property = receiver.getShape().getProperty(name);
   return receiver.set(property.getKey(), value);
 }