Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
try to implement exists_keyed* vtable overrides by adopted copy & paste
  • Loading branch information
moritz committed Feb 16, 2011
1 parent 94e55ed commit 3a80453
Show file tree
Hide file tree
Showing 2 changed files with 66 additions and 0 deletions.
7 changes: 7 additions & 0 deletions src/metamodel/how/NQPMu.pm
Expand Up @@ -57,4 +57,11 @@ class NQPCapture is NQPMu {
method ($key, $value) is parrot_vtable('set_pmc_keyed_int') {
@!array[$key] := $value
}

method ($key) is parrot_vtable('exists_keyed_str') {
pir::exists(%!hash, $key);
}
method ($key) is parrot_vtable('exists_keyed_int') {
pir::exists(@!array, $key);
}
}
59 changes: 59 additions & 0 deletions src/pmc/rakudoobject.pmc
Expand Up @@ -233,4 +233,63 @@ pmclass RakudoObject manual_attrs dynpmc group nqp {
else
SUPER(key, value);
}

VTABLE PMC * exists_keyed(PMC *key) {
if (key->vtable->base_type == enum_class_Key) {
if (PObj_get_FLAGS(key) & KEY_integer_FLAG)
return SELF.exists_keyed_int(VTABLE_get_integer(interp, key));
else
return SELF.exists_keyed_str(VTABLE_get_string(interp, key));
}
else {
PMC **vt = STABLE(SELF)->parrot_vtable_mapping;
PMC *meth;
if (vt && !PMC_IS_NULL(meth = vt[PARROT_VTABLE_SLOT_EXISTS_KEYED])) {
PMC *old_ctx = Parrot_pcc_get_signature(interp, CURRENT_CONTEXT(interp));
PMC *cappy = Parrot_pmc_new(interp, enum_class_CallContext);
VTABLE_push_pmc(interp, cappy, SELF);
VTABLE_push_pmc(interp, cappy, key);
Parrot_pcc_invoke_from_sig_object(interp, meth, cappy);
cappy = Parrot_pcc_get_signature(interp, CURRENT_CONTEXT(interp));
Parrot_pcc_set_signature(interp, CURRENT_CONTEXT(interp), old_ctx);
return VTABLE_get_pmc_keyed_int(interp, cappy, 0);
}
else
return SUPER(key);
}
}

VTABLE PMC * exists_keyed_int(INTVAL key) {
PMC **vt = STABLE(SELF)->parrot_vtable_mapping;
PMC *meth;
if (vt && !PMC_IS_NULL(meth = vt[PARROT_VTABLE_SLOT_EXISTS_KEYED_INT])) {
PMC *old_ctx = Parrot_pcc_get_signature(interp, CURRENT_CONTEXT(interp));
PMC *cappy = Parrot_pmc_new(interp, enum_class_CallContext);
VTABLE_push_pmc(interp, cappy, SELF);
VTABLE_push_integer(interp, cappy, key);
Parrot_pcc_invoke_from_sig_object(interp, meth, cappy);
cappy = Parrot_pcc_get_signature(interp, CURRENT_CONTEXT(interp));
Parrot_pcc_set_signature(interp, CURRENT_CONTEXT(interp), old_ctx);
return VTABLE_get_pmc_keyed_int(interp, cappy, 0);
}
else
return SUPER(key);
}

VTABLE PMC * exists_keyed_str(STRING *key) {
PMC **vt = STABLE(SELF)->parrot_vtable_mapping;
PMC *meth;
if (vt && !PMC_IS_NULL(meth = vt[PARROT_VTABLE_SLOT_EXISTS_KEYED_STR])) {
PMC *old_ctx = Parrot_pcc_get_signature(interp, CURRENT_CONTEXT(interp));
PMC *cappy = Parrot_pmc_new(interp, enum_class_CallContext);
VTABLE_push_pmc(interp, cappy, SELF);
VTABLE_push_string(interp, cappy, key);
Parrot_pcc_invoke_from_sig_object(interp, meth, cappy);
cappy = Parrot_pcc_get_signature(interp, CURRENT_CONTEXT(interp));
Parrot_pcc_set_signature(interp, CURRENT_CONTEXT(interp), old_ctx);
return VTABLE_get_pmc_keyed_int(interp, cappy, 0);
}
else
return SUPER(key);
}
}

0 comments on commit 3a80453

Please sign in to comment.