shithub: scc

Download patch

ref: 0d0b0348c1e5864db9ccb539f98e49299833f68b
parent: 414ccc5a4e31eb805c5031d43f01d73c373019f7
author: Roberto E. Vargas Caballero <[email protected]>
date: Wed Apr 16 08:54:23 EDT 2014

Add return statement

--- a/cc.h
+++ b/cc.h
@@ -233,7 +233,7 @@
 };
 
 extern void
-	emitdcl(Symbol *),
+	emitdcl(Symbol *), emitsframe(Symbol *), emiteframe(Symbol *),
 	emitsym(Node *), emitunary(Node *),
 	emitbin(Node *), emitexp(Node *), emitconst(Node *np);
 
--- a/code.c
+++ b/code.c
@@ -171,15 +171,22 @@
 }
 
 void
-emitframe(Symbol *sym)
+emitsframe(Symbol *sym)
 {
 	puts("{");
 }
 
 void
-emitret(Symbol *sym)
+emiteframe(Symbol *sym)
 {
 	puts("}");
+}
+
+void
+emitret(Type *tp)
+{
+	fputs("\ty", stdout);
+	emittype(tp);
 }
 
 Node *
--- a/decl.c
+++ b/decl.c
@@ -497,9 +497,12 @@
 			if (BTYPE(tp) == FTN) {
 				emitfun(sym);
 				if (yytoken == '{') {
-					emitframe(sym);
+					extern Symbol *curfun;
+
+					curfun = sym;
+					emitsframe(sym);
 					context(compound);
-					emitret(sym);
+					emiteframe(sym); /* FIX: sym is not used */
 					freesyms(NS_LABEL);
 					return;
 				}
--- a/expr.c
+++ b/expr.c
@@ -95,7 +95,7 @@
 /*
  * Convert a Node to a type
  */
-static Node *
+Node *
 convert(Node *np, Type *tp1, char iscast)
 {
 	Type *tp2;
--- a/stmt.c
+++ b/stmt.c
@@ -4,17 +4,39 @@
 
 #include "cc.h"
 
+Symbol *curfun;
+
+extern void decl(void);
+extern Node *expr(void);
+extern Node *convert(Node *np, Type *tp1, char iscast);
+
+static void
+Return(void)
+{
+	Node *np;
+	Type *tp = curfun->type->type;
+
+	expect(RETURN);
+	np = expr();
+	if (np->type != tp) {
+		if ((np = convert(np, tp, 0)) == NULL)
+			error("incorrect type in return");
+	}
+	emitret(tp);
+	emitexp(np);
+}
+
 void
 compound(void)
 {
-	extern void decl(void);
-	extern Node *expr(void);
-
 	expect('{');
 	while (!accept('}')) {
 		switch (yytoken) {
 		case TYPE: case SCLASS: case TQUALIFIER:
 			decl();
+			break;
+		case RETURN:
+			Return();
 			break;
 		default:
 			emitexp(expr());