Ticket #1262 (closed patch: done)

Opened 5 years ago

Last modified 5 years ago

Simple patch for the overriding of invoke for objects

Reported by: NotFound Owned by:
Priority: normal Milestone:
Component: none Version: 1.7.0
Severity: medium Keywords:
Cc: Language:
Patch status: applied Platform:

Description

This simple change makes object() works as expected for the short test case I tried:

Index: src/pmc/object.pmc
===================================================================
--- src/pmc/object.pmc	(revision 42404)
+++ src/pmc/object.pmc	(working copy)
@@ -616,8 +616,11 @@
             PMC * const meth =
                 Parrot_oo_find_vtable_override_for_class(interp, cur_class,
                                                          meth_name);
-            if (!PMC_IS_NULL(meth))
+            if (!PMC_IS_NULL(meth)) {
+                PMC *call_sig = Parrot_pcc_get_signature(interp, CURRENT_CONTEXT(interp));
+                VTABLE_unshift_pmc(interp, call_sig, SELF);
                 return VTABLE_invoke(interp, meth, next);
+	    }
 
             if (cur_class->vtable->base_type == enum_class_PMCProxy) {
                 /* Get the PMC instance and call the vtable method on that. */

This is the test:

.sub main :main
  $P0 = newclass ['myobj']
  addattribute $P0, 'name'
  $P1 = new $P0
  $P3 = new 'String'
  $P3 = 'world'
  setattribute $P1, 'name', $P3
  $P1()
.end

.namespace ['myobj']

.sub hello :method
  print 'hello, '
  $P1 = getattribute self, 'name'
  say $P1
.end

.sub 'invoke' :vtable
  self.'hello'()
.end

Change History

Changed 5 years ago by NotFound

  • status changed from new to closed
  • resolution set to done
  • patch set to applied

After disucssion and some changes, applied in r42424.

See TT #103 for the discussion of the invoke vtable.

Note: See TracTickets for help on using tickets.