class Enum(Concrete):
+ __vid = 0
+
def __init__(self, name, values):
Concrete.__init__(self, name)
- self.values = values
+ self.vid = Enum.__vid
+ Enum.__vid += len(values)
+ self.values = list(values)
def visit(self, visitor, *args, **kwargs):
return visitor.visit_enum(self, *args, **kwargs)
def visit_enum(self, enum):
print 'static void __traceEnum%s(const %s value) {' % (enum.id, enum.expr)
+ n = len(enum.values)
+ for i in range(n):
+ value = enum.values[i]
+ print ' static const Trace::EnumSig sig%u = {%u, "%s", %s};' % (i, enum.vid + i, value, value)
+ print ' const Trace::EnumSig *sig;'
print ' switch(value) {'
- for value in enum.values:
+ for i in range(n):
+ value = enum.values[i]
print ' case %s:' % value
- print ' Trace::LiteralNamedConstant("%s", %s);' % (value, value)
+ print ' sig = &sig%u;' % i
print ' break;'
print ' default:'
print ' Trace::LiteralSInt(value);'
- print ' break;'
+ print ' return;'
print ' }'
+ print ' Trace::LiteralEnum(sig);'
print '}'
print
TYPE_DOUBLE,
TYPE_STRING, // Null terminated, human readible string
TYPE_BLOB, // Block of bytes
- TYPE_CONST,
+ TYPE_ENUM,
TYPE_BITMASK,
TYPE_ARRAY,
TYPE_STRUCT,
visitor.visit(this);
}
-void Const::visit(Visitor &visitor) {
+void Enum::visit(Visitor &visitor) {
visitor.visit(this);
}
os << literal << '"' << node->value << '"' << normal;
}
- void visit(Const *node) {
+ void visit(Enum *node) {
os << literal << node->name << normal;
}
static inline const Value *unwrap(const Value *node) {
- const Const *c = dynamic_cast<const Const *>(node);
+ const Enum *c = dynamic_cast<const Enum *>(node);
if (c)
return c->value;
return node;
};
-class Const : public Value
+class Enum : public Value
{
public:
- Const(std::string _name, Value *_value) : name(_name), value(_value) {}
+ Enum(std::string &_name, Value *_value) : name(_name), value(_value) {}
void visit(Visitor &visitor);
virtual void visit(UInt *) {assert(0);}
virtual void visit(Float *) {assert(0);}
virtual void visit(String *) {assert(0);}
- virtual void visit(Const *) {assert(0);}
+ virtual void visit(Enum *) {assert(0);}
virtual void visit(Bitmask *bitmask) {visit(static_cast<UInt *>(bitmask));}
virtual void visit(Array *) {assert(0);}
virtual void visit(Blob *) {assert(0);}
typedef std::map<size_t, Call::Signature *> FunctionMap;
FunctionMap functions;
+ typedef std::map<size_t, Enum *> EnumMap;
+ EnumMap enums;
+
typedef std::map<size_t, Bitmask::Signature *> BitmaskMap;
BitmaskMap bitmasks;
return parse_double();
case Trace::TYPE_STRING:
return parse_string();
- case Trace::TYPE_CONST:
- return parse_const();
+ case Trace::TYPE_ENUM:
+ return parse_enum();
case Trace::TYPE_BITMASK:
return parse_bitmask();
case Trace::TYPE_ARRAY:
return new String(read_string());
}
- Value *parse_const() {
- std::string name = read_name();
- Value *value = parse_value();
- return new Const(name, value);
+ Value *parse_enum() {
+ size_t id = read_uint();
+ Enum *sig;
+ EnumMap::const_iterator it = enums.find(id);
+ if (it == enums.end()) {
+ std::string name = read_string();
+ Value *value = parse_value();
+ sig = new Enum(name, value);
+ enums[id] = sig;
+ } else {
+ sig = it->second;
+ }
+ assert(sig);
+ return sig;
}
Value *parse_bitmask() {
static unsigned call_no = 0;
static std::map<Id, bool> functions;
+static std::map<Id, bool> enums;
static std::map<Id, bool> bitmasks;
WriteName(name);
}
-void BeginBitmask(void) {
- WriteByte(Trace::TYPE_BITMASK);
-}
-
-void EndBitmask(void) {
- WriteByte(Trace::TYPE_NULL);
-}
-
void LiteralBool(bool value) {
WriteByte(value ? Trace::TYPE_TRUE : Trace::TYPE_FALSE);
}
}
}
-void LiteralNamedConstant(const char *name, long long value) {
- WriteByte(Trace::TYPE_CONST);
- WriteName(name);
- LiteralSInt(value);
+void LiteralEnum(const EnumSig *sig) {
+ WriteByte(Trace::TYPE_ENUM);
+ WriteUInt(sig->id);
+ if (!enums[sig->id]) {
+ WriteString(sig->name);
+ LiteralSInt(sig->value);
+ enums[sig->id] = true;
+ }
}
void LiteralBitmask(const BitmaskSig &bitmask, unsigned long long value) {
const char **args;
};
+ struct EnumSig {
+ Id id;
+ const char *name;
+ signed long long value;
+ };
+
struct BitmaskVal {
const char *name;
unsigned long long value;
void LiteralString(const char *str, size_t size);
void LiteralWString(const wchar_t *str);
void LiteralBlob(const void *data, size_t size);
- void LiteralNamedConstant(const char *name, long long value);
+ void LiteralEnum(const EnumSig *sig);
void LiteralBitmask(const BitmaskSig &bitmask, unsigned long long value);
void LiteralNull(void);
void LiteralOpaque(const void *ptr);