Google-ProtocolBuffers-Dynamic
view release on metacpan or search on metacpan
src/mapper.cpp view on Meta::CPAN
SV **target = av_fetch(array, av_top_index(array) + 1, 1);
copy_value(*target, value ? value : NULL);
}
int MapperField::list_size(HV *self) {
AV *array = get_read_array(self);
if (!array)
return 0;
return av_top_index(array) + 1;
}
SV *MapperField::get_list(HV *self) {
SV *array_ref = get_read_array_ref(self);
return array_ref ? array_ref : &PL_sv_undef;
}
void MapperField::set_list(HV *self, SV *ref) {
if (!SvROK(ref) || SvTYPE(SvRV(ref)) != SVt_PVAV)
croak("Value for field '%s' is not an array reference", field->full_name().c_str());
SV *field_ref = get_write_field(self);
if (!SvOK(field_ref)) {
SvUPGRADE(field_ref, SVt_RV);
SvROK_on(field_ref);
} else {
if (!SvROK(field_ref))
croak("Value of field '%s' is not a reference", field->full_name().c_str());
SvREFCNT_dec(SvRV(field_ref));
}
SvRV_set(field_ref, SvRV(ref));
SvREFCNT_inc(SvRV(field_ref));
}
SV *MapperField::get_map(HV *self) {
SV *hash_ref = get_read_hash_ref(self);
return hash_ref ? hash_ref : &PL_sv_undef;
}
void MapperField::set_map(HV *self, SV *ref) {
if (!SvROK(ref) || SvTYPE(SvRV(ref)) != SVt_PVHV)
croak("Value for field '%s' is not a hash reference", field->full_name().c_str());
SV *field_ref = get_write_field(self);
if (!SvOK(field_ref)) {
SvUPGRADE(field_ref, SVt_RV);
SvROK_on(field_ref);
} else {
if (!SvROK(field_ref))
croak("Value of field '%s' is not a reference", field->full_name().c_str());
SvREFCNT_dec(SvRV(field_ref));
}
SvRV_set(field_ref, SvRV(ref));
SvREFCNT_inc(SvRV(field_ref));
}
MethodMapper::MethodMapper(pTHX_ Dynamic *_registry, const string &method, const MessageDef *_input_def, const MessageDef *_output_def, bool client_streaming, bool server_streaming) :
registry(_registry),
input_def(_input_def),
output_def(_output_def) {
SET_THX_MEMBER;
registry->ref();
method_name_key_sv = newSVpvs_share("method");
serialize_key_sv = newSVpvs_share("serialize");
deserialize_key_sv = newSVpvs_share("deserialize");
method_name_sv = newSVpvn_share(method.data(), method.length(), 0);
serialize_sv = NULL;
deserialize_sv = NULL;
const char *grpc_name;
if (client_streaming) {
if (server_streaming) {
grpc_name = "Grpc::Client::BaseStub::_bidiRequest";
} else {
grpc_name = "Grpc::Client::BaseStub::_clientStreamRequest";
}
} else {
if (server_streaming) {
grpc_name = "Grpc::Client::BaseStub::_serverStreamRequest";
} else {
grpc_name = "Grpc::Client::BaseStub::_simpleRequest";
}
}
grpc_call_sv = get_cv(grpc_name, 0);
if (grpc_call_sv == NULL)
croak("Unable to resolve function '%s'", grpc_name);
}
MethodMapper::~MethodMapper() {
SvREFCNT_dec(method_name_key_sv);
SvREFCNT_dec(serialize_key_sv);
SvREFCNT_dec(deserialize_key_sv);
SvREFCNT_dec(method_name_sv);
SvREFCNT_dec(serialize_sv);
SvREFCNT_dec(deserialize_sv);
SvREFCNT_dec(grpc_call_sv);
// make sure this only goes away after inner destructors have completed
refcounted_mortalize(aTHX_ registry);
}
void MethodMapper::resolve_input_output() {
const Mapper *request_mapper = registry->find_mapper(input_def);
const Mapper *response_mapper = registry->find_mapper(output_def);
string request_encoder_name =
request_mapper->package_name()
+ string("::_static_encode");
SV *encode = (SV *) get_cv(request_encoder_name.c_str(), 0);
if (encode == NULL)
croak("Unable to find GRPC encoder in package '%s' for message '%s'",
request_mapper->package_name(), request_mapper->full_name());
serialize_sv = newRV_inc(encode);
string response_decoder_name =
response_mapper->package_name()
+ string("::_static_decode");
SV *decode = (SV *) get_cv(response_decoder_name.c_str(), 0);
if (decode == NULL)
croak("Unable to find GRPC decoder in package '%s' for message '%s'",
response_mapper->package_name(), response_mapper->full_name());
deserialize_sv = newRV_inc(decode);
}
WarnContext::WarnContext(pTHX) : chained_handler(NULL) {
CV *handler = get_cv("Google::ProtocolBuffers::Dynamic::Mapper::handle_warning", 0);
warn_handler = (SV*) handler;
}
void WarnContext::setup(pTHX) {
CV *handler = get_cv("Google::ProtocolBuffers::Dynamic::Mapper::handle_warning", 0);
CvXSUBANY(handler).any_ptr = new WarnContext(aTHX);
}
WarnContext *WarnContext::get(pTHX) {
CV *handler = get_cv("Google::ProtocolBuffers::Dynamic::Mapper::handle_warning", 0);
( run in 0.937 second using v1.01-cache-2.11-cpan-39bf76dae61 )