2
1
mirror of https://github.com/qpdf/qpdf.git synced 2024-06-09 05:32:43 +00:00

Mark non-ABI symbols in exported class with QPDF_DLL_PRIVATE

This commit is contained in:
Jay Berkenbilt 2022-04-10 13:29:10 -04:00
parent 5525c93124
commit 5f4675bb24
12 changed files with 25 additions and 31 deletions

24
TODO
View File

@ -30,31 +30,17 @@ Misc
encryption dictionary normally. encryption dictionary normally.
* Have a warn in QPDF that passes its variable arguments onto QPDFExc * Have a warn in QPDF that passes its variable arguments onto QPDFExc
so you don't have to do warn(QPDFExc(...)) so you don't have to do warn(QPDFExc(...))
* Nice to have:
* Split qpdf.test into multiple tests
* Rework tests so that nothing is written into the source directory.
* Ideally then the entire build could be done with a read-only
source tree.
Soon: Break ground on "Document-level work" Soon: Break ground on "Document-level work"
cmake cmake
===== =====
* DLL.h
* The effect of QPDF_DLL_CLASS is to export everything in the class,
not just the vtable. On MSVC, we don't need this as the vtable
gets exported automatically when needed. With gcc, we need it to
export typeinfo and vtable. Whenever QPDF_DLL_CLASS is defined,
also define QPDF_DLL_LOCAL to __attribute__
((visibility("hidden"))). Then add QPDF_DLL_LOCAL to everything in
QPDF_DLL_CLASS that is not marked with QPDF_DLL. The effect is
that, with MSVC, only methods are marked QPDF_DLL are public
because QPDF_DLL_CLASS is empty. For gcc, only methods marked
QPDF_DLL are public because QPDF_DLL_LOCAL makes the other things
private. See https://gcc.gnu.org/wiki/Visibility. Make sure this
is documented.
* Update "CODING RULES" in "README-maintainer" - search for QPDF_DLL
* Nice to have:
* Split qpdf.test into multiple tests
* Rework tests so that nothing is written into the source directory.
* Ideally then the entire build could be done with a read-only
source tree.
* pikepdf * pikepdf
* https://github.com/pikepdf/pikepdf/pull/315 -- setup.py + docs * https://github.com/pikepdf/pikepdf/pull/315 -- setup.py + docs
* https://github.com/pikepdf/pikepdf/pull/316 -- setup.py only * https://github.com/pikepdf/pikepdf/pull/316 -- setup.py only

View File

@ -68,7 +68,9 @@ class QPDF_DLL_CLASS ClosedFileInputSource: public InputSource
ClosedFileInputSource(ClosedFileInputSource const&) = delete; ClosedFileInputSource(ClosedFileInputSource const&) = delete;
ClosedFileInputSource& operator=(ClosedFileInputSource const&) = delete; ClosedFileInputSource& operator=(ClosedFileInputSource const&) = delete;
QPDF_DLL_PRIVATE
void before(); void before();
QPDF_DLL_PRIVATE
void after(); void after();
class QPDF_DLL_PRIVATE Members class QPDF_DLL_PRIVATE Members

View File

