Selaa lähdekoodia

Only generate FIL when needed

ceriel 36 vuotta sitten
vanhempi
commit
ca26a52b10
4 muutettua tiedostoa jossa 22 lisäystä ja 11 poistoa
  1. 6 4
      lang/m2/comp/code.c
  2. 3 2
      lang/m2/comp/defmodule.c
  3. 3 0
      lang/m2/comp/scope.h
  4. 10 5
      lang/m2/comp/walk.c

+ 6 - 4
lang/m2/comp/code.c

@@ -311,8 +311,8 @@ CodeCall(nd)
 		and result is already done.
 	*/
 	register t_node *left = nd->nd_left;
-	register t_node *right = nd->nd_right;
 	register t_type *result_tp;
+	int needs_fn;
 
 	if (left->nd_type == std_type) {
 		CodeStd(nd);
@@ -321,8 +321,8 @@ CodeCall(nd)
 
 	assert(IsProcCall(left));
 
-	if (right) {
-		CodeParameters(ParamList(left->nd_type), right);
+	if (nd->nd_right) {
+		CodeParameters(ParamList(left->nd_type), nd->nd_right);
 	}
 
 	switch(left->nd_class) {
@@ -333,11 +333,13 @@ CodeCall(nd)
 			if (level > 0) {
 				C_lxl((arith) (proclevel - level));
 			}
+			needs_fn = left->nd_def->df_scope->sc_defmodule;
 			C_cal(NameOfProc(left->nd_def));
 			break;
 		}}
 		/* Fall through */
 	default:
+		needs_fn = 1;
 		CodePExpr(left);
 		C_cai();
 	}
@@ -350,7 +352,7 @@ CodeCall(nd)
 		}
 		else	C_lfr(sz);
 	}
-	DoFilename();
+	DoFilename(needs_fn);
 	DoLineno(nd);
 }
 

+ 3 - 2
lang/m2/comp/defmodule.c

@@ -93,7 +93,7 @@ GetDefinitionModule(id, incr)
 	t_scopelist *vis;
 	char *fn = FileName;
 	int ln = LineNumber;
-	t_scope *newsc = CurrentScope;
+	t_scope *newsc;
 
 	level += incr;
 	df = lookup(id, GlobalScope, D_IMPORTED, 0);
@@ -105,13 +105,14 @@ GetDefinitionModule(id, incr)
 		ForeignFlag = 0;
 		DefId = id;
 		open_scope(CLOSEDSCOPE);
+		newsc = CurrentScope;
 		vis = CurrVis;
+		newsc->sc_defmodule = incr;
 		if (!strcmp(id->id_text, "SYSTEM")) {
 			do_SYSTEM();
 			df = lookup(id, GlobalScope, D_IMPORTED, 0);
 		}
 		else {
-			newsc = CurrentScope;
 			if (!is_anon_idf(id) && GetFile(id->id_text)) {
 
 				DefModule();

+ 3 - 0
lang/m2/comp/scope.h

@@ -28,6 +28,9 @@ struct scope {
 	struct def *sc_def;	/* list of definitions in this scope */
 	arith sc_off;		/* offsets of variables in this scope */
 	char sc_scopeclosed;	/* flag indicating closed or open scope */
+	char sc_defmodule;	/* flag set is this scope is from a separate
+				   definition module
+				*/
 	int sc_level;		/* level of this scope */
 	struct def *sc_definedby; /* The def structure defining this scope */
 	struct node *sc_end;	/* node to remember line number of end of scope */

+ 10 - 5
lang/m2/comp/walk.c

@@ -117,12 +117,12 @@ DoLineno(nd)
 	}
 }
 
-DoFilename()
+DoFilename(needed)
 {
 	static label	filename_label = 0;
 
-	oldlineno = 0;
-	if (! options['L']) {
+	oldlineno = 0;	/* always invalidate remembered line number */
+	if (needed && ! options['L']) {
 
 		if (! filename_label) {
 			filename_label = 1;
@@ -185,7 +185,7 @@ WalkModule(module)
 		for (; nd; nd = nd->nd_left) {
 			C_cal(nd->nd_def->mod_vis->sc_scope->sc_name);
 		}
-		DoFilename();
+		DoFilename(1);
 	}
 	WalkDefList(sc->sc_def, MkCalls);
 	proclevel++;
@@ -230,7 +230,12 @@ WalkProcedure(procedure)
 	C_ms_par(procedure->df_type->prc_nbpar);
 	TmpOpen(procscope);
 	DoPriority();
-	DoFilename();		/* ??? only when this procedure is exported? */
+	/* generate code for filename only when the procedure can be
+	   exported, either directly or by taking the address.
+	   This cannot be done if the level is not zero (because in
+	   this case it is a nested procedure).
+	*/
+	DoFilename(! procscope->sc_level);
 
 	func_type = tp = RemoveEqual(ResultType(procedure->df_type));