Mercurial > hg > truffle
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}); + } }