scalar decoders
R=rsc
DELTA=897 (728 added, 14 deleted, 155 changed)
OCL=30955
CL=30955
diff --git a/src/pkg/gob/encode.go b/src/pkg/gob/encode.go
index 6654ac5..4175610 100644
--- a/src/pkg/gob/encode.go
+++ b/src/pkg/gob/encode.go
@@ -67,11 +67,20 @@
// Otherwise, the output (for a scalar) is the field number, as an encoded integer,
// followed by the field data in its appropriate format.
-func encBool(i *encInstr, state *EncState) {
- p := unsafe.Pointer(state.base+i.offset);
- for indir := i.indir; indir > 0; indir-- {
+func encIndirect(p unsafe.Pointer, indir int) unsafe.Pointer {
+ for ; indir > 0; indir-- {
p = *(*unsafe.Pointer)(p);
if p == nil {
+ return unsafe.Pointer(nil)
+ }
+ }
+ return p
+}
+
+func encBool(i *encInstr, state *EncState) {
+ p := unsafe.Pointer(state.base+i.offset);
+ if i.indir > 0 {
+ if p = encIndirect(p, i.indir); p == nil {
return
}
}
@@ -84,9 +93,8 @@
func encInt(i *encInstr, state *EncState) {
p := unsafe.Pointer(state.base+i.offset);
- for indir := i.indir; indir > 0; indir-- {
- p = *(*unsafe.Pointer)(p);
- if p == nil {
+ if i.indir > 0 {
+ if p = encIndirect(p, i.indir); p == nil {
return
}
}
@@ -99,9 +107,8 @@
func encUint(i *encInstr, state *EncState) {
p := unsafe.Pointer(state.base+i.offset);
- for indir := i.indir; indir > 0; indir-- {
- p = *(*unsafe.Pointer)(p);
- if p == nil {
+ if i.indir > 0 {
+ if p = encIndirect(p, i.indir); p == nil {
return
}
}
@@ -114,9 +121,8 @@
func encInt8(i *encInstr, state *EncState) {
p := unsafe.Pointer(state.base+i.offset);
- for indir := i.indir; indir > 0; indir-- {
- p = *(*unsafe.Pointer)(p);
- if p == nil {
+ if i.indir > 0 {
+ if p = encIndirect(p, i.indir); p == nil {
return
}
}
@@ -129,9 +135,8 @@
func encUint8(i *encInstr, state *EncState) {
p := unsafe.Pointer(state.base+i.offset);
- for indir := i.indir; indir > 0; indir-- {
- p = *(*unsafe.Pointer)(p);
- if p == nil {
+ if i.indir > 0 {
+ if p = encIndirect(p, i.indir); p == nil {
return
}
}
@@ -144,9 +149,8 @@
func encInt16(i *encInstr, state *EncState) {
p := unsafe.Pointer(state.base+i.offset);
- for indir := i.indir; indir > 0; indir-- {
- p = *(*unsafe.Pointer)(p);
- if p == nil {
+ if i.indir > 0 {
+ if p = encIndirect(p, i.indir); p == nil {
return
}
}
@@ -159,9 +163,8 @@
func encUint16(i *encInstr, state *EncState) {
p := unsafe.Pointer(state.base+i.offset);
- for indir := i.indir; indir > 0; indir-- {
- p = *(*unsafe.Pointer)(p);
- if p == nil {
+ if i.indir > 0 {
+ if p = encIndirect(p, i.indir); p == nil {
return
}
}
@@ -174,9 +177,8 @@
func encInt32(i *encInstr, state *EncState) {
p := unsafe.Pointer(state.base+i.offset);
- for indir := i.indir; indir > 0; indir-- {
- p = *(*unsafe.Pointer)(p);
- if p == nil {
+ if i.indir > 0 {
+ if p = encIndirect(p, i.indir); p == nil {
return
}
}
@@ -189,9 +191,8 @@
func encUint32(i *encInstr, state *EncState) {
p := unsafe.Pointer(state.base+i.offset);
- for indir := i.indir; indir > 0; indir-- {
- p = *(*unsafe.Pointer)(p);
- if p == nil {
+ if i.indir > 0 {
+ if p = encIndirect(p, i.indir); p == nil {
return
}
}
@@ -204,9 +205,8 @@
func encInt64(i *encInstr, state *EncState) {
p := unsafe.Pointer(state.base+i.offset);
- for indir := i.indir; indir > 0; indir-- {
- p = *(*unsafe.Pointer)(p);
- if p == nil {
+ if i.indir > 0 {
+ if p = encIndirect(p, i.indir); p == nil {
return
}
}
@@ -219,9 +219,8 @@
func encUint64(i *encInstr, state *EncState) {
p := unsafe.Pointer(state.base+i.offset);
- for indir := i.indir; indir > 0; indir-- {
- p = *(*unsafe.Pointer)(p);
- if p == nil {
+ if i.indir > 0 {
+ if p = encIndirect(p, i.indir); p == nil {
return
}
}
@@ -250,9 +249,8 @@
func encFloat(i *encInstr, state *EncState) {
p := unsafe.Pointer(state.base+i.offset);
- for indir := i.indir; indir > 0; indir-- {
- p = *(*unsafe.Pointer)(p);
- if p == nil {
+ if i.indir > 0 {
+ if p = encIndirect(p, i.indir); p == nil {
return
}
}
@@ -266,9 +264,8 @@
func encFloat32(i *encInstr, state *EncState) {
p := unsafe.Pointer(state.base+i.offset);
- for indir := i.indir; indir > 0; indir-- {
- p = *(*unsafe.Pointer)(p);
- if p == nil {
+ if i.indir > 0 {
+ if p = encIndirect(p, i.indir); p == nil {
return
}
}
@@ -282,9 +279,8 @@
func encFloat64(i *encInstr, state *EncState) {
p := unsafe.Pointer(state.base+i.offset);
- for indir := i.indir; indir > 0; indir-- {
- p = *(*unsafe.Pointer)(p);
- if p == nil {
+ if i.indir > 0 {
+ if p = encIndirect(p, i.indir); p == nil {
return
}
}