Update to new upb version (#7372)

pull/7377/head
Joshua Haberman 5 years ago committed by GitHub
parent 3be9322e28
commit 0d43ba41ee
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 10
      ruby/ext/google/protobuf_c/encode_decode.c
  2. 66
      ruby/ext/google/protobuf_c/map.c
  3. 2973
      ruby/ext/google/protobuf_c/upb.c
  4. 1663
      ruby/ext/google/protobuf_c/upb.h
  5. 2
      ruby/tests/common_tests.rb

@ -434,10 +434,8 @@ static void *startmap_handler(void *closure, const void *hd) {
} }
static bool endmap_handler(void *closure, const void *hd) { static bool endmap_handler(void *closure, const void *hd) {
MessageHeader* msg = closure; map_parse_frame_t* frame = closure;
const map_handlerdata_t* mapdata = hd; Map_set_frame(frame->map, Qnil);
VALUE map_rb = DEREF(msg, mapdata->ofs, VALUE);
Map_set_frame(map_rb, Qnil);
return true; return true;
} }
@ -1200,7 +1198,7 @@ static void putsubmsg(VALUE submsg, const upb_fielddef *f, upb_sink sink,
upb_sink_startsubmsg(sink, getsel(f, UPB_HANDLER_STARTSUBMSG), &subsink); upb_sink_startsubmsg(sink, getsel(f, UPB_HANDLER_STARTSUBMSG), &subsink);
putmsg(submsg, subdesc, subsink, depth + 1, emit_defaults, is_json, true); putmsg(submsg, subdesc, subsink, depth + 1, emit_defaults, is_json, true);
upb_sink_endsubmsg(sink, getsel(f, UPB_HANDLER_ENDSUBMSG)); upb_sink_endsubmsg(sink, subsink, getsel(f, UPB_HANDLER_ENDSUBMSG));
} }
static void putary(VALUE ary, const upb_fielddef* f, upb_sink sink, int depth, static void putary(VALUE ary, const upb_fielddef* f, upb_sink sink, int depth,
@ -1345,7 +1343,7 @@ static void putmap(VALUE map, const upb_fielddef* f, upb_sink sink, int depth,
entry_sink, emit_defaults, is_json); entry_sink, emit_defaults, is_json);
upb_sink_endmsg(entry_sink, &status); upb_sink_endmsg(entry_sink, &status);
upb_sink_endsubmsg(subsink, getsel(f, UPB_HANDLER_ENDSUBMSG)); upb_sink_endsubmsg(subsink, entry_sink, getsel(f, UPB_HANDLER_ENDSUBMSG));
} }
upb_sink_endseq(sink, getsel(f, UPB_HANDLER_ENDSEQ)); upb_sink_endseq(sink, getsel(f, UPB_HANDLER_ENDSEQ));

