Skip to content
This repository was archived by the owner on Aug 31, 2021. It is now read-only.

Commit 34b2a37

Browse files
committed
[[ Foundation ]] Fix stream functions overwriting custom value header
1 parent 670d58f commit 34b2a37

File tree

1 file changed

+41
-33
lines changed

1 file changed

+41
-33
lines changed

libfoundation/src/foundation-stream.cpp

Lines changed: 41 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -21,13 +21,23 @@ along with LiveCode. If not see <http://www.gnu.org/licenses/>. */
2121

2222
////////////////////////////////////////////////////////////////////////////////
2323

24-
struct __MCStream
24+
struct __MCStreamImpl
2525
{
2626
const MCStreamCallbacks *callbacks;
2727
};
2828

2929
MCTypeInfoRef kMCStreamTypeInfo;
3030

31+
static inline __MCStreamImpl &__MCStreamGet(MCStreamRef p_stream)
32+
{
33+
return *(__MCStreamImpl*)MCValueGetExtraBytesPtr(p_stream);
34+
}
35+
36+
static inline const MCStreamCallbacks *__MCStreamCallbacks(MCStreamRef self)
37+
{
38+
return __MCStreamGet(self).callbacks;
39+
}
40+
3141
////////////////////////////////////////////////////////////////////////////////
3242

