Skip to content

Commit 8b224c6

Browse files
committed
Merge pull request livecode#1806 from peter-b/feature-copydescription
Implement MCValueCopyDescription() for most types
2 parents df24ac7 + a59aafd commit 8b224c6

15 files changed

Lines changed: 230 additions & 46 deletions

engine/src/module-canvas.cpp

Lines changed: 38 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -427,6 +427,11 @@ bool MCCanvasJoinStyleFromString(MCStringRef p_string, MCGJoinStyle &r_style);
427427
bool MCCanvasCapStyleToString(MCGCapStyle p_style, MCStringRef &r_string);
428428
bool MCCanvasCapStyleFromString(MCStringRef p_string, MCGCapStyle &r_style);
429429

430+
MCCanvasFloat MCCanvasColorGetRed(MCCanvasColorRef color);
431+
MCCanvasFloat MCCanvasColorGetGreen(MCCanvasColorRef color);
432+
MCCanvasFloat MCCanvasColorGetBlue(MCCanvasColorRef color);
433+
MCCanvasFloat MCCanvasColorGetAlpha(MCCanvasColorRef color);
434+
430435
////////////////////////////////////////////////////////////////////////////////
431436

432437
static MCNameRef s_blend_mode_map[kMCGBlendModeCount];
@@ -504,8 +509,14 @@ static hash_t __MCCanvasRectangleHash(MCValueRef p_value)
504509

505510
static bool __MCCanvasRectangleDescribe(MCValueRef p_value, MCStringRef &r_desc)
506511
{
507-
// TODO - implement describe rectangle
508-
return false;
512+
MCGRectangle t_rectangle;
513+
MCCanvasRectangleGetMCGRectangle (static_cast<MCCanvasRectangleRef>(p_value), t_rectangle);
514+
515+
return MCStringFormat (r_desc, "<rectangle (%g, %g) - (%g, %g)>",
516+
t_rectangle.origin.x,
517+
t_rectangle.origin.y,
518+
t_rectangle.origin.x + t_rectangle.size.width,
519+
t_rectangle.origin.y + t_rectangle.size.height);
509520
}
510521

511522
bool MCCanvasRectangleCreateWithMCGRectangle(const MCGRectangle &p_rect, MCCanvasRectangleRef &r_rectangle)
@@ -717,8 +728,10 @@ static hash_t __MCCanvasPointHash(MCValueRef p_value)
717728

718729
static bool __MCCanvasPointDescribe(MCValueRef p_value, MCStringRef &r_desc)
719730
{
720-
// TODO - implement describe point
721-
return false;
731+
MCGPoint t_point;
732+
MCCanvasPointGetMCGPoint (static_cast<MCCanvasPointRef>(p_value), t_point);
733+
734+
return MCStringFormat (r_desc, "(%g, %g)", t_point.x, t_point.y);
722735
}
723736

724737
bool MCCanvasPointCreateWithMCGPoint(const MCGPoint &p_point, MCCanvasPointRef &r_point)
@@ -872,8 +885,19 @@ static hash_t __MCCanvasColorHash(MCValueRef p_value)
872885

873886
static bool __MCCanvasColorDescribe(MCValueRef p_value, MCStringRef &r_desc)
874887
{
875-
// TODO - implement describe
876-
return false;
888+
MCCanvasColorRef t_color = static_cast<MCCanvasColorRef>(p_value);
889+
890+
if (1 <= MCCanvasColorGetAlpha (t_color)) /* Opaque case */
891+
return MCStringFormat (r_desc, "<color: %g, %g, %g>",
892+
MCCanvasColorGetRed (t_color),
893+
MCCanvasColorGetGreen (t_color),
894+
MCCanvasColorGetBlue (t_color));
895+
else
896+
return MCStringFormat (r_desc, "<color: %g, %g, %g, %g>",
897+
MCCanvasColorGetRed (t_color),
898+
MCCanvasColorGetGreen (t_color),
899+
MCCanvasColorGetBlue (t_color),
900+
MCCanvasColorGetAlpha (t_color));
877901
}
878902

879903
//////////
@@ -1639,8 +1663,14 @@ static hash_t __MCCanvasImageHash(MCValueRef p_value)
16391663

