Browse Source

codec: re-org decode.go so decodeNaked happens within kInterface specialized function.

Ugorji Nwoke 12 years ago
parent
commit
265e3b5146
1 changed files with 22 additions and 33 deletions
  1. 22 33
      codec/decode.go

+ 22 - 33
codec/decode.go

@@ -207,7 +207,28 @@ func (f *decFnInfo) kUint16(rv reflect.Value) {
 // }
 // }
 
 
 func (f *decFnInfo) kInterface(rv reflect.Value) {
 func (f *decFnInfo) kInterface(rv reflect.Value) {
-	f.d.decodeValue(rv.Elem())
+	if rv.IsNil() {
+		// if nil interface, use some hieristics to set the nil interface to an
+		// appropriate value based on the first byte read (byte descriptor bd)
+		rv2, ndesc := f.dd.decodeNaked()
+		if ndesc == dncNil {
+			return
+		}
+		// Cannot decode into nil interface with methods (e.g. error, io.Reader, etc) 
+		// if non-nil value in stream.
+		if num := f.ti.rt.NumMethod(); num > 0 {
+			decErr("decodeValue: Cannot decode non-nil codec value into nil %v (%v methods)", 
+				f.ti.rt , num)
+		} 
+		if ndesc == dncHandled {
+			rv.Set(rv2)
+			return
+		}
+		f.d.decodeValue(rv2)
+		rv.Set(rv2)
+	} else {
+		f.d.decodeValue(rv.Elem())
+	}
 }
 }
 
 
 func (f *decFnInfo) kStruct(rv reflect.Value) {
 func (f *decFnInfo) kStruct(rv reflect.Value) {
@@ -524,32 +545,7 @@ func (d *Decoder) decodeValue(rv reflect.Value) {
 		rv = rv.Elem()
 		rv = rv.Elem()
 	}
 	}
 	
 	
-	rvOrig := rv
-
 	rt := rv.Type()
 	rt := rv.Type()
-	wasNilIntf := rt.Kind() == reflect.Interface && rv.IsNil()
-
-	var ndesc decodeNakedContext
-	//if nil interface, use some hieristics to set the nil interface to an
-	//appropriate value based on the first byte read (byte descriptor bd)
-	if wasNilIntf {
-		// e.g. nil interface{}, error, io.Reader, etc
-		rv, ndesc = d.d.decodeNaked()
-		if ndesc == dncNil {
-			return
-		}
-		// Cannot decode into nil interface with methods (e.g. error, io.Reader, etc) 
-		// if non-nil value in stream.
-		if num := rt.NumMethod(); num > 0 {
-			decErr("decodeValue: Cannot decode non-nil codec value into nil %v (%v methods)", rt, num)
-		} 
-		if ndesc == dncHandled {
-			rvOrig.Set(rv)
-			return
-		}
-		rt = rv.Type()
-	} 
-
 	rtid := reflect.ValueOf(rt).Pointer()
 	rtid := reflect.ValueOf(rt).Pointer()
 	
 	
 	// retrieve or register a focus'ed function for this type
 	// retrieve or register a focus'ed function for this type
@@ -581,9 +577,6 @@ func (d *Decoder) decodeValue(rv reflect.Value) {
 		// registered a pointer or non-pointer type, meaning we may have to recurse first
 		// registered a pointer or non-pointer type, meaning we may have to recurse first
 		// before matching a mapped type, even though the extension byte is already detected.
 		// before matching a mapped type, even though the extension byte is already detected.
 		//
 		//
-		// If we are checking for builtin or ext type here, it means we didn't go through decodeNaked,
-		// Because decodeNaked would have handled it. It also means wasNilIntf = false.
-		// 
 		// NOTE: if decoding into a nil interface{}, we return a non-nil
 		// NOTE: if decoding into a nil interface{}, we return a non-nil
 		// value except even if the container registers a length of 0.
 		// value except even if the container registers a length of 0.
 		if rtid == rawExtTypId {
 		if rtid == rawExtTypId {
@@ -654,10 +647,6 @@ func (d *Decoder) decodeValue(rv reflect.Value) {
 	
 	
 	fn.f(fn.i, rv)
 	fn.f(fn.i, rv)
 	
 	
-	if wasNilIntf {
-		rvOrig.Set(rv)
-	}
-	
 	return
 	return
 }
 }