[Commit] nickle ChangeLog,1.49,1.50 compile.c,1.151,1.152

Keith Packard commit at keithp.com
Tue May 25 20:13:09 PDT 2004


Committed by: keithp

Update of /local/src/CVS/nickle
In directory home.keithp.com:/tmp/cvs-serv30740

Modified Files:
	ChangeLog compile.c 
Log Message:
2004-05-25  Keith Packard  <keithp at keithp.com>
version 2.35

	* compile.c: (CompileLvalue), (CompileAssign), (CompileAssignOp),
	(CompileAssignFunc), (CompileArrayInit), (_CompileExpr),
	(CompileDecl):
	Allow &rvalue and have it automatically box the value.


Index: ChangeLog
===================================================================
RCS file: /local/src/CVS/nickle/ChangeLog,v
retrieving revision 1.49
retrieving revision 1.50
diff -u -d -r1.49 -r1.50
--- a/ChangeLog	23 May 2004 06:01:51 -0000	1.49
+++ b/ChangeLog	26 May 2004 03:13:06 -0000	1.50
@@ -1,3 +1,11 @@
+2004-05-25  Keith Packard  <keithp at keithp.com>
+version 2.35
+
+	* compile.c: (CompileLvalue), (CompileAssign), (CompileAssignOp),
+	(CompileAssignFunc), (CompileArrayInit), (_CompileExpr),
+	(CompileDecl):
+	Allow &rvalue and have it automatically box the value.
+
 2004-05-21 Bart Massey <bart at cs.pdx.edu>
 version 2.34
 	

Index: compile.c
===================================================================
RCS file: /local/src/CVS/nickle/compile.c,v
retrieving revision 1.151
retrieving revision 1.152
diff -u -d -r1.151 -r1.152
--- a/compile.c	21 May 2004 06:10:34 -0000	1.151
+++ b/compile.c	26 May 2004 03:13:06 -0000	1.152
@@ -218,7 +218,7 @@
 
 typedef enum _tail { TailNever, TailVoid, TailAlways } Tail;
 
-ObjPtr	CompileLvalue (ObjPtr obj, ExprPtr expr, ExprPtr stat, CodePtr code, Bool createIfNecessary, Bool assign, Bool initialize, Bool amper);
+ObjPtr	CompileLvalue (ObjPtr obj, ExprPtr expr, ExprPtr stat, CodePtr code, Bool createIfNecessary, Bool assign, Bool initialize, Bool amper, Bool auto_reference);
 ObjPtr	CompileBinOp (ObjPtr obj, ExprPtr expr, BinaryOp op, ExprPtr stat, CodePtr code);
 ObjPtr	CompileBinFunc (ObjPtr obj, ExprPtr expr, BinaryFunc func, ExprPtr stat, CodePtr code, char *name);
 ObjPtr	CompileUnOp (ObjPtr obj, ExprPtr expr, UnaryOp op, ExprPtr stat, CodePtr code);
@@ -455,10 +455,11 @@
  */
 ObjPtr
 CompileLvalue (ObjPtr obj, ExprPtr expr, ExprPtr stat, CodePtr code,
-	       Bool createIfNecessary, Bool assign, Bool initialize, Bool amper)
+	       Bool createIfNecessary, Bool assign, Bool initialize, 
+	       Bool amper, Bool auto_reference)
 {
     ENTER ();
-    InstPtr	inst;
+    InstPtr	inst = 0;
     SymbolPtr	s;
     int		depth;
     int		ndim;
@@ -524,11 +525,13 @@
 	break;
     case AMPER:
 	obj = CompileLvalue (obj, expr->tree.left, stat, code,
-			     createIfNecessary, assign, initialize, True);
+			     createIfNecessary, assign, initialize, 
+			     True, False);
 	expr->base.type = expr->tree.left->base.type;
 	break;
     case COLONCOLON:
-	obj = CompileLvalue (obj, expr->tree.right, stat, code, False, assign, initialize, amper);
+	obj = CompileLvalue (obj, expr->tree.right, stat, code, False, assign, initialize, 
+			     amper, auto_reference);
 	expr->base.type = expr->tree.right->base.type;
         break;
     case DOT:
@@ -601,8 +604,17 @@
 	}
 	break;
     default:
-	CompileError (obj, stat, "Invalid lvalue");
-        expr->base.type = typePoly;
+	if (auto_reference)
+	{
+	    obj = _CompileExpr (obj, expr, True, stat, code);
+	    BuildInst (obj, OpUnFunc, inst, stat);
+	    inst->unfunc.func = do_reference;
+	}
+	else
+	{
+	    CompileError (obj, stat, "Invalid lvalue");
+	    expr->base.type = typePoly;
+	}
 	break;
     }
     if (flipTypes)
@@ -855,7 +867,8 @@
     ENTER ();
     InstPtr inst;
     
