Coverage Report

Created: 2026-10-31 06:21

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/xpdf-4.06/xpdf/Object.cc
Line
Count
Source
1
//========================================================================
2
//
3
// Object.cc
4
//
5
// Copyright 1996-2003 Glyph & Cog, LLC
6
//
7
//========================================================================
8
9
#include <aconf.h>
10
11
#include <stddef.h>
12
#include "gmempp.h"
13
#include "Object.h"
14
#include "Array.h"
15
#include "Dict.h"
16
#include "Error.h"
17
#include "Stream.h"
18
#include "XRef.h"
19
20
//------------------------------------------------------------------------
21
// Object
22
//------------------------------------------------------------------------
23
24
const char *objTypeNames[numObjTypes] = {
25
  "boolean",
26
  "integer",
27
  "real",
28
  "string",
29
  "name",
30
  "null",
31
  "array",
32
  "dictionary",
33
  "stream",
34
  "ref",
35
  "cmd",
36
  "error",
37
  "eof",
38
  "none"
39
};
40
41
#ifdef DEBUG_OBJECT_MEM
42
#if MULTITHREADED
43
GAtomicCounter Object::numAlloc[numObjTypes] =
44
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
45
#else
46
long Object::numAlloc[numObjTypes] =
47
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
48
#endif
49
#endif // DEBUG_OBJECT_MEM
50
51
856k
Object *Object::initArray(XRef *xref) {
52
856k
  initObj(objArray);
53
856k
  array = new Array(xref);
54
856k
  return this;
55
856k
}
56
57
839k
Object *Object::initDict(XRef *xref) {
58
839k
  initObj(objDict);
59
839k
  dict = new Dict(xref);
60
839k
  return this;
61
839k
}
62
63
6.97k
Object *Object::initDict(Dict *dictA) {
64
6.97k
  initObj(objDict);
65
6.97k
  dict = dictA;
66
6.97k
  dict->incRef();
67
6.97k
  return this;
68
6.97k
}
69
70
567k
Object *Object::initStream(Stream *streamA) {
71
567k
  initObj(objStream);
72
567k
  stream = streamA;
73
567k
  return this;
74
567k
}
75
76
252M
Object *Object::copy(Object *obj) {
77
252M
  *obj = *this;
78
252M
  switch (type) {
79
763k
  case objString:
80
763k
    obj->string = string->copy();
81
763k
    break;
82
7.11M
  case objName:
83
7.11M
    obj->name = copyString(name);
84
7.11M
    break;
85
2.93M
  case objArray:
86
2.93M
    array->incRef();
87
2.93M
    break;
88
2.74M
  case objDict:
89
2.74M
    dict->incRef();
90
2.74M
    break;
91
985k
  case objStream:
92
985k
    obj->stream = stream->copy();
93
985k
    break;
94
28.3M
  case objCmd:
95
28.3M
    obj->cmd = copyString(cmd);
96
28.3M
    break;
97
209M
  default:
98
209M
    break;
99
252M
  }
100
#ifdef DEBUG_OBJECT_MEM
101
#if MULTITHREADED
102
  gAtomicIncrement(&numAlloc[type]);
103
#else
104
  ++numAlloc[type];
105
#endif
106
#endif
107
252M
  return obj;
108
252M
}
109
110
13.6M
Object *Object::fetch(XRef *xref, Object *obj, int recursion) {
111
13.6M
  return (type == objRef && xref) ?
112
11.2M
         xref->fetch(ref.num, ref.gen, obj, recursion) : copy(obj);
113
13.6M
}
114
115
597M
void Object::free() {
116
597M
  switch (type) {
117
1.85M
  case objString:
118
1.85M
    delete string;
119
1.85M
    break;
120
14.8M
  case objName:
121
14.8M
    gfree(name);
122
14.8M
    break;
123
3.79M
  case objArray:
124
3.79M
    if (!array->decRef()) {
125
855k
      delete array;
126
855k
    }
127
3.79M
    break;
128
3.58M
  case objDict:
129
3.58M
    if (!dict->decRef()) {
130
838k
      delete dict;
131
838k
    }
132
3.58M
    break;
133
1.55M
  case objStream:
134
1.55M
    delete stream;
135
1.55M
    break;
136
61.0M
  case objCmd:
137
61.0M
    gfree(cmd);
138
61.0M
    break;
139
511M
  default:
140
511M
    break;
141
597M
  }
142
#ifdef DEBUG_OBJECT_MEM
143
#if MULTITHREADED
144
  gAtomicDecrement(&numAlloc[type]);
145
#else
146
  --numAlloc[type];
147
#endif
148
#endif
149
597M
  type = objNone;
150
597M
}
151
152
575k
const char *Object::getTypeName() {
153
575k
  return objTypeNames[type];
154
575k
}
155
156
0
void Object::print(FILE *f) {
157
0
  Object obj;
158
0
  int i;
159
160
0
  switch (type) {
161
0
  case objBool:
162
0
    fprintf(f, "%s", booln ? "true" : "false");
163
0
    break;
164
0
  case objInt:
165
0
    fprintf(f, "%d", intg);
166
0
    break;
167
0
  case objReal:
168
0
    fprintf(f, "%g", real);
169
0
    break;
170
0
  case objString:
171
0
    fprintf(f, "(");
172
0
    fwrite(string->getCString(), 1, string->getLength(), f);
173
0
    fprintf(f, ")");
174
0
    break;
175
0
  case objName:
176
0
    fprintf(f, "/%s", name);
177
0
    break;
178
0
  case objNull:
179
0
    fprintf(f, "null");
180
0
    break;
181
0
  case objArray:
182
0
    fprintf(f, "[");
183
0
    for (i = 0; i < arrayGetLength(); ++i) {
184
0
      if (i > 0)
185
0
  fprintf(f, " ");
186
0
      arrayGetNF(i, &obj);
187
0
      obj.print(f);
188
0
      obj.free();
189
0
    }
190
0
    fprintf(f, "]");
191
0
    break;
192
0
  case objDict:
193
0
    fprintf(f, "<<");
194
0
    for (i = 0; i < dictGetLength(); ++i) {
195
0
      fprintf(f, " /%s ", dictGetKey(i));
196
0
      dictGetValNF(i, &obj);
197
0
      obj.print(f);
198
0
      obj.free();
199
0
    }
200
0
    fprintf(f, " >>");
201
0
    break;
202
0
  case objStream:
203
0
    fprintf(f, "<stream>");
204
0
    break;
205
0
  case objRef:
206
0
    fprintf(f, "%d %d R", ref.num, ref.gen);
207
0
    break;
208
0
  case objCmd:
209
0
    fprintf(f, "%s", cmd);
210
0
    break;
211
0
  case objError:
212
0
    fprintf(f, "<error>");
213
0
    break;
214
0
  case objEOF:
215
0
    fprintf(f, "<EOF>");
216
0
    break;
217
0
  case objNone:
218
0
    fprintf(f, "<none>");
219
0
    break;
220
0
  }
221
0
}
222
223
0
void Object::memCheck(FILE *f) {
224
#ifdef DEBUG_OBJECT_MEM
225
  int i;
226
  long t;
227
228
  t = 0;
229
  for (i = 0; i < numObjTypes; ++i) {
230
    t += numAlloc[i];
231
  }
232
  if (t > 0) {
233
    fprintf(f, "Allocated objects:\n");
234
    for (i = 0; i < numObjTypes; ++i) {
235
      if (numAlloc[i] > 0) {
236
  fprintf(f, "  %-20s: %6ld\n", objTypeNames[i], numAlloc[i]);
237
      }
238
    }
239
  }
240
#endif
241
0
}