Commit e72156b3 authored by Russ Cox's avatar Russ Cox

remove unused labels

R=golang-dev, gri
CC=golang-dev
https://golang.org/cl/4274052
parent 35cee9f5
...@@ -12,6 +12,8 @@ ...@@ -12,6 +12,8 @@
package net package net
import "os"
// IP address lengths (bytes). // IP address lengths (bytes).
const ( const (
IPv4len = 4 IPv4len = 4
...@@ -39,11 +41,7 @@ type IPMask []byte ...@@ -39,11 +41,7 @@ type IPMask []byte
// IPv4 address a.b.c.d. // IPv4 address a.b.c.d.
func IPv4(a, b, c, d byte) IP { func IPv4(a, b, c, d byte) IP {
p := make(IP, IPv6len) p := make(IP, IPv6len)
for i := 0; i < 10; i++ { copy(p, v4InV6Prefix)
p[i] = 0
}
p[10] = 0xff
p[11] = 0xff
p[12] = a p[12] = a
p[13] = b p[13] = b
p[14] = c p[14] = c
...@@ -51,6 +49,8 @@ func IPv4(a, b, c, d byte) IP { ...@@ -51,6 +49,8 @@ func IPv4(a, b, c, d byte) IP {
return p return p
} }
var v4InV6Prefix = []byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xff, 0xff}
// IPv4Mask returns the IP mask (in 16-byte form) of the // IPv4Mask returns the IP mask (in 16-byte form) of the
// IPv4 mask a.b.c.d. // IPv4 mask a.b.c.d.
func IPv4Mask(a, b, c, d byte) IPMask { func IPv4Mask(a, b, c, d byte) IPMask {
...@@ -140,9 +140,24 @@ func (ip IP) DefaultMask() IPMask { ...@@ -140,9 +140,24 @@ func (ip IP) DefaultMask() IPMask {
return nil // not reached return nil // not reached
} }
func allFF(b []byte) bool {
for _, c := range b {
if c != 0xff {
return false
}
}
return true
}
// Mask returns the result of masking the IP address ip with mask. // Mask returns the result of masking the IP address ip with mask.
func (ip IP) Mask(mask IPMask) IP { func (ip IP) Mask(mask IPMask) IP {
n := len(ip) n := len(ip)
if len(mask) == 16 && len(ip) == 4 && allFF(mask[:12]) {
mask = mask[12:]
}
if len(mask) == 4 && len(ip) == 16 && bytesEqual(ip[:12], v4InV6Prefix) {
ip = ip[12:]
}
if n != len(mask) { if n != len(mask) {
return nil return nil
} }
...@@ -245,6 +260,34 @@ func (ip IP) String() string { ...@@ -245,6 +260,34 @@ func (ip IP) String() string {
return s return s
} }
// Equal returns true if ip and x are the same IP address.
// An IPv4 address and that same address in IPv6 form are
// considered to be equal.
func (ip IP) Equal(x IP) bool {
if len(ip) == len(x) {
return bytesEqual(ip, x)
}
if len(ip) == 4 && len(x) == 16 {
return bytesEqual(x[0:12], v4InV6Prefix) && bytesEqual(ip, x[12:])
}
if len(ip) == 16 && len(x) == 4 {
return bytesEqual(ip[0:12], v4InV6Prefix) && bytesEqual(ip[12:], x)
}
return false
}
func bytesEqual(x, y []byte) bool {
if len(x) != len(y) {
return false
}
for i, b := range x {
if y[i] != b {
return false
}
}
return true
}
// If mask is a sequence of 1 bits followed by 0 bits, // If mask is a sequence of 1 bits followed by 0 bits,
// return the number of 1 bits. // return the number of 1 bits.
func simpleMaskLength(mask IPMask) int { func simpleMaskLength(mask IPMask) int {
...@@ -351,7 +394,6 @@ func parseIPv6(s string) IP { ...@@ -351,7 +394,6 @@ func parseIPv6(s string) IP {
// Loop, parsing hex numbers followed by colon. // Loop, parsing hex numbers followed by colon.
j := 0 j := 0
L:
for j < IPv6len { for j < IPv6len {
// Hex number. // Hex number.
n, i1, ok := xtoi(s, i) n, i1, ok := xtoi(s, i)
...@@ -432,15 +474,66 @@ L: ...@@ -432,15 +474,66 @@ L:
return p return p
} }
// A SyntaxError represents a malformed text string and the type of string that was expected.
type SyntaxError struct {
Type string
Text string
}
func (e *SyntaxError) String() string {
return "invalid " + e.Type + ": " + e.Text
}
func parseIP(s string) IP {
if p := parseIPv4(s); p != nil {
return p
}
if p := parseIPv6(s); p != nil {
return p
}
return nil
}
// ParseIP parses s as an IP address, returning the result. // ParseIP parses s as an IP address, returning the result.
// The string s can be in dotted decimal ("74.125.19.99") // The string s can be in dotted decimal ("74.125.19.99")
// or IPv6 ("2001:4860:0:2001::68") form. // or IPv6 ("2001:4860:0:2001::68") form.
// If s is not a valid textual representation of an IP address, // If s is not a valid textual representation of an IP address,
// ParseIP returns nil. // ParseIP returns nil.
func ParseIP(s string) IP { func ParseIP(s string) IP {
p := parseIPv4(s) if p := parseIPv4(s); p != nil {
if p != nil {
return p return p
} }
return parseIPv6(s) return parseIPv6(s)
} }
// ParseCIDR parses s as a CIDR notation IP address and mask,
// like "192.168.100.1/24" or "2001:DB8::/48".
func ParseCIDR(s string) (ip IP, mask IPMask, err os.Error) {
i := byteIndex(s, '/')
if i < 0 {
return nil, nil, &SyntaxError{"CIDR address", s}
}
ipstr, maskstr := s[:i], s[i+1:]
ip = ParseIP(ipstr)
nn, i, ok := dtoi(maskstr, 0)
if ip == nil || !ok || i != len(maskstr) || nn < 0 || nn > 8*len(ip) {
return nil, nil, &SyntaxError{"CIDR address", s}
}
n := uint(nn)
if len(ip) == 4 {
v4mask := ^uint32(0xffffffff >> n)
mask = IPMask(IPv4(byte(v4mask>>24), byte(v4mask>>16), byte(v4mask>>8), byte(v4mask)))
return ip, mask, nil
}
mask = make(IPMask, 16)
for i := 0; i < 16; i++ {
if n >= 8 {
mask[i] = 0xff
n -= 8
continue
}
mask[i] = ^byte(0xff >> n)
n = 0
}
return ip, mask, nil
}
...@@ -267,7 +267,6 @@ func (t *Template) nextItem() []byte { ...@@ -267,7 +267,6 @@ func (t *Template) nextItem() []byte {
} }
leadingSpace := i > start leadingSpace := i > start
// What's left is nothing, newline, delimited string, or plain text // What's left is nothing, newline, delimited string, or plain text
Switch:
switch { switch {
case i == len(t.buf): case i == len(t.buf):
// EOF; nothing to do // EOF; nothing to do
......
...@@ -815,7 +815,6 @@ Input: ...@@ -815,7 +815,6 @@ Input:
// Parsers are required to recognize lt, gt, amp, apos, and quot // Parsers are required to recognize lt, gt, amp, apos, and quot
// even if they have not been declared. That's all we allow. // even if they have not been declared. That's all we allow.
var i int var i int
CharLoop:
for i = 0; i < len(p.tmp); i++ { for i = 0; i < len(p.tmp); i++ {
var ok bool var ok bool
p.tmp[i], ok = p.getc() p.tmp[i], ok = p.getc()
......
...@@ -7,16 +7,21 @@ ...@@ -7,16 +7,21 @@
package main package main
func main() { func main() {
var i int; var i int
var j int; var j int
if true {} if true {
{ return } }
i = 0; {
if true {} else i++; return
type s struct {}; }
i = 0; i = 0
type s2 int; if true {
var k = func (a int) int { return a+1 }(3); } else {
_, _ = j, k; i++
ro: ; }
type s struct{}
i = 0
type s2 int
var k = func(a int) int { return a + 1 }(3)
_, _ = j, k
} }
// $G $D/$F.go && $L $F.$A && ./$A.out // $G $D/$F.go && $L $F.$A
// Copyright 2009 The Go Authors. All rights reserved. // Copyright 2009 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style // Use of this source code is governed by a BSD-style
...@@ -7,12 +7,16 @@ ...@@ -7,12 +7,16 @@
package main package main
func f() { func f() {
exit: ; exit:
;
goto exit
} }
func main() { func main() {
exit: ; // this should be legal (labels not properly scoped?) exit:
; // this should be legal (labels not properly scoped?)
goto exit
} }
/* /*
......
...@@ -7,7 +7,8 @@ ...@@ -7,7 +7,8 @@
package main package main
func main() { func main() {
var exit int; var exit int
exit: exit:
_ = exit; _ = exit
goto exit
} }
...@@ -7,18 +7,19 @@ ...@@ -7,18 +7,19 @@
package main package main
func f1() { func f1() {
exit: exit:
print("hi\n"); print("hi\n")
goto exit
} }
func f2() { func f2() {
const c = 1234; const c = 1234
} }
func f3() { func f3() {
i := c; // ERROR "undef" i := c // ERROR "undef"
} }
func main() { func main() {
f3(); f3()
} }
...@@ -8,16 +8,21 @@ package main ...@@ -8,16 +8,21 @@ package main
func main() { func main() {
L1: L1:
L2: for i := 0; i < 10; i++ { L2:
print(i); for i := 0; i < 10; i++ {
break L2; print(i)
break L2
} }
L3: ; L3:
L4: for i := 0; i < 10; i++ { ;
print(i); L4:
break L4; for i := 0; i < 10; i++ {
print(i)
break L4
} }
goto L1
goto L3
} }
/* /*
......
...@@ -7,8 +7,17 @@ ...@@ -7,8 +7,17 @@
package main package main
func main() { func main() {
if true {} else L1: ; if true {
if true {} else L2: main() ; } else {
L1:
}
if true {
} else {
L2:
main()
}
goto L1
goto L2
} }
/* /*
......
...@@ -9,19 +9,25 @@ package main ...@@ -9,19 +9,25 @@ package main
func main() { func main() {
L: L:
for i := 0; i < 1; i++ { for i := 0; i < 1; i++ {
L1: L1:
for { for {
break L; break L
} }
panic("BUG: not reached - break"); panic("BUG: not reached - break")
} }
L2: L2:
for i := 0; i < 1; i++ { for i := 0; i < 1; i++ {
L3: L3:
for { for {
continue L2; continue L2
} }
panic("BUG: not reached - continue"); panic("BUG: not reached - continue")
}
if false {
goto L1
}
if false {
goto L3
} }
} }
...@@ -10,16 +10,18 @@ func main() { ...@@ -10,16 +10,18 @@ func main() {
L: L:
for { for {
for { for {
break L2; // ERROR "L2" break L2 // ERROR "L2"
continue L2; // ERROR "L2" continue L2 // ERROR "L2"
} }
} }
L1: L1:
x := 1; x := 1
_ = x; _ = x
for { for {
break L1; // ERROR "L1" break L1 // ERROR "L1"
continue L1; // ERROR "L1" continue L1 // ERROR "L1"
} }
goto L
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment