Mercurial > hg > graal-jvmci-8
comparison graal/com.oracle.truffle.ruby.parser/src/com/oracle/truffle/ruby/parser/Translator.java @ 13735:2c1c805153e6
Ruby: refactor low level instrumentation services
author | Michael Van De Vanter <michael.van.de.vanter@oracle.com> |
---|---|
date | Wed, 22 Jan 2014 21:02:06 -0800 |
parents | fbf448929260 |
children | 22bf5a8ba9eb 3f27e57439ed |
comparison
equal
deleted
inserted
replaced
13734:7bab96d62fa3 | 13735:2c1c805153e6 |
---|---|
20 import com.oracle.truffle.ruby.nodes.call.*; | 20 import com.oracle.truffle.ruby.nodes.call.*; |
21 import com.oracle.truffle.ruby.nodes.cast.*; | 21 import com.oracle.truffle.ruby.nodes.cast.*; |
22 import com.oracle.truffle.ruby.nodes.constants.*; | 22 import com.oracle.truffle.ruby.nodes.constants.*; |
23 import com.oracle.truffle.ruby.nodes.control.*; | 23 import com.oracle.truffle.ruby.nodes.control.*; |
24 import com.oracle.truffle.ruby.nodes.core.*; | 24 import com.oracle.truffle.ruby.nodes.core.*; |
25 import com.oracle.truffle.ruby.nodes.debug.*; | |
26 import com.oracle.truffle.ruby.nodes.literal.*; | 25 import com.oracle.truffle.ruby.nodes.literal.*; |
27 import com.oracle.truffle.ruby.nodes.literal.array.*; | 26 import com.oracle.truffle.ruby.nodes.literal.array.*; |
28 import com.oracle.truffle.ruby.nodes.methods.*; | 27 import com.oracle.truffle.ruby.nodes.methods.*; |
29 import com.oracle.truffle.ruby.nodes.methods.locals.*; | 28 import com.oracle.truffle.ruby.nodes.methods.locals.*; |
30 import com.oracle.truffle.ruby.nodes.objects.*; | 29 import com.oracle.truffle.ruby.nodes.objects.*; |
31 import com.oracle.truffle.ruby.nodes.objects.instancevariables.*; | 30 import com.oracle.truffle.ruby.nodes.objects.instancevariables.*; |
32 import com.oracle.truffle.ruby.nodes.yield.*; | 31 import com.oracle.truffle.ruby.nodes.yield.*; |
33 import com.oracle.truffle.ruby.runtime.*; | 32 import com.oracle.truffle.ruby.runtime.*; |
34 import com.oracle.truffle.ruby.runtime.core.*; | 33 import com.oracle.truffle.ruby.runtime.core.*; |
35 import com.oracle.truffle.ruby.runtime.core.range.*; | 34 import com.oracle.truffle.ruby.runtime.core.range.*; |
36 import com.oracle.truffle.ruby.runtime.debug.*; | |
37 import com.oracle.truffle.ruby.runtime.methods.*; | 35 import com.oracle.truffle.ruby.runtime.methods.*; |
38 | 36 |
39 /** | 37 /** |
40 * A JRuby parser node visitor which translates JRuby AST nodes into our Ruby nodes, implementing a | 38 * A JRuby parser node visitor which translates JRuby AST nodes into our Ruby nodes, implementing a |
41 * Ruby parser. Therefore there is some namespace contention here! We make all references to JRuby | 39 * Ruby parser. Therefore there is some namespace contention here! We make all references to JRuby |
46 protected final Translator parent; | 44 protected final Translator parent; |
47 | 45 |
48 protected final RubyContext context; | 46 protected final RubyContext context; |
49 protected final TranslatorEnvironment environment; | 47 protected final TranslatorEnvironment environment; |
50 protected final Source source; | 48 protected final Source source; |
49 protected final RubyNodeInstrumenter instrumenter; | |
51 | 50 |
52 private boolean translatingForStatement = false; | 51 private boolean translatingForStatement = false; |
53 | 52 |
54 private static final Map<Class, String> nodeDefinedNames = new HashMap<>(); | 53 private static final Map<Class, String> nodeDefinedNames = new HashMap<>(); |
55 | 54 |
95 public Translator(RubyContext context, Translator parent, TranslatorEnvironment environment, Source source) { | 94 public Translator(RubyContext context, Translator parent, TranslatorEnvironment environment, Source source) { |
96 this.context = context; | 95 this.context = context; |
97 this.parent = parent; | 96 this.parent = parent; |
98 this.environment = environment; | 97 this.environment = environment; |
99 this.source = source; | 98 this.source = source; |
99 this.instrumenter = environment.getNodeInstrumenter(); | |
100 } | 100 } |
101 | 101 |
102 @Override | 102 @Override |
103 public Object visitAliasNode(org.jrubyparser.ast.AliasNode node) { | 103 public Object visitAliasNode(org.jrubyparser.ast.AliasNode node) { |
104 final SourceSection sourceSection = translate(node.getPosition()); | 104 final SourceSection sourceSection = translate(node.getPosition()); |
289 | 289 |
290 final ArgumentsAndBlockTranslation argumentsAndBlock = translateArgumentsAndBlock(sourceSection, block, args, extraArgument); | 290 final ArgumentsAndBlockTranslation argumentsAndBlock = translateArgumentsAndBlock(sourceSection, block, args, extraArgument); |
291 | 291 |
292 RubyNode translated = new CallNode(context, sourceSection, node.getName(), receiverTranslated, argumentsAndBlock.getBlock(), argumentsAndBlock.isSplatted(), argumentsAndBlock.getArguments()); | 292 RubyNode translated = new CallNode(context, sourceSection, node.getName(), receiverTranslated, argumentsAndBlock.getBlock(), argumentsAndBlock.isSplatted(), argumentsAndBlock.getArguments()); |
293 | 293 |
294 return translated; | 294 return instrumenter.instrumentAsCall(translated, node.getName()); |
295 } | 295 } |
296 | 296 |
297 protected class ArgumentsAndBlockTranslation { | 297 protected class ArgumentsAndBlockTranslation { |
298 | 298 |
299 private final RubyNode block; | 299 private final RubyNode block; |
1138 rhs = (RubyNode) node.getValue().accept(this); | 1138 rhs = (RubyNode) node.getValue().accept(this); |
1139 } | 1139 } |
1140 | 1140 |
1141 RubyNode translated = ((ReadNode) lhs).makeWriteNode(rhs); | 1141 RubyNode translated = ((ReadNode) lhs).makeWriteNode(rhs); |
1142 | 1142 |
1143 return translated; | 1143 final UniqueMethodIdentifier methodIdentifier = environment.findMethodForLocalVar(node.getName()); |
1144 | |
1145 return instrumenter.instrumentAsLocalAssignment(translated, methodIdentifier, node.getName()); | |
1144 } | 1146 } |
1145 | 1147 |
1146 @Override | 1148 @Override |
1147 public Object visitLocalVarNode(org.jrubyparser.ast.LocalVarNode node) { | 1149 public Object visitLocalVarNode(org.jrubyparser.ast.LocalVarNode node) { |
1148 final SourceSection sourceSection = translate(node.getPosition()); | 1150 final SourceSection sourceSection = translate(node.getPosition()); |
1437 } | 1439 } |
1438 | 1440 |
1439 @Override | 1441 @Override |
1440 public Object visitNewlineNode(org.jrubyparser.ast.NewlineNode node) { | 1442 public Object visitNewlineNode(org.jrubyparser.ast.NewlineNode node) { |
1441 RubyNode translated = (RubyNode) node.getNextNode().accept(this); | 1443 RubyNode translated = (RubyNode) node.getNextNode().accept(this); |
1442 | 1444 return instrumenter.instrumentAsStatement(translated); |
1443 if (context.getConfiguration().getTrace()) { | |
1444 RubyProxyNode proxy; | |
1445 if (translated instanceof RubyProxyNode) { | |
1446 proxy = (RubyProxyNode) translated; | |
1447 } else { | |
1448 proxy = new RubyProxyNode(context, translated); | |
1449 } | |
1450 proxy.getProbeChain().appendProbe(new RubyTraceProbe(context)); | |
1451 | |
1452 translated = proxy; | |
1453 } | |
1454 | |
1455 return translated; | |
1456 } | 1445 } |
1457 | 1446 |
1458 @Override | 1447 @Override |
1459 public Object visitNextNode(org.jrubyparser.ast.NextNode node) { | 1448 public Object visitNextNode(org.jrubyparser.ast.NextNode node) { |
1460 final SourceSection sourceSection = translate(node.getPosition()); | 1449 final SourceSection sourceSection = translate(node.getPosition()); |