#!/usr/local/bin/rune -x # # Demonstrate reference types import "sys"; import ; alias stdio.File *stdout = stdio.stdout; class Fubar { int a = 1; int b = 2; int c = 3; int addme(Fubar @this) { stdio.stdout->show("addme-Fubar:", this->a, this->b, this->c); return(this->a + this->b + this->c); } method int addme2() { return(this.a + this.b + this.c); } destructor method void killme() { stdio.stdout->show("DESTRUCTED"); } } subclass Fubar as SubFubar { refine int a; refine int addme(Fubar @this) { return(this->a + this->b + this->c + 1); } refine method int addme2() { return(this.a + this.b + this.c + 1); } } subclass Fubar as FuA5 { refine int a = 5; int x = 99; } subclass Fubar as FuA6 { refine int a = 6; int x = 99; int y = 99; } Fubar @base; void addList(Fubar @ptr) { base = ptr; stdout->show("value-std", base->addme(base)); stdout->show("value-method", base->addme2()); } # switch main and altmain to test simple referencing, else we do the # more complex test. # int altmain(int ac, char **av) { int x; Fubar *s1; s1.new(); s1->addme(s1); s1 = NULL; return(1); } int main(int ac, char **av) { Fubar @fu; FuA5 fua5; FuA6 fua6; Fubar *s1; SubFubar *s2; int i; s1.new(); s2.new(); s1->a = 1; s2->b = 1; stdout->show("s1 direct-value-std (should be 6):", s1->addme(s1)); stdout->show("s1 direct-value-method (should be 6):", s1->addme2()); stdout->show("s2 direct-value-std (should be 5):", s2->addme(s2)); stdout->show("s2 direct-value-method (should be 5):", s2->addme2()); # XXX addList calls will crash on s1->addme (unimplemented method # extraction for now, remove this comment when this is implemented) # addList(s1); addList(s2); fu = &fua5; stdout->show("fua5 (should be 5):", fu->a); fu = &fua6; stdout->show("fua6 (should be 6):", fu->a); fu = &fua5; stdout->show("fua5 (should be 5):", fu->a); }