/* Sun-$Revision: 23.6 $ */ /* Copyright 1992-9 Sun Microsystems, Inc. and Stanford University. See the LICENSE file for license information. */ # pragma interface struct Send: Expr { Expr* receiver; String* message; String* del; Send(Expr* r, String* m, String* d, char* start, char* end, char* file, fint line, fint col, Parser* p) : Expr(start, end, file, line, col, p){ receiver = r; message = m; del = d; } bool IsSend() { return true; } bool GenByteCodes(AbstractByteCode* b, Object* parent, bool isExpr = true); void oops_do(oopsDoFn f) { Expr::oops_do(f); if (receiver) receiver->oops_do(f); } void addCommentAnnotations(Scanner* scanner); bool GenReceiverForPseudoPrim(AbstractByteCode* b, Object* parent); void PrintDelegatee(); }; struct Unary: Send { Unary(Expr* r, String* m, String* d, char* start, char* end, char* file, fint line, fint col, Parser* p) : Send(r, m, d, start, end, file, line, col, p) {} bool GenByteCodes(AbstractByteCode* b, Object* parent, bool isExpr = true); void Print(); }; struct Binary: Unary { Expr* arg; Binary(Expr* r, String* m, Expr* a, String* d, char* start, char* end, char* file, fint line, fint col, Parser* p) : Unary(r, m, d, start, end, file, line, col, p) { arg = a; } bool IsBinary() { return true; } bool GenByteCodes(AbstractByteCode* b, Object* parent, bool isExpr = true); void oops_do(oopsDoFn f) { Unary::oops_do(f); arg->oops_do(f); } void addCommentAnnotations(Scanner* scanner); void Print(); }; struct Keyword: Send { StringList* keywords; ExprList* args; Keyword(Expr* r, StringList* k, ExprList* a, String* d, char* start, char* end, char* file, fint line, fint col, Parser* p) : Send(r, 0, d, start, end, file, line, col, p) { keywords = k; args = a; message = keywords->AsSelector(); } bool IsKeyword() { return true; } bool GenByteCodes(AbstractByteCode* b, Object* parent, bool isExpr = true); bool GenBranch(AbstractByteCode* b, Object* parent, bool cond, Expr* testMe, Expr* dst); bool GenIndexedBranch(AbstractByteCode* b, Object* parent); bool GenLabelDefinition(AbstractByteCode* b, Object* parent); void oops_do(oopsDoFn f) { Send::oops_do(f); args->oops_do(f); } void addCommentAnnotations(Scanner* scanner); void Print(); };