@ -104,7 +104,7 @@ class QPDF_DLL_CLASS InputSource
qpdf_offset_t last_offset; qpdf_offset_t last_offset;
private: private:
class Members class QPDF_DLL_PRIVATE Members
{ {
friend class InputSource; friend class InputSource;

View File

@ -70,7 +70,9 @@ class QPDF_DLL_CLASS Pl_DCT: public Pipeline
virtual void finish(); virtual void finish();
private: private:
QPDF_DLL_PRIVATE
void compress(void* cinfo, Buffer*); void compress(void* cinfo, Buffer*);
QPDF_DLL_PRIVATE
void decompress(void* cinfo, Buffer*); void decompress(void* cinfo, Buffer*);
enum action_e { a_compress, a_decompress }; enum action_e { a_compress, a_decompress };

View File

@ -30,7 +30,6 @@ class QPDF_DLL_CLASS Pl_Flate: public Pipeline
{ {
public: public:
static unsigned int const def_bufsize = 65536; static unsigned int const def_bufsize = 65536;
static int compression_level;
enum action_e { a_inflate, a_deflate }; enum action_e { a_inflate, a_deflate };
@ -61,10 +60,16 @@ class QPDF_DLL_CLASS Pl_Flate: public Pipeline
void setWarnCallback(std::function<void(char const*, int)> callback); void setWarnCallback(std::function<void(char const*, int)> callback);
private: private:
QPDF_DLL_PRIVATE
void handleData(unsigned char* data, size_t len, int flush); void handleData(unsigned char* data, size_t len, int flush);
QPDF_DLL_PRIVATE
void checkError(char const* prefix, int error_code); void checkError(char const* prefix, int error_code);
QPDF_DLL_PRIVATE
void warn(char const*, int error_code); void warn(char const*, int error_code);
QPDF_DLL_PRIVATE
static int compression_level;
class QPDF_DLL_PRIVATE Members class QPDF_DLL_PRIVATE Members
{ {
friend class Pl_Flate; friend class Pl_Flate;

View File

@ -40,8 +40,11 @@ class QPDF_DLL_CLASS Pl_RunLength: public Pipeline
virtual void finish(); virtual void finish();
private: private:
QPDF_DLL_PRIVATE
void encode(unsigned char* data, size_t len); void encode(unsigned char* data, size_t len);
QPDF_DLL_PRIVATE
void decode(unsigned char* data, size_t len); void decode(unsigned char* data, size_t len);
QPDF_DLL_PRIVATE
void flush_encode(); void flush_encode();
enum state_e { st_top, st_copying, st_run }; enum state_e { st_top, st_copying, st_run };

View File

@ -66,6 +66,7 @@ class QPDF_DLL_CLASS QPDFExc: public std::runtime_error
std::string const& getMessageDetail() const; std::string const& getMessageDetail() const;
private: private:
QPDF_DLL_PRIVATE
static std::string createWhat( static std::string createWhat(
std::string const& filename, std::string const& filename,
std::string const& object, std::string const& object,

View File

@ -32,7 +32,7 @@
class QPDF; class QPDF;
class QPDFObjectHandle; class QPDFObjectHandle;
class QPDF_DLL_CLASS QPDFObject class QPDFObject
{ {
public: public:
QPDFObject(); QPDFObject();

View File

@ -204,6 +204,7 @@ class QPDFObjectHandle
void writeToken(QPDFTokenizer::Token const&); void writeToken(QPDFTokenizer::Token const&);
private: private:
QPDF_DLL_PRIVATE
void setPipeline(Pipeline*); void setPipeline(Pipeline*);
Pipeline* pipeline; Pipeline* pipeline;

View File

@ -47,6 +47,7 @@ class QPDF_DLL_CLASS QPDFSystemError: public std::runtime_error
int getErrno() const; int getErrno() const;
private: private:
QPDF_DLL_PRIVATE
static std::string static std::string
createWhat(std::string const& description, int system_errno); createWhat(std::string const& description, int system_errno);

View File

@ -34,9 +34,8 @@ class QPDF_DLL_CLASS RandomDataProvider
virtual void provideRandomData(unsigned char* data, size_t len) = 0; virtual void provideRandomData(unsigned char* data, size_t len) = 0;
protected: protected:
RandomDataProvider() QPDF_DLL_PRIVATE
{ RandomDataProvider() = default;
}
private: private:
RandomDataProvider(RandomDataProvider const&) = delete; RandomDataProvider(RandomDataProvider const&) = delete;

View File

@ -33,7 +33,6 @@
#include <qpdf/QPDFNameTreeObjectHelper.hh> #include <qpdf/QPDFNameTreeObjectHelper.hh>
#include <qpdf/QPDFNumberTreeObjectHelper.hh> #include <qpdf/QPDFNumberTreeObjectHelper.hh>
#include <qpdf/QPDFObjGen.hh> #include <qpdf/QPDFObjGen.hh>
#include <qpdf/QPDFObject.hh>
#include <qpdf/QPDFObjectHandle.hh> #include <qpdf/QPDFObjectHandle.hh>
#include <qpdf/QPDFOutlineDocumentHelper.hh> #include <qpdf/QPDFOutlineDocumentHelper.hh>
#include <qpdf/QPDFOutlineObjectHelper.hh> #include <qpdf/QPDFOutlineObjectHelper.hh>
@ -50,10 +49,6 @@
#define ignore_class(cls) #define ignore_class(cls)
#define print_size(cls) std::cout << #cls << " " << sizeof(cls) << std::endl #define print_size(cls) std::cout << #cls << " " << sizeof(cls) << std::endl
// This is public because of QPDF_DLL_CLASS on InputSource
// -------
ignore_class(InputSource::Members);
// These are not classes // These are not classes
// ------- // -------
ignore_class(QUtil); ignore_class(QUtil);
@ -105,7 +100,6 @@ main()
print_size(QPDFNumberTreeObjectHelper); print_size(QPDFNumberTreeObjectHelper);
print_size(QPDFNumberTreeObjectHelper::iterator); print_size(QPDFNumberTreeObjectHelper::iterator);
print_size(QPDFObjGen); print_size(QPDFObjGen);
print_size(QPDFObject);
print_size(QPDFObjectHandle); print_size(QPDFObjectHandle);
print_size(QPDFObjectHandle::ParserCallbacks); print_size(QPDFObjectHandle::ParserCallbacks);
print_size(QPDFObjectHandle::QPDFArrayItems); print_size(QPDFObjectHandle::QPDFArrayItems);