File: StackInfoSet.cpp

package info (click to toggle)
storm-lang 0.7.4-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 52,004 kB
  • sloc: ansic: 261,462; cpp: 140,405; sh: 14,891; perl: 9,846; python: 2,525; lisp: 2,504; asm: 860; makefile: 678; pascal: 70; java: 52; xml: 37; awk: 12
file content (83 lines) | stat: -rw-r--r-- 1,694 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
#include "stdafx.h"
#include "StackInfoSet.h"
#include <typeinfo>


StackInfoSet::StackInfoSet() {
	attach(cppInfo);
}

int StackInfoSet::attach(const StackInfo &lookup) {
	util::Lock::L z(lock);

	for (size_t i = 0; i < data.size(); i++) {
		const StackInfo *l = data[i];
		if (!l)
			continue;

		// We assume that if they're of the same type, they're equal.
		if (typeid(*l) == typeid(lookup))
			return -1;
	}

	for (size_t i = 0; i < data.size(); i++) {
		if (!data[i]) {
			data[i] = &lookup;
			return int(i);
		}
	}

	data.push_back(&lookup);
	return int(data.size() - 1);
}

void StackInfoSet::detach(int id) {
	util::Lock::L z(lock);

	if (id >= 0)
		data[id] = null;
}

void StackInfoSet::alloc(StackFrame *frames, nat count) {
	util::Lock::L z(lock);

	for (size_t i = 0; i < data.size(); i++) {
		if (data[i])
			data[i]->alloc(frames, count);
	}
}

void StackInfoSet::free(StackFrame *frames, nat count) {
	util::Lock::L z(lock);

	for (size_t i = 0; i < data.size(); i++) {
		if (data[i])
			data[i]->free(frames, count);
	}
}

int StackInfoSet::translate(void *ip, void *&fnBase, int &offset) {
	util::Lock::L z(lock);

	// Reverse order so that CppInfo is last.
	for (size_t i = data.size(); i > 0; i--) {
		if (data[i - 1])
			if (data[i - 1]->translate(ip, fnBase, offset))
				return int(i) - 1;
	}

	// The C++ backend will do just fine. We should not get here though.
	cppInfo.translate(ip, fnBase, offset);
	return 0;
}

void StackInfoSet::format(GenericOutput &to, int id, void *fnBase, int offset) {
	util::Lock::L z(lock);

	if (data[id]) {
		data[id]->format(to, fnBase, offset);
	} else {
		to.put("Unknown function @0x");
		to.putHex((size_t)fnBase + offset);
	}
}