- void parse_arg(Call *call) {
- unsigned index = read_uint();
- Value *value = parse_value();
- if (index >= call->args.size()) {
- call->args.resize(index + 1);
- }
- call->args[index] = value;
- }
-
- Value *parse_value(void) {
- int c;
- c = read_byte();
- switch(c) {
- case Trace::TYPE_NULL:
- return new Null;
- case Trace::TYPE_FALSE:
- return new Bool(false);
- case Trace::TYPE_TRUE:
- return new Bool(true);
- case Trace::TYPE_SINT:
- return parse_sint();
- case Trace::TYPE_UINT:
- return parse_uint();
- case Trace::TYPE_FLOAT:
- return parse_float();
- case Trace::TYPE_DOUBLE:
- return parse_double();
- case Trace::TYPE_STRING:
- return parse_string();
- case Trace::TYPE_ENUM:
- return parse_enum();
- case Trace::TYPE_BITMASK:
- return parse_bitmask();
- case Trace::TYPE_ARRAY:
- return parse_array();
- case Trace::TYPE_STRUCT:
- return parse_struct();
- case Trace::TYPE_BLOB:
- return parse_blob();
- case Trace::TYPE_OPAQUE:
- return parse_opaque();
- default:
- std::cerr << "error: unknown type " << c << "\n";
- assert(0);
- return NULL;
- }
- }