Mercurial > hg > graal-jvmci-8
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"); }