diff --git a/lib/comp.c b/lib/comp.c index 9aacf5e..c3596d1 100644 --- a/lib/comp.c +++ b/lib/comp.c @@ -4430,6 +4430,8 @@ redo: case HCL_CNODE_SELF: case HCL_CNODE_SUPER: + /* if super is not sent a message, super represents the receiver + * just like self does */ if (emit_byte_instruction(hcl, HCL_CODE_PUSH_RECEIVER, HCL_CNODE_GET_LOC(oprnd)) <= -1) return -1; goto done; diff --git a/t/insta-01.hcl b/t/insta-01.hcl index 0609352..4e6f874 100644 --- a/t/insta-01.hcl +++ b/t/insta-01.hcl @@ -24,28 +24,56 @@ defclass B :: A | d e f | { return self; }; + defun :: getSuper() { return super; }; + ###defun :: getSuperclass() { return (self:superclass); }; + defun :: getSelf() { return self; }; + defun sum() { return (+ (super:get-a) (super:get-b) (super:get-c) self.d self.e self.f); }; }; -set a ((B:newInstance 1 2 3):sum); +a := ((B:newInstance 1 2 3):sum); if (/= a 18) { printf "ERROR: a must be 18\n"; } \ else { printf "OK %d\n" a; }; -set b (B:newInstance 2 3 4); -set a (b:get-a); +b := (B:newInstance 2 3 4); +a := (b:get-a); if (/= a 4) {printf "ERROR: a must be 4\n" } \ else { printf "OK %d\n" a }; -set a (b:get-b); +a := (b:get-b); if (/= a 6) { printf "ERROR: a must be 6\n" } \ else { printf "OK %d\n" a }; -set a (b:get-c); +a := (b:get-c); if (/= a 8) { printf "ERROR: a must be 8\n" } \ else {printf "OK %d\n" a }; -set a (b:sum); +a := (b:sum); if (/= a 27) { printf "ERROR: a must be 27\n" } \ else { printf "OK %d\n" a }; + +## super is equivalent to self unless a message is sent to it. +## if super itself is returned without a message, it just return +## the receiver just like self. To get the superclass, it must use +## the superclass method inherited from the Class class. + +b := (B:getSelf) +a := (B:getSuper) +##c := (B:getSuperlcass) + +if (nqv? a b) { printf "ERROR: a is not equivalent to b\n" } \ +else { printf "OK a is equivalent to b\n" }; + +##if (eqv? a c) { printf "ERROR: a is equivalent to b\n" } \ +##else { printf "OK a is not equivalent to b\n" }; + +if (nqv? a B) { printf "ERROR: a is not equivalent to B\n" } \ +else { printf "OK a is equivalent to A\n" }; + +if (nqv? b B) { printf "ERROR: b is not equivalent to B\n" } \ +else { printf "OK b is equivalent to B\n" }; + +##if (nqv? c A) { printf "ERROR: c is not equivalent to A\n" } \ +##else { printf "OK c is equivalent to A\n" };