-
Notifications
You must be signed in to change notification settings - Fork 138
/
lexinfo.pmc
121 lines (78 loc) · 2.38 KB
/
lexinfo.pmc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
/*
Copyright (C) 2008-2014, Parrot Foundation.
=head1 NAME
src/pmc/lexinfo.pmc - LexInfo PMC
=head1 DESCRIPTION
These are the vtable functions for the lexinfo PMC.
=head2 Functions
=over 4
=cut
*/
#include "pmc/pmc_hash.h"
/* HEADERIZER HFILE: none */
/* HEADERIZER BEGIN: static */
/* HEADERIZER END: static */
/*
* LexInfo contains a constant Hash with constant string
* keys and integer indices
*/
pmclass LexInfo extends Hash provides hash no_ro auto_attrs {
/*
=item C<init_pmc(PMC *sub)>
Initialize the LexInfo PMC and remember the associate
subroutine.
The C<sub> argument is currently ignored.
=cut
*/
VTABLE void init() :manual_wb {
/* Set value type to INTVAL */
SELF.init_int((INTVAL)enum_type_INTVAL);
}
VTABLE void init_pmc(PMC *sub) :manual_wb {
UNUSED(sub)
/* Set value type to INTVAL */
SELF.init_int((INTVAL)enum_type_INTVAL);
}
/*
=item C<void declare_lex_preg(STRING *name, INTVAL preg)>
Declare a lexical variable that is an alias for a PMC register. This is
the dynamic version of a ".lex STRING, PREG" directive.
Note that the second argument is just an integer, i.e. C<0> for C<$P0>.
=cut
*/
METHOD declare_lex_preg(STRING *name, INTVAL preg) {
VTABLE_set_integer_keyed_str(INTERP, SELF, name,
(preg << 2) | REGNO_PMC);
}
/*
=item C<PMC *inspect_str(STRING *what)>
Introspects this LexInfo structure. The only valid introspection key is
C<symbols>, which gets an array of the names of the symbols in this lexpad.
=cut
*/
VTABLE PMC *inspect_str(STRING *what) :no_wb {
if (STRING_equal(INTERP, what, CONST_STRING(INTERP, "symbols"))) {
PMC * const result = Parrot_pmc_new(INTERP, enum_class_ResizableStringArray);
const Hash *hash = (Hash *)SELF.get_pointer();
parrot_hash_iterate(hash,
PARROT_ASSERT(_bucket->key);
VTABLE_push_string(INTERP, result, (STRING *)_bucket->key););
return result;
}
else
Parrot_ex_throw_from_c_args(INTERP, NULL, EXCEPTION_INVALID_OPERATION,
"Unknown introspection value '%S'", what);
}
}
/*
=back
=head1 SEE ALSO
F<docs/pdds/pdd20_lexical_vars.pod>, F<src/classes/lexpad.pmc>.
=cut
*/
/*
* Local variables:
* c-file-style: "parrot"
* End:
* vim: expandtab shiftwidth=4 cinoptions='\:2=2' :
*/