[TT #871] Add rand as a dynop, with tests
[parrot.git] / src / pmc / pointer.pmc
blobeaef16dd1589655d2719a4a3d2c85e8ad0cbd329
1 /*
2 Copyright (C) 2001-2007, Parrot Foundation.
3 $Id$
5 =head1 NAME
7 src/pmc/pointer.pmc - Pointer
9 =head1 DESCRIPTION
11 These are the vtable functions for the Pointer base class.
13 The actual pointer is in C<PMC_data>.
15 =head2 Methods
17 =over 4
19 =cut
23 pmclass Pointer need_ext {
24     ATTR void * mark_function;
25     ATTR void * pointer;
29 =item C<void init()>
31 Initializes the pointer.
33 =cut
37     VTABLE void init() {
38         PObj_custom_mark_destroy_SETALL(SELF);
39         PMC_data(SELF) = mem_allocate_zeroed_typed(Parrot_Pointer_attributes);
40     }
44 =item C<void destroy()>
46 Destroy the Pointer and free associated memory
48 =cut
52     VTABLE void destroy() {
53         mem_sys_free(PARROT_POINTER(SELF));
54         PMC_data(SELF) = NULL;
55     }
60 =item C<void mark()>
62 Marks the pointer as live.
64 =cut
68     VTABLE void mark() {
69         void (*mark_function)(Interp *, void *) =
70             (void (*)(Interp *, void *))D2FPTR(PARROT_POINTER(SELF)->mark_function);
71         void * data = PARROT_POINTER(SELF)->pointer;
72         if (data && mark_function)
73             (*mark_function)(INTERP, data);
74     }
78 =item C<PMC *clone()>
80 Creates and returns a clone of the pointer.
82 =cut
86     VTABLE PMC *clone() {
87         PMC * const dest = pmc_new_noinit(INTERP, SELF->vtable->base_type);
88         PObj_custom_mark_SET(dest);
89         PMC_data(dest) = PMC_data(SELF);
90         return dest;
91     }
95 =item C<void set_pointer(void *)>
97 Sets the pointer value.
99 =cut
103     VTABLE void set_pointer(void *ptr) {
104         PARROT_POINTER(SELF)->pointer = ptr;
105     }
109 =item C<void *get_pointer()>
111 Returns the pointer value.
113 =cut
117     VTABLE void *get_pointer() {
118         return PARROT_POINTER(SELF)->pointer;
119     }
123 =item C<INTVAL get_integer()>
125 Returns the pointer value as an integer.
127 =cut
131     VTABLE INTVAL get_integer() {
132         return (INTVAL)(PARROT_POINTER(SELF)->pointer);
133     }
137 =item C<FLOATVAL get_number()>
139 Returns the pointer value as a floating-point number.
141 =cut
145     VTABLE FLOATVAL get_number() {
146         return (FLOATVAL)(INTVAL)(PARROT_POINTER(SELF)->pointer);
147     }
151 =item C<STRING *get_repr()>
153 Returns the pointer value as a Parrot string.
155 =cut
159     VTABLE STRING *get_repr() {
160         return Parrot_sprintf_c(INTERP, "Pointer = 0x%p", PARROT_POINTER(SELF)->pointer);
161     }
166 =item C<STRING *get_string()>
168 Returns the pointer value as a Parrot string.
170 =cut
174     VTABLE STRING *get_string() {
175         return Parrot_sprintf_c(INTERP, "%s", PARROT_POINTER(SELF)->pointer);
176     }
180 =item C<INTVAL get_bool()>
182 Returns whether the pointer is not C<NULL>.
184 =cut
188     VTABLE INTVAL get_bool() {
189         return (INTVAL)(PMC_data(SELF) != NULL);
190     }
194 =item C<INTVAL is_same(PMC *pmc2)>
196 Returns whether the pointer has the same value as C<*pmc2>.
198 =cut
202     VTABLE INTVAL is_same(PMC *pmc2) {
203         return (INTVAL)(SELF->vtable   == pmc2->vtable &&
204                         PARROT_POINTER(SELF)->pointer == PARROT_POINTER(pmc2)->pointer);
205     }
210 =back
212 =cut
217  * Local variables:
218  *   c-file-style: "parrot"
219  * End:
220  * vim: expandtab shiftwidth=4:
221  */