diff graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/access/SLWritePropertyNode.java @ 18412:997bc9764a9a

SL: use the truffle object storage model to represent SL objects
author Andreas Woess <andreas.woess@jku.at>
date Tue, 18 Nov 2014 12:08:51 +0100
parents dc2e000bed40
children f7bc60c3a8f6
line wrap: on
line diff
--- a/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/access/SLWritePropertyNode.java	Tue Nov 18 23:02:58 2014 +0100
+++ b/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/access/SLWritePropertyNode.java	Tue Nov 18 12:08:51 2014 +0100
@@ -22,13 +22,13 @@
  */
 package com.oracle.truffle.sl.nodes.access;
 
-import java.util.*;
-
 import com.oracle.truffle.api.frame.*;
 import com.oracle.truffle.api.nodes.*;
 import com.oracle.truffle.api.source.*;
+import com.oracle.truffle.api.utilities.*;
 import com.oracle.truffle.sl.*;
 import com.oracle.truffle.sl.nodes.*;
+import com.oracle.truffle.sl.runtime.*;
 
 /**
  * The node for setting a property of an object. When executed, this node first evaluates the value
@@ -46,21 +46,23 @@
     @Child protected SLExpressionNode receiverNode;
     protected final String propertyName;
     @Child protected SLExpressionNode valueNode;
+    @Child protected SLWritePropertyCacheNode cacheNode;
+    private final ConditionProfile receiverTypeCondition = ConditionProfile.createBinaryProfile();
 
     private SLWritePropertyNode(SourceSection src, SLExpressionNode receiverNode, String propertyName, SLExpressionNode valueNode) {
         super(src);
         this.receiverNode = receiverNode;
         this.propertyName = propertyName;
         this.valueNode = valueNode;
+        this.cacheNode = SLWritePropertyCacheNode.create(propertyName);
     }
 
-    @SuppressWarnings("unchecked")
     @Override
     public Object executeGeneric(VirtualFrame frame) {
         Object value = valueNode.executeGeneric(frame);
         Object object = receiverNode.executeGeneric(frame);
-        if (object instanceof Map) {
-            ((Map<Object, Object>) object).put(propertyName, value);
+        if (receiverTypeCondition.profile(SLContext.isSLObject(object))) {
+            cacheNode.executeObject(SLContext.castSLObject(object), value);
         } else {
             throw new SLException("unexpected receiver type");
         }