Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Work around Parrot's nuts keys implementation. This means the getting…
…/setting keys in the capture bit now seems to work well, which gets us to the next error, which is just that NQPCapture needs some more implementation effort (exists). Also will need to make those v-tables overridable.
  • Loading branch information
jnthn committed Feb 16, 2011
1 parent a484ca8 commit 94e55ed
Showing 1 changed file with 41 additions and 25 deletions.
66 changes: 41 additions & 25 deletions src/pmc/rakudoobject.pmc
Expand Up @@ -120,20 +120,28 @@ pmclass RakudoObject manual_attrs dynpmc group nqp {
}

VTABLE PMC * get_pmc_keyed(PMC *key) {
PMC **vt = STABLE(SELF)->parrot_vtable_mapping;
PMC *meth;
if (vt && !PMC_IS_NULL(meth = vt[PARROT_VTABLE_SLOT_GET_PMC_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);
if (key->vtable->base_type == enum_class_Key) {
if (PObj_get_FLAGS(key) & KEY_integer_FLAG)
return SELF.get_pmc_keyed_int(VTABLE_get_integer(interp, key));
else
return SELF.get_pmc_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_GET_PMC_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);
}
else
return SUPER(key);
}

VTABLE PMC * get_pmc_keyed_int(INTVAL key) {
Expand Down Expand Up @@ -171,19 +179,27 @@ pmclass RakudoObject manual_attrs dynpmc group nqp {
}

VTABLE void set_pmc_keyed(PMC *key, PMC *value) {
PMC **vt = STABLE(SELF)->parrot_vtable_mapping;
PMC *meth;
if (vt && !PMC_IS_NULL(meth = vt[PARROT_VTABLE_SLOT_SET_PMC_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);
VTABLE_push_pmc(interp, cappy, value);
Parrot_pcc_invoke_from_sig_object(interp, meth, cappy);
Parrot_pcc_set_signature(interp, CURRENT_CONTEXT(interp), old_ctx);
if (key->vtable->base_type == enum_class_Key) {
if (PObj_get_FLAGS(key) & KEY_integer_FLAG)
SELF.set_pmc_keyed_int(VTABLE_get_integer(interp, key), value);
else
SELF.set_pmc_keyed_str(VTABLE_get_string(interp, key), value);
}
else {
PMC **vt = STABLE(SELF)->parrot_vtable_mapping;
PMC *meth;
if (vt && !PMC_IS_NULL(meth = vt[PARROT_VTABLE_SLOT_SET_PMC_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);
VTABLE_push_pmc(interp, cappy, value);
Parrot_pcc_invoke_from_sig_object(interp, meth, cappy);
Parrot_pcc_set_signature(interp, CURRENT_CONTEXT(interp), old_ctx);
}
else
SUPER(key, value);
}
else
SUPER(key, value);
}

VTABLE void set_pmc_keyed_int(INTVAL key, PMC *value) {
Expand Down

0 comments on commit 94e55ed

Please sign in to comment.