Skip to content

Commit 3a80453

Browse files
committed
try to implement exists_keyed* vtable overrides by adopted copy & paste
1 parent 94e55ed commit 3a80453

File tree

2 files changed

+66
-0
lines changed

2 files changed

+66
-0
lines changed

src/metamodel/how/NQPMu.pm

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,4 +57,11 @@ class NQPCapture is NQPMu {
5757
method ($key, $value) is parrot_vtable('set_pmc_keyed_int') {
5858
@!array[$key] := $value
5959
}
60+
61+
method ($key) is parrot_vtable('exists_keyed_str') {
62+
pir::exists(%!hash, $key);
63+
}
64+
method ($key) is parrot_vtable('exists_keyed_int') {
65+
pir::exists(@!array, $key);
66+
}
6067
}

src/pmc/rakudoobject.pmc

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -233,4 +233,63 @@ pmclass RakudoObject manual_attrs dynpmc group nqp {
233233
else
234234
SUPER(key, value);
235235
}
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+
}
236295
}

0 commit comments

Comments
 (0)