00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035 #include "../shared/trace.h"
00036 #include "../shared/traceFrame.h"
00037 #include "../shared/method.h"
00038
00039 Trace::~Trace() {
00040
00041 if( frames) TraceFrame::deleteArray(frames, numFrames);
00042 frames = NULL;
00043 }
00044
00045 Buffer& Trace::infoToBin( Buffer& b) {
00046
00047 b += numFrames;
00048
00049 TraceFrame* p = frames;
00050 for( jint i = 0; i < numFrames; i++, p++) {
00051
00052 b += p->lineno;
00053 b += p->method->getProfID();
00054 }
00055
00056 return b;
00057 }
00058
00059 const TraceKey& Trace::getKey(TraceKey& key) {
00060
00061 TraceFrame* tf = frames;
00062 JVMPI_CallFrame* cf = key.frames;
00063
00064 key.numFrames = numFrames;
00065 for (int i = 0; i < numFrames; i++, tf++, cf++) {
00066 cf->lineno = tf->lineno;
00067 tf->method->getKey(cf->method_id);
00068 }
00069
00070 return key;
00071 }
00072
00073 int Trace::operator==(const TraceKey& key) {
00074
00075 if (key.numFrames != numFrames) return 0;
00076
00077 const JVMPI_CallFrame* cf = key.frames;
00078 TraceFrame* tf = frames;
00079
00080 for (int i = 0; i < numFrames; i++, tf++, cf++)
00081 if( (tf->lineno != cf->lineno) || (!(*tf->method == cf->method_id))) return 0;
00082
00083 return 1;
00084 }
00085
00086 int Trace::hashKey(const TraceKey& key) {
00087
00088 const JVMPI_CallFrame* p = key.frames;
00089 int sum = 0;
00090
00091 for (int i = 0; i < key.numFrames; i++, p++) {
00092 sum += (int)p->lineno;
00093 sum += Method::hashKey(p->method_id);
00094 }
00095
00096 return sum;
00097 }