3343
struct __MCMemoryInputStream
@@ -254,9 +264,7 @@ bool MCMemoryOutputStreamFinish(MCStreamRef p_stream, void*& r_buffer, size_t& r
254264

255265
static void __MCStreamDestroy(MCValueRef p_value)
256266
{
257-
__MCStream *self;
258-
self = (__MCStream *)MCValueGetExtraBytesPtr(p_value);
259-
self -> callbacks -> destroy(self);
267+
__MCStreamCallbacks((MCStreamRef)p_value)->destroy((MCStreamRef)p_value);
260268
}
261269

262270
static bool __MCStreamCopy(MCValueRef p_value, bool p_release, MCValueRef& r_value)
@@ -294,11 +302,11 @@ static MCValueCustomCallbacks kMCStreamCustomValueCallbacks =
294302

295303
bool MCStreamCreate(const MCStreamCallbacks *p_callbacks, size_t p_extra_bytes, MCStreamRef& r_stream)
296304
{
297-
__MCStream *self;
298-
if (!MCValueCreateCustom(kMCStreamTypeInfo, sizeof(__MCStream) + p_extra_bytes, self))
305+
MCStreamRef self;
306+
if (!MCValueCreateCustom(kMCStreamTypeInfo, sizeof(__MCStreamImpl) + p_extra_bytes, self))
299307
return false;
300308

301-
self -> callbacks = p_callbacks;
309+
__MCStreamGet(self).callbacks = p_callbacks;
302310

303311
r_stream = self;
304312

@@ -307,71 +315,71 @@ bool MCStreamCreate(const MCStreamCallbacks *p_callbacks, size_t p_extra_bytes,
307315

308316
const MCStreamCallbacks *MCStreamGetCallbacks(MCStreamRef self)
309317
{
310-
return self -> callbacks;
318+
return __MCStreamCallbacks(self);
311319
}
312320

313321
////////////////////////////////////////////////////////////////////////////////
314322

315323
bool MCStreamIsReadable(MCStreamRef self)
316324
{
317-
return self -> callbacks -> read != nil;
325+
return __MCStreamCallbacks(self) -> read != nil;
318326
}
319327

320328
bool MCStreamIsWritable(MCStreamRef self)
321329
{
322-
return self -> callbacks -> write != nil;
330+
return __MCStreamCallbacks(self) -> write != nil;
323331
}
324332

325333
bool MCStreamIsMarkable(MCStreamRef self)
326334
{
327-
return self -> callbacks -> mark != nil;
335+
return __MCStreamCallbacks(self) -> mark != nil;
328336
}
329337

330338
bool MCStreamIsSeekable(MCStreamRef self)
331339
{
332-
return self -> callbacks -> seek != nil;
340+
return __MCStreamCallbacks(self) -> seek != nil;
333341
}
334342

335343
////////////////////////////////////////////////////////////////////////////////
336344

337345
bool MCStreamGetAvailableForRead(MCStreamRef self, size_t& r_available)
338346
{
339-
if (self -> callbacks -> get_available_for_read == nil)
347+
if (__MCStreamCallbacks(self) -> get_available_for_read == nil)
340348
return false;
341-
return self -> callbacks -> get_available_for_read(self, r_available);
349+
return __MCStreamCallbacks(self) -> get_available_for_read(self, r_available);
342350
}
343351

344352
bool MCStreamRead(MCStreamRef self, void *p_buffer, size_t p_amount)
345353
{
346-
if (self -> callbacks -> read == nil)
354+
if (__MCStreamCallbacks(self) -> read == nil)
347355
return false;
348-
return self -> callbacks -> read(self, p_buffer, p_amount);
356+
return __MCStreamCallbacks(self) -> read(self, p_buffer, p_amount);
349357
}
350358

351359
bool MCStreamGetAvailableForWrite(MCStreamRef self, size_t& r_available)
352360
{
353-
if (self -> callbacks -> get_available_for_write == nil)
361+
if (__MCStreamCallbacks(self) -> get_available_for_write == nil)
354362
return false;
355-
return self -> callbacks -> get_available_for_write(self, r_available);
363+
return __MCStreamCallbacks(self) -> get_available_for_write(self, r_available);
356364
}
357365

358366
bool MCStreamWrite(MCStreamRef self, const void *p_buffer, size_t p_amount)
359367
{
360-
if (self -> callbacks -> write == nil)
368+
if (__MCStreamCallbacks(self) -> write == nil)
361369
return false;
362-
return self -> callbacks -> write(self, p_buffer, p_amount);
370+
return __MCStreamCallbacks(self) -> write(self, p_buffer, p_amount);
363371
}
364372

365373
bool MCStreamSkip(MCStreamRef self, size_t p_amount)
366374
{
367-
if (self -> callbacks -> skip != nil)
368-
return self -> callbacks -> skip(self, p_amount);
369-
if (self -> callbacks -> seek != nil)
375+
if (__MCStreamCallbacks(self) -> skip != nil)
376+
return __MCStreamCallbacks(self) -> skip(self, p_amount);
377+
if (__MCStreamCallbacks(self) -> seek != nil)
370378
{
371379
filepos_t t_pos;
372-
if (!self -> callbacks -> tell(self, t_pos))
380+
if (!__MCStreamCallbacks(self) -> tell(self, t_pos))
373381
return false;
374-
return self -> callbacks -> seek(self, t_pos + p_amount);
382+
return __MCStreamCallbacks(self) -> seek(self, t_pos + p_amount);
375383
}
376384
return false;
377385
}
@@ -380,32 +388,32 @@ bool MCStreamSkip(MCStreamRef self, size_t p_amount)
380388

381389
bool MCStreamMark(MCStreamRef self, size_t p_read_limit)
382390
{
383-
if (self -> callbacks -> mark == nil)
391+
if (__MCStreamCallbacks(self) -> mark == nil)
384392
return false;
385-
return self -> callbacks -> mark(self, p_read_limit);
393+
return __MCStreamCallbacks(self) -> mark(self, p_read_limit);
386394
}
387395

388396
bool MCStreamReset(MCStreamRef self)
389397
{
390-
if (self -> callbacks -> reset == nil)
398+
if (__MCStreamCallbacks(self) -> reset == nil)
391399
return false;
392-
return self -> callbacks -> reset(self);
400+
return __MCStreamCallbacks(self) -> reset(self);
393401
}
394402

395403
////////////////////////////////////////////////////////////////////////////////
396404

397405
bool MCStreamTell(MCStreamRef self, filepos_t& r_position)
398406
{
399-
if (self -> callbacks -> tell == nil)
407+
if (__MCStreamCallbacks(self) -> tell == nil)
400408
return false;
401-
return self -> callbacks -> tell(self, r_position);
409+
return __MCStreamCallbacks(self) -> tell(self, r_position);
402410
}
403411

404412
bool MCStreamSeek(MCStreamRef self, filepos_t p_position)
405413
{
406-
if (self -> callbacks -> seek == nil)
414+
if (__MCStreamCallbacks(self) -> seek == nil)
407415
return false;
408-
return self -> callbacks -> seek(self, p_position);
416+
return __MCStreamCallbacks(self) -> seek(self, p_position);
409417
}
410418

411419
////////////////////////////////////////////////////////////////////////////////

0 commit comments

Comments
 (0)