[TT #871] Add rand as a dynop, with tests
[parrot.git] / src / pmc / parrotlibrary.pmc
blobfbf31e5a4fefeb917f3d60d6e98c1b0327a139e5
1 /*
2 Copyright (C) 2001-2009, Parrot Foundation.
3 $Id$
5 =head1 NAME
7 src/pmc/parrotlibrary.pmc - Dynamic Library
9 =head1 DESCRIPTION
11 Class for holding info about a dynamic library.
13 Properties:
15     _filename               full path/file of lib
16     _ro                     true after init
18 All ParrotLibrary PMCs are in interp->iglobals.
20 When a dynamic library (pmc or ops) is loaded, the load function returns
21 a ParrotLibrary PMC.
23 =head2 Methods
25 =over 4
27 =cut
31 #define PMC_dlhandle(x) ((Parrot_ParrotLibrary_attributes*)PMC_data(x))->dl_handle
32 #define PMC_oplib_init(x) ((Parrot_ParrotLibrary_attributes*)PMC_data(x))->oplib_init
34 pmclass ParrotLibrary need_ext provides library {
35     ATTR void * dl_handle;  /* DLL handle */
36     ATTR void * oplib_init; /* oplib init function */
40 =item C<void init()>
42 Initializes the library with a C<NULL> oplib init function.
44 =cut
48     VTABLE void init() {
49         Parrot_ParrotLibrary_attributes * const attrs =
50             mem_allocate_zeroed_typed(Parrot_ParrotLibrary_attributes);
51         PMC_data(SELF) = attrs;
52         PObj_active_destroy_SET(SELF);
53     }
57 =item C<void destroy()>
59 Destroys the library, closing the shared library.
61 =cut
65     VTABLE void destroy() {
66         void *dl_handle = PMC_dlhandle(SELF);
67         if (dl_handle)
68             Parrot_dlclose(dl_handle);
69         mem_sys_free(PMC_data(SELF));
70         PMC_data(SELF) = NULL;
71     }
76 =item C<PMC *clone()>
78 Creates and returns a clone of the library.
80 =cut
84     VTABLE PMC *clone() {
85         PMC * const dest     = pmc_new(INTERP, SELF->vtable->base_type);
86         PMC_oplib_init(dest) = PMC_oplib_init(SELF);
87         PMC_dlhandle(dest)   = PMC_dlhandle(SELF);
89         if (PMC_metadata(SELF))
90             PMC_metadata(dest) = VTABLE_clone(INTERP, PMC_metadata(SELF));
92         return dest;
93     }
97 =item C<INTVAL get_bool()>
99 Returns whether a library has been successfully loaded.
101 =cut
105     VTABLE INTVAL get_bool() {
106         return (PMC_dlhandle(SELF) != NULL);
107     }
111 =item C<STRING *get_string()>
113 Returns the name of the loaded library.
115 =cut
119     VTABLE STRING *get_string() {
120         STRING * const key  = CONST_STRING(INTERP, "_filename");
121         PMC    * const prop = VTABLE_getprop(INTERP, SELF, key);
123         return VTABLE_get_string(INTERP, prop);
124     }
128 =item C<void set_pointer(void *handle)>
130 Set the pointer to the shared library handle.
132 =cut
136     VTABLE void set_pointer(void *handle) {
137         PMC_dlhandle(SELF) = handle;
138     }
143 =back
145 =head1 SEE ALSO
147     Date:    Mon, 29 Sep 2003 14:37:11 -0400 (EDT)
148     Subject: Library loading and initialization sequence
149     From:    Dan Sugalski
151 =head1 HISTORY
153 Initial version by leo 2003.10.12.
155 =cut
160  * Local variables:
161  *   c-file-style: "parrot"
162  * End:
163  * vim: expandtab shiftwidth=4:
164  */