-    obj = CompileLvalue (obj, expr->tree.left, stat, code, True, True, initialize, False);
+    obj = CompileLvalue (obj, expr->tree.left, stat, code, True, True, initialize, 
+			 False, False);
     SetPush (obj);
     obj = _CompileExpr (obj, expr->tree.right, True, stat, code);
     expr->base.type = TypeCombineBinary (expr->tree.left->base.type,
@@ -879,7 +892,8 @@
     ENTER ();
     InstPtr inst;
     
-    obj = CompileLvalue (obj, expr->tree.left, stat, code, False, False, False, False);
+    obj = CompileLvalue (obj, expr->tree.left, stat, code, False, False, False, 
+			 False, False);
     SetPush (obj);
     BuildInst (obj, OpFetch, inst, stat);
     SetPush (obj);
@@ -906,7 +920,8 @@
     ENTER ();
     InstPtr inst;
     
-    obj = CompileLvalue (obj, expr->tree.left, stat, code, False, False, False, False);
+    obj = CompileLvalue (obj, expr->tree.left, stat, code, False, False, False, 
+			 False, False);
     SetPush (obj);
     BuildInst (obj, OpFetch, inst, stat);
     SetPush (obj);
@@ -1674,7 +1689,7 @@
 	SetPush (obj);
 	obj = CompileLvalue (obj,
 			     expr->tree.left->tree.right,
-			     stat, code, False, True, True, False);
+			     stat, code, False, True, True, False, False);
 	SetPush (obj);
     }
     obj = CompileBuildArray (obj, expr, type, dimensions, ndim, stat, code);
@@ -2401,7 +2416,8 @@
 	break;
     case STAR:	    obj = CompileUnFunc (obj, expr, Dereference, stat, code,"*"); break;
     case AMPER:	    
-	obj = CompileLvalue (obj, expr->tree.left, stat, code, False, False, False, False);
+	obj = CompileLvalue (obj, expr->tree.left, stat, code, False, False, False, 
+			     False, True);
 	t = CompileRefType (expr->tree.left->base.type);
 	if (!t)
 	    t = expr->tree.left->base.type;
@@ -2421,7 +2437,8 @@
     case INC:	    
 	if (expr->tree.left)
 	{
-	    obj = CompileLvalue (obj, expr->tree.left, stat, code, False, False, False, False);
+	    obj = CompileLvalue (obj, expr->tree.left, stat, code, False, False, False, 
+				 False, False);
 	    expr->base.type = TypeCombineBinary (expr->tree.left->base.type,
 						 ASSIGNPLUS,
 						 typePrim[rep_int]);
@@ -2429,7 +2446,8 @@
 	}
 	else
 	{
-	    obj = CompileLvalue (obj, expr->tree.right, stat, code, False, False, False, False);
+	    obj = CompileLvalue (obj, expr->tree.right, stat, code, 
+				 False, False, False, False, False);
 	    expr->base.type = TypeCombineBinary (expr->tree.right->base.type,
 						 ASSIGNPLUS,
 						 typePrim[rep_int]);
@@ -2448,7 +2466,8 @@
     case DEC:
 	if (expr->tree.left)
 	{
-	    obj = CompileLvalue (obj, expr->tree.left, stat, code, False, False, False, False);
+	    obj = CompileLvalue (obj, expr->tree.left, stat, code, 
+				 False, False, False, False, False);
 	    expr->base.type = TypeCombineBinary (expr->tree.left->base.type,
 						 ASSIGNMINUS,
 						 typePrim[rep_int]);
@@ -2456,7 +2475,8 @@
 	}
 	else
 	{
-	    obj = CompileLvalue (obj, expr->tree.right, stat, code, False, False, False, False);
+	    obj = CompileLvalue (obj, expr->tree.right, stat, code, 
+				 False, False, False, False, False);
 	    expr->base.type = TypeCombineBinary (expr->tree.right->base.type,
 						 ASSIGNMINUS,
 						 typePrim[rep_int]);
@@ -2681,7 +2701,8 @@
     case ASSIGNPOW:
 	obj = _CompileExpr (obj, expr->tree.left, True, stat, code);
 	SetPush (obj);
-	obj = CompileLvalue (obj, expr->tree.right->tree.left, stat, code, False, False, False, False);
+	obj = CompileLvalue (obj, expr->tree.right->tree.left, stat, code,
+			     False, False, False, False, False);
 	SetPush (obj);
 	obj = _CompileExpr (obj, expr->tree.right->tree.right, True, stat, code);
 	expr->base.type = TypeCombineBinary (expr->tree.right->tree.left->base.type,
@@ -4008,7 +4029,8 @@
 	    lvalue = NewExprAtom (decl->name, decl->symbol, False);
 	    *initObj = CompileLvalue (*initObj, lvalue,
 				       decls, code, False, True, True, 
-				      CompileRefType (s->symbol.type) != 0);
+				      CompileRefType (s->symbol.type) != 0,
+				      False);
 	    SetPush (*initObj);
 	    *initObj = CompileInit (*initObj, init, s->symbol.type, stat, code);
 	    CompileDeclInitObjFinish (&obj, initObj, code, code_compile);




More information about the Commit mailing list