OLD | NEW |
| (Empty) |
1 // Copyright (c) 2015, the Dartino project authors. Please see the AUTHORS file | |
2 // for details. All rights reserved. Use of this source code is governed by a | |
3 // BSD-style license that can be found in the LICENSE.md file. | |
4 | |
5 library fletchc.debug_info_function_codegen; | |
6 | |
7 import 'package:compiler/src/elements/elements.dart'; | |
8 import 'package:compiler/src/resolution/tree_elements.dart'; | |
9 import 'package:compiler/src/tree/tree.dart'; | |
10 import 'package:compiler/src/universe/selector.dart'; | |
11 | |
12 import 'package:compiler/src/dart_types.dart' show | |
13 DartType; | |
14 | |
15 import 'package:compiler/src/diagnostics/spannable.dart' show | |
16 Spannable; | |
17 | |
18 import 'bytecode_assembler.dart'; | |
19 import 'closure_environment.dart'; | |
20 import 'codegen_visitor.dart'; | |
21 | |
22 import 'fletch_function_builder.dart' show | |
23 FletchFunctionBuilder; | |
24 | |
25 import 'debug_registry.dart' show | |
26 DebugRegistry; | |
27 | |
28 import 'fletch_context.dart'; | |
29 import 'function_codegen.dart'; | |
30 import 'debug_info.dart'; | |
31 | |
32 class DebugInfoFunctionCodegen extends FunctionCodegen with DebugRegistry { | |
33 final FletchCompilerImplementation compiler; | |
34 final DebugInfo debugInfo; | |
35 | |
36 DebugInfoFunctionCodegen(this.debugInfo, | |
37 FletchFunctionBuilder functionBuilder, | |
38 FletchContext context, | |
39 TreeElements elements, | |
40 ClosureEnvironment closureEnvironment, | |
41 FunctionElement function, | |
42 this.compiler) | |
43 : super(functionBuilder, context, elements, null, | |
44 closureEnvironment, function) { | |
45 if (functionBuilder.isInstanceMember) pushVariableDeclaration(thisValue); | |
46 } | |
47 | |
48 void recordDebugInfo(Node node) { | |
49 debugInfo.addLocation(compiler, assembler.byteSize, node); | |
50 } | |
51 | |
52 void pushVariableDeclaration(LocalValue value) { | |
53 super.pushVariableDeclaration(value); | |
54 debugInfo.pushScope(assembler.byteSize, value); | |
55 } | |
56 | |
57 void popVariableDeclaration(Element element) { | |
58 super.popVariableDeclaration(element); | |
59 debugInfo.popScope(assembler.byteSize); | |
60 } | |
61 | |
62 void callIsSelector( | |
63 Node node, | |
64 DartType type, | |
65 Spannable diagnosticLocation) { | |
66 recordDebugInfo(node); | |
67 super.callIsSelector(node, type, diagnosticLocation); | |
68 } | |
69 | |
70 void invokeMethod(Node node, Selector selector) { | |
71 recordDebugInfo(node); | |
72 super.invokeMethod(node, selector); | |
73 } | |
74 | |
75 void invokeGetter(Node node, Name name) { | |
76 recordDebugInfo(node); | |
77 super.invokeGetter(node, name); | |
78 } | |
79 | |
80 void invokeSetter(Node node, Name name) { | |
81 recordDebugInfo(node); | |
82 super.invokeSetter(node, name); | |
83 } | |
84 | |
85 void invokeFactory(Node node, int constId, int arity) { | |
86 recordDebugInfo(node); | |
87 super.invokeFactory(node, constId, arity); | |
88 } | |
89 | |
90 void invokeStatic(Node node, int constId, int arity) { | |
91 recordDebugInfo(node); | |
92 super.invokeStatic(node, constId, arity); | |
93 } | |
94 | |
95 void generateReturn(Node node) { | |
96 recordDebugInfo(node); | |
97 super.generateReturn(node); | |
98 } | |
99 | |
100 void generateReturnNull(Node node) { | |
101 recordDebugInfo(node); | |
102 super.generateReturnNull(node); | |
103 } | |
104 | |
105 void generateImplicitReturn(FunctionExpression node) { | |
106 // If the method is empty, generate debug information for the | |
107 // implicit 'return null' that covers the entire method. That was, | |
108 // the debugger will use the entire (empty) method as the source | |
109 // listing is a breakpoint is set in the method. | |
110 if (node.body is Block) { | |
111 Block body = node.body; | |
112 if (body.statements.isEmpty) recordDebugInfo(node); | |
113 } | |
114 super.generateImplicitReturn(node); | |
115 } | |
116 | |
117 void generateSwitchCaseMatch(CaseMatch caseMatch, BytecodeLabel ifTrue) { | |
118 // We do not want to break on the evaluation of the individual | |
119 // case equality tests. | |
120 recordDebugInfo(null); | |
121 super.generateSwitchCaseMatch(caseMatch, ifTrue); | |
122 } | |
123 | |
124 void generateEmptyInitializer(Node node) { | |
125 recordDebugInfo(node); | |
126 super.generateEmptyInitializer(node); | |
127 } | |
128 | |
129 void generateIdentical(Node node) { | |
130 recordDebugInfo(node); | |
131 super.generateIdentical(node); | |
132 } | |
133 | |
134 void generateIdenticalNonNumeric(Node node) { | |
135 recordDebugInfo(node); | |
136 super.generateIdenticalNonNumeric(node); | |
137 } | |
138 | |
139 void generateThrow(Node node) { | |
140 recordDebugInfo(node); | |
141 super.generateThrow(node); | |
142 } | |
143 | |
144 void visitForValue(Node node) { | |
145 recordDebugInfo(node); | |
146 super.visitForValue(node); | |
147 } | |
148 | |
149 void visitForEffect(Node node) { | |
150 recordDebugInfo(node); | |
151 super.visitForEffect(node); | |
152 } | |
153 } | |
OLD | NEW |