Switch over to an exception handling model for "high-level" requests.

Add new getValueAsString method.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@7463 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Chris Lattner 2003-08-01 04:37:57 +00:00
parent cf1b585312
commit 5c737ad4d6
4 changed files with 78 additions and 20 deletions

View File

@ -452,6 +452,23 @@ std::ostream &operator<<(std::ostream &OS, const Record &R) {
return OS << "}\n";
}
/// getValueAsString - This method looks up the specified field and returns its
/// value as a string, throwing an exception if the field does not exist or if
/// the value is not a string.
///
std::string Record::getValueAsString(const std::string &FieldName) const {
const RecordVal *R = getValue(FieldName);
if (R == 0 || R->getValue() == 0)
throw "Record '" + R->getName() + "' does not have a field named '" +
FieldName + "!\n";
if (const StringInit *SI = dynamic_cast<const StringInit*>(R->getValue()))
return SI->getValue();
throw "Record '" + R->getName() + "', field '" + FieldName +
"' does not have a string initializer!";
}
void RecordKeeper::dump() const { std::cerr << *this; }
std::ostream &operator<<(std::ostream &OS, const RecordKeeper &RK) {
@ -473,18 +490,17 @@ std::ostream &operator<<(std::ostream &OS, const RecordKeeper &RK) {
/// getAllDerivedDefinitions - This method returns all concrete definitions
/// that derive from the specified class name. If a class with the specified
/// name does not exist, an error is printed and true is returned.
bool RecordKeeper::getAllDerivedDefinitions(const std::string &ClassName,
std::vector<Record*> &Defs) const {
std::vector<Record*>
RecordKeeper::getAllDerivedDefinitions(const std::string &ClassName) const {
Record *Class = Records.getClass(ClassName);
if (!Class) {
std::cerr << "ERROR: Couldn't find the '" << ClassName << "' class!\n";
return true;
}
if (!Class)
throw "ERROR: Couldn't find the '" + ClassName + "' class!\n";
std::vector<Record*> Defs;
for (std::map<std::string, Record*>::const_iterator I = getDefs().begin(),
E = getDefs().end(); I != E; ++I)
if (I->second->isSubClassOf(Class))
Defs.push_back(I->second);
return false;
return Defs;
}

View File

@ -319,6 +319,8 @@ class StringInit : public Init {
public:
StringInit(const std::string &V) : Value(V) {}
const std::string &getValue() const { return Value; }
virtual Init *convertInitializerTo(RecTy *Ty) {
return Ty->convertValue(this);
}
@ -592,6 +594,17 @@ public:
void resolveReferences();
void dump() const;
//===--------------------------------------------------------------------===//
// High-level methods useful to tablegen back-ends
//
/// getValueAsString - This method looks up the specified field and returns
/// its value as a string, throwing an exception if the field does not exist
/// or if the value is not a string.
///
std::string getValueAsString(const std::string &FieldName) const;
};
std::ostream &operator<<(std::ostream &OS, const Record &R);
@ -633,9 +646,9 @@ public:
/// getAllDerivedDefinitions - This method returns all concrete definitions
/// that derive from the specified class name. If a class with the specified
/// name does not exist, an error is printed and true is returned.
bool getAllDerivedDefinitions(const std::string &ClassName,
std::vector<Record*> &ReturnDefs) const;
/// name does not exist, an exception is thrown.
std::vector<Record*>
getAllDerivedDefinitions(const std::string &ClassName) const;
void dump() const;

View File

@ -452,6 +452,23 @@ std::ostream &operator<<(std::ostream &OS, const Record &R) {
return OS << "}\n";
}
/// getValueAsString - This method looks up the specified field and returns its
/// value as a string, throwing an exception if the field does not exist or if
/// the value is not a string.
///
std::string Record::getValueAsString(const std::string &FieldName) const {
const RecordVal *R = getValue(FieldName);
if (R == 0 || R->getValue() == 0)
throw "Record '" + R->getName() + "' does not have a field named '" +
FieldName + "!\n";
if (const StringInit *SI = dynamic_cast<const StringInit*>(R->getValue()))
return SI->getValue();
throw "Record '" + R->getName() + "', field '" + FieldName +
"' does not have a string initializer!";
}
void RecordKeeper::dump() const { std::cerr << *this; }
std::ostream &operator<<(std::ostream &OS, const RecordKeeper &RK) {
@ -473,18 +490,17 @@ std::ostream &operator<<(std::ostream &OS, const RecordKeeper &RK) {
/// getAllDerivedDefinitions - This method returns all concrete definitions
/// that derive from the specified class name. If a class with the specified
/// name does not exist, an error is printed and true is returned.
bool RecordKeeper::getAllDerivedDefinitions(const std::string &ClassName,
std::vector<Record*> &Defs) const {
std::vector<Record*>
RecordKeeper::getAllDerivedDefinitions(const std::string &ClassName) const {
Record *Class = Records.getClass(ClassName);
if (!Class) {
std::cerr << "ERROR: Couldn't find the '" << ClassName << "' class!\n";
return true;
}
if (!Class)
throw "ERROR: Couldn't find the '" + ClassName + "' class!\n";
std::vector<Record*> Defs;
for (std::map<std::string, Record*>::const_iterator I = getDefs().begin(),
E = getDefs().end(); I != E; ++I)
if (I->second->isSubClassOf(Class))
Defs.push_back(I->second);
return false;
return Defs;
}

View File

@ -319,6 +319,8 @@ class StringInit : public Init {
public:
StringInit(const std::string &V) : Value(V) {}
const std::string &getValue() const { return Value; }
virtual Init *convertInitializerTo(RecTy *Ty) {
return Ty->convertValue(this);
}
@ -592,6 +594,17 @@ public:
void resolveReferences();
void dump() const;
//===--------------------------------------------------------------------===//
// High-level methods useful to tablegen back-ends
//
/// getValueAsString - This method looks up the specified field and returns
/// its value as a string, throwing an exception if the field does not exist
/// or if the value is not a string.
///
std::string getValueAsString(const std::string &FieldName) const;
};
std::ostream &operator<<(std::ostream &OS, const Record &R);
@ -633,9 +646,9 @@ public:
/// getAllDerivedDefinitions - This method returns all concrete definitions
/// that derive from the specified class name. If a class with the specified
/// name does not exist, an error is printed and true is returned.
bool getAllDerivedDefinitions(const std::string &ClassName,
std::vector<Record*> &ReturnDefs) const;
/// name does not exist, an exception is thrown.
std::vector<Record*>
getAllDerivedDefinitions(const std::string &ClassName) const;
void dump() const;