Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Newer
Older
100644 486 lines (349 sloc) 11.848 kb
7c873ca Namespaces 1 - stub in NameSpace PMC
Leopold Toetsch authored
1 /*
f149e74 @coke #39217 - copyright cleanup. (src/)
coke authored
2 Copyright (C) 2005, The Perl Foundation.
6351e77 Namespaces 2 - remove Stash structure
Leopold Toetsch authored
3 $Id$
7c873ca Namespaces 1 - stub in NameSpace PMC
Leopold Toetsch authored
4
5 =head1 NAME
6
7 src/pmc/namespace.pmc - NameSpace PMC
8
9 =head1 DESCRIPTION
10
11 These are the vtable functions for the namespace PMC.
12
6351e77 Namespaces 2 - remove Stash structure
Leopold Toetsch authored
13 =head2 Data
14
6334469 Namespaces 13 - implement half-typed namespace storage
Leopold Toetsch authored
15 PMC_struct_val ... the hash, bucket->value is either a
16 var/sub or a namespace, of a FixedPMCarray
17 of 2 PMCs (namespace, sub/var) slots
6351e77 Namespaces 2 - remove Stash structure
Leopold Toetsch authored
18 PMC_pmc_val ... parent namespace
a13623c Namespaces 6 - remember namespace parent and name
Leopold Toetsch authored
19 PMC_data ... name STRING of this namespace part
6351e77 Namespaces 2 - remove Stash structure
Leopold Toetsch authored
20
7c873ca Namespaces 1 - stub in NameSpace PMC
Leopold Toetsch authored
21 =head2 Functions
22
23 =over 4
24
25 =cut
26
27 */
28
29 #include "parrot/parrot.h"
30 #include <assert.h>
31
6334469 Namespaces 13 - implement half-typed namespace storage
Leopold Toetsch authored
32 /*
33 * Typically a named slot either contains another namespace or a
34 * var/sub (not both).
35 * In case that the bucket->value is occupied, a FixedPMCArray is
36 * created, and the items are moved over to that extra storage.
37 * The array is flagged with FPA_is_ns_ext to distinguish it from a
38 * plain array variable.
39 *
40 * This could easily expanded to a full-fledged typed namespace if needed.
41 */
42
43 enum {
44 NS_slot_ns,
45 NS_slot_var_sub, /* unspecified ~half-raw slot */
46 NS_max_slots
47 } NS_slot_enum;
48
49 #define FPA_is_ns_ext PObj_private0_FLAG
50
9505cfc Merge STM intro trunk.
Charles Reiss authored
51 pmclass NameSpace extends Hash need_ext no_ro {
cb1fcaa Namespaces 3 - add namespace vtable function
Leopold Toetsch authored
52
a13623c Namespaces 6 - remember namespace parent and name
Leopold Toetsch authored
53 /*
54
55 =item C<voit init()>
56
57 Initialze a C<NameSpace> PMC by calling C<Hash.init> and clearing
58 other fields.
59
60 =cut
61
62 */
63
64 void init() {
cb1fcaa Namespaces 3 - add namespace vtable function
Leopold Toetsch authored
65 SUPER(); /* _struct_val := Hash */
66 PMC_pmc_val(SELF) = NULL; /* parent */
67 PMC_data(SELF) = NULL; /* namespace name */
68 }
69
a13623c Namespaces 6 - remember namespace parent and name
Leopold Toetsch authored
70 /*
71
ffadb54 Namespaces 11 - implement NameSpace.mark
Leopold Toetsch authored
72 =item C<void mark()>
73
74 Marks the namespace as live.
75
76 =cut
77
78 */
79 void mark() {
80 SUPER();
81 if (PMC_pmc_val(SELF))
82 pobject_lives(INTERP, (PObj*)PMC_pmc_val(SELF));
83 if (PMC_data(SELF))
84 pobject_lives(INTERP, (PObj*)PMC_data(SELF));
85 }
86
87 /*
88
a13623c Namespaces 6 - remember namespace parent and name
Leopold Toetsch authored
89 =item C<void set_pmc_keyed_str(STRING *key, PMC *value)>
90
91 Sets C<*value> as the namespace item for C<*key>. This is part of the
92 raw interface. If the PMC C<value> is exactly a NameSpace, C<SELF>
93 will be set as the parent of that namespace and the name C<key> of
94 C<value> is stored too.
95
d0b24de Namespaces 9 - implement NameSpace.name()
Leopold Toetsch authored
96 =item C<void set_pmc_keyed(PMC *key, PMC *value)>
97
98 If C<key> is a simple key, it works like above. If C<key> is an array
99 of strings or a chained key, add all components to the namespace.
100
91f4991 Namespaces 11 - get_namespace Px, Py
Leopold Toetsch authored
101 =item C<PMC* get_pmc_keyed(PMC *key)>
102
b996545 Fix #38907
Leopold Toetsch authored
103 Return the given namespace or PMCNULL. C<key> is either an array of
91f4991 Namespaces 11 - get_namespace Px, Py
Leopold Toetsch authored
104 strings, or a possibly nested key.
105
6334469 Namespaces 13 - implement half-typed namespace storage
Leopold Toetsch authored
106 =item C<PMC* get_pmc_keyed_str(PMC *key)>
107
b996545 Fix #38907
Leopold Toetsch authored
108 Return the given namespace item or PMCNULL. If the named item is either
6334469 Namespaces 13 - implement half-typed namespace storage
Leopold Toetsch authored
109 a NameSpace or a var, the NameSpace is returned.
110
a13623c Namespaces 6 - remember namespace parent and name
Leopold Toetsch authored
111 =cut
112
113 */
114
115 void set_pmc_keyed_str(STRING *key, PMC *value) {
badd187 @chipdude PDD21 reloaded, phase 1.
chipdude authored
116 const int val_is_NS = value->vtable->base_type == enum_class_NameSpace;
6c8f30b @ambs 80 columns cuts in all pmcs
ambs authored
117 HashBucket *b =
118 parrot_hash_get_bucket(INTERP, (Hash*) PMC_struct_val(SELF), key);
badd187 @chipdude PDD21 reloaded, phase 1.
chipdude authored
119 PMC *new_tuple = NULL;
120
6334469 Namespaces 13 - implement half-typed namespace storage
Leopold Toetsch authored
121 if (!b)
122 SUPER(key, value);
57c5846 @particle [core]: remove unused variables and do whitespace fixes
particle authored
123 else {
124 PMC *old = b->value;
125 if ((old->vtable->base_type == enum_class_NameSpace) == val_is_NS) {
126 /* simple ns or simple var/sub changed */
127 SUPER(key, value);
128 }
6334469 Namespaces 13 - implement half-typed namespace storage
Leopold Toetsch authored
129 else if ((PObj_get_FLAGS(old) & FPA_is_ns_ext) &&
130 old->vtable->base_type == enum_class_FixedPMCArray) {
131 /* we have a tuple extension already */
57c5846 @particle [core]: remove unused variables and do whitespace fixes
particle authored
132 VTABLE_set_pmc_keyed_int(INTERP, old,
133 val_is_NS ? NS_slot_ns : NS_slot_var_sub,
134 value);
6334469 Namespaces 13 - implement half-typed namespace storage
Leopold Toetsch authored
135 }
136 else {
137 /* creat new tuple */
badd187 @chipdude PDD21 reloaded, phase 1.
chipdude authored
138 new_tuple = pmc_new(INTERP, enum_class_FixedPMCArray);
6334469 Namespaces 13 - implement half-typed namespace storage
Leopold Toetsch authored
139 /* flag it as special */
badd187 @chipdude PDD21 reloaded, phase 1.
chipdude authored
140 PObj_get_FLAGS(new_tuple) |= FPA_is_ns_ext;
6334469 Namespaces 13 - implement half-typed namespace storage
Leopold Toetsch authored
141 /* for a fully typed namespace, we'd need 3 or 4 */
badd187 @chipdude PDD21 reloaded, phase 1.
chipdude authored
142 VTABLE_set_integer_native(INTERP, new_tuple, NS_max_slots);
6334469 Namespaces 13 - implement half-typed namespace storage
Leopold Toetsch authored
143 }
144 }
badd187 @chipdude PDD21 reloaded, phase 1.
chipdude authored
145
6334469 Namespaces 13 - implement half-typed namespace storage
Leopold Toetsch authored
146 if (val_is_NS) {
57c5846 @particle [core]: remove unused variables and do whitespace fixes
particle authored
147 /* TODO - this hack needs to go */
a13623c Namespaces 6 - remember namespace parent and name
Leopold Toetsch authored
148 PMC_pmc_val(value) = SELF; /* set parent */
149 PMC_data(value) = key; /* and name */
badd187 @chipdude PDD21 reloaded, phase 1.
chipdude authored
150
151 if (new_tuple) {
6c8f30b @ambs 80 columns cuts in all pmcs
ambs authored
152 VTABLE_set_pmc_keyed_int(INTERP, new_tuple, NS_slot_ns,
153 value);
154 VTABLE_set_pmc_keyed_int(INTERP, new_tuple, NS_slot_var_sub,
155 b->value);
badd187 @chipdude PDD21 reloaded, phase 1.
chipdude authored
156 b->value = new_tuple;
6334469 Namespaces 13 - implement half-typed namespace storage
Leopold Toetsch authored
157 /* distinction from a plain FPA, which doesn't extend the
158 * namespace storage
159 */
160 }
161 }
badd187 @chipdude PDD21 reloaded, phase 1.
chipdude authored
162 else if (new_tuple) {
163 VTABLE_set_pmc_keyed_int(INTERP, new_tuple, NS_slot_ns, b->value);
164 VTABLE_set_pmc_keyed_int(INTERP, new_tuple, NS_slot_var_sub, value);
165 b->value = new_tuple;
a13623c Namespaces 6 - remember namespace parent and name
Leopold Toetsch authored
166 }
167 }
168
d0b24de Namespaces 9 - implement NameSpace.name()
Leopold Toetsch authored
169 void set_pmc_keyed(PMC *key, PMC *value) {
57c5846 @particle [core]: remove unused variables and do whitespace fixes
particle authored
170 PMC *ns = SELF;
0579ef7 Namespaces 17 - implement set_pmc_keyed with complex keys
Leopold Toetsch authored
171 STRING *part;
badd187 @chipdude PDD21 reloaded, phase 1.
chipdude authored
172
3085c75 Namespaces 28 - hierarchical class namespaces 4
Leopold Toetsch authored
173 if (key->vtable->base_type == enum_class_String) {
174 SELF.set_pmc_keyed_str(VTABLE_get_string(INTERP, key), value);
175 return;
176 }
badd187 @chipdude PDD21 reloaded, phase 1.
chipdude authored
177
0579ef7 Namespaces 17 - implement set_pmc_keyed with complex keys
Leopold Toetsch authored
178 if (key->vtable->base_type == enum_class_Key) {
179 while (1) {
180 part = key_string(INTERP, key);
181 key = key_next(INTERP, key);
badd187 @chipdude PDD21 reloaded, phase 1.
chipdude authored
182 if (!key) {
57c5846 @particle [core]: remove unused variables and do whitespace fixes
particle authored
183 Parrot_set_global(INTERP, ns, part, value);
badd187 @chipdude PDD21 reloaded, phase 1.
chipdude authored
184 return;
57c5846 @particle [core]: remove unused variables and do whitespace fixes
particle authored
185 }
186 ns = Parrot_make_namespace_keyed_str(INTERP, ns, part);
187 }
d0b24de Namespaces 9 - implement NameSpace.name()
Leopold Toetsch authored
188 }
badd187 @chipdude PDD21 reloaded, phase 1.
chipdude authored
189
190 real_exception(INTERP, NULL, E_NameError, "Invalid namespace key");
d0b24de Namespaces 9 - implement NameSpace.name()
Leopold Toetsch authored
191 }
192
91f4991 Namespaces 11 - get_namespace Px, Py
Leopold Toetsch authored
193 PMC* get_pmc_keyed_str (STRING* key) {
badd187 @chipdude PDD21 reloaded, phase 1.
chipdude authored
194 PMC *ns = parrot_hash_get(INTERP, (Hash*) PMC_struct_val(SELF), key);
6334469 Namespaces 13 - implement half-typed namespace storage
Leopold Toetsch authored
195 if (!ns)
b996545 Fix #38907
Leopold Toetsch authored
196 return PMCNULL;
6334469 Namespaces 13 - implement half-typed namespace storage
Leopold Toetsch authored
197 if ((PObj_get_FLAGS(ns) & FPA_is_ns_ext) &&
198 ns->vtable->base_type == enum_class_FixedPMCArray)
199 ns = VTABLE_get_pmc_keyed_int(INTERP, ns, NS_slot_ns);
0d3a865 Namespaces 14 - use NameSpace PMC for global ops
Leopold Toetsch authored
200 return ns;
91f4991 Namespaces 11 - get_namespace Px, Py
Leopold Toetsch authored
201 }
badd187 @chipdude PDD21 reloaded, phase 1.
chipdude authored
202
91f4991 Namespaces 11 - get_namespace Px, Py
Leopold Toetsch authored
203 PMC* get_pmc_keyed(PMC *key) {
204 PMC *ns = SELF;
205 STRING *part;
57c5846 @particle [core]: remove unused variables and do whitespace fixes
particle authored
206
3085c75 Namespaces 28 - hierarchical class namespaces 4
Leopold Toetsch authored
207 if (key->vtable->base_type == enum_class_String) {
208 return SELF.get_pmc_keyed_str(VTABLE_get_string(INTERP, key));
209 }
badd187 @chipdude PDD21 reloaded, phase 1.
chipdude authored
210
211 if (key->vtable->base_type == enum_class_Key) {
91f4991 Namespaces 11 - get_namespace Px, Py
Leopold Toetsch authored
212 while (key) {
213 part = key_string(INTERP, key);
badd187 @chipdude PDD21 reloaded, phase 1.
chipdude authored
214 key = key_next(INTERP, key);
57c5846 @particle [core]: remove unused variables and do whitespace fixes
particle authored
215 if (!key)
badd187 @chipdude PDD21 reloaded, phase 1.
chipdude authored
216 return VTABLE_get_pmc_keyed_str(INTERP, ns, part);
217 ns = Parrot_get_namespace_keyed_str(INTERP, ns, part);
b996545 Fix #38907
Leopold Toetsch authored
218 if (PMC_IS_NULL(ns))
219 return PMCNULL;
91f4991 Namespaces 11 - get_namespace Px, Py
Leopold Toetsch authored
220 }
221 return ns;
222 }
badd187 @chipdude PDD21 reloaded, phase 1.
chipdude authored
223
224 real_exception(INTERP, NULL, E_NameError, "Invalid namespace key");
225 /* NOTREACHED */
226 return PMCNULL;
91f4991 Namespaces 11 - get_namespace Px, Py
Leopold Toetsch authored
227 }
228
a13623c Namespaces 6 - remember namespace parent and name
Leopold Toetsch authored
229 /*
230
3085c75 Namespaces 28 - hierarchical class namespaces 4
Leopold Toetsch authored
231 =item C<void* get_pointer_keyed_str(STRING *key)>
232
233 =item C<void* get_pointer_keyed(PMC *key)>
0d3a865 Namespaces 14 - use NameSpace PMC for global ops
Leopold Toetsch authored
234
b996545 Fix #38907
Leopold Toetsch authored
235 Return the given namespace item or PMCNULL. If the named item is either
0d3a865 Namespaces 14 - use NameSpace PMC for global ops
Leopold Toetsch authored
236 a NameSpace or a var, the var is returned.
237
badd187 @chipdude PDD21 reloaded, phase 1.
chipdude authored
238 TOTAL KLUDGE. ON THE CHOPPING BLOCK.
239
0d3a865 Namespaces 14 - use NameSpace PMC for global ops
Leopold Toetsch authored
240 =cut
241
242 */
243
244 void* get_pointer_keyed_str (STRING* key) {
badd187 @chipdude PDD21 reloaded, phase 1.
chipdude authored
245 PMC *ns = parrot_hash_get(INTERP, (Hash*) PMC_struct_val(SELF), key);
0d3a865 Namespaces 14 - use NameSpace PMC for global ops
Leopold Toetsch authored
246 if (!ns)
b996545 Fix #38907
Leopold Toetsch authored
247 return PMCNULL;
0d3a865 Namespaces 14 - use NameSpace PMC for global ops
Leopold Toetsch authored
248 if ((PObj_get_FLAGS(ns) & FPA_is_ns_ext) &&
249 ns->vtable->base_type == enum_class_FixedPMCArray)
250 ns = VTABLE_get_pmc_keyed_int(INTERP, ns, NS_slot_var_sub);
251 return ns;
252 }
3085c75 Namespaces 28 - hierarchical class namespaces 4
Leopold Toetsch authored
253
254 void* get_pointer_keyed(PMC *key) {
255 PMC *ns = SELF;
256 STRING *part;
57c5846 @particle [core]: remove unused variables and do whitespace fixes
particle authored
257
3085c75 Namespaces 28 - hierarchical class namespaces 4
Leopold Toetsch authored
258 if (key->vtable->base_type == enum_class_String) {
259 return SELF.get_pointer_keyed_str(VTABLE_get_string(INTERP, key));
260 }
badd187 @chipdude PDD21 reloaded, phase 1.
chipdude authored
261
262 if (key->vtable->base_type == enum_class_Key) {
3085c75 Namespaces 28 - hierarchical class namespaces 4
Leopold Toetsch authored
263 while (key) {
264 part = key_string(INTERP, key);
cc54d04 Namespaces 29 - hierarchical class namespaces 5
Leopold Toetsch authored
265 key = key_next(INTERP, key);
badd187 @chipdude PDD21 reloaded, phase 1.
chipdude authored
266 if (!key)
267 return VTABLE_get_pointer_keyed_str(INTERP, ns, part);
268 ns = Parrot_get_namespace_keyed_str(INTERP, ns, part);
3085c75 Namespaces 28 - hierarchical class namespaces 4
Leopold Toetsch authored
269 if (PMC_IS_NULL(ns))
270 return PMCNULL;
271 }
272 return ns;
273 }
badd187 @chipdude PDD21 reloaded, phase 1.
chipdude authored
274
275 real_exception(INTERP, NULL, E_NameError, "Invalid namespace key");
276 /* NOTREACHED */
277 return PMCNULL;
3085c75 Namespaces 28 - hierarchical class namespaces 4
Leopold Toetsch authored
278 }
57c5846 @particle [core]: remove unused variables and do whitespace fixes
particle authored
279
0d3a865 Namespaces 14 - use NameSpace PMC for global ops
Leopold Toetsch authored
280 /*
281
a13623c Namespaces 6 - remember namespace parent and name
Leopold Toetsch authored
282 =item C<STRING* get_string()>
283
284 Return the name of this namespace part.
285
286 =cut
287
288 */
289
290 STRING* get_string() {
291 return PMC_data(SELF);
cb1fcaa Namespaces 3 - add namespace vtable function
Leopold Toetsch authored
292 }
293
d0b24de Namespaces 9 - implement NameSpace.name()
Leopold Toetsch authored
294 /*
295
296 =back
297
298 =head2 Methods
299
300 =over 4
301
302 =cut
303
304 */
305
306 /*
307
308 =item C<METHOD PMC* name()>
309
310 Returns the name of the namespace as an array of strings.
311
312 $P2 = $P3.'name'()
313 $S0 = join '::', $P2 # '::Foo::Bar'
314
315 =cut
316
317 */
318
319 METHOD PMC* name() {
320 PMC *ar, *ns;
321
322 ar = pmc_new(INTERP, enum_class_ResizableStringArray);
323 ns = SELF;
324 while (ns) {
325 VTABLE_unshift_string(INTERP, ar, PMC_data(ns));
326 ns = PMC_pmc_val(ns);
327 }
57c5846 @particle [core]: remove unused variables and do whitespace fixes
particle authored
328
442c8fc @mdiep Don't return the NULL namespace root as part of Namespace.name()
mdiep authored
329 /* remove the NULL string of the namespace root */
330 VTABLE_shift_string(INTERP, ar);
57c5846 @particle [core]: remove unused variables and do whitespace fixes
particle authored
331
d0b24de Namespaces 9 - implement NameSpace.name()
Leopold Toetsch authored
332 return ar;
333 }
4994bce @chromatic Added find_namespace(), find_sub(), and find_var() to NameSpace PMC with...
chromatic authored
334 /*
335
336 =item C<METHOD PMC* find_namespace(STRING* name)>
337
338 Return the namespace with the given name.
339
340 =cut
341
342 */
343
344 METHOD PMC* find_namespace(STRING* key) {
345 STRING *s_ns = CONST_STRING(INTERP, "NameSpace");
346 PMC *ns = parrot_hash_get(INTERP, (Hash*) PMC_struct_val(SELF), key);
347
348 if (!ns)
349 return PMCNULL;
350
351 /* it's a NameSpace */
352 if (VTABLE_isa(INTERP, ns, s_ns))
353 return ns;
354
355 return PMCNULL;
356 }
357
358 /*
359
360 =item C<METHOD PMC* find_sub(STRING* name)>
361
362 Return the Sub PMC with the given name.
363
364 =cut
365
366 */
367
368 METHOD PMC* find_sub(STRING* key) {
369 STRING *s_sub = CONST_STRING(INTERP, "Sub");
370 PMC *sub = parrot_hash_get(INTERP, (Hash*) PMC_struct_val(SELF), key);
371
372 if (!sub)
373 return PMCNULL;
374
375 /* it's a Sub */
376 if (VTABLE_isa(INTERP, sub, s_sub))
377 return sub;
378
379 return PMCNULL;
380 }
381
382 /*
383
384 =item C<METHOD PMC* find_var(STRING* name)>
385
386 Return the PMC with the given name.
387
388 =cut
389
390 */
391
392 METHOD PMC* find_var(STRING* key) {
393 PMC *val = parrot_hash_get(INTERP, (Hash*) PMC_struct_val(SELF), key);
394
395 if (!val)
396 return PMCNULL;
397
398 return val;
399 }
7c873ca Namespaces 1 - stub in NameSpace PMC
Leopold Toetsch authored
400
401 /*
402
d21bb82 Namespace iteration (see also #39778) - 2
Leopold Toetsch authored
403 =item C<METHOD PMC* get_sym(STRING* name)>
404
405 Return the symbol (var or sub) with the given name. This can be used
406 to retrieve symbols, if a NameSpace with the same name exists.
407
408 =cut
409
410 */
411
412 METHOD PMC* get_sym(STRING* key) {
413 PMC *ns = parrot_hash_get(INTERP, (Hash*) PMC_struct_val(SELF), key);
414 if (!ns)
415 return PMCNULL;
416 if (ns->vtable == SELF->vtable) {
417 /* it's a NameSpace */
418 return PMCNULL;
419 }
420 if ((PObj_get_FLAGS(ns) & FPA_is_ns_ext) &&
421 ns->vtable->base_type == enum_class_FixedPMCArray)
422 ns = VTABLE_get_pmc_keyed_int(INTERP, ns, NS_slot_var_sub);
423 return ns;
424 }
badd187 @chipdude PDD21 reloaded, phase 1.
chipdude authored
425
426 /*
427
d34b325 Namespaces 24 - bugfix, export_to
Leopold Toetsch authored
428 =item C<METHOD void export_to(PMC* dest, PMC* what)>
429
430 Export items from this NameSpace into the C<dest> NameSpace. C<what>
431 is an array of (string) names to be exported.
432
433 =cut
434
435 */
436
437 METHOD void export_to(PMC* dest, PMC* what) {
438 INTVAL i, n;
439
440 n = VTABLE_elements(INTERP, what);
441 if (!n)
442 return;
443 for (i = 0; i < n; ++i) {
444 STRING *name;
445 PMC *el;
446
447 name = VTABLE_get_string_keyed_int(INTERP, what, i);
448 el = VTABLE_get_pmc_keyed_str(INTERP, SELF, name);
449 VTABLE_set_pmc_keyed_str(INTERP, dest, name, el);
450 }
451 }
cb6a495 add NameSpace.parent method; test
Leopold Toetsch authored
452
453 /*
454
459ea09 rename NameSpace.parent() to .get_parent()
Leopold Toetsch authored
455 =item C<METHOD PMC* get_parent()>
cb6a495 add NameSpace.parent method; test
Leopold Toetsch authored
456
ab1fc3d fix typo
Leopold Toetsch authored
457 Return the parent NameSpace or PMCNULL, if none.
cb6a495 add NameSpace.parent method; test
Leopold Toetsch authored
458
459 =cut
460
461 */
462
459ea09 rename NameSpace.parent() to .get_parent()
Leopold Toetsch authored
463 METHOD PMC* get_parent() {
cb6a495 add NameSpace.parent method; test
Leopold Toetsch authored
464 return PMC_pmc_val(SELF) ? PMC_pmc_val(SELF) : PMCNULL;
465 }
466
d34b325 Namespaces 24 - bugfix, export_to
Leopold Toetsch authored
467 }
468 /*
469
7c873ca Namespaces 1 - stub in NameSpace PMC
Leopold Toetsch authored
470 =back
471
472 =head1 SEE ALSO
473
d647e42 @ambs Namespace PMC: svn props, corrected POD name link.
ambs authored
474 F<docs/pdds/pdd21_namespaces.pod>
7c873ca Namespaces 1 - stub in NameSpace PMC
Leopold Toetsch authored
475
476 =cut
477
478 */
479
480 /*
481 * Local variables:
72575ae @bschmalhofer #40481: [PATCH] C-code coda in pmc files
bschmalhofer authored
482 * c-file-style: "parrot"
7c873ca Namespaces 1 - stub in NameSpace PMC
Leopold Toetsch authored
483 * End:
484 * vim: expandtab shiftwidth=4:
72575ae @bschmalhofer #40481: [PATCH] C-code coda in pmc files
bschmalhofer authored
485 */
Something went wrong with that request. Please try again.