diff truffle/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/access/SLWritePropertyNode.java @ 22415:c1f804ce6cad

Extend interop functionality for SL
author Matthias Grimmer <grimmer@ssw.jku.at>
date Mon, 23 Nov 2015 16:30:16 +0100
parents dc83cc1f94f2
children b272920e26b2
line wrap: on
line diff
--- a/truffle/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/access/SLWritePropertyNode.java	Wed Nov 18 12:49:12 2015 +0100
+++ b/truffle/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/access/SLWritePropertyNode.java	Mon Nov 23 16:30:16 2015 +0100
@@ -41,8 +41,16 @@
 package com.oracle.truffle.sl.nodes.access;
 
 import com.oracle.truffle.api.CompilerDirectives;
+import com.oracle.truffle.api.dsl.NodeChild;
+import com.oracle.truffle.api.dsl.NodeChildren;
+import com.oracle.truffle.api.dsl.Specialization;
 import com.oracle.truffle.api.frame.VirtualFrame;
+import com.oracle.truffle.api.interop.ForeignAccess;
+import com.oracle.truffle.api.interop.Message;
+import com.oracle.truffle.api.interop.TruffleObject;
+import com.oracle.truffle.api.nodes.Node;
 import com.oracle.truffle.api.nodes.NodeInfo;
+import com.oracle.truffle.api.object.DynamicObject;
 import com.oracle.truffle.api.source.SourceSection;
 import com.oracle.truffle.api.utilities.ConditionProfile;
 import com.oracle.truffle.sl.SLException;
@@ -56,11 +64,8 @@
  * value if the property already exists or adds a new property. Finally, it returns the new value.
  */
 @NodeInfo(shortName = ".=")
-public final class SLWritePropertyNode extends SLExpressionNode {
-
-    public static SLWritePropertyNode create(SourceSection src, SLExpressionNode receiverNode, String propertyName, SLExpressionNode valueNode) {
-        return new SLWritePropertyNode(src, receiverNode, propertyName, valueNode);
-    }
+@NodeChildren({@NodeChild(value = "receiver", type = SLExpressionNode.class), @NodeChild(value = "value", type = SLExpressionNode.class)})
+public abstract class SLWritePropertyNode extends SLExpressionNode {
 
     @Child protected SLExpressionNode receiverNode;
     protected final String propertyName;
@@ -68,18 +73,14 @@
     @Child protected SLWritePropertyCacheNode cacheNode;
     private final ConditionProfile receiverTypeCondition = ConditionProfile.createBinaryProfile();
 
-    private SLWritePropertyNode(SourceSection src, SLExpressionNode receiverNode, String propertyName, SLExpressionNode valueNode) {
+    SLWritePropertyNode(SourceSection src, String propertyName) {
         super(src);
-        this.receiverNode = receiverNode;
         this.propertyName = propertyName;
-        this.valueNode = valueNode;
         this.cacheNode = SLWritePropertyCacheNodeGen.create(propertyName);
     }
 
-    @Override
-    public Object executeGeneric(VirtualFrame frame) {
-        Object value = valueNode.executeGeneric(frame);
-        Object object = receiverNode.executeGeneric(frame);
+    @Specialization(guards = "isSLObject(object)")
+    public Object doSLObject(DynamicObject object, Object value) {
         if (receiverTypeCondition.profile(SLContext.isSLObject(object))) {
             cacheNode.executeObject(SLContext.castSLObject(object), value);
         } else {
@@ -88,4 +89,15 @@
         }
         return value;
     }
+
+    @Child private Node foreignWrite;
+
+    @Specialization
+    public Object doForeignObject(VirtualFrame frame, TruffleObject object, Object value) {
+        if (foreignWrite == null) {
+            CompilerDirectives.transferToInterpreterAndInvalidate();
+            this.foreignWrite = insert(Message.WRITE.createNode());
+        }
+        return ForeignAccess.execute(foreignWrite, frame, object, new Object[]{propertyName, value});
+    }
 }