16401664
static bool __MCCanvasImageDescribe(MCValueRef p_value, MCStringRef &r_desc)
16411665
{
1642-
// TODO - implement describe
1643-
return false;
1666+
MCCanvasImageRef t_image = static_cast<MCCanvasImageRef>(p_value);
1667+
1668+
uint32_t t_width, t_height;
1669+
if (!MCImageRepGetGeometry(MCCanvasImageGetImageRep (t_image),
1670+
t_width, t_height))
1671+
return MCStringCopy (MCSTR("<image>"), r_desc);
1672+
1673+
return MCStringFormat(r_desc, "<image %ux%u>", t_width, t_height);
16441674
}
16451675

16461676
bool MCCanvasImageCreateWithImageRep(MCImageRep *p_image, MCCanvasImageRef &r_image)

libfoundation/include/foundation.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1413,6 +1413,7 @@ struct MCForeignTypeDescriptor
14131413
bool (*hash)(void *contents, hash_t& r_hash);
14141414
bool (*doimport)(void *contents, bool release, MCValueRef& r_value);
14151415
bool (*doexport)(MCValueRef value, bool release, void *contents);
1416+
bool (*describe)(void *contents, MCStringRef & r_desc);
14161417
};
14171418

14181419
MC_DLLEXPORT bool MCForeignTypeInfoCreate(const MCForeignTypeDescriptor *descriptor, MCTypeInfoRef& r_typeinfo);
@@ -2479,6 +2480,7 @@ struct MCHandlerCallbacks
24792480
size_t size;
24802481
void (*release)(void *context);
24812482
bool (*invoke)(void *context, MCValueRef *arguments, uindex_t argument_count, MCValueRef& r_value);
2483+
bool (*describe)(void *context, MCStringRef& r_desc);
24822484
};
24832485

24842486
MC_DLLEXPORT bool MCHandlerCreate(MCTypeInfoRef typeinfo, const MCHandlerCallbacks *callbacks, void *context, MCHandlerRef& r_handler);

libfoundation/src/foundation-array.cpp

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -656,7 +656,28 @@ bool __MCArrayIsEqualTo(__MCArray *self, __MCArray *other_self)
656656

657657
bool __MCArrayCopyDescription(__MCArray *self, MCStringRef& r_string)
658658
{
659-
return false;
659+
/* Shortcut for empty arrays */
660+
if (MCArrayIsEmpty (self))
661+
return MCStringCopy (MCSTR("{}"), r_string);
662+
663+
MCAutoListRef t_contents_list;
664+
if (!MCListCreateMutable (MCSTR(", "), &t_contents_list))
665+
return false;
666+
667+
uintptr_t t_iter;
668+
MCNameRef t_key;
669+
MCValueRef t_value;
670+
while (MCArrayIterate (self, t_iter, t_key, t_value))
671+
{
672+
if (!MCListAppendFormat (*t_contents_list, "%@: %@", t_key, t_value))
673+
return false;
674+
}
675+
676+
MCAutoStringRef t_contents_string;
677+
if (!MCListCopyAsString (*t_contents_list, &t_contents_string))
678+
return false;
679+
680+
return MCStringFormat(r_string, "{%@}", *t_contents_string);
660681
}
661682

662683
bool __MCArrayImmutableCopy(__MCArray *self, bool p_release, __MCArray*& r_immutable_self)

libfoundation/src/foundation-custom.cpp

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ bool
5858
__MCCustomDefaultDescribe (MCValueRef self,
5959
MCStringRef & r_desc)
6060
{
61-
return false;
61+
return MCStringFormat(r_desc, "<custom: %p>", self);
6262
}
6363

