@@ -233,4 +233,63 @@ pmclass RakudoObject manual_attrs dynpmc group nqp {
233
233
else
234
234
SUPER(key, value);
235
235
}
236
+
237
+ VTABLE PMC * exists_keyed(PMC *key) {
238
+ if (key->vtable->base_type == enum_class_Key) {
239
+ if (PObj_get_FLAGS(key) & KEY_integer_FLAG)
240
+ return SELF.exists_keyed_int(VTABLE_get_integer(interp, key));
241
+ else
242
+ return SELF.exists_keyed_str(VTABLE_get_string(interp, key));
243
+ }
244
+ else {
245
+ PMC **vt = STABLE(SELF)->parrot_vtable_mapping;
246
+ PMC *meth;
247
+ if (vt && !PMC_IS_NULL(meth = vt[PARROT_VTABLE_SLOT_EXISTS_KEYED])) {
248
+ PMC *old_ctx = Parrot_pcc_get_signature(interp, CURRENT_CONTEXT(interp));
249
+ PMC *cappy = Parrot_pmc_new(interp, enum_class_CallContext);
250
+ VTABLE_push_pmc(interp, cappy, SELF);
251
+ VTABLE_push_pmc(interp, cappy, key);
252
+ Parrot_pcc_invoke_from_sig_object(interp, meth, cappy);
253
+ cappy = Parrot_pcc_get_signature(interp, CURRENT_CONTEXT(interp));
254
+ Parrot_pcc_set_signature(interp, CURRENT_CONTEXT(interp), old_ctx);
255
+ return VTABLE_get_pmc_keyed_int(interp, cappy, 0);
256
+ }
257
+ else
258
+ return SUPER(key);
259
+ }
260
+ }
261
+
262
+ VTABLE PMC * exists_keyed_int(INTVAL key) {
263
+ PMC **vt = STABLE(SELF)->parrot_vtable_mapping;
264
+ PMC *meth;
265
+ if (vt && !PMC_IS_NULL(meth = vt[PARROT_VTABLE_SLOT_EXISTS_KEYED_INT])) {
266
+ PMC *old_ctx = Parrot_pcc_get_signature(interp, CURRENT_CONTEXT(interp));
267
+ PMC *cappy = Parrot_pmc_new(interp, enum_class_CallContext);
268
+ VTABLE_push_pmc(interp, cappy, SELF);
269
+ VTABLE_push_integer(interp, cappy, key);
270
+ Parrot_pcc_invoke_from_sig_object(interp, meth, cappy);
271
+ cappy = Parrot_pcc_get_signature(interp, CURRENT_CONTEXT(interp));
272
+ Parrot_pcc_set_signature(interp, CURRENT_CONTEXT(interp), old_ctx);
273
+ return VTABLE_get_pmc_keyed_int(interp, cappy, 0);
274
+ }
275
+ else
276
+ return SUPER(key);
277
+ }
278
+
279
+ VTABLE PMC * exists_keyed_str(STRING *key) {
280
+ PMC **vt = STABLE(SELF)->parrot_vtable_mapping;
281
+ PMC *meth;
282
+ if (vt && !PMC_IS_NULL(meth = vt[PARROT_VTABLE_SLOT_EXISTS_KEYED_STR])) {
283
+ PMC *old_ctx = Parrot_pcc_get_signature(interp, CURRENT_CONTEXT(interp));
284
+ PMC *cappy = Parrot_pmc_new(interp, enum_class_CallContext);
285
+ VTABLE_push_pmc(interp, cappy, SELF);
286
+ VTABLE_push_string(interp, cappy, key);
287
+ Parrot_pcc_invoke_from_sig_object(interp, meth, cappy);
288
+ cappy = Parrot_pcc_get_signature(interp, CURRENT_CONTEXT(interp));
289
+ Parrot_pcc_set_signature(interp, CURRENT_CONTEXT(interp), old_ctx);
290
+ return VTABLE_get_pmc_keyed_int(interp, cappy, 0);
291
+ }
292
+ else
293
+ return SUPER(key);
294
+ }
236
295
}
0 commit comments