Google-ProtocolBuffers-Dynamic

 view release on metacpan or  search on metacpan

src/dynamic.cpp  view on Meta::CPAN

#include "dynamic.h"
#include "mapper.h"
#include "servicedef.h"

#include "pb/gpb_mapping.h"

#include <sstream>

using namespace gpd;
using namespace std;
using namespace UMS_NS;
using namespace google::protobuf;
using namespace upb;
using namespace upb::googlepb;

#if PERL_VERSION < 10
    #undef  newCONSTSUB
    #define newCONSTSUB(a, b,c) Perl_newCONSTSUB(aTHX_ a, const_cast<char *>(b), c)

    #undef newXS
    #define newXS(a, b, c) Perl_newXS(aTHX_ const_cast<char *>(a), b, const_cast<char *>(c))
#endif

namespace {
    SV *get_stack_trace(pTHX) {
        dSP;

        PUSHMARK(SP);
        PUTBACK;

        call_pv("Google::ProtocolBuffers::Dynamic::_stack_trace", G_SCALAR);

        SPAGAIN;
        SV *stack_trace = POPs;
        PUTBACK;

        return stack_trace;
    }

    const string
        sym_ARGV    = "ARGV",
        sym_ARGVOUT = "ARGVOUT",
        sym_ENV     = "ENV",
        sym_INC     = "INC",
        sym_SIG     = "SIG",
        sym_STDIN   = "STDIN",
        sym_STDOUT  = "STDOUT",
        sym_STDERR  = "STDERR",

        sym_BEGIN     = "BEGIN",
        sym_CHECK     = "CHECK",
        sym_END       = "END",
        sym_INIT      = "INIT",
        sym_UNITCHECK = "UNITCHECK";

    // does the same job as S_gv_is_in_main in gv.c
    bool is_in_main(const string &name) {
        size_t length = name.length();

        switch (name[0]) {
        case '_':
            return length == 1;
        case 'A':
            return name == sym_ARGV || name == sym_ARGVOUT;
        case 'E':
            return name == sym_ENV;
        case 'I':
            return name == sym_INC;
        case 'S':
            return name == sym_SIG || name == sym_STDIN ||
                   name == sym_STDOUT || name == sym_STDERR;
        default:
            return false;
        }
    }

    bool is_special_sub(const string &name) {
        switch (name[0]) {
        case 'B':
            return name == sym_BEGIN;
        case 'C':
            return name == sym_CHECK;
        case 'E':
            return name == sym_END;
        case 'I':
            return name == sym_INIT;
        case 'U':
            return name == sym_UNITCHECK;
        default:
            return false;
        }
    }
}

MappingOptions::MappingOptions(pTHX_ SV *options_ref) :
        use_bigints(sizeof(IV) < sizeof(int64_t)),
        check_required_fields(true),
        explicit_defaults(false),
        encode_defaults(false),
        encode_defaults_proto3(false),
        check_enum_values(true),
        generic_extension_methods(true),
        implicit_maps(false),
        decode_blessed(true),
        fail_ref_coercion(false),
        no_redefine_perl_names(false),
        ignore_undef_fields(false),
        boolean_style(Perl),
        accessor_style(GetAndSet),
        client_services(Disable),
        default_decoder(Upb) {
    stack_trace = get_stack_trace(aTHX);

    if (options_ref == NULL || !SvOK(options_ref))
        return;
    if (!SvROK(options_ref) || SvTYPE(SvRV(options_ref)) != SVt_PVHV)
        croak("options must be a hash reference");
    HV *options = (HV *) SvRV(options_ref);

#define BOOLEAN_OPTION(field, name) { \
        SV **value = hv_fetchs(options, #name, 0); \
        if (value) \
            field = SvTRUE(*value); \
    }

    BOOLEAN_OPTION(use_bigints, use_bigints);
    BOOLEAN_OPTION(check_required_fields, check_required_fields);
    BOOLEAN_OPTION(explicit_defaults, explicit_defaults);
    BOOLEAN_OPTION(encode_defaults, encode_defaults);
    BOOLEAN_OPTION(encode_defaults_proto3, encode_defaults_proto3);
    BOOLEAN_OPTION(check_enum_values, check_enum_values);
    BOOLEAN_OPTION(generic_extension_methods, generic_extension_methods);
    BOOLEAN_OPTION(implicit_maps, implicit_maps);
    BOOLEAN_OPTION(decode_blessed, decode_blessed);
    BOOLEAN_OPTION(fail_ref_coercion, fail_ref_coercion);
    BOOLEAN_OPTION(ignore_undef_fields, ignore_undef_fields);

#undef BOOLEAN_OPTION

#define START_STRING_VALUE(name) \
    if (SV **value = hv_fetchs(options, #name, 0)) { \
        const char *buf = SvPV_nolen(*value); \
        \
        if (0 == 1)

#define STRING_VALUE(field, string, value) \
        else if (strEQ(buf, #string)) \
            field = value



( run in 1.230 second using v1.01-cache-2.11-cpan-39bf76dae61 )