diff graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/access/SLReadPropertyNode.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 73211b2c7c7a
line wrap: on
line diff
--- a/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/access/SLReadPropertyNode.java	Tue Nov 18 23:02:58 2014 +0100
+++ b/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/access/SLReadPropertyNode.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 accessing a property of an object. When executed, this node first evaluates the
@@ -43,18 +43,21 @@
 
     @Child protected SLExpressionNode receiverNode;
     protected final String propertyName;
+    @Child protected SLReadPropertyCacheNode cacheNode;
+    private final ConditionProfile receiverTypeCondition = ConditionProfile.createBinaryProfile();
 
     private SLReadPropertyNode(SourceSection src, SLExpressionNode receiverNode, String propertyName) {
         super(src);
         this.receiverNode = receiverNode;
         this.propertyName = propertyName;
+        this.cacheNode = SLReadPropertyCacheNode.create(propertyName);
     }
 
     @Override
     public Object executeGeneric(VirtualFrame frame) {
         Object object = receiverNode.executeGeneric(frame);
-        if (object instanceof Map) {
-            return ((Map<?, ?>) object).get(propertyName);
+        if (receiverTypeCondition.profile(SLContext.isSLObject(object))) {
+            return cacheNode.executeObject(SLContext.castSLObject(object));
         } else {
             throw new SLException("unexpected receiver type");
         }