--- ./texk/web2c/luatexdir/image/pdftoepdf.w 2018-01-23 07:12:10.789476867 +0000 +++ ../pdftoepdf.w 2018-01-23 08:08:05.626143676 +0000 @@ -27,6 +27,10 @@ /* This file is mostly C and not very much C++; it's just used to interface the functions of poppler, which happens to be written in C++. + Patches for the new poppler 0.59 from + https://www.mail-archive.com/arch-commits@archlinux.org/msg357548.html + with some modifications to comply the poppler API. + */ extern void md5(Guchar *msg, int msgLen, Guchar *digest); @@ -71,12 +75,7 @@ ck = (char *) malloc(PDF_CHECKSUM_SIZE); if (ck == NULL) formatted_error("pdf inclusion","out of memory while processing '%s'", a); - snprintf(ck, PDF_CHECKSUM_SIZE, "%" - PRIu64 - "_%" - PRIu64, - (uint64_t) size, - (uint64_t) mtime); + snprintf(ck, PDF_CHECKSUM_SIZE, "%"@= @>PRIu64@= @>"_%"@= @>PRIu64, (uint64_t) size,(uint64_t) mtime); } else { switch (fe) { case FE_FAIL: @@ -229,7 +228,7 @@ free(checksum); } if (pdf_doc->doc == NULL) { - docmemstream = new MemStream( docstream,0,streamsize, obj.initNull() ); + docmemstream = new MemStream( docstream,0,streamsize, Object(objNull) ); doc = new PDFDoc(docmemstream); /* takes ownership of docmemstream */ pdf_doc->pc++; if (!doc->isOk() || !doc->okToPrint()) { @@ -413,9 +412,8 @@ Object obj1; pdf_begin_array(pdf); for (i = 0, l = array->getLength(); i < l; ++i) { - array->getNF(i, &obj1); + obj1 = array->getNF(i); copyObject(pdf, pdf_doc, &obj1); - obj1.free(); } pdf_end_array(pdf); } @@ -427,9 +425,8 @@ pdf_begin_dict(pdf); for (i = 0, l = dict->getLength(); i < l; ++i) { copyName(pdf, dict->getKey(i)); - dict->getValNF(i, &obj1); + obj1 = dict->getValNF(i); copyObject(pdf, pdf_doc, &obj1); - obj1.free(); } pdf_end_dict(pdf); } @@ -515,13 +512,12 @@ PDFDoc *doc = pdf_doc->doc; xref = doc->getXRef(); for (r = pdf_doc->inObjList; r != NULL;) { - xref->fetch(r->ref.num, r->ref.gen, &obj1); + obj1 = xref->fetch(r->ref.num, r->ref.gen); if (obj1.isStream()) pdf_begin_obj(pdf, r->num, OBJSTM_NEVER); else pdf_begin_obj(pdf, r->num, 2); copyObject(pdf, pdf_doc, &obj1); - obj1.free(); pdf_end_obj(pdf); n = r->next; delete r; @@ -601,7 +597,7 @@ pdf_doc = refPdfDocument(img_filepath(idict), FE_FAIL); else if (img_type(idict) == IMG_TYPE_PDFMEMSTREAM) { pdf_doc = findPdfDocument(img_filepath(idict)) ; - if (pdf_doc == NULL ) + if (pdf_doc == NULL ) normal_error("pdf inclusion", "memstream not initialized"); if (pdf_doc->doc == NULL) normal_error("pdf inclusion", "memstream document is empty"); @@ -618,12 +614,12 @@ */ pdf_major_version_found = doc->getPDFMajorVersion(); pdf_minor_version_found = doc->getPDFMinorVersion(); - if ((pdf_major_version_found > 1) || (pdf_minor_version_found > img_pdfminorversion(idict))) { - const char *msg = "PDF inclusion: found PDF version '%d.%d', but at most version '1.%d' allowed"; + if ((100 * pdf_major_version_found + pdf_major_version_found) > (100 * img_pdfmajorversion(idict) + img_pdfminorversion(idict))) { + const char *msg = "PDF inclusion: found PDF version '%d.%d', but at most version '%d.%d' allowed"; if (img_errorlevel(idict) > 0) { - formatted_error("pdf inclusion",msg, pdf_major_version_found, pdf_minor_version_found, img_pdfminorversion(idict)); + formatted_error("pdf inclusion",msg, pdf_major_version_found, pdf_minor_version_found, img_pdfmajorversion(idict), img_pdfminorversion(idict)); } else { - formatted_warning("pdf inclusion",msg, pdf_major_version_found, pdf_minor_version_found, img_pdfminorversion(idict)); + formatted_warning("pdf inclusion",msg, pdf_major_version_found, pdf_minor_version_found, img_pdfmajorversion(idict), img_pdfminorversion(idict)); } } img_totalpages(idict) = catalog->getNumPages(); @@ -697,7 +693,7 @@ unrefPdfDocument(img_filepath(idict)); } - and also unref'd in the finalizer zo we got an extra unrefs when garbage was + and also unref'd in the finalizer so we got an extra unrefs when garbage was collected. However it is more efficient to keep the file open so we do that now. The (slower) alternative is to unref here (which in most cases forcing a close of the file) but then we must not call flush_pdf_info. @@ -745,7 +741,7 @@ catalog = doc->getCatalog(); page = catalog->getPage(img_pagenum(idict)); pageref = catalog->getPageRef(img_pagenum(idict)); - doc->getXRef()->fetch(pageref->num, pageref->gen, &pageobj); + pageobj = doc->getXRef()->fetch(pageref->num, pageref->gen); pageDict = pageobj.getDict(); /* write the Page header */ pdf_begin_obj(pdf, img_objnum(idict), OBJSTM_NEVER); @@ -762,12 +758,11 @@ pdf_dict_add_int(pdf, "PTEX.PageNumber", (int) img_pagenum(idict)); } if ((suppress_optional_info & 8) == 0) { - doc->getDocInfoNF(&obj1); + obj1 = doc->getDocInfoNF(); if (obj1.isRef()) { /* the info dict must be indirect (PDF Ref p. 61) */ pdf_dict_add_ref(pdf, "PTEX.InfoDict", addInObj(pdf, pdf_doc, obj1.getRef())); } - obj1.free(); } if (img_is_bbox(idict)) { bbox[0] = sp2bp(img_bbox(idict)[0]); @@ -793,19 +788,17 @@ Now all relevant parts of the Page dictionary are copied. Metadata validity check is needed(as a stream it must be indirect). */ - pageDict->lookupNF("Metadata", &obj1); + obj1 = pageDict->lookupNF("Metadata"); if (!obj1.isNull() && !obj1.isRef()) formatted_warning("pdf inclusion","/Metadata must be indirect object"); - obj1.free(); /* copy selected items in Page dictionary */ for (i = 0; pagedictkeys[i] != NULL; i++) { - pageDict->lookupNF(pagedictkeys[i], &obj1); + obj1 = pageDict->lookupNF(pagedictkeys[i]); if (!obj1.isNull()) { pdf_add_name(pdf, pagedictkeys[i]); /* preserves indirection */ copyObject(pdf, pdf_doc, &obj1); } - obj1.free(); } /* If there are no Resources in the Page dict of the embedded page, @@ -813,32 +806,28 @@ PDF file, climbing up the tree until the Resources are found. (This fixes a problem with Scribus 1.3.3.14.) */ - pageDict->lookupNF("Resources", &obj1); + obj1 = pageDict->lookupNF("Resources"); if (obj1.isNull()) { op1 = &pagesobj1; op2 = &pagesobj2; - pageDict->lookup("Parent", op1); + *op1 = pageDict->lookup("Parent"); while (op1->isDict()) { - obj1.free(); - op1->dictLookupNF("Resources", &obj1); + obj1 = op1->dictLookupNF("Resources"); if (!obj1.isNull()) { pdf_add_name(pdf, "Resources"); copyObject(pdf, pdf_doc, &obj1); break; } - op1->dictLookup("Parent", op2); + *op2 = op1->dictLookup("Parent"); optmp = op1; op1 = op2; op2 = optmp; - op2->free(); }; if (!op1->isDict()) formatted_warning("pdf inclusion","Page /Resources missing"); - op1->free(); } - obj1.free(); /* Write the Page contents. */ - page->getContents(&contents); + contents = page->getContents(); if (contents.isStream()) { /* Variant A: get stream and recompress under control of \pdfcompresslevel @@ -849,27 +838,23 @@ Variant B: copy stream without recompressing */ - contents.streamGetDict()->lookup("F", &obj1); + obj1 = contents.streamGetDict()->lookup("F"); if (!obj1.isNull()) { normal_error("pdf inclusion","unsupported external stream"); } - obj1.free(); - contents.streamGetDict()->lookup("Length", &obj1); + obj1 = contents.streamGetDict()->lookup("Length"); pdf_add_name(pdf, "Length"); copyObject(pdf, pdf_doc, &obj1); - obj1.free(); - contents.streamGetDict()->lookup("Filter", &obj1); + obj1 = contents.streamGetDict()->lookup("Filter"); if (!obj1.isNull()) { pdf_add_name(pdf, "Filter"); copyObject(pdf, pdf_doc, &obj1); - obj1.free(); - contents.streamGetDict()->lookup("DecodeParms", &obj1); + obj1 = contents.streamGetDict()->lookup("DecodeParms"); if (!obj1.isNull()) { pdf_add_name(pdf, "DecodeParms"); copyObject(pdf, pdf_doc, &obj1); } } - obj1.free(); pdf_end_dict(pdf); pdf_begin_stream(pdf); copyStreamStream(pdf, contents.getStream()->getUndecodedStream()); @@ -880,8 +865,8 @@ pdf_end_dict(pdf); pdf_begin_stream(pdf); for (i = 0, l = contents.arrayGetLength(); i < l; ++i) { - copyStreamStream(pdf, (contents.arrayGet(i, &obj1))->getStream()); - obj1.free(); + obj1 = contents.arrayGet(i); + copyStreamStream(pdf, obj1.getStream()); if (i < (l - 1)) { /* Put a space between streams to be on the safe side (streams @@ -902,14 +887,18 @@ } /* write out all indirect objects */ writeRefs(pdf, pdf_doc); - contents.free(); - pageobj.free(); /* unrefPdfDocument() must come after contents.free() and pageobj.free()! TH: The next line makes repeated pdf inclusion unacceptably slow unrefPdfDocument(img_filepath(idict)); */ + +if (! img_keepopen(idict)) { + unrefPdfDocument(img_filepath(idict)); +} + + } /* Deallocate a PdfDocument with all its resources. */ --- ./texk/web2c/luatexdir/lua/lepdflib.cc 2017-03-11 01:04:06.000000000 +0000 +++ ../lepdflib.cc 2018-01-23 08:07:59.790233165 +0000 @@ -21,7 +21,9 @@ #include "image/epdf.h" - +// Patches for the new poppler 0.59 from +// https://www.mail-archive.com/arch-commits@archlinux.org/msg357548.html +// with some modifications to comply the poppler API. // define DEBUG @@ -253,6 +255,12 @@ lua_settable(L,-3) +#define OBJECT_TYPE(name) \ + lua_pushstring(L, #name); \ + lua_pushinteger(L, (int)name); \ + lua_settable(L,-3) + + #define STRUCTELEMENT_TYPE_ENTRY(name) \ lua_pushstring(L, #name); \ lua_pushinteger(L, StructElement::name); \ @@ -306,6 +314,28 @@ return 1; } +static int l_Object_Type(lua_State * L) { + lua_createtable(L,0,16);/*nr of ObjType values*/ ; + OBJECT_TYPE(objBool); + OBJECT_TYPE(objInt); + OBJECT_TYPE(objReal); + OBJECT_TYPE(objString); + OBJECT_TYPE(objName); + OBJECT_TYPE(objNull); + OBJECT_TYPE(objArray); + OBJECT_TYPE(objDict); + OBJECT_TYPE(objStream); + OBJECT_TYPE(objRef); + OBJECT_TYPE(objCmd); + OBJECT_TYPE(objError); + OBJECT_TYPE(objEOF); + OBJECT_TYPE(objNone); + OBJECT_TYPE(objInt64); + OBJECT_TYPE(objDead); + return 1; +} + + static int l_StructElement_Type(lua_State * L) { lua_createtable (L, 0, 50); STRUCTELEMENT_TYPE_ENTRY(Document); @@ -398,14 +428,136 @@ static int l_new_Object(lua_State * L) { udstruct *uout; + int n = lua_gettop(L); // number of arguments uout = new_Object_userdata(L); - uout->d = new Object(); // automatic init to type "none" - uout->atype = ALLOC_LEPDF; - uout->pc = 0; - uout->pd = NULL; // not connected to any PDFDoc + switch(n) { + case 0: + uout->d = new Object(); // automatic init to type "none" + uout->atype = ALLOC_LEPDF; + uout->pc = 0; + uout->pd = NULL; // not connected to any PDFDoc + break; + case 1: + if (lua_isboolean (L,1)) { + uout->d = new Object(lua_toboolean(L, 1)? gTrue : gFalse); + uout->atype = ALLOC_LEPDF; + uout->pc = 0; + uout->pd = NULL; + } else if (lua_isnumber (L,1)) { + double d = lua_tonumber(L,1); + // Missed :Object(long long int64gA) + if (d==((int)d)) { + uout->d = new Object((int)d); + } else { + uout->d = new Object(d); + } + uout->atype = ALLOC_LEPDF; + uout->pc = 0; + uout->pd = NULL; + } else if (lua_isstring (L,1)){ + GooString *gs; + const char *s; + size_t len; + s = luaL_checklstring(L, 2, &len); + gs = new GooString(s, len); + uout->d = new Object(gs); + uout->atype = ALLOC_LEPDF; + uout->pc = 0; + uout->pd = NULL; + } else if (luaL_testudata(L,1,M_Array)){ + udstruct *u; + Array *a; + u = (udstruct *) luaL_checkudata(L, 1, M_Array); + a = (Array *)u->d; + uout->d = new Object(a); + uout->atype = ALLOC_LEPDF; + uout->pc = 0; + uout->pd = NULL; + } else if (luaL_testudata(L,1,M_Dict)){ + udstruct *u; + Dict *d; + u = (udstruct *) luaL_checkudata(L, 1, M_Dict); + d = (Dict *)u->d; + uout->d = new Object(d); + uout->atype = ALLOC_LEPDF; + uout->pc = 0; + uout->pd = NULL; + } else if (luaL_testudata(L,1,M_Stream)){ + udstruct *u; + Stream *s; + u = (udstruct *) luaL_checkudata(L, 1, M_Stream); + s = (Stream *)u->d; + *((Object *) uout->d) = Object(s); + } else + luaL_error(L, "Invalid/unsupported value for Object constructor"); + break; + case 2: + if (lua_isnumber (L,1) && lua_isnumber (L,2)) { + double numA = lua_tonumber(L,1); + double genA = lua_tonumber(L,2); + if ( ((numA)==(int)(numA)) && ((genA)==(int)(genA)) ){ + uout->d = new Object((int)(numA), (int)(genA)); + uout->atype = ALLOC_LEPDF; + uout->pc = 0; + uout->pd = NULL; + } + } else if (lua_isnumber (L,1) && (lua_isstring(L,2)|| lua_isnoneornil(L,2))) { + double d_typeA = lua_tonumber(L,1); + int typeA = (int)(d_typeA); + if (d_typeA==typeA){ + switch((int)(typeA)) { + case objBool: + case objInt: + case objReal: + case objString: + case objName: + case objNull: + case objArray: + case objDict: + case objStream: + case objRef: + case objCmd: + case objError: + case objEOF: + case objNone: + case objInt64: + case objDead: + if (lua_isstring(L,2)) + uout->d = new Object((ObjType)(typeA), luaL_checkstring(L, 2)); + else + uout->d = new Object((ObjType)(typeA)); + uout->atype = ALLOC_LEPDF; + uout->pc = 0; + uout->pd = NULL; + + break; + default: + luaL_error(L, "Invalid values for Object constructor"); + break; + }//switch((int)(d)) + } else // (d_typeA)!=(typeA) + luaL_error(L, "Invalid/unsupported values for Object constructor"); + } // if (lua_isnumber (L,1) && (lua_isstring(L,2)|| lua_isnoneornil(L,2))) + break; + default: + luaL_error(L, "Invalid specification for Object constructor"); + } + lua_settop(L,1); return 1; } +// static int l_new_Object(lua_State * L) +// { +// udstruct *uout; +// uout = new_Object_userdata(L); +// uout->d = new Object(); // automatic init to type "none" +// uout->atype = ALLOC_LEPDF; +// uout->pc = 0; +// uout->pd = NULL; // not connected to any PDFDoc +// return 1; +// } + + // PDFRectangle see Page.h static int l_new_PDFRectangle(lua_State * L) @@ -429,6 +581,7 @@ {"AttributeOwner_Type",l_AttributeOwner_Type}, {"Dict", l_new_Dict}, {"Object", l_new_Object}, + {"Object_Type", l_Object_Type}, {"PDFRectangle", l_new_PDFRectangle}, {NULL, NULL} // sentinel }; @@ -538,7 +691,7 @@ pdfdoc_changed_error(L); \ uout = new_Object_userdata(L); \ uout->d = new Object(); \ - ((in *) uin->d)->function((Object *) uout->d); \ + *((Object *)uout->d) = ((in *) uin->d)->function(); \ uout->atype = ALLOC_LEPDF; \ uout->pc = uin->pc; \ uout->pd = uin->pd; \ @@ -665,30 +818,27 @@ //********************************************************************** // Array - -static int m_Array_incRef(lua_State * L) -{ - int i; - udstruct *uin; - uin = (udstruct *) luaL_checkudata(L, 1, M_Array); - if (uin->pd != NULL && uin->pd->pc != uin->pc) - pdfdoc_changed_error(L); - i = ((Array *) uin->d)->incRef(); - lua_pushinteger(L, i); - return 1; -} - -static int m_Array_decRef(lua_State * L) -{ - int i; - udstruct *uin; - uin = (udstruct *) luaL_checkudata(L, 1, M_Array); - if (uin->pd != NULL && uin->pd->pc != uin->pc) - pdfdoc_changed_error(L); - i = ((Array *) uin->d)->decRef(); - lua_pushinteger(L, i); - return 1; -} +// Now private +// static int m_Array_incRef(lua_State * L) +// { +// udstruct *uin; +// uin = (udstruct *) luaL_checkudata(L, 1, M_Array); +// if (uin->pd != NULL && uin->pd->pc != uin->pc) +// pdfdoc_changed_error(L); +// lua_pushinteger(L, 1); +// return 1; +// } +// Now private +// static int m_Array_decRef(lua_State * L) +// { +// int i; +// udstruct *uin; +// uin = (udstruct *) luaL_checkudata(L, 1, M_Array); +// if (uin->pd != NULL && uin->pd->pc != uin->pc) +// pdfdoc_changed_error(L); +// lua_pushinteger(L, 1); +// return 1; +// } m_poppler_get_INT(Array, getLength); @@ -702,7 +852,7 @@ if ((uin->pd != NULL && uin->pd->pc != uin->pc) || (uobj->pd != NULL && uobj->pd->pc != uobj->pc)) pdfdoc_changed_error(L); - ((Array *) uin->d)->add(((Object *) uobj->d)); + ((Array *) uin->d)->add(std::move(*((Object *) uobj->d))); return 0; } @@ -718,7 +868,7 @@ if (i > 0 && i <= len) { uout = new_Object_userdata(L); uout->d = new Object(); - ((Array *) uin->d)->get(i - 1, (Object *) uout->d); + *((Object *) uout->d) = ((Array *) uin->d)->get(i - 1); uout->atype = ALLOC_LEPDF; uout->pc = uin->pc; uout->pd = uin->pd; @@ -739,7 +889,7 @@ if (i > 0 && i <= len) { uout = new_Object_userdata(L); uout->d = new Object(); - ((Array *) uin->d)->getNF(i - 1, (Object *) uout->d); + *((Object *) uout->d) = ((Array *) uin->d)->getNF(i - 1); uout->atype = ALLOC_LEPDF; uout->pc = uin->pc; uout->pd = uin->pd; @@ -773,8 +923,8 @@ m_poppler__tostring(Array); static const struct luaL_Reg Array_m[] = { - {"incRef", m_Array_incRef}, - {"decRef", m_Array_decRef}, + // {"incRef", m_Array_incRef},// Now private + // {"decRef", m_Array_decRef},// Now private {"getLength", m_Array_getLength}, {"add", m_Array_add}, {"get", m_Array_get}, @@ -950,30 +1100,26 @@ //********************************************************************** // Dict - -static int m_Dict_incRef(lua_State * L) -{ - int i; - udstruct *uin; - uin = (udstruct *) luaL_checkudata(L, 1, M_Dict); - if (uin->pd != NULL && uin->pd->pc != uin->pc) - pdfdoc_changed_error(L); - i = ((Dict *) uin->d)->incRef(); - lua_pushinteger(L, i); - return 1; -} - -static int m_Dict_decRef(lua_State * L) -{ - int i; - udstruct *uin; - uin = (udstruct *) luaL_checkudata(L, 1, M_Dict); - if (uin->pd != NULL && uin->pd->pc != uin->pc) - pdfdoc_changed_error(L); - i = ((Dict *) uin->d)->decRef(); - lua_pushinteger(L, i); - return 1; -} +// Now private +// static int m_Dict_incRef(lua_State * L) +// { +// udstruct *uin; +// uin = (udstruct *) luaL_checkudata(L, 1, M_Dict); +// if (uin->pd != NULL && uin->pd->pc != uin->pc) +// pdfdoc_changed_error(L); +// lua_pushinteger(L, 1); +// return 1; +// } +// Now private +// static int m_Dict_decRef(lua_State * L) +// { +// udstruct *uin; +// uin = (udstruct *) luaL_checkudata(L, 1, M_Dict); +// if (uin->pd != NULL && uin->pd->pc != uin->pc) +// pdfdoc_changed_error(L); +// lua_pushinteger(L, 1); +// return 1; +// } m_poppler_get_INT(Dict, getLength); @@ -986,7 +1132,7 @@ pdfdoc_changed_error(L); s = copyString(luaL_checkstring(L, 2)); uobj = (udstruct *) luaL_checkudata(L, 3, M_Object); - ((Dict *) uin->d)->add(s, ((Object *) uobj->d)); + ((Dict *) uin->d)->add(s, std::move(*((Object *) uobj->d))); return 0; } @@ -999,7 +1145,7 @@ pdfdoc_changed_error(L); s = luaL_checkstring(L, 2); uobj = (udstruct *) luaL_checkudata(L, 3, M_Object); - ((Dict *) uin->d)->set(s, ((Object *) uobj->d)); + ((Dict *) uin->d)->set(s, std::move(*((Object *) uobj->d))); return 0; } @@ -1027,7 +1173,7 @@ s = luaL_checkstring(L, 2); uout = new_Object_userdata(L); uout->d = new Object(); - ((Dict *) uin->d)->lookup(s, (Object *) uout->d); + *((Object *) uout->d) = ((Dict *) uin->d)->lookup(s); uout->atype = ALLOC_LEPDF; uout->pc = uin->pc; uout->pd = uin->pd; @@ -1044,7 +1190,7 @@ s = luaL_checkstring(L, 2); uout = new_Object_userdata(L); uout->d = new Object(); - ((Dict *) uin->d)->lookupNF(s, (Object *) uout->d); + *((Object *) uout->d) = ((Dict *) uin->d)->lookupNF(s); uout->atype = ALLOC_LEPDF; uout->pc = uin->pc; uout->pd = uin->pd; @@ -1096,7 +1242,7 @@ if (i > 0 && i <= len) { uout = new_Object_userdata(L); uout->d = new Object(); - ((Dict *) uin->d)->getVal(i - 1, (Object *) uout->d); + *((Object *) uout->d) = ((Dict *) uin->d)->getVal(i - 1); uout->atype = ALLOC_LEPDF; uout->pc = uin->pc; uout->pd = uin->pd; @@ -1117,7 +1263,7 @@ if (i > 0 && i <= len) { uout = new_Object_userdata(L); uout->d = new Object(); - ((Dict *) uin->d)->getValNF(i - 1, (Object *) uout->d); + *((Object *) uout->d) = ((Dict *) uin->d)->getValNF(i - 1); uout->atype = ALLOC_LEPDF; uout->pc = uin->pc; uout->pd = uin->pd; @@ -1131,8 +1277,8 @@ m_poppler__tostring(Dict); static const struct luaL_Reg Dict_m[] = { - {"incRef", m_Dict_incRef}, - {"decRef", m_Dict_decRef}, + // {"incRef", m_Dict_incRef},// Now private + // {"decRef", m_Dict_decRef},// Now private {"getLength", m_Dict_getLength}, {"add", m_Dict_add}, {"set", m_Dict_set}, @@ -1381,9 +1527,9 @@ pdfdoc_changed_error(L); luaL_checktype(L, 2, LUA_TBOOLEAN); if (lua_toboolean(L, 2) != 0) - ((Object *) uin->d)->initBool(gTrue); + *((Object *) uin->d) = Object(gTrue); else - ((Object *) uin->d)->initBool(gFalse); + *((Object *) uin->d) = Object(gFalse); return 0; } @@ -1395,7 +1541,7 @@ if (uin->pd != NULL && uin->pd->pc != uin->pc) pdfdoc_changed_error(L); i = luaL_checkint(L, 2); - ((Object *) uin->d)->initInt(i); + *((Object *) uin->d) = Object(i); return 0; } @@ -1407,7 +1553,7 @@ if (uin->pd != NULL && uin->pd->pc != uin->pc) pdfdoc_changed_error(L); d = luaL_checknumber(L, 2); - ((Object *) uin->d)->initReal(d); + *((Object *) uin->d) = Object(d); return 0; } @@ -1422,7 +1568,7 @@ pdfdoc_changed_error(L); s = luaL_checklstring(L, 2, &len); gs = new GooString(s, len); - ((Object *) uin->d)->initString(gs); + *((Object *) uin->d) = Object(gs); return 0; } @@ -1434,7 +1580,7 @@ if (uin->pd != NULL && uin->pd->pc != uin->pc) pdfdoc_changed_error(L); s = luaL_checkstring(L, 2); - ((Object *) uin->d)->initName(s); + *((Object *) uin->d) = Object(objName, s); return 0; } @@ -1444,13 +1590,14 @@ uin = (udstruct *) luaL_checkudata(L, 1, M_Object); if (uin->pd != NULL && uin->pd->pc != uin->pc) pdfdoc_changed_error(L); - ((Object *) uin->d)->initNull(); + *((Object *) uin->d) = Object(objNull); return 0; } static int m_Object_initArray(lua_State * L) { udstruct *uin, *uxref; + Array *a; uin = (udstruct *) luaL_checkudata(L, 1, M_Object); uxref = (udstruct *) luaL_checkudata(L, 2, M_XRef); if (uin->pd != NULL && uxref->pd != NULL && uin->pd != uxref->pd) @@ -1458,7 +1605,8 @@ if ((uin->pd != NULL && uin->pd->pc != uin->pc) || (uxref->pd != NULL && uxref->pd->pc != uxref->pc)) pdfdoc_changed_error(L); - ((Object *) uin->d)->initArray((XRef *) uxref->d); + a = new Array((XRef *) uxref->d); + *((Object *) uin->d) = Object(a); return 0; } @@ -1469,6 +1617,7 @@ static int m_Object_initDict(lua_State * L) { udstruct *uin, *uxref; + Dict *d; uin = (udstruct *) luaL_checkudata(L, 1, M_Object); uxref = (udstruct *) luaL_checkudata(L, 2, M_XRef); if (uin->pd != NULL && uxref->pd != NULL && uin->pd != uxref->pd) @@ -1476,7 +1625,8 @@ if ((uin->pd != NULL && uin->pd->pc != uin->pc) || (uxref->pd != NULL && uxref->pd->pc != uxref->pc)) pdfdoc_changed_error(L); - ((Object *) uin->d)->initDict((XRef *) uxref->d); + d = new Dict((XRef *) uxref->d); + *((Object *) uin->d) = Object(d); return 0; } @@ -1490,7 +1640,7 @@ if ((uin->pd != NULL && uin->pd->pc != uin->pc) || (ustream->pd != NULL && ustream->pd->pc != ustream->pc)) pdfdoc_changed_error(L); - ((Object *) uin->d)->initStream((Stream *) ustream->d); + *((Object *) uin->d) = Object((Stream *) ustream->d); return 0; } @@ -1503,7 +1653,7 @@ pdfdoc_changed_error(L); num = luaL_checkint(L, 2); gen = luaL_checkint(L, 3); - ((Object *) uin->d)->initRef(num, gen); + *((Object *) uin->d) = Object(num, gen); return 0; } @@ -1515,7 +1665,7 @@ if (uin->pd != NULL && uin->pd->pc != uin->pc) pdfdoc_changed_error(L); s = luaL_checkstring(L, 2); - ((Object *) uin->d)->initCmd(CHARP_CAST s); + *((Object *) uin->d) = Object(objCmd, CHARP_CAST s); return 0; } @@ -1525,7 +1675,7 @@ uin = (udstruct *) luaL_checkudata(L, 1, M_Object); if (uin->pd != NULL && uin->pd->pc != uin->pc) pdfdoc_changed_error(L); - ((Object *) uin->d)->initError(); + *((Object *) uin->d) = Object(objError); return 0; } @@ -1535,7 +1685,7 @@ uin = (udstruct *) luaL_checkudata(L, 1, M_Object); if (uin->pd != NULL && uin->pd->pc != uin->pc) pdfdoc_changed_error(L); - ((Object *) uin->d)->initEOF(); + *((Object *) uin->d) = Object(objEOF); return 0; } @@ -1551,7 +1701,7 @@ pdfdoc_changed_error(L); uout = new_Object_userdata(L); uout->d = new Object(); - ((Object *) uin->d)->fetch((XRef *) uxref->d, (Object *) uout->d); + *((Object *) uout->d) = ((Object *) uin->d)->fetch((XRef *) uxref->d); uout->atype = ALLOC_LEPDF; uout->pc = uin->pc; uout->pd = uin->pd; @@ -1816,7 +1966,7 @@ pdfdoc_changed_error(L); if (!((Object *) uin->d)->isArray()) luaL_error(L, "Object is not an Array"); - ((Object *) uin->d)->arrayAdd((Object *) uobj->d); + ((Object *) uin->d)->arrayAdd(std::move(*((Object *) uobj->d))); return 0; } @@ -1833,7 +1983,7 @@ if (i > 0 && i <= len) { uout = new_Object_userdata(L); uout->d = new Object(); - ((Object *) uin->d)->arrayGet(i - 1, (Object *) uout->d); + *((Object *) uout->d) = ((Object *) uin->d)->arrayGet(i - 1); uout->atype = ALLOC_LEPDF; uout->pc = uin->pc; uout->pd = uin->pd; @@ -1857,7 +2007,7 @@ if (i > 0 && i <= len) { uout = new_Object_userdata(L); uout->d = new Object(); - ((Object *) uin->d)->arrayGetNF(i - 1, (Object *) uout->d); + *((Object *) uout->d) = ((Object *) uin->d)->arrayGetNF(i - 1); uout->atype = ALLOC_LEPDF; uout->pc = uin->pc; uout->pd = uin->pd; @@ -1897,7 +2047,7 @@ pdfdoc_changed_error(L); if (!((Object *) uin->d)->isDict()) luaL_error(L, "Object is not a Dict"); - ((Object *) uin->d)->dictAdd(copyString(s), (Object *) uobj->d); + ((Object *) uin->d)->dictAdd(copyString(s), std::move(*((Object *) uobj->d))); return 0; } @@ -1915,7 +2065,7 @@ pdfdoc_changed_error(L); if (!((Object *) uin->d)->isDict()) luaL_error(L, "Object is not a Dict"); - ((Object *) uin->d)->dictSet(s, (Object *) uobj->d); + ((Object *) uin->d)->dictSet(s, std::move(*((Object *) uobj->d))); return 0; } @@ -1930,7 +2080,7 @@ if (((Object *) uin->d)->isDict()) { uout = new_Object_userdata(L); uout->d = new Object(); - ((Object *) uin->d)->dictLookup(s, (Object *) uout->d); + *((Object *) uout->d) = ((Object *) uin->d)->dictLookup(s); uout->atype = ALLOC_LEPDF; uout->pc = uin->pc; uout->pd = uin->pd; @@ -1950,7 +2100,7 @@ if (((Object *) uin->d)->isDict()) { uout = new_Object_userdata(L); uout->d = new Object(); - ((Object *) uin->d)->dictLookupNF(s, (Object *) uout->d); + *((Object *) uout->d) = ((Object *) uin->d)->dictLookupNF(s); uout->atype = ALLOC_LEPDF; uout->pc = uin->pc; uout->pd = uin->pd; @@ -1991,7 +2141,7 @@ if (i > 0 && i <= len) { uout = new_Object_userdata(L); uout->d = new Object(); - ((Object *) uin->d)->dictGetVal(i - 1, (Object *) uout->d); + *((Object *) uout->d) = ((Object *) uin->d)->dictGetVal(i - 1); uout->atype = ALLOC_LEPDF; uout->pc = uin->pc; uout->pd = uin->pd; @@ -2015,7 +2165,7 @@ if (i > 0 && i <= len) { uout = new_Object_userdata(L); uout->d = new Object(); - ((Object *) uin->d)->dictGetValNF(i - 1, (Object *) uout->d); + *((Object *) uout->d) = ((Object *) uin->d)->dictGetValNF(i - 1); uout->atype = ALLOC_LEPDF; uout->pc = uin->pc; uout->pd = uin->pd; @@ -2243,7 +2393,7 @@ m_poppler_get_poppler(Page, Dict, getPieceInfo); m_poppler_get_poppler(Page, Dict, getSeparationInfo); m_poppler_get_poppler(Page, Dict, getResourceDict); -m_poppler_get_OBJECT(Page, getAnnots); +m_poppler_get_OBJECT(Page, getAnnotsObject); m_poppler_get_OBJECT(Page, getContents); @@ -2270,7 +2420,7 @@ {"getPieceInfo", m_Page_getPieceInfo}, {"getSeparationInfo", m_Page_getSeparationInfo}, {"getResourceDict", m_Page_getResourceDict}, - {"getAnnots", m_Page_getAnnots}, + {"getAnnotsObject", m_Page_getAnnotsObject}, {"getContents", m_Page_getContents}, {"__tostring", m_Page__tostring}, {NULL, NULL} // sentinel @@ -2520,7 +2670,7 @@ if (((PdfDocument *) uin->d)->doc->getXRef()->isOk()) { uout = new_Object_userdata(L); uout->d = new Object(); - ((PdfDocument *) uin->d)->doc->getDocInfo((Object *) uout->d); + *((Object *) uout->d) = ((PdfDocument *) uin->d)->doc->getDocInfo(); uout->atype = ALLOC_LEPDF; uout->pc = uin->pc; uout->pd = uin->pd; @@ -2538,7 +2688,7 @@ if (((PdfDocument *) uin->d)->doc->getXRef()->isOk()) { uout = new_Object_userdata(L); uout->d = new Object(); - ((PdfDocument *) uin->d)->doc->getDocInfoNF((Object *) uout->d); + *((Object *) uout->d) = ((PdfDocument *) uin->d)->doc->getDocInfoNF(); uout->atype = ALLOC_LEPDF; uout->pc = uin->pc; uout->pd = uin->pd; @@ -2841,7 +2991,7 @@ uout = new_Object_userdata(L); uout->d = new Object(); origin = (Object *) (((Attribute *) uin->d)->getValue()); - origin->copy ( ((Object *)uout->d) ); + *((Object *) uout->d) = origin->copy(); uout->atype = ALLOC_LEPDF; uout->pc = uin->pc; uout->pd = uin->pd; @@ -3320,7 +3470,8 @@ parent = root->findParentElement(i-1); if (parent != NULL) { uout = new_StructElement_userdata(L); - uout->d = new StructElement( *parent ); + // see https://isocpp.org/wiki/faq/const-correctness#aliasing-and-const + uout->d = (StructElement *) parent; uout->atype = ALLOC_LEPDF; uout->pc = uin->pc; uout->pd = uin->pd; @@ -3331,7 +3482,6 @@ static const struct luaL_Reg StructTreeRoot_m[] = { - {"findParentElement", m_StructTreeRoot_findParentElement}, {"getDoc",m_StructTreeRoot_getDoc}, {"getRoleMap",m_StructTreeRoot_getRoleMap}, {"getClassMap",m_StructTreeRoot_getClassMap}, @@ -3370,7 +3520,7 @@ gen = luaL_checkint(L, 3); uout = new_Object_userdata(L); uout->d = new Object(); - ((XRef *) uin->d)->fetch(num, gen, (Object *) uout->d); + *((Object *) uout->d) = ((XRef *) uin->d)->fetch(num, gen); uout->atype = ALLOC_LEPDF; uout->pc = uin->pc; uout->pd = uin->pd; @@ -3449,7 +3599,7 @@ lua_setfield(L, -2, "__index"); \ lua_pushstring(L, "no user access"); \ lua_setfield(L, -2, "__metatable"); \ - luaL_register(L, NULL, type##_m) + luaL_openlib(L, NULL, type##_m, 0) #else #define setfuncs_meta(type) \ luaL_newmetatable(L, M_##type); \ @@ -3484,6 +3634,6 @@ setfuncs_meta(TextSpan); setfuncs_meta(XRef); setfuncs_meta(XRefEntry); - luaL_register(L, "epdf", epdflib_f); + luaL_openlib(L, "epdf", epdflib_f, 0); return 1; } --- ./texk/web2c/luatexdir/lua/lpdfscannerlib.cc 2016-11-25 18:09:15.000000000 +0000 +++ ../lpdfscannerlib.cc 2018-01-23 08:07:59.790233165 +0000 @@ -634,7 +634,7 @@ int i; for (i=0;iget(i, val); + *val = arrayref->get(i); if (val->isStream()) { ObjectList *rover = self->_streams; ObjectList *item = (ObjectList *)priv_xmalloc (sizeof(ObjectList)); @@ -944,8 +944,8 @@ luaL_openlib(L, 0, scannerlib_meta, 0); lua_pushvalue(L, -1); lua_setfield(L, -2, "__index"); - luaL_register(L, NULL, scannerlib_m); - luaL_register(L, "pdfscanner", scannerlib); + luaL_openlib(L, NULL, scannerlib_m, 0); + luaL_openlib(L, "pdfscanner", scannerlib, 0); return 1; } --- ./texk/web2c/luatexdir/image/image.h 2017-02-04 01:04:04.000000000 +0000 +++ ../image.h 2018-01-23 09:09:10.241949055 +0000 @@ -126,6 +126,7 @@ int luaref ; boolean keepopen; int errorlevel; + int pdfmajorversion; int pdfminorversion; union { pdf_stream_struct *pdfstream; @@ -171,6 +172,7 @@ # define img_luaref(N) ((N)->luaref) # define img_keepopen(N) ((N)->keepopen) # define img_errorlevel(N) ((N)->errorlevel) +# define img_pdfmajorversion(N) ((N)->pdfmajorversion) # define img_pdfminorversion(N) ((N)->pdfminorversion) # define img_pdfstream_ptr(N) ((N)->img_struct.pdfstream)