Skip to content

Commit 08eecdd

Browse files
ZigzagAKAleksey Konovkin
andauthored
Fix a bug that callbacks are never freed (#33)
fixes #32 Co-authored-by: Aleksey Konovkin <aleksey.konovkin@nexign.com>
1 parent 147e623 commit 08eecdd

3 files changed

Lines changed: 30 additions & 59 deletions

File tree

xmlua/html-sax-parser.lua

Lines changed: 10 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,7 @@ local function create_start_document_callback(user_callback)
2020
user_callback()
2121
end
2222
local c_callback = ffi.cast("startDocumentSAXFunc", callback)
23-
ffi.gc(c_callback, function() c_callback:free() end)
24-
return c_callback
23+
return ffi.gc(c_callback, c_callback.free)
2524
end
2625

2726
local function create_processing_instruction_callback(user_callback)
@@ -31,8 +30,7 @@ local function create_processing_instruction_callback(user_callback)
3130
user_callback(target, data)
3231
end
3332
local c_callback = ffi.cast("processingInstructionSAXFunc", callback)
34-
ffi.gc(c_callback, function() c_callback:free() end)
35-
return c_callback
33+
return ffi.gc(c_callback, c_callback.free)
3634
end
3735

3836
local function create_cdata_block_callback(user_callback)
@@ -41,8 +39,7 @@ local function create_cdata_block_callback(user_callback)
4139
user_callback(cdata_block)
4240
end
4341
local c_callback = ffi.cast("cdataBlockSAXFunc", callback)
44-
ffi.gc(c_callback, function() c_callback:free() end)
45-
return c_callback
42+
return ffi.gc(c_callback, c_callback.free)
4643
end
4744

4845
local function create_ignorable_whitespace_callback(user_callback)
@@ -51,17 +48,15 @@ local function create_ignorable_whitespace_callback(user_callback)
5148
user_callback(ignorable_whitespaces)
5249
end
5350
local c_callback = ffi.cast("ignorableWhitespaceSAXFunc", callback)
54-
ffi.gc(c_callback, function() c_callback:free() end)
55-
return c_callback
51+
return ffi.gc(c_callback, c_callback.free)
5652
end
5753

5854
local function create_comment_callback(user_callback)
5955
local callback = function(user_data, raw_comment)
6056
user_callback(to_string(raw_comment))
6157
end
6258
local c_callback = ffi.cast("commentSAXFunc", callback)
63-
ffi.gc(c_callback, function() c_callback:free() end)
64-
return c_callback
59+
return ffi.gc(c_callback, c_callback.free)
6560
end
6661

6762
local function create_start_element_callback(user_callback)
@@ -89,44 +84,39 @@ local function create_start_element_callback(user_callback)
8984
user_callback(to_string(raw_name), attributes)
9085
end
9186
local c_callback = ffi.cast("startElementSAXFunc", callback)
92-
ffi.gc(c_callback, function() c_callback:free() end)
93-
return c_callback
87+
return ffi.gc(c_callback, c_callback.free)
9488
end
9589

9690
local function create_end_element_callback(user_callback)
9791
local callback = function(user_data, raw_name)
9892
user_callback(to_string(raw_name))
9993
end
10094
local c_callback = ffi.cast("endElementSAXFunc", callback)
101-
ffi.gc(c_callback, function() c_callback:free() end)
102-
return c_callback
95+
return ffi.gc(c_callback, c_callback.free)
10396
end
10497

10598
local function create_text_callback(user_callback)
10699
local callback = function(user_data, raw_text, raw_length)
107100
user_callback(to_string(raw_text, raw_length))
108101
end
109102
local c_callback = ffi.cast("charactersSAXFunc", callback)
110-
ffi.gc(c_callback, function() c_callback:free() end)
111-
return c_callback
103+
return ffi.gc(c_callback, c_callback.free)
112104
end
113105

114106
local function create_end_document_callback(user_callback)
115107
local callback = function(user_data)
116108
user_callback()
117109
end
118110
local c_callback = ffi.cast("endDocumentSAXFunc", callback)
119-
ffi.gc(c_callback, function() c_callback:free() end)
120-
return c_callback
111+
return ffi.gc(c_callback, c_callback.free)
121112
end
122113

123114
local function create_error_callback(user_callback)
124115
local callback = function(user_data, raw_xml_error)
125116
user_callback(converter.convert_xml_error(raw_xml_error))
126117
end
127118
local c_callback = ffi.cast("xmlStructuredErrorFunc", callback)
128-
ffi.gc(c_callback, function() c_callback:free() end)
129-
return c_callback
119+
return ffi.gc(c_callback, c_callback.free)
130120
end
131121

132122
function metatable.__newindex(parser, key, value)

xmlua/libxml2.lua

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -604,7 +604,7 @@ jit.off(libxml2.xmlSaveTree)
604604
local function error_ignore(user_data, err)
605605
end
606606
local c_error_ignore = ffi.cast("xmlStructuredErrorFunc", error_ignore)
607-
ffi.gc(c_error_ignore, function(callback) callback:free() end)
607+
ffi.gc(c_error_ignore, c_error_ignore.free)
608608

609609
function libxml2.xmlXPathNewContext(document)
610610
local context = xml2.xmlXPathNewContext(document)

xmlua/xml-sax-parser.lua

Lines changed: 19 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,7 @@ local function create_start_document_callback(user_callback)
2525
user_callback()
2626
end
2727
local c_callback = ffi.cast("startDocumentSAXFunc", callback)
28-
ffi.gc(c_callback, function() c_callback:free() end)
29-
return c_callback
28+
return ffi.gc(c_callback, c_callback.free)
3029
end
3130

3231
local ELEMENT_TYPES = {
@@ -48,8 +47,7 @@ local function create_element_declaration_callback(user_callback)
4847
content)
4948
end
5049
local c_callback = ffi.cast("elementDeclSAXFunc", callback)
51-
ffi.gc(c_callback, function() c_callback:free() end)
52-
return c_callback
50+
return ffi.gc(c_callback, c_callback.free)
5351
end
5452

5553
local function create_attribute_declaration_callback(user_callback)
@@ -75,8 +73,7 @@ local function create_attribute_declaration_callback(user_callback)
7573
enumerated_value)
7674
end
7775
local c_callback = ffi.cast("attributeDeclSAXFunc", callback)
78-
ffi.gc(c_callback, function() c_callback:free() end)
79-
return c_callback
76+
return ffi.gc(c_callback, c_callback.free)
8077
end
8178

