From cf35baa1ad70f0dca734f93bcc2b54d8d059bcdd Mon Sep 17 00:00:00 2001 From: Joshua Haberman Date: Wed, 27 Mar 2019 15:32:05 -0700 Subject: Moved macros from upb.h to port_def.inc to avoid leaking them to users. (#160) * Use port_def.inc to prevent macros from leaking to users. * Added helpful comments to port_def.inc/port_undef.inc. --- upb/bindings/lua/msg.c | 2 + upb/bindings/stdc++/string.h | 4 ++ upb/decode.c | 2 + upb/def.c | 2 + upb/def.h | 4 ++ upb/encode.c | 2 + upb/generated_util.h | 4 ++ upb/handlers.c | 1 + upb/handlers.h | 4 ++ upb/json/parser.c | 140 ++++++++++++++++++++++--------------------- upb/json/parser.rl | 2 + upb/json/printer.c | 2 + upb/legacy_msg_reflection.c | 2 + upb/legacy_msg_reflection.h | 6 +- upb/msg.c | 2 + upb/msgfactory.c | 2 + upb/pb/compile_decoder.c | 2 + upb/pb/decoder.c | 2 + upb/pb/decoder.int.h | 4 ++ upb/pb/encoder.c | 1 + upb/pb/textprinter.c | 2 + upb/pb/varint.int.h | 4 ++ upb/port_def.inc | 103 ++++++++++++++++++++++++++++++- upb/port_undef.inc | 14 +++++ upb/sink.h | 4 ++ upb/table.c | 2 + upb/table.int.h | 4 ++ upb/upb.c | 5 +- upb/upb.h | 82 +------------------------ 29 files changed, 259 insertions(+), 151 deletions(-) (limited to 'upb') diff --git a/upb/bindings/lua/msg.c b/upb/bindings/lua/msg.c index 1e5e47c..4b8a854 100644 --- a/upb/bindings/lua/msg.c +++ b/upb/bindings/lua/msg.c @@ -14,6 +14,8 @@ #include "upb/legacy_msg_reflection.h" #include "upb/msg.h" +#include "upb/port_def.inc" + /* * Message/Array/Map objects can be constructed in one of two ways: * diff --git a/upb/bindings/stdc++/string.h b/upb/bindings/stdc++/string.h index 55b44cf..c346548 100644 --- a/upb/bindings/stdc++/string.h +++ b/upb/bindings/stdc++/string.h @@ -4,6 +4,8 @@ #include "upb/sink.h" +#include "upb/port_def.inc" + namespace upb { template @@ -62,4 +64,6 @@ class StringSink { } // namespace upb +#include "upb/port_undef.inc" + #endif // UPB_STDCPP_H_ diff --git a/upb/decode.c b/upb/decode.c index 996f36a..96622f9 100644 --- a/upb/decode.c +++ b/upb/decode.c @@ -3,6 +3,8 @@ #include "upb/upb.h" #include "upb/decode.h" +#include "upb/port_def.inc" + /* Maps descriptor type -> upb field type. */ const uint8_t upb_desctype_to_fieldtype[] = { UPB_WIRE_TYPE_END_GROUP, /* ENDGROUP */ diff --git a/upb/def.c b/upb/def.c index 6721bcb..b51f22a 100644 --- a/upb/def.c +++ b/upb/def.c @@ -7,6 +7,8 @@ #include #include "google/protobuf/descriptor.upb.h" +#include "upb/port_def.inc" + typedef struct { size_t len; char str[1]; /* Null-terminated string data follows. */ diff --git a/upb/def.h b/upb/def.h index c585aa8..c88ce90 100644 --- a/upb/def.h +++ b/upb/def.h @@ -37,6 +37,8 @@ class SymbolTable; } #endif +#include "upb/port_def.inc" + struct upb_enumdef; typedef struct upb_enumdef upb_enumdef; struct upb_fielddef; @@ -902,4 +904,6 @@ UPB_INLINE const char* upb_safecstr(const std::string& str) { #endif /* __cplusplus */ +#include "upb/port_undef.inc" + #endif /* UPB_DEF_H_ */ diff --git a/upb/encode.c b/upb/encode.c index 2bcf550..576d238 100644 --- a/upb/encode.c +++ b/upb/encode.c @@ -7,6 +7,8 @@ #include "upb/msg.h" #include "upb/upb.h" +#include "upb/port_def.inc" + #define UPB_PB_VARINT_MAX_LEN 10 #define CHK(x) do { if (!(x)) { return false; } } while(0) diff --git a/upb/generated_util.h b/upb/generated_util.h index 0d5e6ba..314a6d5 100644 --- a/upb/generated_util.h +++ b/upb/generated_util.h @@ -9,6 +9,8 @@ #include #include "upb/msg.h" +#include "upb/port_def.inc" + #define PTR_AT(msg, ofs, type) (type*)((const char*)msg + ofs) UPB_INLINE const void *_upb_array_accessor(const void *msg, size_t ofs, @@ -98,4 +100,6 @@ UPB_INLINE bool _upb_has_oneof_field(const void *msg, size_t case_ofs, int32_t n #undef PTR_AT +#include "upb/port_undef.inc" + #endif /* UPB_GENERATED_UTIL_H_ */ diff --git a/upb/handlers.c b/upb/handlers.c index a452663..844a360 100644 --- a/upb/handlers.c +++ b/upb/handlers.c @@ -9,6 +9,7 @@ #include "upb/sink.h" +#include "upb/port_def.inc" struct upb_handlers { upb_handlercache *cache; diff --git a/upb/handlers.h b/upb/handlers.h index cedd977..856be31 100644 --- a/upb/handlers.h +++ b/upb/handlers.h @@ -22,6 +22,8 @@ #include "upb/def.h" #include "upb/table.int.h" +#include "upb/port_def.inc" + #ifdef __cplusplus namespace upb { class HandlersPtr; @@ -725,4 +727,6 @@ bool upb_msg_getscalarhandlerdata(const upb_handlers *h, #include "upb/handlers-inl.h" +#include "upb/port_undef.inc" + #endif /* UPB_HANDLERS_H */ diff --git a/upb/json/parser.c b/upb/json/parser.c index 4040370..1e9d2fc 100644 --- a/upb/json/parser.c +++ b/upb/json/parser.c @@ -35,6 +35,8 @@ #include "upb/json/parser.h" #include "upb/pb/encoder.h" +#include "upb/port_def.inc" + #define UPB_JSON_MAX_DEPTH 64 /* Type of value message */ @@ -2542,11 +2544,11 @@ static bool does_fieldmask_end(upb_json_parser *p) { * final state once, when the closing '"' is seen. */ -#line 2747 "upb/json/parser.rl" +#line 2749 "upb/json/parser.rl" -#line 2550 "upb/json/parser.c" +#line 2552 "upb/json/parser.c" static const char _json_actions[] = { 0, 1, 0, 1, 1, 1, 3, 1, 4, 1, 6, 1, 7, 1, 8, 1, @@ -2801,7 +2803,7 @@ static const int json_en_value_machine = 78; static const int json_en_main = 1; -#line 2750 "upb/json/parser.rl" +#line 2752 "upb/json/parser.rl" size_t parse(void *closure, const void *hd, const char *buf, size_t size, const upb_bufhandle *handle) { @@ -2824,7 +2826,7 @@ size_t parse(void *closure, const void *hd, const char *buf, size_t size, capture_resume(parser, buf); -#line 2828 "upb/json/parser.c" +#line 2830 "upb/json/parser.c" { int _klen; unsigned int _trans; @@ -2899,147 +2901,147 @@ _match: switch ( *_acts++ ) { case 1: -#line 2555 "upb/json/parser.rl" +#line 2557 "upb/json/parser.rl" { p--; {cs = stack[--top]; goto _again;} } break; case 2: -#line 2557 "upb/json/parser.rl" +#line 2559 "upb/json/parser.rl" { p--; {stack[top++] = cs; cs = 23;goto _again;} } break; case 3: -#line 2561 "upb/json/parser.rl" +#line 2563 "upb/json/parser.rl" { start_text(parser, p); } break; case 4: -#line 2562 "upb/json/parser.rl" +#line 2564 "upb/json/parser.rl" { CHECK_RETURN_TOP(end_text(parser, p)); } break; case 5: -#line 2568 "upb/json/parser.rl" +#line 2570 "upb/json/parser.rl" { start_hex(parser); } break; case 6: -#line 2569 "upb/json/parser.rl" +#line 2571 "upb/json/parser.rl" { hexdigit(parser, p); } break; case 7: -#line 2570 "upb/json/parser.rl" +#line 2572 "upb/json/parser.rl" { CHECK_RETURN_TOP(end_hex(parser)); } break; case 8: -#line 2576 "upb/json/parser.rl" +#line 2578 "upb/json/parser.rl" { CHECK_RETURN_TOP(escape(parser, p)); } break; case 9: -#line 2582 "upb/json/parser.rl" +#line 2584 "upb/json/parser.rl" { p--; {cs = stack[--top]; goto _again;} } break; case 10: -#line 2587 "upb/json/parser.rl" +#line 2589 "upb/json/parser.rl" { start_year(parser, p); } break; case 11: -#line 2588 "upb/json/parser.rl" +#line 2590 "upb/json/parser.rl" { CHECK_RETURN_TOP(end_year(parser, p)); } break; case 12: -#line 2592 "upb/json/parser.rl" +#line 2594 "upb/json/parser.rl" { start_month(parser, p); } break; case 13: -#line 2593 "upb/json/parser.rl" +#line 2595 "upb/json/parser.rl" { CHECK_RETURN_TOP(end_month(parser, p)); } break; case 14: -#line 2597 "upb/json/parser.rl" +#line 2599 "upb/json/parser.rl" { start_day(parser, p); } break; case 15: -#line 2598 "upb/json/parser.rl" +#line 2600 "upb/json/parser.rl" { CHECK_RETURN_TOP(end_day(parser, p)); } break; case 16: -#line 2602 "upb/json/parser.rl" +#line 2604 "upb/json/parser.rl" { start_hour(parser, p); } break; case 17: -#line 2603 "upb/json/parser.rl" +#line 2605 "upb/json/parser.rl" { CHECK_RETURN_TOP(end_hour(parser, p)); } break; case 18: -#line 2607 "upb/json/parser.rl" +#line 2609 "upb/json/parser.rl" { start_minute(parser, p); } break; case 19: -#line 2608 "upb/json/parser.rl" +#line 2610 "upb/json/parser.rl" { CHECK_RETURN_TOP(end_minute(parser, p)); } break; case 20: -#line 2612 "upb/json/parser.rl" +#line 2614 "upb/json/parser.rl" { start_second(parser, p); } break; case 21: -#line 2613 "upb/json/parser.rl" +#line 2615 "upb/json/parser.rl" { CHECK_RETURN_TOP(end_second(parser, p)); } break; case 22: -#line 2618 "upb/json/parser.rl" +#line 2620 "upb/json/parser.rl" { start_duration_base(parser, p); } break; case 23: -#line 2619 "upb/json/parser.rl" +#line 2621 "upb/json/parser.rl" { CHECK_RETURN_TOP(end_duration_base(parser, p)); } break; case 24: -#line 2621 "upb/json/parser.rl" +#line 2623 "upb/json/parser.rl" { p--; {cs = stack[--top]; goto _again;} } break; case 25: -#line 2626 "upb/json/parser.rl" +#line 2628 "upb/json/parser.rl" { start_timestamp_base(parser); } break; case 26: -#line 2628 "upb/json/parser.rl" +#line 2630 "upb/json/parser.rl" { start_timestamp_fraction(parser, p); } break; case 27: -#line 2629 "upb/json/parser.rl" +#line 2631 "upb/json/parser.rl" { CHECK_RETURN_TOP(end_timestamp_fraction(parser, p)); } break; case 28: -#line 2631 "upb/json/parser.rl" +#line 2633 "upb/json/parser.rl" { start_timestamp_zone(parser, p); } break; case 29: -#line 2632 "upb/json/parser.rl" +#line 2634 "upb/json/parser.rl" { CHECK_RETURN_TOP(end_timestamp_zone(parser, p)); } break; case 30: -#line 2634 "upb/json/parser.rl" +#line 2636 "upb/json/parser.rl" { p--; {cs = stack[--top]; goto _again;} } break; case 31: -#line 2639 "upb/json/parser.rl" +#line 2641 "upb/json/parser.rl" { start_fieldmask_path_text(parser, p); } break; case 32: -#line 2640 "upb/json/parser.rl" +#line 2642 "upb/json/parser.rl" { end_fieldmask_path_text(parser, p); } break; case 33: -#line 2645 "upb/json/parser.rl" +#line 2647 "upb/json/parser.rl" { start_fieldmask_path(parser); } break; case 34: -#line 2646 "upb/json/parser.rl" +#line 2648 "upb/json/parser.rl" { end_fieldmask_path(parser); } break; case 35: -#line 2652 "upb/json/parser.rl" +#line 2654 "upb/json/parser.rl" { p--; {cs = stack[--top]; goto _again;} } break; case 36: -#line 2657 "upb/json/parser.rl" +#line 2659 "upb/json/parser.rl" { if (is_wellknown_msg(parser, UPB_WELLKNOWN_TIMESTAMP)) { {stack[top++] = cs; cs = 47;goto _again;} @@ -3053,11 +3055,11 @@ _match: } break; case 37: -#line 2670 "upb/json/parser.rl" +#line 2672 "upb/json/parser.rl" { p--; {stack[top++] = cs; cs = 78;goto _again;} } break; case 38: -#line 2675 "upb/json/parser.rl" +#line 2677 "upb/json/parser.rl" { if (is_wellknown_msg(parser, UPB_WELLKNOWN_ANY)) { start_any_member(parser, p); @@ -3067,11 +3069,11 @@ _match: } break; case 39: -#line 2682 "upb/json/parser.rl" +#line 2684 "upb/json/parser.rl" { CHECK_RETURN_TOP(end_membername(parser)); } break; case 40: -#line 2685 "upb/json/parser.rl" +#line 2687 "upb/json/parser.rl" { if (is_wellknown_msg(parser, UPB_WELLKNOWN_ANY)) { end_any_member(parser, p); @@ -3081,7 +3083,7 @@ _match: } break; case 41: -#line 2696 "upb/json/parser.rl" +#line 2698 "upb/json/parser.rl" { if (is_wellknown_msg(parser, UPB_WELLKNOWN_ANY)) { start_any_object(parser, p); @@ -3091,7 +3093,7 @@ _match: } break; case 42: -#line 2705 "upb/json/parser.rl" +#line 2707 "upb/json/parser.rl" { if (is_wellknown_msg(parser, UPB_WELLKNOWN_ANY)) { CHECK_RETURN_TOP(end_any_object(parser, p)); @@ -3101,54 +3103,54 @@ _match: } break; case 43: -#line 2717 "upb/json/parser.rl" +#line 2719 "upb/json/parser.rl" { CHECK_RETURN_TOP(start_array(parser)); } break; case 44: -#line 2721 "upb/json/parser.rl" +#line 2723 "upb/json/parser.rl" { end_array(parser); } break; case 45: -#line 2726 "upb/json/parser.rl" +#line 2728 "upb/json/parser.rl" { CHECK_RETURN_TOP(start_number(parser, p)); } break; case 46: -#line 2727 "upb/json/parser.rl" +#line 2729 "upb/json/parser.rl" { CHECK_RETURN_TOP(end_number(parser, p)); } break; case 47: -#line 2729 "upb/json/parser.rl" +#line 2731 "upb/json/parser.rl" { CHECK_RETURN_TOP(start_stringval(parser)); } break; case 48: -#line 2730 "upb/json/parser.rl" +#line 2732 "upb/json/parser.rl" { CHECK_RETURN_TOP(end_stringval(parser)); } break; case 49: -#line 2732 "upb/json/parser.rl" +#line 2734 "upb/json/parser.rl" { CHECK_RETURN_TOP(end_bool(parser, true)); } break; case 50: -#line 2734 "upb/json/parser.rl" +#line 2736 "upb/json/parser.rl" { CHECK_RETURN_TOP(end_bool(parser, false)); } break; case 51: -#line 2736 "upb/json/parser.rl" +#line 2738 "upb/json/parser.rl" { CHECK_RETURN_TOP(end_null(parser)); } break; case 52: -#line 2738 "upb/json/parser.rl" +#line 2740 "upb/json/parser.rl" { CHECK_RETURN_TOP(start_subobject_full(parser)); } break; case 53: -#line 2739 "upb/json/parser.rl" +#line 2741 "upb/json/parser.rl" { end_subobject_full(parser); } break; case 54: -#line 2744 "upb/json/parser.rl" +#line 2746 "upb/json/parser.rl" { p--; {cs = stack[--top]; goto _again;} } break; -#line 3152 "upb/json/parser.c" +#line 3154 "upb/json/parser.c" } } @@ -3165,32 +3167,32 @@ _again: while ( __nacts-- > 0 ) { switch ( *__acts++ ) { case 0: -#line 2553 "upb/json/parser.rl" +#line 2555 "upb/json/parser.rl" { p--; {cs = stack[--top]; if ( p == pe ) goto _test_eof; goto _again;} } break; case 46: -#line 2727 "upb/json/parser.rl" +#line 2729 "upb/json/parser.rl" { CHECK_RETURN_TOP(end_number(parser, p)); } break; case 49: -#line 2732 "upb/json/parser.rl" +#line 2734 "upb/json/parser.rl" { CHECK_RETURN_TOP(end_bool(parser, true)); } break; case 50: -#line 2734 "upb/json/parser.rl" +#line 2736 "upb/json/parser.rl" { CHECK_RETURN_TOP(end_bool(parser, false)); } break; case 51: -#line 2736 "upb/json/parser.rl" +#line 2738 "upb/json/parser.rl" { CHECK_RETURN_TOP(end_null(parser)); } break; case 53: -#line 2739 "upb/json/parser.rl" +#line 2741 "upb/json/parser.rl" { end_subobject_full(parser); } break; -#line 3194 "upb/json/parser.c" +#line 3196 "upb/json/parser.c" } } } @@ -3198,7 +3200,7 @@ goto _again;} } _out: {} } -#line 2772 "upb/json/parser.rl" +#line 2774 "upb/json/parser.rl" if (p != pe) { upb_status_seterrf(parser->status, "Parse error at '%.*s'\n", pe - p, p); @@ -3241,13 +3243,13 @@ static void json_parser_reset(upb_json_parser *p) { /* Emit Ragel initialization of the parser. */ -#line 3245 "upb/json/parser.c" +#line 3247 "upb/json/parser.c" { cs = json_start; top = 0; } -#line 2814 "upb/json/parser.rl" +#line 2816 "upb/json/parser.rl" p->current_state = cs; p->parser_top = top; accumulate_clear(p); diff --git a/upb/json/parser.rl b/upb/json/parser.rl index a48a47d..7e260a4 100644 --- a/upb/json/parser.rl +++ b/upb/json/parser.rl @@ -33,6 +33,8 @@ #include "upb/json/parser.h" #include "upb/pb/encoder.h" +#include "upb/port_def.inc" + #define UPB_JSON_MAX_DEPTH 64 /* Type of value message */ diff --git a/upb/json/printer.c b/upb/json/printer.c index 72f26b2..37482a8 100644 --- a/upb/json/printer.c +++ b/upb/json/printer.c @@ -10,6 +10,8 @@ #include #include +#include "upb/port_def.inc" + struct upb_json_printer { upb_sink input_; /* BytesSink closure. */ diff --git a/upb/legacy_msg_reflection.c b/upb/legacy_msg_reflection.c index 0140533..0683dde 100644 --- a/upb/legacy_msg_reflection.c +++ b/upb/legacy_msg_reflection.c @@ -5,6 +5,8 @@ #include "upb/table.int.h" #include "upb/msg.h" +#include "upb/port_def.inc" + bool upb_fieldtype_mapkeyok(upb_fieldtype_t type) { return type == UPB_TYPE_BOOL || type == UPB_TYPE_INT32 || type == UPB_TYPE_UINT32 || type == UPB_TYPE_INT64 || diff --git a/upb/legacy_msg_reflection.h b/upb/legacy_msg_reflection.h index 66d3fba..32a621b 100644 --- a/upb/legacy_msg_reflection.h +++ b/upb/legacy_msg_reflection.h @@ -5,6 +5,8 @@ #include "upb/upb.h" #include "upb/msg.h" +#include "upb/port_def.inc" + struct upb_map; typedef struct upb_map upb_map; @@ -183,4 +185,6 @@ upb_msgval upb_mapiter_value(const upb_mapiter *i); void upb_mapiter_setdone(upb_mapiter *i); bool upb_mapiter_isequal(const upb_mapiter *i1, const upb_mapiter *i2); -#endif // UPB_LEGACY_MSG_REFLECTION_H_ +#include "upb/port_undef.inc" + +#endif /* UPB_LEGACY_MSG_REFLECTION_H_ */ diff --git a/upb/msg.c b/upb/msg.c index d6ad8df..ca2766c 100644 --- a/upb/msg.c +++ b/upb/msg.c @@ -3,6 +3,8 @@ #include "upb/table.int.h" +#include "upb/port_def.inc" + #define VOIDPTR_AT(msg, ofs) (void*)((char*)msg + ofs) /* Internal members of a upb_msg. We can change this without breaking binary diff --git a/upb/msgfactory.c b/upb/msgfactory.c index 2e13199..4ecf272 100644 --- a/upb/msgfactory.c +++ b/upb/msgfactory.c @@ -1,6 +1,8 @@ #include "upb/msgfactory.h" +#include "upb/port_def.inc" + static bool is_power_of_two(size_t val) { return (val & (val - 1)) == 0; } diff --git a/upb/pb/compile_decoder.c b/upb/pb/compile_decoder.c index 89f000a..a7d1ac3 100644 --- a/upb/pb/compile_decoder.c +++ b/upb/pb/compile_decoder.c @@ -15,6 +15,8 @@ #include #endif +#include "upb/port_def.inc" + #define MAXLABEL 5 #define EMPTYLABEL -1 diff --git a/upb/pb/decoder.c b/upb/pb/decoder.c index 2384312..a7a5e7b 100644 --- a/upb/pb/decoder.c +++ b/upb/pb/decoder.c @@ -22,6 +22,8 @@ #include #endif +#include "upb/port_def.inc" + #define CHECK_SUSPEND(x) if (!(x)) return upb_pbdecoder_suspend(d); /* Error messages that are shared between the bytecode and JIT decoders. */ diff --git a/upb/pb/decoder.int.h b/upb/pb/decoder.int.h index 42fd7f8..3ed50df 100644 --- a/upb/pb/decoder.int.h +++ b/upb/pb/decoder.int.h @@ -11,6 +11,8 @@ #include "upb/sink.h" #include "upb/table.int.h" +#include "upb/port_def.inc" + /* Opcode definitions. The canonical meaning of each opcode is its * implementation in the interpreter (the JIT is written to match this). * @@ -303,4 +305,6 @@ UPB_INLINE void upb_pbdecoder_unpackdispatch(uint64_t dispatch, uint64_t *ofs, #define CHECK_RETURN(x) { int32_t ret = x; if (ret >= 0) return ret; } +#include "upb/port_undef.inc" + #endif /* UPB_DECODER_INT_H_ */ diff --git a/upb/pb/encoder.c b/upb/pb/encoder.c index 5f74010..e7092a8 100644 --- a/upb/pb/encoder.c +++ b/upb/pb/encoder.c @@ -57,6 +57,7 @@ #include "upb/pb/encoder.h" #include "upb/pb/varint.int.h" +#include "upb/port_def.inc" /* The output buffer is divided into segments; a segment is a string of data * that is "ready to go" -- it does not need any varint lengths inserted into diff --git a/upb/pb/textprinter.c b/upb/pb/textprinter.c index 934130e..7aafffc 100644 --- a/upb/pb/textprinter.c +++ b/upb/pb/textprinter.c @@ -16,6 +16,8 @@ #include "upb/sink.h" +#include "upb/port_def.inc" + struct upb_textprinter { upb_sink input_; upb_bytessink output_; diff --git a/upb/pb/varint.int.h b/upb/pb/varint.int.h index b216a94..ddda694 100644 --- a/upb/pb/varint.int.h +++ b/upb/pb/varint.int.h @@ -11,6 +11,8 @@ #include #include "upb/upb.h" +#include "upb/port_def.inc" + #ifdef __cplusplus extern "C" { #endif @@ -153,4 +155,6 @@ UPB_INLINE uint64_t upb_vencode32(uint32_t val) { } /* extern "C" */ #endif +#include "upb/port_undef.inc" + #endif /* UPB_VARINT_DECODER_H_ */ diff --git a/upb/port_def.inc b/upb/port_def.inc index fe975a0..1b343d8 100644 --- a/upb/port_def.inc +++ b/upb/port_def.inc @@ -1,4 +1,25 @@ - +/* +* This is where we define macros used across upb. +* +* All of these macros are undef'd in port_undef.inc to avoid leaking them to +* users. +* +* The correct usage is: +* +* #include "upb/foobar.h" +* #include "upb/baz.h" +* +* // MUST be last included header. +* #include "upb/port_def.inc" +* +* // Code for this file. +* // <...> +* +* // Can be omitted for .c files, required for .h. +* #include "upb/port_undef.inc" +* +* This file is private and must not be included by users! +*/ #ifndef UINTPTR_MAX #error must include stdint.h first #endif @@ -20,3 +41,83 @@ #define UPB_WRITE_ONEOF(msg, fieldtype, offset, value, case_offset, case_val) \ UPB_FIELD_AT(msg, int, case_offset) = case_val; \ UPB_FIELD_AT(msg, fieldtype, offset) = value; + +/* UPB_INLINE: inline if possible, emit standalone code if required. */ +#ifdef __cplusplus +#define UPB_INLINE inline +#elif defined (__GNUC__) +#define UPB_INLINE static __inline__ +#else +#define UPB_INLINE static +#endif + +/* Hints to the compiler about likely/unlikely branches. */ +#define UPB_LIKELY(x) __builtin_expect((x),1) + +/* Define UPB_BIG_ENDIAN manually if you're on big endian and your compiler + * doesn't provide these preprocessor symbols. */ +#if defined(__BYTE_ORDER__) && (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__) +#define UPB_BIG_ENDIAN +#endif + +/* Macros for function attributes on compilers that support them. */ +#ifdef __GNUC__ +#define UPB_FORCEINLINE __inline__ __attribute__((always_inline)) +#define UPB_NOINLINE __attribute__((noinline)) +#define UPB_NORETURN __attribute__((__noreturn__)) +#else /* !defined(__GNUC__) */ +#define UPB_FORCEINLINE +#define UPB_NOINLINE +#define UPB_NORETURN +#endif + +#if __STDC_VERSION__ >= 199901L || __cplusplus >= 201103L +/* C99/C++11 versions. */ +#include +#define _upb_snprintf snprintf +#define _upb_vsnprintf vsnprintf +#define _upb_va_copy(a, b) va_copy(a, b) +#elif defined __GNUC__ +/* A few hacky workarounds for functions not in C89. + * For internal use only! + * TODO(haberman): fix these by including our own implementations, or finding + * another workaround. + */ +#define _upb_snprintf __builtin_snprintf +#define _upb_vsnprintf __builtin_vsnprintf +#define _upb_va_copy(a, b) __va_copy(a, b) +#else +#error Need implementations of [v]snprintf and va_copy +#endif + +#ifdef __cplusplus +#if __cplusplus >= 201103L || defined(__GXX_EXPERIMENTAL_CXX0X__) || \ + (defined(_MSC_VER) && _MSC_VER >= 1900) +// C++11 is present +#else +#error upb requires C++11 for C++ support +#endif +#endif + +#define UPB_MAX(x, y) ((x) > (y) ? (x) : (y)) +#define UPB_MIN(x, y) ((x) < (y) ? (x) : (y)) + +#define UPB_UNUSED(var) (void)var + +/* UPB_ASSERT(): in release mode, we use the expression without letting it be + * evaluated. This prevents "unused variable" warnings. */ +#ifdef NDEBUG +#define UPB_ASSERT(expr) do {} while (false && (expr)) +#else +#define UPB_ASSERT(expr) assert(expr) +#endif + +/* UPB_ASSERT_DEBUGVAR(): assert that uses functions or variables that only + * exist in debug mode. This turns into regular assert. */ +#define UPB_ASSERT_DEBUGVAR(expr) assert(expr) + +#ifdef __GNUC__ +#define UPB_UNREACHABLE() do { assert(0); __builtin_unreachable(); } while(0) +#else +#define UPB_UNREACHABLE() do { assert(0); } while(0) +#endif diff --git a/upb/port_undef.inc b/upb/port_undef.inc index 7db97ca..bfd2a08 100644 --- a/upb/port_undef.inc +++ b/upb/port_undef.inc @@ -1,5 +1,19 @@ +/* See port_def.inc. This should #undef all macros #defined there. */ #undef UPB_SIZE #undef UPB_FIELD_AT #undef UPB_READ_ONEOF #undef UPB_WRITE_ONEOF +#undef UPB_INLINE +#undef UPB_FORCEINLINE +#undef UPB_NOINLINE +#undef UPB_NORETURN +#undef UPB_MAX +#undef UPB_MIN +#undef UPB_UNUSED +#undef UPB_ASSERT +#undef UPB_ASSERT_DEBUGVAR +#undef UPB_UNREACHABLE +#undef _upb_snprintf +#undef _upb_vsnprintf +#undef _upb_va_copy diff --git a/upb/sink.h b/upb/sink.h index 4d6d0a3..47d218a 100644 --- a/upb/sink.h +++ b/upb/sink.h @@ -20,6 +20,8 @@ #include "upb/handlers.h" +#include "upb/port_def.inc" + #ifdef __cplusplus namespace upb { class BytesSink; @@ -509,4 +511,6 @@ template bool PutBuffer(const T& str, BytesSink sink) { #endif /* __cplusplus */ +#include "upb/port_undef.inc" + #endif diff --git a/upb/table.c b/upb/table.c index 128f607..429861e 100644 --- a/upb/table.c +++ b/upb/table.c @@ -8,6 +8,8 @@ #include +#include "upb/port_def.inc" + #define UPB_MAXARRSIZE 16 /* 64k. */ /* From Chromium. */ diff --git a/upb/table.int.h b/upb/table.int.h index 2b86390..762d449 100644 --- a/upb/table.int.h +++ b/upb/table.int.h @@ -24,6 +24,8 @@ #include #include "upb/upb.h" +#include "upb/port_def.inc" + #ifdef __cplusplus extern "C" { #endif @@ -500,4 +502,6 @@ bool upb_inttable_iter_isequal(const upb_inttable_iter *i1, } /* extern "C" */ #endif +#include "upb/port_undef.inc" + #endif /* UPB_TABLE_H_ */ diff --git a/upb/upb.c b/upb/upb.c index 0cf5b50..266ea7d 100644 --- a/upb/upb.c +++ b/upb/upb.c @@ -1,4 +1,6 @@ +#include "upb/upb.h" + #include #include #include @@ -6,7 +8,8 @@ #include #include #include -#include "upb/upb.h" + +#include "upb/port_def.inc" /* Guarantee null-termination and provide ellipsis truncation. * It may be tempting to "optimize" this by initializing these final diff --git a/upb/upb.h b/upb/upb.h index 49bb757..7b5d1c1 100644 --- a/upb/upb.h +++ b/upb/upb.h @@ -24,85 +24,7 @@ template class InlinedArena; } #endif -/* UPB_INLINE: inline if possible, emit standalone code if required. */ -#ifdef __cplusplus -#define UPB_INLINE inline -#elif defined (__GNUC__) -#define UPB_INLINE static __inline__ -#else -#define UPB_INLINE static -#endif - -/* Hints to the compiler about likely/unlikely branches. */ -#define UPB_LIKELY(x) __builtin_expect((x),1) - -/* Define UPB_BIG_ENDIAN manually if you're on big endian and your compiler - * doesn't provide these preprocessor symbols. */ -#if defined(__BYTE_ORDER__) && (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__) -#define UPB_BIG_ENDIAN -#endif - -/* Macros for function attributes on compilers that support them. */ -#ifdef __GNUC__ -#define UPB_FORCEINLINE __inline__ __attribute__((always_inline)) -#define UPB_NOINLINE __attribute__((noinline)) -#define UPB_NORETURN __attribute__((__noreturn__)) -#else /* !defined(__GNUC__) */ -#define UPB_FORCEINLINE -#define UPB_NOINLINE -#define UPB_NORETURN -#endif - -#if __STDC_VERSION__ >= 199901L || __cplusplus >= 201103L -/* C99/C++11 versions. */ -#include -#define _upb_snprintf snprintf -#define _upb_vsnprintf vsnprintf -#define _upb_va_copy(a, b) va_copy(a, b) -#elif defined __GNUC__ -/* A few hacky workarounds for functions not in C89. - * For internal use only! - * TODO(haberman): fix these by including our own implementations, or finding - * another workaround. - */ -#define _upb_snprintf __builtin_snprintf -#define _upb_vsnprintf __builtin_vsnprintf -#define _upb_va_copy(a, b) __va_copy(a, b) -#else -#error Need implementations of [v]snprintf and va_copy -#endif - -#ifdef __cplusplus -#if __cplusplus >= 201103L || defined(__GXX_EXPERIMENTAL_CXX0X__) || \ - (defined(_MSC_VER) && _MSC_VER >= 1900) -// C++11 is present -#else -#error upb requires C++11 for C++ support -#endif -#endif - -#define UPB_MAX(x, y) ((x) > (y) ? (x) : (y)) -#define UPB_MIN(x, y) ((x) < (y) ? (x) : (y)) - -#define UPB_UNUSED(var) (void)var - -/* UPB_ASSERT(): in release mode, we use the expression without letting it be - * evaluated. This prevents "unused variable" warnings. */ -#ifdef NDEBUG -#define UPB_ASSERT(expr) do {} while (false && (expr)) -#else -#define UPB_ASSERT(expr) assert(expr) -#endif - -/* UPB_ASSERT_DEBUGVAR(): assert that uses functions or variables that only - * exist in debug mode. This turns into regular assert. */ -#define UPB_ASSERT_DEBUGVAR(expr) assert(expr) - -#ifdef __GNUC__ -#define UPB_UNREACHABLE() do { assert(0); __builtin_unreachable(); } while(0) -#else -#define UPB_UNREACHABLE() do { assert(0); } while(0) -#endif +#include "upb/port_def.inc" /* upb_status *****************************************************************/ @@ -429,4 +351,6 @@ typedef enum { extern const uint8_t upb_desctype_to_fieldtype[]; +#include "upb/port_undef.inc" + #endif /* UPB_H_ */ -- cgit v1.2.3