@@ -77,39 +77,56 @@ static void * default_get_boxed_ref(PARROT_INTERP, STable *st, void *data, INTVA
77
77
"%Ss cannot box other types" , st -> REPR -> name );
78
78
}
79
79
PARROT_DOES_NOT_RETURN
80
- static void die_no_idx (PARROT_INTERP , STRING * repr_name ) {
80
+ static void die_no_pos (PARROT_INTERP , STRING * repr_name ) {
81
81
Parrot_ex_throw_from_c_args (interp , NULL , EXCEPTION_INVALID_OPERATION ,
82
- "%Ss representation does not support indexed storage" , repr_name );
82
+ "%Ss representation does not support positional storage" , repr_name );
83
83
}
84
84
static void default_at_pos_native (PARROT_INTERP , STable * st , void * data , INTVAL index , NativeValue * value ) {
85
- die_no_idx (interp , st -> REPR -> name );
85
+ die_no_pos (interp , st -> REPR -> name );
86
86
}
87
87
static PMC * default_at_pos_boxed (PARROT_INTERP , STable * st , void * data , INTVAL index ) {
88
- die_no_idx (interp , st -> REPR -> name );
88
+ die_no_pos (interp , st -> REPR -> name );
89
89
}
90
90
static void default_bind_pos_native (PARROT_INTERP , STable * st , void * data , INTVAL index , NativeValue * value ) {
91
- die_no_idx (interp , st -> REPR -> name );
91
+ die_no_pos (interp , st -> REPR -> name );
92
92
}
93
93
static void default_bind_pos_boxed (PARROT_INTERP , STable * st , void * data , INTVAL index , PMC * obj ) {
94
- die_no_idx (interp , st -> REPR -> name );
94
+ die_no_pos (interp , st -> REPR -> name );
95
95
}
96
96
static INTVAL default_elems (PARROT_INTERP , STable * st , void * data ) {
97
- die_no_idx (interp , st -> REPR -> name );
97
+ die_no_pos (interp , st -> REPR -> name );
98
98
}
99
99
static void default_push_boxed (PARROT_INTERP , STable * st , void * data , PMC * obj ) {
100
- die_no_idx (interp , st -> REPR -> name );
100
+ die_no_pos (interp , st -> REPR -> name );
101
101
}
102
102
static PMC * default_pop_boxed (PARROT_INTERP , STable * st , void * data ) {
103
- die_no_idx (interp , st -> REPR -> name );
103
+ die_no_pos (interp , st -> REPR -> name );
104
104
}
105
105
static void default_unshift_boxed (PARROT_INTERP , STable * st , void * data , PMC * obj ) {
106
- die_no_idx (interp , st -> REPR -> name );
106
+ die_no_pos (interp , st -> REPR -> name );
107
107
}
108
108
static PMC * default_shift_boxed (PARROT_INTERP , STable * st , void * data ) {
109
- die_no_idx (interp , st -> REPR -> name );
109
+ die_no_pos (interp , st -> REPR -> name );
110
110
}
111
111
static STable * default_get_elem_stable (PARROT_INTERP , STable * st ) {
112
- die_no_idx (interp , st -> REPR -> name );
112
+ die_no_pos (interp , st -> REPR -> name );
113
+ }
114
+ PARROT_DOES_NOT_RETURN
115
+ static void die_no_ass (PARROT_INTERP , STRING * repr_name ) {
116
+ Parrot_ex_throw_from_c_args (interp , NULL , EXCEPTION_INVALID_OPERATION ,
117
+ "%Ss representation does not support associative storage" , repr_name );
118
+ }
119
+ static PMC * default_at_key_boxed (PARROT_INTERP , STable * st , void * data , STRING * key ) {
120
+ die_no_ass (interp , st -> REPR -> name );
121
+ }
122
+ static void default_bind_key_boxed (PARROT_INTERP , STable * st , void * data , STRING * key , PMC * value ) {
123
+ die_no_ass (interp , st -> REPR -> name );
124
+ }
125
+ static INTVAL default_exists_key (PARROT_INTERP , STable * st , void * data , STRING * key ) {
126
+ die_no_ass (interp , st -> REPR -> name );
127
+ }
128
+ static void default_delete_key (PARROT_INTERP , STable * st , void * data , STRING * key ) {
129
+ die_no_ass (interp , st -> REPR -> name );
113
130
}
114
131
115
132
/* Set default attribute functions on a REPR that lacks them. */
@@ -150,6 +167,15 @@ static void add_default_pos_funcs(PARROT_INTERP, REPROps *repr) {
150
167
repr -> pos_funcs -> get_elem_stable = default_get_elem_stable ;
151
168
}
152
169
170
+ /* Set default associative functions on a REPR that lacks them. */
171
+ static void add_default_ass_funcs (PARROT_INTERP , REPROps * repr ) {
172
+ repr -> ass_funcs = mem_allocate_typed (REPROps_Associative );
173
+ repr -> ass_funcs -> at_key_boxed = default_at_key_boxed ;
174
+ repr -> ass_funcs -> bind_key_boxed = default_bind_key_boxed ;
175
+ repr -> ass_funcs -> exists_key = default_exists_key ;
176
+ repr -> ass_funcs -> delete_key = default_delete_key ;
177
+ }
178
+
153
179
/* Registers a representation. It this is ever made public, it should first be
154
180
* made thread-safe. */
155
181
static void register_repr (PARROT_INTERP , STRING * name , REPROps * repr ) {
@@ -169,6 +195,8 @@ static void register_repr(PARROT_INTERP, STRING *name, REPROps *repr) {
169
195
add_default_box_funcs (interp , repr );
170
196
if (!repr -> pos_funcs )
171
197
add_default_pos_funcs (interp , repr );
198
+ if (!repr -> ass_funcs )
199
+ add_default_ass_funcs (interp , repr );
172
200
}
173
201
174
202
/* Dynamically registers a representation (that is, one defined outside of
0 commit comments