8279
local function create_unparsed_entity_declaration_callback(user_callback)
@@ -91,8 +88,7 @@ local function create_unparsed_entity_declaration_callback(user_callback)
9188
to_string(raw_notation_name))
9289
end
9390
local c_callback = ffi.cast("unparsedEntityDeclSAXFunc", callback)
94-
ffi.gc(c_callback, function() c_callback:free() end)
95-
return c_callback
91+
return ffi.gc(c_callback, c_callback.free)
9692
end
9793

9894
local function create_notation_declaration_callback(user_callback)
@@ -105,8 +101,7 @@ local function create_notation_declaration_callback(user_callback)
105101
to_string(raw_system_id))
106102
end
107103
local c_callback = ffi.cast("notationDeclSAXFunc", callback)
108-
ffi.gc(c_callback, function() c_callback:free() end)
109-
return c_callback
104+
return ffi.gc(c_callback, c_callback.free)
110105
end
111106

112107
local function create_entity_declaration_callback(user_callback)
@@ -123,8 +118,7 @@ local function create_entity_declaration_callback(user_callback)
123118
to_string(raw_content))
124119
end
125120
local c_callback = ffi.cast("entityDeclSAXFunc", callback)
126-
ffi.gc(c_callback, function() c_callback:free() end)
127-
return c_callback
121+
return ffi.gc(c_callback, c_callback.free)
128122
end
129123

130124
local function create_internal_subset_callback(user_callback)
@@ -138,8 +132,7 @@ local function create_internal_subset_callback(user_callback)
138132
user_callback(name, external_id, system_id)
139133
end
140134
local c_callback = ffi.cast("internalSubsetSAXFunc", callback)
141-
ffi.gc(c_callback, function() c_callback:free() end)
142-
return c_callback
135+
return ffi.gc(c_callback, c_callback.free)
143136
end
144137

145138
local function create_external_subset_callback(user_callback)
@@ -153,8 +146,7 @@ local function create_external_subset_callback(user_callback)
153146
user_callback(name, external_id, system_id)
154147
end
155148
local c_callback = ffi.cast("externalSubsetSAXFunc", callback)
156-
ffi.gc(c_callback, function() c_callback:free() end)
157-
return c_callback
149+
return ffi.gc(c_callback, c_callback.free)
158150
end
159151

160152
local function create_cdata_block_callback(user_callback)
@@ -163,17 +155,15 @@ local function create_cdata_block_callback(user_callback)
163155
user_callback(cdata_block)
164156
end
165157
local c_callback = ffi.cast("cdataBlockSAXFunc", callback)
166-
ffi.gc(c_callback, function() c_callback:free() end)
167-
return c_callback
158+
return ffi.gc(c_callback, c_callback.free)
168159
end
169160

