]> Cypherpunks repositories - gostls13.git/commitdiff
defer statement
authorRobert Griesemer <gri@golang.org>
Tue, 27 Jan 2009 01:48:27 +0000 (17:48 -0800)
committerRobert Griesemer <gri@golang.org>
Tue, 27 Jan 2009 01:48:27 +0000 (17:48 -0800)
R=r
OCL=23542
CL=23542

usr/gri/pretty/parser.go
usr/gri/pretty/printer.go
usr/gri/pretty/scanner.go
usr/gri/pretty/selftest2.go
usr/gri/pretty/test.sh

index fc20c2fbea019a3fc51c61e311c432c96ba8a34a..8af9591a198ca732d4e3fba2e7c60a0980c698e2 100644 (file)
@@ -1186,11 +1186,11 @@ func (P *Parser) ParseSimpleStat(range_ok bool) *AST.Stat {
 }
 
 
-func (P *Parser) ParseGoStat() *AST.Stat {
-       P.Trace("GoStat");
+func (P *Parser) ParseInvocationStat(keyword int) *AST.Stat {
+       P.Trace("InvocationStat");
 
-       s := AST.NewStat(P.pos, Scanner.GO);
-       P.Expect(Scanner.GO);
+       s := AST.NewStat(P.pos, keyword);
+       P.Expect(keyword);
        s.Expr = P.ParseExpression(1);
 
        P.Ecart();
@@ -1434,8 +1434,8 @@ func (P *Parser) ParseStatement() *AST.Stat {
                Scanner.LBRACK, Scanner.STRUCT,  // composite type
                Scanner.MUL, Scanner.AND, Scanner.ARROW:  // unary
                s = P.ParseSimpleStat(false);
-       case Scanner.GO:
-               s = P.ParseGoStat();
+       case Scanner.GO, Scanner.DEFER:
+               s = P.ParseInvocationStat(P.tok);
        case Scanner.RETURN:
                s = P.ParseReturnStat();
        case Scanner.BREAK, Scanner.CONTINUE, Scanner.GOTO, Scanner.FALLTHROUGH:
index 87b5f68167f12bf25816259de36685083df7d857..9de403e5dc89ccf7bb929eb9a34740d90ff290fb 100644 (file)
@@ -776,7 +776,9 @@ func (P *Printer) Stat(s *AST.Stat) {
                P.indentation--;
                P.newlines = 1;
 
-       case Scanner.GO, Scanner.RETURN, Scanner.FALLTHROUGH, Scanner.BREAK, Scanner.CONTINUE, Scanner.GOTO:
+       case
+               Scanner.GO, Scanner.DEFER, Scanner.RETURN, Scanner.FALLTHROUGH,
+               Scanner.BREAK, Scanner.CONTINUE, Scanner.GOTO:
                P.Token(s.Pos, s.Tok);
                if s.Expr != nil {
                        P.separator = blank;
index 49aaecb6ad09a6eb28201f5b473e7b2a653b69b6..0fcf104362e4c80580ba0882ffa27a353ed90ec8 100644 (file)
@@ -84,6 +84,7 @@ const (
        CONTINUE;
 
        DEFAULT;
+       DEFER;
        ELSE;
        FALLTHROUGH;
        FOR;
@@ -185,6 +186,7 @@ func TokenString(tok int) string {
        case CONTINUE: return "continue";
 
        case DEFAULT: return "default";
+       case DEFER: return "defer";
        case ELSE: return "else";
        case FALLTHROUGH: return "fallthrough";
        case FOR: return "for";
index 7b5fc649455b790c55c2e285b549e5f7ec311fdb..ab3e0e4ae75afee83f580ef6441cc03424a3927f 100644 (file)
@@ -123,7 +123,7 @@ func f3(a *[]int, m map[string] int) {
        var i string;
        var x int;
        for i, x = range m {
-               println(i, x);
+               defer println(i, x);
        }
 }
 
index 9d07fe81fb1399606c8ff97dfd7de405a7a56924..29b2c818f6feb05f46d4f43fe7b457129f87d582 100755 (executable)
@@ -27,7 +27,7 @@ apply1() {
        # the following have semantic errors: bug039.go | bug040.go
        method1.go | selftest1.go | func3.go | \
        bug014.go | bug025.go | bug029.go | bug032.go | bug039.go | bug040.go | bug050.go |  bug068.go | \
-       bug088.go | bug083.go | bug106.go | bug125.go | bug126.go | bug132.go ) ;;
+       bug088.go | bug083.go | bug106.go | bug125.go | bug126.go | bug132.go | bug133.go ) ;;
        * ) $1 $2; count $F;;
        esac
 }