changeset 21900:cb051c368c80

Truffle: move property notification hook to shared data, and call it on remove as well
author Andreas Woess <andreas.woess@oracle.com>
date Wed, 10 Jun 2015 20:05:52 +0200
parents 4663ad4f9fbf
children 19340125f182
files graal/com.oracle.truffle.api.object/src/com/oracle/truffle/api/object/ObjectType.java graal/com.oracle.truffle.api.object/src/com/oracle/truffle/api/object/ShapeListener.java graal/com.oracle.truffle.object/src/com/oracle/truffle/object/ShapeImpl.java
diffstat 3 files changed, 44 insertions(+), 13 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.truffle.api.object/src/com/oracle/truffle/api/object/ObjectType.java	Wed Jun 10 16:18:22 2015 +0200
+++ b/graal/com.oracle.truffle.api.object/src/com/oracle/truffle/api/object/ObjectType.java	Wed Jun 10 20:05:52 2015 +0200
@@ -61,16 +61,6 @@
         return null;
     }
 
-    /**
-     * Called when a new property is added to a shape.
-     *
-     * @param property the added property
-     * @param shapeBefore shape before the property was added
-     * @param shapeAfter shape after the property was added
-     */
-    public void onPropertyAdded(Property property, Shape shapeBefore, Shape shapeAfter) {
-    }
-
     public ForeignAccess getForeignAccessFactory() {
         return ForeignAccess.create(new com.oracle.truffle.api.interop.ForeignAccess.Factory() {
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graal/com.oracle.truffle.api.object/src/com/oracle/truffle/api/object/ShapeListener.java	Wed Jun 10 20:05:52 2015 +0200
@@ -0,0 +1,34 @@
+/*
+ * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package com.oracle.truffle.api.object;
+
+public interface ShapeListener {
+    /**
+     * Called when a property is added, removed, or replaced.
+     *
+     * @param key identifier of the property
+     */
+    void onPropertyTransition(Object key);
+}
--- a/graal/com.oracle.truffle.object/src/com/oracle/truffle/object/ShapeImpl.java	Wed Jun 10 16:18:22 2015 +0200
+++ b/graal/com.oracle.truffle.object/src/com/oracle/truffle/object/ShapeImpl.java	Wed Jun 10 20:05:52 2015 +0200
@@ -332,9 +332,14 @@
     @Override
     public ShapeImpl addProperty(Property property) {
         assert isValid();
-        ShapeImpl nextShape = addPropertyInternal(property);
-        objectType.onPropertyAdded(property, this, nextShape);
-        return nextShape;
+        onPropertyTransition(property);
+        return addPropertyInternal(property);
+    }
+
+    protected final void onPropertyTransition(Property property) {
+        if (sharedData instanceof ShapeListener) {
+            ((ShapeListener) sharedData).onPropertyTransition(property.getKey());
+        }
     }
 
     /**
@@ -627,6 +632,8 @@
     @TruffleBoundary
     @Override
     public final ShapeImpl removeProperty(Property prop) {
+        onPropertyTransition(prop);
+
         RemovePropertyTransition transition = new RemovePropertyTransition(prop);
         ShapeImpl cachedShape = queryTransition(transition);
         if (cachedShape != null) {