170161
local function create_comment_callback(user_callback)
171162
local callback = function(user_data, raw_comment)
172163
user_callback(to_string(raw_comment))
173164
end
174165
local c_callback = ffi.cast("commentSAXFunc", callback)
175-
ffi.gc(c_callback, function() c_callback:free() end)
176-
return c_callback
166+
return ffi.gc(c_callback, c_callback.free)
177167
end
178168

179169
local function create_processing_instruction_callback(user_callback)
@@ -183,8 +173,7 @@ local function create_processing_instruction_callback(user_callback)
183173
user_callback(target, data)
184174
end
185175
local c_callback = ffi.cast("processingInstructionSAXFunc", callback)
186-
ffi.gc(c_callback, function() c_callback:free() end)
187-
return c_callback
176+
return ffi.gc(c_callback, c_callback.free)
188177
end
189178

190179
local function create_ignorable_whitespace_callback(user_callback)
@@ -196,26 +185,23 @@ local function create_ignorable_whitespace_callback(user_callback)
196185
user_callback(ignorable_whitespaces)
197186
end
198187
local c_callback = ffi.cast("ignorableWhitespaceSAXFunc", callback)
199-
ffi.gc(c_callback, function() c_callback:free() end)
200-
return c_callback
188+
return ffi.gc(c_callback, c_callback.free)
201189
end
202190

203191
local function create_text_callback(user_callback)
204192
local callback = function(user_data, raw_text, raw_length)
205193
user_callback(to_string(raw_text, raw_length))
206194
end
207195
local c_callback = ffi.cast("charactersSAXFunc", callback)
208-
ffi.gc(c_callback, function() c_callback:free() end)
209-
return c_callback
196+
return ffi.gc(c_callback, c_callback.free)
210197
end
211198

212199
local function create_reference_callback(user_callback)
213200
local callback = function(user_data, raw_entity_name)
214201
user_callback(to_string(raw_entity_name))
215202
end
216203
local c_callback = ffi.cast("referenceSAXFunc", callback)
217-
ffi.gc(c_callback, function() c_callback:free() end)
218-
return c_callback
204+
return ffi.gc(c_callback, c_callback.free)
219205
end
220206

221207
local function create_start_element_callback(user_callback)
@@ -264,8 +250,7 @@ local function create_start_element_callback(user_callback)
264250
attributes)
265251
end
266252
local c_callback = ffi.cast("startElementNsSAX2Func", callback)
267-
ffi.gc(c_callback, function() c_callback:free() end)
268-
return c_callback
253+
return ffi.gc(c_callback, c_callback.free)
269254
end
270255

271256
local function create_end_element_callback(user_callback)
@@ -278,8 +263,7 @@ local function create_end_element_callback(user_callback)
278263
to_string(raw_uri))
279264
end
280265
local c_callback = ffi.cast("endElementNsSAX2Func", callback)
281-
ffi.gc(c_callback, function() c_callback:free() end)
282-
return c_callback
266+
return ffi.gc(c_callback, c_callback.free)
283267
end
284268

285269
local function create_warning_callback(user_callback)
@@ -292,26 +276,23 @@ local function create_warning_callback(user_callback)
292276
user_callback(xml_warning)
293277
end
294278
local c_callback = ffi.cast("warningSAXFunc", callback)
295-
ffi.gc(c_callback, function() c_callback:free() end)
296-
return c_callback
279+
return ffi.gc(c_callback, c_callback.free)
297280
end
298281

299282
local function create_xml_structured_error_callback(user_callback)
300283
local callback = function(user_data, raw_xml_error)
301284
user_callback(converter.convert_xml_error(raw_xml_error))
302285
end
303286
local c_callback = ffi.cast("xmlStructuredErrorFunc", callback)
304-
ffi.gc(c_callback, function() c_callback:free() end)
305-
return c_callback
287+
return ffi.gc(c_callback, c_callback.free)
306288
end
307289

308290
local function create_end_document_callback(user_callback)
309291
local callback = function(user_data)
310292
user_callback()
311293
end
312294
local c_callback = ffi.cast("endDocumentSAXFunc", callback)
313-
ffi.gc(c_callback, function() c_callback:free() end)
314-
return c_callback
295+
return ffi.gc(c_callback, c_callback.free)
315296
end
316297

317298
function metatable.__newindex(parser, key, value)

0 commit comments

Comments
 (0)