annotate graal/com.oracle.truffle.api/src/com/oracle/truffle/api/instrument/impl/LineLocationToProbeCollectionMap.java @ 16873:3ad18f453679

Truffle/Instrumentation: Javadoc
author Michael Van De Vanter <michael.van.de.vanter@oracle.com>
date Wed, 20 Aug 2014 15:14:30 -0700
parents 7bfbad29d331
children f0e3b50c29c8
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
16856
7833417c8172 Changes to Instrumentation
David Piorkowski <david.piorkowski@oracle.com>
parents:
diff changeset
1 /*
7833417c8172 Changes to Instrumentation
David Piorkowski <david.piorkowski@oracle.com>
parents:
diff changeset
2 * Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved.
7833417c8172 Changes to Instrumentation
David Piorkowski <david.piorkowski@oracle.com>
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
7833417c8172 Changes to Instrumentation
David Piorkowski <david.piorkowski@oracle.com>
parents:
diff changeset
4 *
7833417c8172 Changes to Instrumentation
David Piorkowski <david.piorkowski@oracle.com>
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
7833417c8172 Changes to Instrumentation
David Piorkowski <david.piorkowski@oracle.com>
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
7833417c8172 Changes to Instrumentation
David Piorkowski <david.piorkowski@oracle.com>
parents:
diff changeset
7 * published by the Free Software Foundation. Oracle designates this
7833417c8172 Changes to Instrumentation
David Piorkowski <david.piorkowski@oracle.com>
parents:
diff changeset
8 * particular file as subject to the "Classpath" exception as provided
7833417c8172 Changes to Instrumentation
David Piorkowski <david.piorkowski@oracle.com>
parents:
diff changeset
9 * by Oracle in the LICENSE file that accompanied this code.
7833417c8172 Changes to Instrumentation
David Piorkowski <david.piorkowski@oracle.com>
parents:
diff changeset
10 *
7833417c8172 Changes to Instrumentation
David Piorkowski <david.piorkowski@oracle.com>
parents:
diff changeset
11 * This code is distributed in the hope that it will be useful, but WITHOUT
7833417c8172 Changes to Instrumentation
David Piorkowski <david.piorkowski@oracle.com>
parents:
diff changeset
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
7833417c8172 Changes to Instrumentation
David Piorkowski <david.piorkowski@oracle.com>
parents:
diff changeset
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
7833417c8172 Changes to Instrumentation
David Piorkowski <david.piorkowski@oracle.com>
parents:
diff changeset
14 * version 2 for more details (a copy is included in the LICENSE file that
7833417c8172 Changes to Instrumentation
David Piorkowski <david.piorkowski@oracle.com>
parents:
diff changeset
15 * accompanied this code).
7833417c8172 Changes to Instrumentation
David Piorkowski <david.piorkowski@oracle.com>
parents:
diff changeset
16 *
7833417c8172 Changes to Instrumentation
David Piorkowski <david.piorkowski@oracle.com>
parents:
diff changeset
17 * You should have received a copy of the GNU General Public License version
7833417c8172 Changes to Instrumentation
David Piorkowski <david.piorkowski@oracle.com>
parents:
diff changeset
18 * 2 along with this work; if not, write to the Free Software Foundation,
7833417c8172 Changes to Instrumentation
David Piorkowski <david.piorkowski@oracle.com>
parents:
diff changeset
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
7833417c8172 Changes to Instrumentation
David Piorkowski <david.piorkowski@oracle.com>
parents:
diff changeset
20 *
7833417c8172 Changes to Instrumentation
David Piorkowski <david.piorkowski@oracle.com>
parents:
diff changeset
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
7833417c8172 Changes to Instrumentation
David Piorkowski <david.piorkowski@oracle.com>
parents:
diff changeset
22 * or visit www.oracle.com if you need additional information or have any
7833417c8172 Changes to Instrumentation
David Piorkowski <david.piorkowski@oracle.com>
parents:
diff changeset
23 * questions.
7833417c8172 Changes to Instrumentation
David Piorkowski <david.piorkowski@oracle.com>
parents:
diff changeset
24 */
7833417c8172 Changes to Instrumentation
David Piorkowski <david.piorkowski@oracle.com>
parents:
diff changeset
25 package com.oracle.truffle.api.instrument.impl;
7833417c8172 Changes to Instrumentation
David Piorkowski <david.piorkowski@oracle.com>
parents:
diff changeset
26
7833417c8172 Changes to Instrumentation
David Piorkowski <david.piorkowski@oracle.com>
parents:
diff changeset
27 import java.util.*;
7833417c8172 Changes to Instrumentation
David Piorkowski <david.piorkowski@oracle.com>
parents:
diff changeset
28
7833417c8172 Changes to Instrumentation
David Piorkowski <david.piorkowski@oracle.com>
parents:
diff changeset
29 import com.oracle.truffle.api.instrument.*;
7833417c8172 Changes to Instrumentation
David Piorkowski <david.piorkowski@oracle.com>
parents:
diff changeset
30 import com.oracle.truffle.api.source.*;
7833417c8172 Changes to Instrumentation
David Piorkowski <david.piorkowski@oracle.com>
parents:
diff changeset
31
7833417c8172 Changes to Instrumentation
David Piorkowski <david.piorkowski@oracle.com>
parents:
diff changeset
32 /**
16857
7bfbad29d331 Truffle/Instrumentation: Javadoc cleanups and minor corrections.
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16856
diff changeset
33 * A mapping from {@link LineLocation} (a line number in a specific piece of {@link Source} code) to
7bfbad29d331 Truffle/Instrumentation: Javadoc cleanups and minor corrections.
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16856
diff changeset
34 * a collection of {@link Probe}s whose associated {@link SourceSection} starts on that line.
16856
7833417c8172 Changes to Instrumentation
David Piorkowski <david.piorkowski@oracle.com>
parents:
diff changeset
35 */
7833417c8172 Changes to Instrumentation
David Piorkowski <david.piorkowski@oracle.com>
parents:
diff changeset
36 public class LineLocationToProbeCollectionMap implements ProbeListener {
16873
3ad18f453679 Truffle/Instrumentation: Javadoc
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16857
diff changeset
37
16856
7833417c8172 Changes to Instrumentation
David Piorkowski <david.piorkowski@oracle.com>
parents:
diff changeset
38 /**
7833417c8172 Changes to Instrumentation
David Piorkowski <david.piorkowski@oracle.com>
parents:
diff changeset
39 * Map: Source line ==> probes associated with source sections starting on the line.
7833417c8172 Changes to Instrumentation
David Piorkowski <david.piorkowski@oracle.com>
parents:
diff changeset
40 */
7833417c8172 Changes to Instrumentation
David Piorkowski <david.piorkowski@oracle.com>
parents:
diff changeset
41 private final Map<LineLocation, Collection<Probe>> lineToProbesMap = new HashMap<>();
7833417c8172 Changes to Instrumentation
David Piorkowski <david.piorkowski@oracle.com>
parents:
diff changeset
42
7833417c8172 Changes to Instrumentation
David Piorkowski <david.piorkowski@oracle.com>
parents:
diff changeset
43 public LineLocationToProbeCollectionMap() {
7833417c8172 Changes to Instrumentation
David Piorkowski <david.piorkowski@oracle.com>
parents:
diff changeset
44 }
7833417c8172 Changes to Instrumentation
David Piorkowski <david.piorkowski@oracle.com>
parents:
diff changeset
45
7833417c8172 Changes to Instrumentation
David Piorkowski <david.piorkowski@oracle.com>
parents:
diff changeset
46 public void newProbeInserted(SourceSection source, Probe probe) {
7833417c8172 Changes to Instrumentation
David Piorkowski <david.piorkowski@oracle.com>
parents:
diff changeset
47 final LineLocation line = source.getLineLocation();
7833417c8172 Changes to Instrumentation
David Piorkowski <david.piorkowski@oracle.com>
parents:
diff changeset
48 this.addProbeToLine(line, probe);
7833417c8172 Changes to Instrumentation
David Piorkowski <david.piorkowski@oracle.com>
parents:
diff changeset
49 }
7833417c8172 Changes to Instrumentation
David Piorkowski <david.piorkowski@oracle.com>
parents:
diff changeset
50
7833417c8172 Changes to Instrumentation
David Piorkowski <david.piorkowski@oracle.com>
parents:
diff changeset
51 public void probeTaggedAs(Probe probe, SyntaxTag tag) {
16857
7bfbad29d331 Truffle/Instrumentation: Javadoc cleanups and minor corrections.
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16856
diff changeset
52 // This map ignores tags
16856
7833417c8172 Changes to Instrumentation
David Piorkowski <david.piorkowski@oracle.com>
parents:
diff changeset
53 }
7833417c8172 Changes to Instrumentation
David Piorkowski <david.piorkowski@oracle.com>
parents:
diff changeset
54
7833417c8172 Changes to Instrumentation
David Piorkowski <david.piorkowski@oracle.com>
parents:
diff changeset
55 /**
7833417c8172 Changes to Instrumentation
David Piorkowski <david.piorkowski@oracle.com>
parents:
diff changeset
56 * Returns the {@link Probe}, if any, associated with source that starts on a specified line; if
16857
7bfbad29d331 Truffle/Instrumentation: Javadoc cleanups and minor corrections.
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16856
diff changeset
57 * there are more than one, return the one with the first starting character location.
16856
7833417c8172 Changes to Instrumentation
David Piorkowski <david.piorkowski@oracle.com>
parents:
diff changeset
58 */
7833417c8172 Changes to Instrumentation
David Piorkowski <david.piorkowski@oracle.com>
parents:
diff changeset
59 public Probe findLineProbe(LineLocation lineLocation) {
7833417c8172 Changes to Instrumentation
David Piorkowski <david.piorkowski@oracle.com>
parents:
diff changeset
60 Probe probe = null;
7833417c8172 Changes to Instrumentation
David Piorkowski <david.piorkowski@oracle.com>
parents:
diff changeset
61 final Collection<Probe> probes = getProbesAtLine(lineLocation);
7833417c8172 Changes to Instrumentation
David Piorkowski <david.piorkowski@oracle.com>
parents:
diff changeset
62 for (Probe probeOnLine : probes) {
7833417c8172 Changes to Instrumentation
David Piorkowski <david.piorkowski@oracle.com>
parents:
diff changeset
63 if (probe == null) {
7833417c8172 Changes to Instrumentation
David Piorkowski <david.piorkowski@oracle.com>
parents:
diff changeset
64 probe = probeOnLine;
7833417c8172 Changes to Instrumentation
David Piorkowski <david.piorkowski@oracle.com>
parents:
diff changeset
65 } else if (probeOnLine.getSourceLocation().getCharIndex() < probe.getSourceLocation().getCharIndex()) {
7833417c8172 Changes to Instrumentation
David Piorkowski <david.piorkowski@oracle.com>
parents:
diff changeset
66 probe = probeOnLine;
7833417c8172 Changes to Instrumentation
David Piorkowski <david.piorkowski@oracle.com>
parents:
diff changeset
67 }
7833417c8172 Changes to Instrumentation
David Piorkowski <david.piorkowski@oracle.com>
parents:
diff changeset
68 }
7833417c8172 Changes to Instrumentation
David Piorkowski <david.piorkowski@oracle.com>
parents:
diff changeset
69 return probe;
7833417c8172 Changes to Instrumentation
David Piorkowski <david.piorkowski@oracle.com>
parents:
diff changeset
70 }
7833417c8172 Changes to Instrumentation
David Piorkowski <david.piorkowski@oracle.com>
parents:
diff changeset
71
7833417c8172 Changes to Instrumentation
David Piorkowski <david.piorkowski@oracle.com>
parents:
diff changeset
72 /**
16873
3ad18f453679 Truffle/Instrumentation: Javadoc
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16857
diff changeset
73 * Records creation of a probe whose associated source starts on the given line.
16856
7833417c8172 Changes to Instrumentation
David Piorkowski <david.piorkowski@oracle.com>
parents:
diff changeset
74 * <p>
7833417c8172 Changes to Instrumentation
David Piorkowski <david.piorkowski@oracle.com>
parents:
diff changeset
75 * If the line already exists in the internal {@link #lineToProbesMap}, this probe will be added
7833417c8172 Changes to Instrumentation
David Piorkowski <david.piorkowski@oracle.com>
parents:
diff changeset
76 * to the existing collection. If no line already exists in the internal map, then a new key is
7833417c8172 Changes to Instrumentation
David Piorkowski <david.piorkowski@oracle.com>
parents:
diff changeset
77 * added along with a new collection containing the probe.
7833417c8172 Changes to Instrumentation
David Piorkowski <david.piorkowski@oracle.com>
parents:
diff changeset
78 * <p>
7833417c8172 Changes to Instrumentation
David Piorkowski <david.piorkowski@oracle.com>
parents:
diff changeset
79 * This class requires that each added line/probe pair hasn't been previously added. However,
7833417c8172 Changes to Instrumentation
David Piorkowski <david.piorkowski@oracle.com>
parents:
diff changeset
80 * attaching the same probe to a new line location is allowed.
7833417c8172 Changes to Instrumentation
David Piorkowski <david.piorkowski@oracle.com>
parents:
diff changeset
81 *
7833417c8172 Changes to Instrumentation
David Piorkowski <david.piorkowski@oracle.com>
parents:
diff changeset
82 * @param line The {@link LineLocation} to attach the probe to.
7833417c8172 Changes to Instrumentation
David Piorkowski <david.piorkowski@oracle.com>
parents:
diff changeset
83 * @param probe The {@link Probe} to attach for that line location.
7833417c8172 Changes to Instrumentation
David Piorkowski <david.piorkowski@oracle.com>
parents:
diff changeset
84 */
7833417c8172 Changes to Instrumentation
David Piorkowski <david.piorkowski@oracle.com>
parents:
diff changeset
85 private void addProbeToLine(LineLocation line, Probe probe) {
7833417c8172 Changes to Instrumentation
David Piorkowski <david.piorkowski@oracle.com>
parents:
diff changeset
86
7833417c8172 Changes to Instrumentation
David Piorkowski <david.piorkowski@oracle.com>
parents:
diff changeset
87 if (!lineToProbesMap.containsKey(line)) {
7833417c8172 Changes to Instrumentation
David Piorkowski <david.piorkowski@oracle.com>
parents:
diff changeset
88 // Key does not exist, add new probe list
7833417c8172 Changes to Instrumentation
David Piorkowski <david.piorkowski@oracle.com>
parents:
diff changeset
89 final ArrayList<Probe> newProbeList = new ArrayList<>(2);
7833417c8172 Changes to Instrumentation
David Piorkowski <david.piorkowski@oracle.com>
parents:
diff changeset
90 newProbeList.add(probe);
7833417c8172 Changes to Instrumentation
David Piorkowski <david.piorkowski@oracle.com>
parents:
diff changeset
91 lineToProbesMap.put(line, newProbeList);
7833417c8172 Changes to Instrumentation
David Piorkowski <david.piorkowski@oracle.com>
parents:
diff changeset
92 } else {
7833417c8172 Changes to Instrumentation
David Piorkowski <david.piorkowski@oracle.com>
parents:
diff changeset
93 // Probe list exists, add to existing
7833417c8172 Changes to Instrumentation
David Piorkowski <david.piorkowski@oracle.com>
parents:
diff changeset
94 final Collection<Probe> existingProbeList = lineToProbesMap.get(line);
7833417c8172 Changes to Instrumentation
David Piorkowski <david.piorkowski@oracle.com>
parents:
diff changeset
95 assert !existingProbeList.contains(probe);
7833417c8172 Changes to Instrumentation
David Piorkowski <david.piorkowski@oracle.com>
parents:
diff changeset
96 existingProbeList.add(probe);
7833417c8172 Changes to Instrumentation
David Piorkowski <david.piorkowski@oracle.com>
parents:
diff changeset
97 }
7833417c8172 Changes to Instrumentation
David Piorkowski <david.piorkowski@oracle.com>
parents:
diff changeset
98 }
7833417c8172 Changes to Instrumentation
David Piorkowski <david.piorkowski@oracle.com>
parents:
diff changeset
99
7833417c8172 Changes to Instrumentation
David Piorkowski <david.piorkowski@oracle.com>
parents:
diff changeset
100 /**
16873
3ad18f453679 Truffle/Instrumentation: Javadoc
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16857
diff changeset
101 * Returns a collection of {@link Probe}s whose associated source begings at the given
3ad18f453679 Truffle/Instrumentation: Javadoc
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16857
diff changeset
102 * {@link LineLocation}. If there are no probes at that line, an empty list is returned.
16856
7833417c8172 Changes to Instrumentation
David Piorkowski <david.piorkowski@oracle.com>
parents:
diff changeset
103 *
7833417c8172 Changes to Instrumentation
David Piorkowski <david.piorkowski@oracle.com>
parents:
diff changeset
104 * @param line The line to check.
16873
3ad18f453679 Truffle/Instrumentation: Javadoc
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16857
diff changeset
105 * @return A collection of probes at the given line.
16856
7833417c8172 Changes to Instrumentation
David Piorkowski <david.piorkowski@oracle.com>
parents:
diff changeset
106 */
7833417c8172 Changes to Instrumentation
David Piorkowski <david.piorkowski@oracle.com>
parents:
diff changeset
107 private Collection<Probe> getProbesAtLine(LineLocation line) {
7833417c8172 Changes to Instrumentation
David Piorkowski <david.piorkowski@oracle.com>
parents:
diff changeset
108 Collection<Probe> probeList = lineToProbesMap.get(line);
7833417c8172 Changes to Instrumentation
David Piorkowski <david.piorkowski@oracle.com>
parents:
diff changeset
109
7833417c8172 Changes to Instrumentation
David Piorkowski <david.piorkowski@oracle.com>
parents:
diff changeset
110 if (probeList == null)
7833417c8172 Changes to Instrumentation
David Piorkowski <david.piorkowski@oracle.com>
parents:
diff changeset
111 probeList = new ArrayList<>(2);
7833417c8172 Changes to Instrumentation
David Piorkowski <david.piorkowski@oracle.com>
parents:
diff changeset
112
7833417c8172 Changes to Instrumentation
David Piorkowski <david.piorkowski@oracle.com>
parents:
diff changeset
113 return probeList;
7833417c8172 Changes to Instrumentation
David Piorkowski <david.piorkowski@oracle.com>
parents:
diff changeset
114 }
7833417c8172 Changes to Instrumentation
David Piorkowski <david.piorkowski@oracle.com>
parents:
diff changeset
115 }