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());