@ -100,11 +100,11 @@ static VALUE table_key(Map* self, VALUE key,
return key; return key;
} }
static VALUE table_key_to_ruby(Map* self, const char* buf, size_t length) { static VALUE table_key_to_ruby(Map* self, upb_strview key) {
switch (self->key_type) { switch (self->key_type) {
case UPB_TYPE_BYTES: case UPB_TYPE_BYTES:
case UPB_TYPE_STRING: { case UPB_TYPE_STRING: {
VALUE ret = rb_str_new(buf, length); VALUE ret = rb_str_new(key.data, key.size);
rb_enc_associate(ret, rb_enc_associate(ret,
(self->key_type == UPB_TYPE_BYTES) ? (self->key_type == UPB_TYPE_BYTES) ?
kRubyString8bitEncoding : kRubyStringUtf8Encoding); kRubyString8bitEncoding : kRubyStringUtf8Encoding);
@ -116,7 +116,7 @@ static VALUE table_key_to_ruby(Map* self, const char* buf, size_t length) {
case UPB_TYPE_INT64: case UPB_TYPE_INT64:
case UPB_TYPE_UINT32: case UPB_TYPE_UINT32:
case UPB_TYPE_UINT64: case UPB_TYPE_UINT64:
return native_slot_get(self->key_type, Qnil, buf); return native_slot_get(self->key_type, Qnil, key.data);
default: default:
assert(false); assert(false);
@ -289,9 +289,7 @@ VALUE Map_each(VALUE _self) {
for (upb_strtable_begin(&it, &self->table); for (upb_strtable_begin(&it, &self->table);
!upb_strtable_done(&it); !upb_strtable_done(&it);
upb_strtable_next(&it)) { upb_strtable_next(&it)) {
VALUE key = table_key_to_ruby(self, upb_strtable_iter_key(&it));
VALUE key = table_key_to_ruby(
self, upb_strtable_iter_key(&it), upb_strtable_iter_keylength(&it));
upb_value v = upb_strtable_iter_value(&it); upb_value v = upb_strtable_iter_value(&it);
void* mem = value_memory(&v); void* mem = value_memory(&v);
@ -319,9 +317,7 @@ VALUE Map_keys(VALUE _self) {
for (upb_strtable_begin(&it, &self->table); for (upb_strtable_begin(&it, &self->table);
!upb_strtable_done(&it); !upb_strtable_done(&it);
upb_strtable_next(&it)) { upb_strtable_next(&it)) {
VALUE key = table_key_to_ruby(self, upb_strtable_iter_key(&it));
VALUE key = table_key_to_ruby(
self, upb_strtable_iter_key(&it), upb_strtable_iter_keylength(&it));
rb_ary_push(ret, key); rb_ary_push(ret, key);
} }
@ -526,17 +522,14 @@ VALUE Map_dup(VALUE _self) {
for (upb_strtable_begin(&it, &self->table); for (upb_strtable_begin(&it, &self->table);
!upb_strtable_done(&it); !upb_strtable_done(&it);
upb_strtable_next(&it)) { upb_strtable_next(&it)) {
upb_strview k = upb_strtable_iter_key(&it);
upb_value v = upb_strtable_iter_value(&it); upb_value v = upb_strtable_iter_value(&it);
void* mem = value_memory(&v); void* mem = value_memory(&v);
upb_value dup; upb_value dup;
void* dup_mem = value_memory(&dup); void* dup_mem = value_memory(&dup);
native_slot_dup(self->value_type, dup_mem, mem); native_slot_dup(self->value_type, dup_mem, mem);
if (!upb_strtable_insert2(&new_self->table, if (!upb_strtable_insert2(&new_self->table, k.data, k.size, dup)) {
upb_strtable_iter_key(&it),
upb_strtable_iter_keylength(&it),
dup)) {
rb_raise(rb_eRuntimeError, "Error inserting value into new table"); rb_raise(rb_eRuntimeError, "Error inserting value into new table");
} }
} }
@ -554,7 +547,7 @@ VALUE Map_deep_copy(VALUE _self) {
for (upb_strtable_begin(&it, &self->table); for (upb_strtable_begin(&it, &self->table);
!upb_strtable_done(&it); !upb_strtable_done(&it);
upb_strtable_next(&it)) { upb_strtable_next(&it)) {
upb_strview k = upb_strtable_iter_key(&it);
upb_value v = upb_strtable_iter_value(&it); upb_value v = upb_strtable_iter_value(&it);
void* mem = value_memory(&v); void* mem = value_memory(&v);
upb_value dup; upb_value dup;
@ -562,10 +555,7 @@ VALUE Map_deep_copy(VALUE _self) {
native_slot_deep_copy(self->value_type, self->value_type_class, dup_mem, native_slot_deep_copy(self->value_type, self->value_type_class, dup_mem,
mem); mem);
if (!upb_strtable_insert2(&new_self->table, if (!upb_strtable_insert2(&new_self->table, k.data, k.size, dup)) {
upb_strtable_iter_key(&it),
upb_strtable_iter_keylength(&it),
dup)) {
rb_raise(rb_eRuntimeError, "Error inserting value into new table"); rb_raise(rb_eRuntimeError, "Error inserting value into new table");
} }
} }
@ -618,16 +608,13 @@ VALUE Map_eq(VALUE _self, VALUE _other) {
for (upb_strtable_begin(&it, &self->table); for (upb_strtable_begin(&it, &self->table);
!upb_strtable_done(&it); !upb_strtable_done(&it);
upb_strtable_next(&it)) { upb_strtable_next(&it)) {
upb_strview k = upb_strtable_iter_key(&it);
upb_value v = upb_strtable_iter_value(&it); upb_value v = upb_strtable_iter_value(&it);
void* mem = value_memory(&v); void* mem = value_memory(&v);
upb_value other_v; upb_value other_v;
void* other_mem = value_memory(&other_v); void* other_mem = value_memory(&other_v);
if (!upb_strtable_lookup2(&other->table, if (!upb_strtable_lookup2(&other->table, k.data, k.size, &other_v)) {
upb_strtable_iter_key(&it),
upb_strtable_iter_keylength(&it),
&other_v)) {
// Not present in other map. // Not present in other map.
return Qfalse; return Qfalse;
} }
@ -655,11 +642,9 @@ VALUE Map_hash(VALUE _self) {
VALUE hash_sym = rb_intern("hash"); VALUE hash_sym = rb_intern("hash");
upb_strtable_iter it; upb_strtable_iter it;
for (upb_strtable_begin(&it, &self->table); for (upb_strtable_begin(&it, &self->table); !upb_strtable_done(&it);
!upb_strtable_done(&it);
upb_strtable_next(&it)) { upb_strtable_next(&it)) {
VALUE key = table_key_to_ruby( VALUE key = table_key_to_ruby(self, upb_strtable_iter_key(&it));
self, upb_strtable_iter_key(&it), upb_strtable_iter_keylength(&it));
upb_value v = upb_strtable_iter_value(&it); upb_value v = upb_strtable_iter_value(&it);
void* mem = value_memory(&v); void* mem = value_memory(&v);
@ -687,8 +672,7 @@ VALUE Map_to_h(VALUE _self) {
for (upb_strtable_begin(&it, &self->table); for (upb_strtable_begin(&it, &self->table);
!upb_strtable_done(&it); !upb_strtable_done(&it);
upb_strtable_next(&it)) { upb_strtable_next(&it)) {
VALUE key = table_key_to_ruby( VALUE key = table_key_to_ruby(self, upb_strtable_iter_key(&it));
self, upb_strtable_iter_key(&it), upb_strtable_iter_keylength(&it));
upb_value v = upb_strtable_iter_value(&it); upb_value v = upb_strtable_iter_value(&it);
void* mem = value_memory(&v); void* mem = value_memory(&v);
VALUE value = native_slot_get(self->value_type, VALUE value = native_slot_get(self->value_type,
@ -720,11 +704,9 @@ VALUE Map_inspect(VALUE _self) {
VALUE inspect_sym = rb_intern("inspect"); VALUE inspect_sym = rb_intern("inspect");
upb_strtable_iter it; upb_strtable_iter it;
for (upb_strtable_begin(&it, &self->table); for (upb_strtable_begin(&it, &self->table); !upb_strtable_done(&it);
!upb_strtable_done(&it);
upb_strtable_next(&it)) { upb_strtable_next(&it)) {
VALUE key = table_key_to_ruby( VALUE key = table_key_to_ruby(self, upb_strtable_iter_key(&it));
self, upb_strtable_iter_key(&it), upb_strtable_iter_keylength(&it));
upb_value v = upb_strtable_iter_value(&it); upb_value v = upb_strtable_iter_value(&it);
void* mem = value_memory(&v); void* mem = value_memory(&v);
@ -785,20 +767,15 @@ VALUE Map_merge_into_self(VALUE _self, VALUE hashmap) {
for (upb_strtable_begin(&it, &other->table); for (upb_strtable_begin(&it, &other->table);
!upb_strtable_done(&it); !upb_strtable_done(&it);
upb_strtable_next(&it)) { upb_strtable_next(&it)) {
upb_strview k = upb_strtable_iter_key(&it);
// Replace any existing value by issuing a 'remove' operation first. // Replace any existing value by issuing a 'remove' operation first.
upb_value v; upb_value v;
upb_value oldv; upb_value oldv;
upb_strtable_remove2(&self->table, upb_strtable_remove2(&self->table, k.data, k.size, &oldv);
upb_strtable_iter_key(&it),
upb_strtable_iter_keylength(&it),
&oldv);
v = upb_strtable_iter_value(&it); v = upb_strtable_iter_value(&it);
upb_strtable_insert2(&self->table, upb_strtable_insert2(&self->table, k.data, k.size, v);
upb_strtable_iter_key(&it),
upb_strtable_iter_keylength(&it),
v);
} }
} else { } else {
rb_raise(rb_eArgError, "Unknown type merging into Map"); rb_raise(rb_eArgError, "Unknown type merging into Map");
@ -822,10 +799,7 @@ bool Map_done(Map_iter* iter) {
} }
VALUE Map_iter_key(Map_iter* iter) { VALUE Map_iter_key(Map_iter* iter) {
return table_key_to_ruby( return table_key_to_ruby(iter->self, upb_strtable_iter_key(&iter->it));
iter->self,
upb_strtable_iter_key(&iter->it),
upb_strtable_iter_keylength(&iter->it));
} }
VALUE Map_iter_value(Map_iter* iter) { VALUE Map_iter_value(Map_iter* iter) {

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

@ -1723,7 +1723,7 @@ module CommonTests
m.duration = Rational(3, 2) m.duration = Rational(3, 2)
assert_equal Google::Protobuf::Duration.new(seconds: 1, nanos: 500_000_000), m.duration assert_equal Google::Protobuf::Duration.new(seconds: 1, nanos: 500_000_000), m.duration
m.duration = BigDecimal.new("5") m.duration = BigDecimal("5")
assert_equal Google::Protobuf::Duration.new(seconds: 5, nanos: 0), m.duration assert_equal Google::Protobuf::Duration.new(seconds: 5, nanos: 0), m.duration
m = proto_module::TimeMessage.new(duration: 1.1) m = proto_module::TimeMessage.new(duration: 1.1)

Loading…
Cancel
Save