23 int InterrogateDatabase::_file_major_version = 0;
24 int InterrogateDatabase::_file_minor_version = 0;
25 int InterrogateDatabase::_current_major_version = 3;
26 int InterrogateDatabase::_current_minor_version = 3;
32 InterrogateDatabase() {
43 if (_global_ptr ==
nullptr) {
44 if (interrogatedb_cat->is_debug()) {
45 interrogatedb_cat->debug()
46 <<
"Creating interrogate database\n";
61 if (interrogatedb_cat->is_debug()) {
62 if (def->library_name ==
nullptr) {
63 interrogatedb_cat->debug()
64 <<
"Got interrogate data for anonymous module\n";
66 interrogatedb_cat->debug()
67 <<
"Got interrogate data for module " << def->library_name <<
"\n";
71 int num_indices = def->next_index - def->first_index;
72 if (num_indices > 0) {
75 def->first_index = _next_index;
76 _next_index += num_indices;
77 def->next_index = _next_index;
81 _modules.push_back(def);
84 if (def->num_unique_names > 0 && def->library_name !=
nullptr) {
87 _modules_by_hash[def->library_hash_name] = def;
90 if (def->database_filename !=
nullptr) {
91 _requests.push_back(def);
114 return _global_types.size();
123 if (n >= 0 && n < (
int)_global_types.size()) {
124 return _global_types[n];
137 return _all_types.size();
146 if (n >= 0 && n < (
int)_all_types.size()) {
147 return _all_types[n];
160 return _global_functions.size();
170 if (n >= 0 && n < (
int)_global_functions.size()) {
171 return _global_functions[n];
184 return _all_functions.size();
193 if (n >= 0 && n < (
int)_all_functions.size()) {
194 return _all_functions[n];
206 return _global_manifests.size();
216 if (n >= 0 && n < (
int)_global_manifests.size()) {
217 return _global_manifests[n];
229 return _global_elements.size();
239 if (n >= 0 && n < (
int)_global_elements.size()) {
240 return _global_elements[n];
253 TypeMap::const_iterator ti;
254 ti = _type_map.find(type);
255 if (ti == _type_map.end()) {
270 FunctionMap::const_iterator fi;
271 fi = _function_map.find(
function);
272 if (fi == _function_map.end()) {
273 return bogus_function;
275 return *(*fi).second;
287 FunctionWrapperMap::const_iterator wi;
288 wi = _wrapper_map.find(wrapper);
289 if (wi == _wrapper_map.end()) {
290 return bogus_wrapper;
304 ManifestMap::const_iterator mi;
305 mi = _manifest_map.find(manifest);
306 if (mi == _manifest_map.end()) {
307 return bogus_manifest;
321 ElementMap::const_iterator ei;
322 ei = _element_map.find(element);
323 if (ei == _element_map.end()) {
324 return bogus_element;
338 MakeSeqMap::const_iterator si;
339 si = _make_seq_map.find(make_seq);
340 if (si == _make_seq_map.end()) {
341 return bogus_make_seq;
351 _type_map.erase(type);
362 if (find_module(wrapper, def, module_index)) {
363 if (module_index >= 0 && module_index < def->num_fptrs) {
364 return def->fptrs[module_index];
381 string library_hash_name = unique_name.substr(0, 4);
382 string wrapper_hash_name = unique_name.substr(4);
385 ModulesByHash::const_iterator mi;
386 mi = _modules_by_hash.find(library_hash_name);
387 if (mi == _modules_by_hash.end()) {
393 binary_search_wrapper_hash(def->unique_names,
394 def->unique_names + def->num_unique_names,
396 if (index_offset >= 0) {
397 return def->first_index + index_offset;
409 return _file_major_version;
418 return _file_minor_version;
427 return _current_major_version;
436 return _current_minor_version;
445 _error_flag = error_flag;
454 return _next_index++;
464 _type_map.insert(TypeMap::value_type(index, type)).second;
470 assert(!old_type.is_fully_defined());
477 _global_types.push_back(index);
479 _all_types.push_back(index);
488 _function_map.insert(FunctionMap::value_type(index,
function)).second;
491 if (function->is_global()) {
492 _global_functions.push_back(index);
494 _all_functions.push_back(index);
505 _wrapper_map.insert(FunctionWrapperMap::value_type(index, wrapper)).second;
516 _manifest_map.insert(ManifestMap::value_type(index, manifest)).second;
519 _global_manifests.push_back(index);
528 _element_map.insert(ElementMap::value_type(index, element)).second;
532 _global_elements.push_back(index);
542 _make_seq_map.insert(MakeSeqMap::value_type(index, make_seq)).second;
554 return _type_map[type];
564 return *_function_map[
function];
574 return _wrapper_map[wrapper];
584 return _manifest_map[manifest];
594 return _element_map[element];
604 return _make_seq_map[make_seq];
632 FunctionWrapperMap new_wrapper_map;
633 FunctionWrapperMap::iterator wi;
634 for (wi = _wrapper_map.begin(); wi != _wrapper_map.end(); ++wi) {
636 new_wrapper_map[first_index] = (*wi).second;
641 FunctionMap new_function_map;
642 FunctionMap::iterator fi;
643 for (fi = _function_map.begin(); fi != _function_map.end(); ++fi) {
645 new_function_map[first_index] = (*fi).second;
649 TypeMap new_type_map;
650 TypeMap::iterator ti;
651 for (ti = _type_map.begin(); ti != _type_map.end(); ++ti) {
652 assert((*ti).first != 0);
654 new_type_map[first_index] = (*ti).second;
658 ManifestMap new_manifest_map;
659 ManifestMap::iterator mi;
660 for (mi = _manifest_map.begin(); mi != _manifest_map.end(); ++mi) {
662 new_manifest_map[first_index] = (*mi).second;
666 ElementMap new_element_map;
667 ElementMap::iterator ei;
668 for (ei = _element_map.begin(); ei != _element_map.end(); ++ei) {
670 new_element_map[first_index] = (*ei).second;
674 MakeSeqMap new_make_seq_map;
675 MakeSeqMap::iterator si;
676 for (si = _make_seq_map.begin(); si != _make_seq_map.end(); ++si) {
678 new_make_seq_map[first_index] = (*si).second;
682 _next_index = first_index;
684 _wrapper_map.swap(new_wrapper_map);
685 _function_map.swap(new_function_map);
686 _type_map.swap(new_type_map);
687 _manifest_map.swap(new_manifest_map);
688 _element_map.swap(new_element_map);
689 _make_seq_map.swap(new_make_seq_map);
692 for (wi = _wrapper_map.begin(); wi != _wrapper_map.end(); ++wi) {
693 (*wi).second.remap_indices(remap);
695 for (fi = _function_map.begin(); fi != _function_map.end(); ++fi) {
696 (*fi).second->remap_indices(remap);
698 for (ti = _type_map.begin(); ti != _type_map.end(); ++ti) {
699 (*ti).second.remap_indices(remap);
701 for (mi = _manifest_map.begin(); mi != _manifest_map.end(); ++mi) {
702 (*mi).second.remap_indices(remap);
704 for (ei = _element_map.begin(); ei != _element_map.end(); ++ei) {
705 (*ei).second.remap_indices(remap);
707 for (si = _make_seq_map.begin(); si != _make_seq_map.end(); ++si) {
708 (*si).second.remap_indices(remap);
710 GlobalFunctions::iterator gfi;
711 for (gfi = _global_functions.begin(); gfi != _global_functions.end(); ++gfi) {
714 for (gfi = _all_functions.begin(); gfi != _all_functions.end(); ++gfi) {
717 GlobalTypes::iterator gti;
718 for (gti = _global_types.begin(); gti != _global_types.end(); ++gti) {
721 for (gti = _all_types.begin(); gti != _all_types.end(); ++gti) {
724 GlobalManifests::iterator gmi;
725 for (gmi = _global_manifests.begin(); gmi != _global_manifests.end(); ++gmi) {
728 GlobalElements::iterator gei;
729 for (gei = _global_elements.begin(); gei != _global_elements.end(); ++gei) {
742 out << def->file_identifier <<
"\n"
743 << _current_major_version <<
" " << _current_minor_version <<
"\n";
753 out << _function_map.size() <<
"\n";
754 FunctionMap::const_iterator fi;
755 for (fi = _function_map.begin(); fi != _function_map.end(); ++fi) {
756 out << (*fi).first <<
" " << *(*fi).second <<
"\n";
759 out << _wrapper_map.size() <<
"\n";
760 FunctionWrapperMap::const_iterator wi;
761 for (wi = _wrapper_map.begin(); wi != _wrapper_map.end(); ++wi) {
762 out << (*wi).first <<
" " << (*wi).second <<
"\n";
765 out << _type_map.size() <<
"\n";
766 TypeMap::const_iterator ti;
767 for (ti = _type_map.begin(); ti != _type_map.end(); ++ti) {
768 out << (*ti).first <<
" " << (*ti).second <<
"\n";
771 out << _manifest_map.size() <<
"\n";
772 ManifestMap::const_iterator mi;
773 for (mi = _manifest_map.begin(); mi != _manifest_map.end(); ++mi) {
774 out << (*mi).first <<
" " << (*mi).second <<
"\n";
777 out << _element_map.size() <<
"\n";
778 ElementMap::const_iterator ei;
779 for (ei = _element_map.begin(); ei != _element_map.end(); ++ei) {
780 out << (*ei).first <<
" " << (*ei).second <<
"\n";
783 out << _make_seq_map.size() <<
"\n";
784 MakeSeqMap::const_iterator si;
785 for (si = _make_seq_map.begin(); si != _make_seq_map.end(); ++si) {
786 out << (*si).first <<
" " << (*si).second <<
"\n";
801 if (!temp.read_new(in, def)) {
805 if (def->first_index == 0 && def->next_index == 0) {
810 if (next != def->next_index) {
811 interrogatedb_cat->error()
812 <<
"Module database file " << def->database_filename
813 <<
" is out of date.\n";
825 void InterrogateDatabase::
827 const DSearchPath &searchpath = interrogatedb_path;
829 Requests copy_requests;
830 copy_requests.swap(_requests);
832 Requests::const_iterator ri;
833 for (ri = copy_requests.begin(); ri != copy_requests.end(); ++ri) {
836 if (def->database_filename !=
nullptr) {
837 Filename filename = def->database_filename;
839 if (!pathname.empty() && pathname[0] !=
'/') {
840 pathname = searchpath.
find_file(pathname);
843 if (pathname.empty()) {
844 interrogatedb_cat->error()
845 <<
"Unable to find " << filename <<
" on " << searchpath <<
"\n";
853 interrogatedb_cat->error() <<
"Unable to read " << pathname <<
".\n";
858 input >> file_identifier
859 >> _file_major_version >> _file_minor_version;
861 if (def->file_identifier != 0 &&
862 file_identifier != def->file_identifier) {
863 interrogatedb_cat->warning()
864 <<
"Interrogate data in " << pathname
865 <<
" is out of sync with the compiled-in data"
866 <<
" (" << file_identifier <<
" != " << def->file_identifier <<
").\n";
870 if (_file_major_version != _current_major_version ||
871 _file_minor_version > _current_minor_version) {
872 interrogatedb_cat->error()
873 <<
"Cannot read interrogate data in " << pathname
874 <<
"; database is version " << _file_major_version <<
"."
875 << _file_minor_version <<
" while we are expecting "
876 << _current_major_version <<
"." << _current_minor_version
881 if (interrogatedb_cat->is_debug()) {
882 interrogatedb_cat->debug()
883 <<
"Reading " << filename <<
"\n";
885 if (!
read(input, def)) {
886 interrogatedb_cat->error()
887 <<
"Error reading " << pathname <<
".\n";
904 bool InterrogateDatabase::
920 while (num_functions > 0) {
923 in >> index >> *
function;
941 while (num_wrappers > 0) {
942 FunctionWrapperIndex index;
944 in >> index >> wrapper;
961 while (num_types > 0) {
981 while (num_manifests > 0) {
984 in >> index >> manifest;
1001 while (num_elements > 0) {
1004 in >> index >> element;
1016 in >> num_make_seqs;
1021 while (num_make_seqs > 0) {
1024 in >> index >> make_seq;
1041 void InterrogateDatabase::
1048 map<string, TypeIndex> types_by_name;
1050 TypeMap::const_iterator ti;
1051 for (ti = _type_map.begin(); ti != _type_map.end(); ++ti) {
1053 if (type.has_true_name()) {
1054 types_by_name[type.get_true_name()] = (*ti).first;
1060 for (ti = other._type_map.begin(); ti != other._type_map.end(); ++ti) {
1061 TypeIndex other_type_index = (*ti).first;
1064 if (other_type.has_name()) {
1065 map<string, TypeIndex>::iterator ni;
1066 ni = types_by_name.find(other_type.get_true_name());
1067 if (ni != types_by_name.end()) {
1070 TypeIndex this_type_index = (*ni).second;
1071 remap.
add_mapping(other_type_index, this_type_index);
1078 for (ti = other._type_map.begin(); ti != other._type_map.end(); ++ti) {
1079 TypeIndex other_type_index = (*ti).first;
1082 if (!remap.
in_map(other_type_index)) {
1084 add_type(other_type_index, other_type);
1089 TypeIndex this_type_index = remap.
map_from(other_type_index);
1095 _global_types.push_back(this_type_index);
1105 FunctionMap::const_iterator fi;
1106 for (fi = other._function_map.begin();
1107 fi != other._function_map.end();
1109 FunctionIndex other_function_index = (*fi).first;
1115 FunctionWrapperMap::const_iterator wi;
1116 for (wi = other._wrapper_map.begin();
1117 wi != other._wrapper_map.end();
1119 FunctionWrapperIndex other_wrapper_index = (*wi).first;
1125 ManifestMap::const_iterator mi;
1126 for (mi = other._manifest_map.begin();
1127 mi != other._manifest_map.end();
1129 ManifestIndex other_manifest_index = (*mi).first;
1135 ElementMap::const_iterator ei;
1136 for (ei = other._element_map.begin();
1137 ei != other._element_map.end();
1139 ElementIndex other_element_index = (*ei).first;
1145 MakeSeqMap::const_iterator si;
1146 for (si = other._make_seq_map.begin();
1147 si != other._make_seq_map.end();
1149 MakeSeqIndex other_make_seq_index = (*si).first;
1167 bool InterrogateDatabase::
1169 int &module_index) {
1170 if (_modules.empty()) {
1174 int mi = binary_search_module(0, _modules.size(), wrapper);
1175 assert(mi >= 0 && mi < (
int)_modules.size());
1177 module_index = wrapper - def->first_index;
1179 return (wrapper < def->next_index);
1186 int InterrogateDatabase::
1187 binary_search_module(
int begin,
int end, FunctionIndex
function) {
1188 int mid = begin + (end - begin) / 2;
1193 int index = _modules[mid]->first_index;
1194 if (index <=
function) {
1195 return binary_search_module(mid, end,
function);
1198 return binary_search_module(begin, mid,
function);
1207 int InterrogateDatabase::
1210 const string &wrapper_hash_name) {
1216 string name = mid->name;
1217 if (name < wrapper_hash_name) {
1218 return binary_search_wrapper_hash(mid, end, wrapper_hash_name);
1220 }
else if (wrapper_hash_name < name) {
1221 return binary_search_wrapper_hash(begin, mid, wrapper_hash_name);
1224 return mid->index_offset;
1231 void InterrogateDatabase::
1232 freshen_types_by_name() {
1233 _types_by_name.clear();
1234 TypeMap::const_iterator ti;
1235 for (ti = _type_map.begin(); ti != _type_map.end(); ++ti) {
1236 _types_by_name[(*ti).second.get_name()] = (*ti).first;
1243 void InterrogateDatabase::
1244 freshen_types_by_scoped_name() {
1245 _types_by_scoped_name.clear();
1246 TypeMap::const_iterator ti;
1247 for (ti = _type_map.begin(); ti != _type_map.end(); ++ti) {
1248 _types_by_scoped_name[(*ti).second.get_scoped_name()] = (*ti).first;
1255 void InterrogateDatabase::
1256 freshen_types_by_true_name() {
1257 _types_by_true_name.clear();
1258 TypeMap::const_iterator ti;
1259 for (ti = _type_map.begin(); ti != _type_map.end(); ++ti) {
1260 _types_by_true_name[(*ti).second.get_true_name()] = (*ti).first;
1267 void InterrogateDatabase::
1268 freshen_manifests_by_name() {
1269 _manifests_by_name.clear();
1270 ManifestMap::const_iterator ti;
1271 for (ti = _manifest_map.begin(); ti != _manifest_map.end(); ++ti) {
1272 _manifests_by_name[(*ti).second.get_name()] = (*ti).first;
1279 void InterrogateDatabase::
1280 freshen_elements_by_name() {
1281 _elements_by_name.clear();
1282 ElementMap::const_iterator ti;
1283 for (ti = _element_map.begin(); ti != _element_map.end(); ++ti) {
1284 _elements_by_name[(*ti).second.get_name()] = (*ti).first;
1291 void InterrogateDatabase::
1292 freshen_elements_by_scoped_name() {
1293 _elements_by_scoped_name.clear();
1294 ElementMap::const_iterator ti;
1295 for (ti = _element_map.begin(); ti != _element_map.end(); ++ti) {
1296 _elements_by_scoped_name[(*ti).second.get_scoped_name()] = (*ti).first;
1304 int InterrogateDatabase::
1305 lookup(
const string &name, Lookup &lookup, LookupType type,
1307 if ((_lookups_fresh & (
int)type) == 0) {
1310 _lookups_fresh |= (int)type;
1313 Lookup::const_iterator li;
1314 li = lookup.find(name);
1315 if (li != lookup.end()) {
1316 return (*li).second;