Exemplo n.º 1
0
// Handler to end a map entry: inserts the value defined during the message into
// the map. This is the 'endmsg' handler on the map entry msgdef.
static bool endmap_handler(void *closure, const void *hd, upb_status* s) {
    map_parse_frame_t* frame = closure;
    const map_handlerdata_t* mapdata = hd;

    VALUE key = native_slot_get(
                    mapdata->key_field_type, Qnil,
                    &frame->key_storage);

    VALUE value_field_typeclass = Qnil;
    VALUE value;

    if (mapdata->value_field_type == UPB_TYPE_MESSAGE ||
            mapdata->value_field_type == UPB_TYPE_ENUM) {
        value_field_typeclass = get_def_obj(mapdata->value_field_subdef);
    }

    value = native_slot_get(
                mapdata->value_field_type, value_field_typeclass,
                &frame->value_storage);

    Map_index_set(frame->map, key, value);
    free(frame);

    return true;
}
Exemplo n.º 2
0
static int merge_into_self_callback(VALUE key, VALUE value, VALUE self) {
  Map_index_set(self, key, value);
  return ST_CONTINUE;
}