Skip to content

Commit acafae7

Browse files
committed
[truffle] Add a partial and slow nqp::bindattr
1 parent 6eecd16 commit acafae7

File tree

2 files changed

+46
-0
lines changed

2 files changed

+46
-0
lines changed

src/vm/jvm/Truffle.nqp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -570,6 +570,8 @@ class QAST::OperationsTruffle {
570570
add_simple_op('create', $OBJ, [$OBJ], :side_effects);
571571
add_simple_op('newtype', $OBJ, [$OBJ, $STR], :side_effects, :decont(0));
572572

573+
add_simple_op('bindattr', $OBJ, [$OBJ, $OBJ, $STR, $OBJ], :side_effects);
574+
573575
add_simple_op('composetype', $OBJ, [$OBJ, $OBJ], :side_effects);
574576
add_simple_op('sethllconfig', $OBJ, [$STR, $OBJ], :side_effects);
575577

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package org.perl6.nqp.truffle.nodes.sixmodel;
2+
import com.oracle.truffle.api.frame.VirtualFrame;
3+
import com.oracle.truffle.api.nodes.NodeInfo;
4+
import org.perl6.nqp.truffle.nodes.NQPNode;
5+
import org.perl6.nqp.truffle.nodes.NQPObjNode;
6+
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
7+
import com.oracle.truffle.api.object.DynamicObject;
8+
import org.perl6.nqp.dsl.Deserializer;
9+
10+
@NodeInfo(shortName = "bindattr")
11+
public final class NQPBindattrNode extends NQPObjNode {
12+
@Child private NQPNode objNode;
13+
@Child private NQPNode classHandleNode;
14+
@Child private NQPNode nameNode;
15+
@Child private NQPNode valueNode;
16+
17+
@Deserializer
18+
public NQPBindattrNode(NQPNode objNode, NQPNode classHandleNode, NQPNode nameNode, NQPNode valueNode) {
19+
this.objNode = objNode;
20+
this.classHandleNode = classHandleNode;
21+
this.nameNode = nameNode;
22+
this.valueNode = valueNode;
23+
}
24+
25+
@TruffleBoundary
26+
public void setAttribute(DynamicObject obj, String name, Object value) {
27+
// TODO - take classHandle into account
28+
if (!(obj.set(name, value))) {
29+
throw new RuntimeException("Can't set attribute");
30+
}
31+
}
32+
33+
@Override
34+
public Object execute(VirtualFrame frame) {
35+
Object obj = objNode.execute(frame);
36+
Object classHandle = classHandleNode.execute(frame);
37+
String name = nameNode.executeStr(frame);
38+
Object value = valueNode.execute(frame);
39+
40+
setAttribute((DynamicObject) obj, name, value);
41+
42+
return value;
43+
}
44+
}

0 commit comments

Comments
 (0)