64,639
社区成员
发帖
与我相关
我的任务
分享
const char* Message::_InternalParse(const char* ptr,
internal::ParseContext* ctx) {
class ReflectiveFieldParser {
public:
ReflectiveFieldParser(Message* msg, internal::ParseContext* ctx)
: ReflectiveFieldParser(msg, ctx, false) {}
void AddVarint(uint32 num, uint64 value) {
if (is_item_ && num == 2) {
if (!payload_.empty()) {
auto field = Field(value, 2);
if (field && field->message_type()) {
auto child = reflection_->MutableMessage(msg_, field);
// TODO(gerbens) signal error
child->ParsePartialFromString(payload_);
} else {
MutableUnknown()->AddLengthDelimited(value)->swap(payload_);
}
return;
}
type_id_ = value;
return;
}
auto field = Field(num, 0);
if (field) {
SetField(value, field, msg_, reflection_);
} else {
MutableUnknown()->AddVarint(num, value);
}
}
void AddFixed64(uint32 num, uint64 value) {
auto field = Field(num, 1);
if (field) {
SetField(value, field, msg_, reflection_);
} else {
MutableUnknown()->AddFixed64(num, value);
}
}
const char* ParseLengthDelimited(uint32 num, const char* ptr,
internal::ParseContext* ctx) {
if (is_item_ && num == 3) {
if (type_id_ == 0) {
return InlineGreedyStringParser(&payload_, ptr, ctx);
}
num = type_id_;
type_id_ = 0;
}
auto field = Field(num, 2);
if (field) {
return ParseLenDelim(num, field, msg_, reflection_, ptr, ctx);
} else {
return InlineGreedyStringParser(
MutableUnknown()->AddLengthDelimited(num), ptr, ctx);
}
}
const char* ParseGroup(uint32 num, const char* ptr,
internal::ParseContext* ctx) {
if (!is_item_ && descriptor_->options().message_set_wire_format() &&
num == 1) {
is_item_ = true;
ptr = ctx->ParseGroup(this, ptr, num * 8 + 3);
is_item_ = false;
type_id_ = 0;
return ptr;
}
auto field = Field(num, 3);
if (field) {
auto msg = GetGroup(num, field, msg_, reflection_);
return ctx->ParseGroup(msg, ptr, num * 8 + 3);
} else {
return UnknownFieldParse(num * 8 + 3, MutableUnknown(), ptr, ctx);
}
}
void AddFixed32(uint32 num, uint32 value) {
auto field = Field(num, 5);
if (field) {
SetField(value, field, msg_, reflection_);
} else {
MutableUnknown()->AddFixed32(num, value);
}
}
const char* _InternalParse(const char* ptr, internal::ParseContext* ctx) {
// We're parsing the a MessageSetItem
GOOGLE_DCHECK(is_item_);
return internal::WireFormatParser(*this, ptr, ctx);
}
private:
Message* msg_;
const Descriptor* descriptor_;
const Reflection* reflection_;
internal::ParseContext* ctx_;
UnknownFieldSet* unknown_ = nullptr;
bool is_item_ = false;
uint32 type_id_ = 0;
std::string payload_;
ReflectiveFieldParser(Message* msg, internal::ParseContext* ctx,
bool is_item)
: msg_(msg),
descriptor_(msg->GetDescriptor()),
reflection_(msg->GetReflection()),
ctx_(ctx),
is_item_(is_item) {
GOOGLE_CHECK(descriptor_) << msg->GetTypeName();
GOOGLE_CHECK(reflection_) << msg->GetTypeName();
}
const FieldDescriptor* Field(int num, int wire_type) {
auto field = descriptor_->FindFieldByNumber(num);
// If that failed, check if the field is an extension.
if (field == nullptr && descriptor_->IsExtensionNumber(num)) {
const DescriptorPool* pool = ctx_->data().pool;
if (pool == nullptr) {
field = reflection_->FindKnownExtensionByNumber(num);
} else {
field = pool->FindExtensionByNumber(descriptor_, num);
}
}
if (field == nullptr) return nullptr;
if (internal::WireFormat::WireTypeForFieldType(field->type()) !=
wire_type) {
if (field->is_packable()) {
if (wire_type ==
internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) {
return field;
}
}
return nullptr;
}
return field;
}
UnknownFieldSet* MutableUnknown() {
if (unknown_) return unknown_;
return unknown_ = reflection_->MutableUnknownFields(msg_);
}
};
ReflectiveFieldParser field_parser(this, ctx);
return internal::WireFormatParser(field_parser, ptr, ctx);
}
int main(int argc, const char * argv[]) {
class MA {
public :
MA() {printf("create...\n");}
~MA() {printf("delete...\n");}
};
MA ma;
return 0;
}