6464
bool
@@ -74,3 +74,19 @@ __MCCustomDefaultMutableCopy (MCValueRef self,
7474
{
7575
return false;
7676
}
77+
78+
bool
79+
__MCCustomCopyDescription (MCValueRef self,
80+
MCStringRef & r_desc)
81+
{
82+
MCTypeInfoRef t_typeinfo;
83+
t_typeinfo = __MCCustomValueResolveTypeInfo((__MCValue *) self);
84+
85+
bool (*t_describe_func)(MCValueRef, MCStringRef &);
86+
t_describe_func = t_typeinfo -> custom . callbacks . describe;
87+
88+
if (NULL == t_describe_func)
89+
t_describe_func = __MCCustomDefaultDescribe;
90+
91+
return t_describe_func (self, r_desc);
92+
}

libfoundation/src/foundation-data.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -828,7 +828,8 @@ hash_t __MCDataHash(__MCData *self)
828828

829829
bool __MCDataCopyDescription(__MCData *self, MCStringRef &r_description)
830830
{
831-
return false;
831+
return MCStringFormat (r_description, "<data: %u B>",
832+
MCDataGetLength (self));
832833
}
833834

834835
////////////////////////////////////////////////////////////////////////////////

libfoundation/src/foundation-error.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -354,7 +354,7 @@ bool __MCErrorIsEqualTo(__MCError *self, __MCError *other_error)
354354

355355
bool __MCErrorCopyDescription(__MCError *self, MCStringRef& r_string)
356356
{
357-
return false;
357+
return MCStringCopy (MCErrorGetMessage (self), r_string);
358358
}
359359

360360
bool __MCErrorInitialize(void)

libfoundation/src/foundation-foreign.cpp

Lines changed: 64 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,17 @@ bool __MCForeignValueIsEqualTo(__MCForeignValue *self, __MCForeignValue *other_s
145145

146146
bool __MCForeignValueCopyDescription(__MCForeignValue *self, MCStringRef& r_description)
147147
{
148-
return false;
148+
MCTypeInfoRef t_resolved_typeinfo;
149+
t_resolved_typeinfo = __MCTypeInfoResolve(self->typeinfo);
150+
151+
bool (*t_describe_func)(void *, MCStringRef &);
152+
t_describe_func = t_resolved_typeinfo->foreign.descriptor.describe;
153+
154+
if (NULL != t_describe_func)
155+
return t_describe_func (MCForeignValueGetContentsPtr (self),
156+
r_description);
157+
else
158+
return MCStringFormat(r_description, "<foreign: %p>", self);
149159
}
150160

151161
////////////////////////////////////////////////////////////////////////////////
@@ -312,6 +322,53 @@ static bool __double_export(MCValueRef value, bool release, void *contents)
312322
return true;
313323
}
314324

325+
static bool
326+
__bool_describe (void *contents,
327+
MCStringRef & r_string)
328+
{
329+
return MCStringCopy (MCSTR(*((bool *) contents) ? "<foreign true>" : "<foreign false>"), r_string);
330+
}
331+
332+
static bool
333+
__int_describe (void *contents,
334+
MCStringRef & r_string)
335+
{
336+
return MCStringFormat (r_string, "<foreign integer %i>",
337+
*((integer_t *) contents));
338+
}
339+
340+
static bool
341+
__uint_describe (void *contents,
342+
MCStringRef & r_string)
343+
{
344+
return MCStringFormat (r_string, "<foreign unsigned integer %u>",
345+
*((uinteger_t *) contents));
346+
}
347+
348+
static bool
349+
__float_describe (void *contents,
350+
MCStringRef & r_string)
351+
{
352+
return MCStringFormat (r_string, "<foreign float %g>",
353+
(double) *((float *) contents));
354+
}
355+
356+
static bool
357+
__double_describe (void *contents,
358+
MCStringRef & r_string)
359+
{
360+
return MCStringFormat (r_string, "<foreign double %g>",
361+
*((double *) contents));
362+
}
363+
364+
static bool
365+
__pointer_describe (void *contents,
366+
MCStringRef & r_string)
367+
{
368+
return MCStringFormat (r_string, "<foreign pointer %p>",
369+
*((void **) contents));
370+
}
371+
315372
static bool __build_typeinfo(const char *p_name, MCForeignTypeDescriptor *p_desc, MCTypeInfoRef& r_typeinfo)
316373
{
317374
MCAutoStringRef t_name_string;
@@ -355,6 +412,7 @@ bool __MCForeignValueInitialize(void)
355412
d . hash = __bool_hash;
356413
d . doimport = __bool_import;
357414
d . doexport = __bool_export;
415+
d . describe = __bool_describe;
358416
if (!__build_typeinfo("__builtin__.bool", &d, kMCBoolTypeInfo))
359417
return false;
360418

@@ -373,6 +431,7 @@ bool __MCForeignValueInitialize(void)
373431
d . hash = __int_hash;
374432
d . doimport = __int_import;
375433
d . doexport = __int_export;
434+
d . describe = __int_describe;
376435
if (!__build_typeinfo("__builtin__.int", &d, kMCIntTypeInfo))
377436
return false;
378437

@@ -391,6 +450,7 @@ bool __MCForeignValueInitialize(void)
391450
d . hash = __int_hash;
392451
d . doimport = __uint_import;
393452
d . doexport = __uint_export;
453+
d . describe = __uint_describe;
394454
if (!__build_typeinfo("__builtin__.uint", &d, kMCUIntTypeInfo))
395455
return false;
396456

@@ -409,6 +469,7 @@ bool __MCForeignValueInitialize(void)
409469
d . hash = __float_hash;
410470
d . doimport = __float_import;
411471
d . doexport = __float_export;
472+
d . describe = __float_describe;
412473
if (!__build_typeinfo("__builtin__.float", &d, kMCFloatTypeInfo))
413474
return false;
414475

@@ -427,6 +488,7 @@ bool __MCForeignValueInitialize(void)
427488
d . hash = __double_hash;
428489
d . doimport = __double_import;
429490
d . doexport = __double_export;
491+
d . describe = __double_describe;
430492
if (!__build_typeinfo("__builtin__.double", &d, kMCDoubleTypeInfo))
431493
return false;
432494

@@ -445,6 +507,7 @@ bool __MCForeignValueInitialize(void)
445507
d . hash = __pointer_hash;
446508
d . doimport = nil;
447509
d . doexport = nil;
510+
d . describe = __pointer_describe;
448511
if (!__build_typeinfo("__builtin__.pointer", &d, kMCPointerTypeInfo))
449512
return false;
450513

libfoundation/src/foundation-handler.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,13 @@ bool __MCHandlerIsEqualTo(__MCHandler *self, __MCHandler *other_self)
7474

7575
bool __MCHandlerCopyDescription(__MCHandler *self, MCStringRef& r_desc)
7676
{
77-
return false;
77+
if (NULL != self->callbacks->describe)
78+
return self->callbacks->describe(MCHandlerGetContext (self), r_desc);
79+
80+
/* Default implementation. */
81+
/* FIXME Should include information about arguments and return
82+
* values, extracted from the handler's typeinfo. */
83+
return MCStringCopy(MCSTR("<handler>"), r_desc);
7884
}
7985

8086
////////////////////////////////////////////////////////////////////////////////

libfoundation/src/foundation-list.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ You should have received a copy of the GNU General Public License
1515
along with LiveCode. If not see <http://www.gnu.org/licenses/>. */
1616

1717
#include <foundation.h>
18+
#include <foundation-auto.h>
1819

1920
#include "foundation-private.h"
2021

@@ -241,7 +242,10 @@ bool __MCListIsEqualTo(__MCList *list, __MCList *other_list)
241242

242243
bool __MCListCopyDescription(__MCList *self, MCStringRef& r_string)
243244
{
244-
return false;
245+
MCAutoStringRef t_self_string;
246+
if (!MCListCopyAsString (self, &t_self_string))
247+
return false;
248+
return MCValueCopyDescription(*t_self_string, r_string);
245249
}
246250

247251
bool __MCListImmutableCopy(__MCList *self, bool p_release, __MCList*& r_immutable_value)

libfoundation/src/foundation-private.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -556,6 +556,9 @@ void __MCStreamFinalize(void);
556556

557557
/* Default implementations of each of the function members of struct &
558558
* MCValueCustomCallbacks */
559+
MCTypeInfoRef __MCCustomValueResolveTypeInfo(__MCValue *p_value);
560+
bool __MCCustomCopyDescription (MCValueRef self, MCStringRef & r_desc);
561+
559562
void __MCCustomDefaultDestroy(MCValueRef);
560563
bool __MCCustomDefaultCopy(MCValueRef, bool, MCValueRef &);
561564
bool __MCCustomDefaultEqual(MCValueRef, MCValueRef);

0 commit comments

Comments
 (0)