TBR v23proxy: support FromZero.

MultiPart: 6/6
Change-Id: I4afbf386f27465d74ce4417f87b8844979feef65
diff --git a/go/src/v.io/x/mojo/proxy/util/util_test.go b/go/src/v.io/x/mojo/proxy/util/util_test.go
index 7375b6d..143f7d8 100644
--- a/go/src/v.io/x/mojo/proxy/util/util_test.go
+++ b/go/src/v.io/x/mojo/proxy/util/util_test.go
@@ -5,12 +5,12 @@
 package util_test
 
 import (
-	"testing"
 	"reflect"
+	"testing"
 
+	"v.io/v23/vdl"
 	"v.io/v23/vom"
 	"v.io/x/mojo/proxy/util"
-	"v.io/v23/vdl"
 )
 
 type TestStructA struct {
@@ -66,4 +66,4 @@
 	if got, want := out, expectedRaw; !reflect.DeepEqual(got, want) {
 		t.Errorf("got %v, want %v", got, want)
 	}
-}
\ No newline at end of file
+}
diff --git a/go/src/v.io/x/mojo/tests/client/test_client.go b/go/src/v.io/x/mojo/tests/client/test_client.go
index 64bff14..7841083 100644
--- a/go/src/v.io/x/mojo/tests/client/test_client.go
+++ b/go/src/v.io/x/mojo/tests/client/test_client.go
@@ -28,7 +28,7 @@
 import "C"
 
 var (
-	mojoFlag *flag.FlagSet
+	mojoFlag     *flag.FlagSet
 	endpointFlag *string
 )
 
diff --git a/go/src/v.io/x/mojo/transcoder/from_mojom.go b/go/src/v.io/x/mojo/transcoder/from_mojom.go
index 85df7b5..7ee6faf 100644
--- a/go/src/v.io/x/mojo/transcoder/from_mojom.go
+++ b/go/src/v.io/x/mojo/transcoder/from_mojom.go
@@ -27,7 +27,7 @@
 	return FromMojo(target, data, datatype)
 }
 
-func FromMojo(target vdl.Target, data []byte, datatype *vdl.Type) error  {
+func FromMojo(target vdl.Target, data []byte, datatype *vdl.Type) error {
 	mtv := &mojomToTargetTranscoder{modec: bindings.NewDecoder(data, nil)}
 	return mtv.transcodeValue(datatype, target, true, false)
 }
@@ -134,7 +134,7 @@
 		case err != nil:
 			return err
 		case ptr == 0 && isNullable:
-			return target.FromNil(vdl.OptionalType(vt))
+			return target.FromZero(vdl.OptionalType(vt))
 		case ptr == 0 && !isNullable:
 			return fmt.Errorf("invalid null struct pointer")
 		}
@@ -212,7 +212,7 @@
 		case err != nil:
 			return err
 		case ptr == 0 && isNullable:
-			return target.FromNil(vdl.OptionalType(vt))
+			return target.FromZero(vdl.OptionalType(vt))
 		case ptr == 0 && !isNullable:
 			return fmt.Errorf("invalid null struct pointer")
 		}
@@ -278,7 +278,7 @@
 			case err != nil:
 				return err
 			case ptr == 0 && isNullable:
-				return target.FromNil(vdl.OptionalType(vt))
+				return target.FromZero(vdl.OptionalType(vt))
 			case ptr == 0 && !isNullable:
 				return fmt.Errorf("invalid null struct pointer")
 			}
@@ -318,7 +318,7 @@
 		}
 		if size == 0 {
 			mtv.modec.SkipUnionValue()
-			return target.FromNil(vdl.OptionalType(vt))
+			return target.FromZero(vdl.OptionalType(vt))
 		}
 		if int(tag) >= vt.NumField() {
 			return fmt.Errorf("union tag out of bounds")
@@ -337,7 +337,7 @@
 			case err != nil:
 				return err
 			case ptr == 0 && isNullable:
-				return target.FromNil(vdl.OptionalType(fld.Type))
+				return target.FromZero(vdl.OptionalType(fld.Type))
 			case ptr == 0 && !isNullable:
 				return fmt.Errorf("invalid null union pointer")
 			}
diff --git a/go/src/v.io/x/mojo/transcoder/internal/internal.vdl.go b/go/src/v.io/x/mojo/transcoder/internal/internal.vdl.go
index 79e1592..76b2812 100644
--- a/go/src/v.io/x/mojo/transcoder/internal/internal.vdl.go
+++ b/go/src/v.io/x/mojo/transcoder/internal/internal.vdl.go
@@ -34,55 +34,86 @@
 	if err != nil {
 		return err
 	}
-
 	keyTarget2, fieldTarget3, err := fieldsTarget1.StartField("Street")
 	if err != vdl.ErrFieldNoExist && err != nil {
 		return err
 	}
 	if err != vdl.ErrFieldNoExist {
-		if err := fieldTarget3.FromString(string(m.Street), tt.NonOptional().Field(0).Type); err != nil {
-			return err
+
+		var4 := (m.Street == "")
+		if var4 {
+			if err := fieldTarget3.FromZero(tt.NonOptional().Field(0).Type); err != nil {
+				return err
+			}
+		} else {
+			if err := fieldTarget3.FromString(string(m.Street), tt.NonOptional().Field(0).Type); err != nil {
+				return err
+			}
 		}
 		if err := fieldsTarget1.FinishField(keyTarget2, fieldTarget3); err != nil {
 			return err
 		}
 	}
-	keyTarget4, fieldTarget5, err := fieldsTarget1.StartField("City")
+	keyTarget5, fieldTarget6, err := fieldsTarget1.StartField("City")
 	if err != vdl.ErrFieldNoExist && err != nil {
 		return err
 	}
 	if err != vdl.ErrFieldNoExist {
-		if err := fieldTarget5.FromString(string(m.City), tt.NonOptional().Field(1).Type); err != nil {
-			return err
+
+		var7 := (m.City == "")
+		if var7 {
+			if err := fieldTarget6.FromZero(tt.NonOptional().Field(1).Type); err != nil {
+				return err
+			}
+		} else {
+			if err := fieldTarget6.FromString(string(m.City), tt.NonOptional().Field(1).Type); err != nil {
+				return err
+			}
 		}
-		if err := fieldsTarget1.FinishField(keyTarget4, fieldTarget5); err != nil {
+		if err := fieldsTarget1.FinishField(keyTarget5, fieldTarget6); err != nil {
 			return err
 		}
 	}
-	keyTarget6, fieldTarget7, err := fieldsTarget1.StartField("State")
+	keyTarget8, fieldTarget9, err := fieldsTarget1.StartField("State")
 	if err != vdl.ErrFieldNoExist && err != nil {
 		return err
 	}
 	if err != vdl.ErrFieldNoExist {
-		if err := fieldTarget7.FromString(string(m.State), tt.NonOptional().Field(2).Type); err != nil {
-			return err
-		}
-		if err := fieldsTarget1.FinishField(keyTarget6, fieldTarget7); err != nil {
-			return err
-		}
-	}
-	keyTarget8, fieldTarget9, err := fieldsTarget1.StartField("Zip")
-	if err != vdl.ErrFieldNoExist && err != nil {
-		return err
-	}
-	if err != vdl.ErrFieldNoExist {
-		if err := fieldTarget9.FromString(string(m.Zip), tt.NonOptional().Field(3).Type); err != nil {
-			return err
+
+		var10 := (m.State == "")
+		if var10 {
+			if err := fieldTarget9.FromZero(tt.NonOptional().Field(2).Type); err != nil {
+				return err
+			}
+		} else {
+			if err := fieldTarget9.FromString(string(m.State), tt.NonOptional().Field(2).Type); err != nil {
+				return err
+			}
 		}
 		if err := fieldsTarget1.FinishField(keyTarget8, fieldTarget9); err != nil {
 			return err
 		}
 	}
+	keyTarget11, fieldTarget12, err := fieldsTarget1.StartField("Zip")
+	if err != vdl.ErrFieldNoExist && err != nil {
+		return err
+	}
+	if err != vdl.ErrFieldNoExist {
+
+		var13 := (m.Zip == "")
+		if var13 {
+			if err := fieldTarget12.FromZero(tt.NonOptional().Field(3).Type); err != nil {
+				return err
+			}
+		} else {
+			if err := fieldTarget12.FromString(string(m.Zip), tt.NonOptional().Field(3).Type); err != nil {
+				return err
+			}
+		}
+		if err := fieldsTarget1.FinishField(keyTarget11, fieldTarget12); err != nil {
+			return err
+		}
+	}
 	if err := t.FinishFields(fieldsTarget1); err != nil {
 		return err
 	}
@@ -139,6 +170,10 @@
 
 	return nil
 }
+func (t *AddressInfoTarget) FromZero(tt *vdl.Type) error {
+	*t.Value = AddressInfo{}
+	return nil
+}
 
 type CreditAgency int
 
@@ -222,11 +257,15 @@
 	case "TransUnion":
 		*t.Value = 2
 	default:
-		return fmt.Errorf("label %s not in enum src/v.io/x/mojo/transcoder/internal.CreditAgency", src)
+		return fmt.Errorf("label %s not in enum CreditAgencyEquifax", src)
 	}
 
 	return nil
 }
+func (t *CreditAgencyTarget) FromZero(tt *vdl.Type) error {
+	*t.Value = CreditAgencyEquifax
+	return nil
+}
 
 type ExperianRating int
 
@@ -302,11 +341,15 @@
 	case "Bad":
 		*t.Value = 1
 	default:
-		return fmt.Errorf("label %s not in enum src/v.io/x/mojo/transcoder/internal.ExperianRating", src)
+		return fmt.Errorf("label %s not in enum ExperianRatingGood", src)
 	}
 
 	return nil
 }
+func (t *ExperianRatingTarget) FromZero(tt *vdl.Type) error {
+	*t.Value = ExperianRatingGood
+	return nil
+}
 
 type EquifaxCreditReport struct {
 	Rating byte
@@ -322,14 +365,21 @@
 	if err != nil {
 		return err
 	}
-
 	keyTarget2, fieldTarget3, err := fieldsTarget1.StartField("Rating")
 	if err != vdl.ErrFieldNoExist && err != nil {
 		return err
 	}
 	if err != vdl.ErrFieldNoExist {
-		if err := fieldTarget3.FromUint(uint64(m.Rating), tt.NonOptional().Field(0).Type); err != nil {
-			return err
+
+		var4 := (m.Rating == byte(0))
+		if var4 {
+			if err := fieldTarget3.FromZero(tt.NonOptional().Field(0).Type); err != nil {
+				return err
+			}
+		} else {
+			if err := fieldTarget3.FromUint(uint64(m.Rating), tt.NonOptional().Field(0).Type); err != nil {
+				return err
+			}
 		}
 		if err := fieldsTarget1.FinishField(keyTarget2, fieldTarget3); err != nil {
 			return err
@@ -376,6 +426,10 @@
 
 	return nil
 }
+func (t *EquifaxCreditReportTarget) FromZero(tt *vdl.Type) error {
+	*t.Value = EquifaxCreditReport{}
+	return nil
+}
 
 type ExperianCreditReport struct {
 	Rating ExperianRating
@@ -391,15 +445,22 @@
 	if err != nil {
 		return err
 	}
-
 	keyTarget2, fieldTarget3, err := fieldsTarget1.StartField("Rating")
 	if err != vdl.ErrFieldNoExist && err != nil {
 		return err
 	}
 	if err != vdl.ErrFieldNoExist {
 
-		if err := m.Rating.FillVDLTarget(fieldTarget3, tt.NonOptional().Field(0).Type); err != nil {
-			return err
+		var4 := (m.Rating == ExperianRatingGood)
+		if var4 {
+			if err := fieldTarget3.FromZero(tt.NonOptional().Field(0).Type); err != nil {
+				return err
+			}
+		} else {
+
+			if err := m.Rating.FillVDLTarget(fieldTarget3, tt.NonOptional().Field(0).Type); err != nil {
+				return err
+			}
 		}
 		if err := fieldsTarget1.FinishField(keyTarget2, fieldTarget3); err != nil {
 			return err
@@ -446,6 +507,10 @@
 
 	return nil
 }
+func (t *ExperianCreditReportTarget) FromZero(tt *vdl.Type) error {
+	*t.Value = ExperianCreditReport{}
+	return nil
+}
 
 type TransUnionCreditReport struct {
 	Rating int16
@@ -461,14 +526,21 @@
 	if err != nil {
 		return err
 	}
-
 	keyTarget2, fieldTarget3, err := fieldsTarget1.StartField("Rating")
 	if err != vdl.ErrFieldNoExist && err != nil {
 		return err
 	}
 	if err != vdl.ErrFieldNoExist {
-		if err := fieldTarget3.FromInt(int64(m.Rating), tt.NonOptional().Field(0).Type); err != nil {
-			return err
+
+		var4 := (m.Rating == int16(0))
+		if var4 {
+			if err := fieldTarget3.FromZero(tt.NonOptional().Field(0).Type); err != nil {
+				return err
+			}
+		} else {
+			if err := fieldTarget3.FromInt(int64(m.Rating), tt.NonOptional().Field(0).Type); err != nil {
+				return err
+			}
 		}
 		if err := fieldsTarget1.FinishField(keyTarget2, fieldTarget3); err != nil {
 			return err
@@ -515,6 +587,10 @@
 
 	return nil
 }
+func (t *TransUnionCreditReportTarget) FromZero(tt *vdl.Type) error {
+	*t.Value = TransUnionCreditReport{}
+	return nil
+}
 
 type (
 	// AgencyReport represents any single field of the AgencyReport union type.
@@ -690,6 +766,10 @@
 
 	return nil
 }
+func (t *AgencyReportTarget) FromZero(tt *vdl.Type) error {
+	*t.Value = AgencyReport(AgencyReportEquifaxReport{})
+	return nil
+}
 
 type agencyReportTargetFactory struct{}
 
@@ -715,34 +795,54 @@
 	if err != nil {
 		return err
 	}
-
 	keyTarget2, fieldTarget3, err := fieldsTarget1.StartField("Agency")
 	if err != vdl.ErrFieldNoExist && err != nil {
 		return err
 	}
 	if err != vdl.ErrFieldNoExist {
 
-		if err := m.Agency.FillVDLTarget(fieldTarget3, tt.NonOptional().Field(0).Type); err != nil {
-			return err
+		var4 := (m.Agency == CreditAgencyEquifax)
+		if var4 {
+			if err := fieldTarget3.FromZero(tt.NonOptional().Field(0).Type); err != nil {
+				return err
+			}
+		} else {
+
+			if err := m.Agency.FillVDLTarget(fieldTarget3, tt.NonOptional().Field(0).Type); err != nil {
+				return err
+			}
 		}
 		if err := fieldsTarget1.FinishField(keyTarget2, fieldTarget3); err != nil {
 			return err
 		}
 	}
-	keyTarget4, fieldTarget5, err := fieldsTarget1.StartField("Report")
+	keyTarget5, fieldTarget6, err := fieldsTarget1.StartField("Report")
 	if err != vdl.ErrFieldNoExist && err != nil {
 		return err
 	}
 	if err != vdl.ErrFieldNoExist {
 
-		unionValue6 := m.Report
-		if unionValue6 == nil {
-			unionValue6 = AgencyReportEquifaxReport{}
+		var var7 bool
+		if field, ok := m.Report.(AgencyReportEquifaxReport); ok {
+
+			var8 := (field.Value == EquifaxCreditReport{})
+			var7 = var8
 		}
-		if err := unionValue6.FillVDLTarget(fieldTarget5, tt.NonOptional().Field(1).Type); err != nil {
-			return err
+		if var7 {
+			if err := fieldTarget6.FromZero(tt.NonOptional().Field(1).Type); err != nil {
+				return err
+			}
+		} else {
+
+			unionValue9 := m.Report
+			if unionValue9 == nil {
+				unionValue9 = AgencyReportEquifaxReport{}
+			}
+			if err := unionValue9.FillVDLTarget(fieldTarget6, tt.NonOptional().Field(1).Type); err != nil {
+				return err
+			}
 		}
-		if err := fieldsTarget1.FinishField(keyTarget4, fieldTarget5); err != nil {
+		if err := fieldsTarget1.FinishField(keyTarget5, fieldTarget6); err != nil {
 			return err
 		}
 	}
@@ -792,6 +892,12 @@
 
 	return nil
 }
+func (t *CreditReportTarget) FromZero(tt *vdl.Type) error {
+	*t.Value = CreditReport{
+		Report: AgencyReportEquifaxReport{},
+	}
+	return nil
+}
 
 type Customer struct {
 	Name    string
@@ -811,66 +917,107 @@
 	if err != nil {
 		return err
 	}
-
 	keyTarget2, fieldTarget3, err := fieldsTarget1.StartField("Name")
 	if err != vdl.ErrFieldNoExist && err != nil {
 		return err
 	}
 	if err != vdl.ErrFieldNoExist {
-		if err := fieldTarget3.FromString(string(m.Name), tt.NonOptional().Field(0).Type); err != nil {
-			return err
+
+		var4 := (m.Name == "")
+		if var4 {
+			if err := fieldTarget3.FromZero(tt.NonOptional().Field(0).Type); err != nil {
+				return err
+			}
+		} else {
+			if err := fieldTarget3.FromString(string(m.Name), tt.NonOptional().Field(0).Type); err != nil {
+				return err
+			}
 		}
 		if err := fieldsTarget1.FinishField(keyTarget2, fieldTarget3); err != nil {
 			return err
 		}
 	}
-	keyTarget4, fieldTarget5, err := fieldsTarget1.StartField("Id")
-	if err != vdl.ErrFieldNoExist && err != nil {
-		return err
-	}
-	if err != vdl.ErrFieldNoExist {
-		if err := fieldTarget5.FromInt(int64(m.Id), tt.NonOptional().Field(1).Type); err != nil {
-			return err
-		}
-		if err := fieldsTarget1.FinishField(keyTarget4, fieldTarget5); err != nil {
-			return err
-		}
-	}
-	keyTarget6, fieldTarget7, err := fieldsTarget1.StartField("Active")
-	if err != vdl.ErrFieldNoExist && err != nil {
-		return err
-	}
-	if err != vdl.ErrFieldNoExist {
-		if err := fieldTarget7.FromBool(bool(m.Active), tt.NonOptional().Field(2).Type); err != nil {
-			return err
-		}
-		if err := fieldsTarget1.FinishField(keyTarget6, fieldTarget7); err != nil {
-			return err
-		}
-	}
-	keyTarget8, fieldTarget9, err := fieldsTarget1.StartField("Address")
+	keyTarget5, fieldTarget6, err := fieldsTarget1.StartField("Id")
 	if err != vdl.ErrFieldNoExist && err != nil {
 		return err
 	}
 	if err != vdl.ErrFieldNoExist {
 
-		if err := m.Address.FillVDLTarget(fieldTarget9, tt.NonOptional().Field(3).Type); err != nil {
+		var7 := (m.Id == int64(0))
+		if var7 {
+			if err := fieldTarget6.FromZero(tt.NonOptional().Field(1).Type); err != nil {
+				return err
+			}
+		} else {
+			if err := fieldTarget6.FromInt(int64(m.Id), tt.NonOptional().Field(1).Type); err != nil {
+				return err
+			}
+		}
+		if err := fieldsTarget1.FinishField(keyTarget5, fieldTarget6); err != nil {
 			return err
 		}
+	}
+	keyTarget8, fieldTarget9, err := fieldsTarget1.StartField("Active")
+	if err != vdl.ErrFieldNoExist && err != nil {
+		return err
+	}
+	if err != vdl.ErrFieldNoExist {
+
+		var10 := (m.Active == false)
+		if var10 {
+			if err := fieldTarget9.FromZero(tt.NonOptional().Field(2).Type); err != nil {
+				return err
+			}
+		} else {
+			if err := fieldTarget9.FromBool(bool(m.Active), tt.NonOptional().Field(2).Type); err != nil {
+				return err
+			}
+		}
 		if err := fieldsTarget1.FinishField(keyTarget8, fieldTarget9); err != nil {
 			return err
 		}
 	}
-	keyTarget10, fieldTarget11, err := fieldsTarget1.StartField("Credit")
+	keyTarget11, fieldTarget12, err := fieldsTarget1.StartField("Address")
 	if err != vdl.ErrFieldNoExist && err != nil {
 		return err
 	}
 	if err != vdl.ErrFieldNoExist {
 
-		if err := m.Credit.FillVDLTarget(fieldTarget11, tt.NonOptional().Field(4).Type); err != nil {
+		var13 := (m.Address == AddressInfo{})
+		if var13 {
+			if err := fieldTarget12.FromZero(tt.NonOptional().Field(3).Type); err != nil {
+				return err
+			}
+		} else {
+
+			if err := m.Address.FillVDLTarget(fieldTarget12, tt.NonOptional().Field(3).Type); err != nil {
+				return err
+			}
+		}
+		if err := fieldsTarget1.FinishField(keyTarget11, fieldTarget12); err != nil {
 			return err
 		}
-		if err := fieldsTarget1.FinishField(keyTarget10, fieldTarget11); err != nil {
+	}
+	keyTarget14, fieldTarget15, err := fieldsTarget1.StartField("Credit")
+	if err != vdl.ErrFieldNoExist && err != nil {
+		return err
+	}
+	if err != vdl.ErrFieldNoExist {
+
+		var16 := (m.Credit == CreditReport{
+			Report: AgencyReportEquifaxReport{},
+		})
+		if var16 {
+			if err := fieldTarget15.FromZero(tt.NonOptional().Field(4).Type); err != nil {
+				return err
+			}
+		} else {
+
+			if err := m.Credit.FillVDLTarget(fieldTarget15, tt.NonOptional().Field(4).Type); err != nil {
+				return err
+			}
+		}
+		if err := fieldsTarget1.FinishField(keyTarget14, fieldTarget15); err != nil {
 			return err
 		}
 	}
@@ -935,25 +1082,14 @@
 
 	return nil
 }
-
-// Create zero values for each type.
-var (
-	__VDLZeroAddressInfo            = AddressInfo{}
-	__VDLZeroCreditAgency           = CreditAgencyEquifax
-	__VDLZeroExperianRating         = ExperianRatingGood
-	__VDLZeroEquifaxCreditReport    = EquifaxCreditReport{}
-	__VDLZeroExperianCreditReport   = ExperianCreditReport{}
-	__VDLZeroTransUnionCreditReport = TransUnionCreditReport{}
-	__VDLZeroAgencyReport           = AgencyReport(AgencyReportEquifaxReport{})
-	__VDLZeroCreditReport           = CreditReport{
-		Report: AgencyReportEquifaxReport{},
-	}
-	__VDLZeroCustomer = Customer{
+func (t *CustomerTarget) FromZero(tt *vdl.Type) error {
+	*t.Value = Customer{
 		Credit: CreditReport{
 			Report: AgencyReportEquifaxReport{},
 		},
 	}
-)
+	return nil
+}
 
 var __VDLInitCalled bool
 
@@ -974,6 +1110,7 @@
 	if __VDLInitCalled {
 		return struct{}{}
 	}
+	__VDLInitCalled = true
 
 	// Register types.
 	vdl.Register((*AddressInfo)(nil))
diff --git a/go/src/v.io/x/mojo/transcoder/target.go b/go/src/v.io/x/mojo/transcoder/target.go
index 162704e..1d45b19 100644
--- a/go/src/v.io/x/mojo/transcoder/target.go
+++ b/go/src/v.io/x/mojo/transcoder/target.go
@@ -93,7 +93,10 @@
 	panic("UNIMPLEMENTED")
 
 }
-func (t target) FromNil(tt *vdl.Type) error {
+func (t target) FromZero(tt *vdl.Type) error {
+	if tt.IsBytes() {
+		return t.FromBytes(nil, tt)
+	}
 	switch tt.Kind() {
 	case vdl.Optional:
 		elemType := tt.Elem()
@@ -106,8 +109,94 @@
 		}
 	case vdl.Any:
 		panic("Any rep not yet determined")
+	case vdl.Bool:
+		return t.FromBool(false, tt)
+	case vdl.Byte, vdl.Uint16, vdl.Uint32, vdl.Uint64:
+		return t.FromUint(0, tt)
+	case vdl.Int8, vdl.Int16, vdl.Int32, vdl.Int64:
+		return t.FromInt(0, tt)
+	case vdl.Float32, vdl.Float64:
+		return t.FromFloat(0, tt)
+	case vdl.String:
+		return t.FromString("", tt)
+	case vdl.Enum:
+		return t.FromEnumLabel(tt.EnumLabel(0), tt)
+	case vdl.TypeObject:
+		return t.FromTypeObject(vdl.AnyType)
+	case vdl.List:
+		lt, err := t.StartList(tt, 0)
+		if err != nil {
+			return err
+		}
+		return t.FinishList(lt)
+	case vdl.Array:
+		lt, err := t.StartList(tt, tt.Len())
+		if err != nil {
+			return err
+		}
+		for i := 0; i < tt.Len(); i++ {
+			targ, err := lt.StartElem(i)
+			if err != nil {
+				return err
+			}
+			if err := targ.FromZero(tt.Elem()); err != nil {
+				return err
+			}
+			if err := lt.FinishElem(targ); err != nil {
+				return err
+			}
+		}
+		return t.FinishList(lt)
+	case vdl.Map:
+		mt, err := t.StartMap(tt, 0)
+		if err != nil {
+			return err
+		}
+		return t.FinishMap(mt)
+	case vdl.Set:
+		st, err := t.StartSet(tt, 0)
+		if err != nil {
+			return err
+		}
+		return t.FinishSet(st)
+	case vdl.Struct:
+		st, err := t.StartFields(tt)
+		if err != nil {
+			return err
+		}
+		for i := 0; i < tt.NumField(); i++ {
+			fld := tt.Field(i)
+			kt, ft, err := st.StartField(fld.Name)
+			if err != nil {
+				return err
+			}
+			if err := ft.FromZero(fld.Type); err != nil {
+				return err
+			}
+			if err := st.FinishField(kt, ft); err != nil {
+				return err
+			}
+		}
+		return t.FinishFields(st)
+	case vdl.Union:
+		st, err := t.StartFields(tt)
+		if err != nil {
+			return err
+		}
+		fld := tt.Field(0)
+		kt, ft, err := st.StartField(fld.Name)
+		if err != nil {
+			return err
+		}
+		if err := ft.FromZero(fld.Type); err != nil {
+			return err
+		}
+		if err := st.FinishField(kt, ft); err != nil {
+			return err
+		}
+		return t.FinishFields(st)
 	default:
-		panic("Type cannot be nil")
+		panic(fmt.Sprintf("unknown type %v", tt))
 	}
 	return nil
 }
diff --git a/go/src/v.io/x/mojo/transcoder/testtypes/testtypes.vdl.go b/go/src/v.io/x/mojo/transcoder/testtypes/testtypes.vdl.go
index cc35d3f..b74ab04 100644
--- a/go/src/v.io/x/mojo/transcoder/testtypes/testtypes.vdl.go
+++ b/go/src/v.io/x/mojo/transcoder/testtypes/testtypes.vdl.go
@@ -91,11 +91,15 @@
 	case "Second":
 		*t.Value = 1
 	default:
-		return fmt.Errorf("label %s not in enum src/v.io/x/mojo/transcoder/testtypes.AnEnum", src)
+		return fmt.Errorf("label %s not in enum AnEnumFirst", src)
 	}
 
 	return nil
 }
+func (t *AnEnumTarget) FromZero(tt *vdl.Type) error {
+	*t.Value = AnEnumFirst
+	return nil
+}
 
 type (
 	// PodUnion represents any single field of the PodUnion union type.
@@ -659,6 +663,10 @@
 
 	return nil
 }
+func (t *PodUnionTarget) FromZero(tt *vdl.Type) error {
+	*t.Value = PodUnion(PodUnionFInt8{})
+	return nil
+}
 
 type podUnionTargetFactory struct{}
 
@@ -683,19 +691,31 @@
 	if err != nil {
 		return err
 	}
-
 	keyTarget2, fieldTarget3, err := fieldsTarget1.StartField("PodUnion")
 	if err != vdl.ErrFieldNoExist && err != nil {
 		return err
 	}
 	if err != vdl.ErrFieldNoExist {
 
-		unionValue4 := m.PodUnion
-		if unionValue4 == nil {
-			unionValue4 = PodUnionFInt8{}
+		var var4 bool
+		if field, ok := m.PodUnion.(PodUnionFInt8); ok {
+
+			var5 := (field.Value == int8(0))
+			var4 = var5
 		}
-		if err := unionValue4.FillVDLTarget(fieldTarget3, tt.NonOptional().Field(0).Type); err != nil {
-			return err
+		if var4 {
+			if err := fieldTarget3.FromZero(tt.NonOptional().Field(0).Type); err != nil {
+				return err
+			}
+		} else {
+
+			unionValue6 := m.PodUnion
+			if unionValue6 == nil {
+				unionValue6 = PodUnionFInt8{}
+			}
+			if err := unionValue6.FillVDLTarget(fieldTarget3, tt.NonOptional().Field(0).Type); err != nil {
+				return err
+			}
 		}
 		if err := fieldsTarget1.FinishField(keyTarget2, fieldTarget3); err != nil {
 			return err
@@ -742,6 +762,12 @@
 
 	return nil
 }
+func (t *PodUnionWrapperTarget) FromZero(tt *vdl.Type) error {
+	*t.Value = PodUnionWrapper{
+		PodUnion: PodUnionFInt8{},
+	}
+	return nil
+}
 
 type DummyStruct struct {
 	FInt8 int8
@@ -757,14 +783,21 @@
 	if err != nil {
 		return err
 	}
-
 	keyTarget2, fieldTarget3, err := fieldsTarget1.StartField("FInt8")
 	if err != vdl.ErrFieldNoExist && err != nil {
 		return err
 	}
 	if err != vdl.ErrFieldNoExist {
-		if err := fieldTarget3.FromInt(int64(m.FInt8), tt.NonOptional().Field(0).Type); err != nil {
-			return err
+
+		var4 := (m.FInt8 == int8(0))
+		if var4 {
+			if err := fieldTarget3.FromZero(tt.NonOptional().Field(0).Type); err != nil {
+				return err
+			}
+		} else {
+			if err := fieldTarget3.FromInt(int64(m.FInt8), tt.NonOptional().Field(0).Type); err != nil {
+				return err
+			}
 		}
 		if err := fieldsTarget1.FinishField(keyTarget2, fieldTarget3); err != nil {
 			return err
@@ -811,6 +844,10 @@
 
 	return nil
 }
+func (t *DummyStructTarget) FromZero(tt *vdl.Type) error {
+	*t.Value = DummyStruct{}
+	return nil
+}
 
 type (
 	// ObjectUnion represents any single field of the ObjectUnion union type.
@@ -965,14 +1002,8 @@
 		return err
 	}
 
-	if m.Value == nil {
-		if err := fieldTarget3.FromNil(tt.NonOptional().Field(3).Type); err != nil {
-			return err
-		}
-	} else {
-		if err := m.Value.FillVDLTarget(fieldTarget3, tt.NonOptional().Field(3).Type); err != nil {
-			return err
-		}
+	if err := m.Value.FillVDLTarget(fieldTarget3, tt.NonOptional().Field(3).Type); err != nil {
+		return err
 	}
 	if err := fieldsTarget1.FinishField(keyTarget2, fieldTarget3); err != nil {
 		return err
@@ -1193,6 +1224,10 @@
 
 	return nil
 }
+func (t *ObjectUnionTarget) FromZero(tt *vdl.Type) error {
+	*t.Value = ObjectUnion(ObjectUnionFInt8{})
+	return nil
+}
 
 type objectUnionTargetFactory struct{}
 
@@ -1227,10 +1262,8 @@
 
 	return nil
 }
-func (t *__VDLTarget1_optional) FromNil(tt *vdl.Type) error {
-
-	*t.Value = nil
-
+func (t *__VDLTarget1_optional) FromZero(tt *vdl.Type) error {
+	*t.Value = (*DummyStruct)(nil)
 	return nil
 }
 
@@ -1266,6 +1299,10 @@
 
 	return nil
 }
+func (t *__VDLTarget2_list) FromZero(tt *vdl.Type) error {
+	*t.Value = []int8(nil)
+	return nil
+}
 
 // map[string]int8
 type __VDLTarget3_map struct {
@@ -1309,6 +1346,10 @@
 
 	return nil
 }
+func (t *__VDLTarget3_map) FromZero(tt *vdl.Type) error {
+	*t.Value = map[string]int8(nil)
+	return nil
+}
 
 type ObjectUnionWrapper struct {
 	ObjectUnion ObjectUnion
@@ -1324,19 +1365,31 @@
 	if err != nil {
 		return err
 	}
-
 	keyTarget2, fieldTarget3, err := fieldsTarget1.StartField("ObjectUnion")
 	if err != vdl.ErrFieldNoExist && err != nil {
 		return err
 	}
 	if err != vdl.ErrFieldNoExist {
 
-		unionValue4 := m.ObjectUnion
-		if unionValue4 == nil {
-			unionValue4 = ObjectUnionFInt8{}
+		var var4 bool
+		if field, ok := m.ObjectUnion.(ObjectUnionFInt8); ok {
+
+			var5 := (field.Value == int8(0))
+			var4 = var5
 		}
-		if err := unionValue4.FillVDLTarget(fieldTarget3, tt.NonOptional().Field(0).Type); err != nil {
-			return err
+		if var4 {
+			if err := fieldTarget3.FromZero(tt.NonOptional().Field(0).Type); err != nil {
+				return err
+			}
+		} else {
+
+			unionValue6 := m.ObjectUnion
+			if unionValue6 == nil {
+				unionValue6 = ObjectUnionFInt8{}
+			}
+			if err := unionValue6.FillVDLTarget(fieldTarget3, tt.NonOptional().Field(0).Type); err != nil {
+				return err
+			}
 		}
 		if err := fieldsTarget1.FinishField(keyTarget2, fieldTarget3); err != nil {
 			return err
@@ -1383,6 +1436,12 @@
 
 	return nil
 }
+func (t *ObjectUnionWrapperTarget) FromZero(tt *vdl.Type) error {
+	*t.Value = ObjectUnionWrapper{
+		ObjectUnion: ObjectUnionFInt8{},
+	}
+	return nil
+}
 
 type Rect struct {
 	X      int32
@@ -1401,55 +1460,86 @@
 	if err != nil {
 		return err
 	}
-
 	keyTarget2, fieldTarget3, err := fieldsTarget1.StartField("X")
 	if err != vdl.ErrFieldNoExist && err != nil {
 		return err
 	}
 	if err != vdl.ErrFieldNoExist {
-		if err := fieldTarget3.FromInt(int64(m.X), tt.NonOptional().Field(0).Type); err != nil {
-			return err
+
+		var4 := (m.X == int32(0))
+		if var4 {
+			if err := fieldTarget3.FromZero(tt.NonOptional().Field(0).Type); err != nil {
+				return err
+			}
+		} else {
+			if err := fieldTarget3.FromInt(int64(m.X), tt.NonOptional().Field(0).Type); err != nil {
+				return err
+			}
 		}
 		if err := fieldsTarget1.FinishField(keyTarget2, fieldTarget3); err != nil {
 			return err
 		}
 	}
-	keyTarget4, fieldTarget5, err := fieldsTarget1.StartField("Y")
+	keyTarget5, fieldTarget6, err := fieldsTarget1.StartField("Y")
 	if err != vdl.ErrFieldNoExist && err != nil {
 		return err
 	}
 	if err != vdl.ErrFieldNoExist {
-		if err := fieldTarget5.FromInt(int64(m.Y), tt.NonOptional().Field(1).Type); err != nil {
-			return err
+
+		var7 := (m.Y == int32(0))
+		if var7 {
+			if err := fieldTarget6.FromZero(tt.NonOptional().Field(1).Type); err != nil {
+				return err
+			}
+		} else {
+			if err := fieldTarget6.FromInt(int64(m.Y), tt.NonOptional().Field(1).Type); err != nil {
+				return err
+			}
 		}
-		if err := fieldsTarget1.FinishField(keyTarget4, fieldTarget5); err != nil {
+		if err := fieldsTarget1.FinishField(keyTarget5, fieldTarget6); err != nil {
 			return err
 		}
 	}
-	keyTarget6, fieldTarget7, err := fieldsTarget1.StartField("Width")
+	keyTarget8, fieldTarget9, err := fieldsTarget1.StartField("Width")
 	if err != vdl.ErrFieldNoExist && err != nil {
 		return err
 	}
 	if err != vdl.ErrFieldNoExist {
-		if err := fieldTarget7.FromInt(int64(m.Width), tt.NonOptional().Field(2).Type); err != nil {
-			return err
-		}
-		if err := fieldsTarget1.FinishField(keyTarget6, fieldTarget7); err != nil {
-			return err
-		}
-	}
-	keyTarget8, fieldTarget9, err := fieldsTarget1.StartField("Height")
-	if err != vdl.ErrFieldNoExist && err != nil {
-		return err
-	}
-	if err != vdl.ErrFieldNoExist {
-		if err := fieldTarget9.FromInt(int64(m.Height), tt.NonOptional().Field(3).Type); err != nil {
-			return err
+
+		var10 := (m.Width == int32(0))
+		if var10 {
+			if err := fieldTarget9.FromZero(tt.NonOptional().Field(2).Type); err != nil {
+				return err
+			}
+		} else {
+			if err := fieldTarget9.FromInt(int64(m.Width), tt.NonOptional().Field(2).Type); err != nil {
+				return err
+			}
 		}
 		if err := fieldsTarget1.FinishField(keyTarget8, fieldTarget9); err != nil {
 			return err
 		}
 	}
+	keyTarget11, fieldTarget12, err := fieldsTarget1.StartField("Height")
+	if err != vdl.ErrFieldNoExist && err != nil {
+		return err
+	}
+	if err != vdl.ErrFieldNoExist {
+
+		var13 := (m.Height == int32(0))
+		if var13 {
+			if err := fieldTarget12.FromZero(tt.NonOptional().Field(3).Type); err != nil {
+				return err
+			}
+		} else {
+			if err := fieldTarget12.FromInt(int64(m.Height), tt.NonOptional().Field(3).Type); err != nil {
+				return err
+			}
+		}
+		if err := fieldsTarget1.FinishField(keyTarget11, fieldTarget12); err != nil {
+			return err
+		}
+	}
 	if err := t.FinishFields(fieldsTarget1); err != nil {
 		return err
 	}
@@ -1506,6 +1596,10 @@
 
 	return nil
 }
+func (t *RectTarget) FromZero(tt *vdl.Type) error {
+	*t.Value = Rect{}
+	return nil
+}
 
 type MultiVersionStruct struct {
 	FInt32  int32
@@ -1526,94 +1620,144 @@
 	if err != nil {
 		return err
 	}
-
 	keyTarget2, fieldTarget3, err := fieldsTarget1.StartField("FInt32")
 	if err != vdl.ErrFieldNoExist && err != nil {
 		return err
 	}
 	if err != vdl.ErrFieldNoExist {
-		if err := fieldTarget3.FromInt(int64(m.FInt32), tt.NonOptional().Field(0).Type); err != nil {
-			return err
+
+		var4 := (m.FInt32 == int32(0))
+		if var4 {
+			if err := fieldTarget3.FromZero(tt.NonOptional().Field(0).Type); err != nil {
+				return err
+			}
+		} else {
+			if err := fieldTarget3.FromInt(int64(m.FInt32), tt.NonOptional().Field(0).Type); err != nil {
+				return err
+			}
 		}
 		if err := fieldsTarget1.FinishField(keyTarget2, fieldTarget3); err != nil {
 			return err
 		}
 	}
-	keyTarget4, fieldTarget5, err := fieldsTarget1.StartField("FRect")
+	keyTarget5, fieldTarget6, err := fieldsTarget1.StartField("FRect")
 	if err != vdl.ErrFieldNoExist && err != nil {
 		return err
 	}
 	if err != vdl.ErrFieldNoExist {
 
-		if err := m.FRect.FillVDLTarget(fieldTarget5, tt.NonOptional().Field(1).Type); err != nil {
-			return err
+		var7 := (m.FRect == Rect{})
+		if var7 {
+			if err := fieldTarget6.FromZero(tt.NonOptional().Field(1).Type); err != nil {
+				return err
+			}
+		} else {
+
+			if err := m.FRect.FillVDLTarget(fieldTarget6, tt.NonOptional().Field(1).Type); err != nil {
+				return err
+			}
 		}
-		if err := fieldsTarget1.FinishField(keyTarget4, fieldTarget5); err != nil {
+		if err := fieldsTarget1.FinishField(keyTarget5, fieldTarget6); err != nil {
 			return err
 		}
 	}
-	keyTarget6, fieldTarget7, err := fieldsTarget1.StartField("FString")
-	if err != vdl.ErrFieldNoExist && err != nil {
-		return err
-	}
-	if err != vdl.ErrFieldNoExist {
-		if err := fieldTarget7.FromString(string(m.FString), tt.NonOptional().Field(2).Type); err != nil {
-			return err
-		}
-		if err := fieldsTarget1.FinishField(keyTarget6, fieldTarget7); err != nil {
-			return err
-		}
-	}
-	keyTarget8, fieldTarget9, err := fieldsTarget1.StartField("FArray")
+	keyTarget8, fieldTarget9, err := fieldsTarget1.StartField("FString")
 	if err != vdl.ErrFieldNoExist && err != nil {
 		return err
 	}
 	if err != vdl.ErrFieldNoExist {
 
-		listTarget10, err := fieldTarget9.StartList(tt.NonOptional().Field(3).Type, len(m.FArray))
-		if err != nil {
-			return err
-		}
-		for i, elem12 := range m.FArray {
-			elemTarget11, err := listTarget10.StartElem(i)
-			if err != nil {
+		var10 := (m.FString == "")
+		if var10 {
+			if err := fieldTarget9.FromZero(tt.NonOptional().Field(2).Type); err != nil {
 				return err
 			}
-			if err := elemTarget11.FromInt(int64(elem12), tt.NonOptional().Field(3).Type.Elem()); err != nil {
+		} else {
+			if err := fieldTarget9.FromString(string(m.FString), tt.NonOptional().Field(2).Type); err != nil {
 				return err
 			}
-			if err := listTarget10.FinishElem(elemTarget11); err != nil {
-				return err
-			}
-		}
-		if err := fieldTarget9.FinishList(listTarget10); err != nil {
-			return err
 		}
 		if err := fieldsTarget1.FinishField(keyTarget8, fieldTarget9); err != nil {
 			return err
 		}
 	}
-	keyTarget13, fieldTarget14, err := fieldsTarget1.StartField("FBool")
+	keyTarget11, fieldTarget12, err := fieldsTarget1.StartField("FArray")
 	if err != vdl.ErrFieldNoExist && err != nil {
 		return err
 	}
 	if err != vdl.ErrFieldNoExist {
-		if err := fieldTarget14.FromBool(bool(m.FBool), tt.NonOptional().Field(4).Type); err != nil {
-			return err
+
+		var var13 bool
+		if len(m.FArray) == 0 {
+			var13 = true
 		}
-		if err := fieldsTarget1.FinishField(keyTarget13, fieldTarget14); err != nil {
+		if var13 {
+			if err := fieldTarget12.FromZero(tt.NonOptional().Field(3).Type); err != nil {
+				return err
+			}
+		} else {
+
+			listTarget14, err := fieldTarget12.StartList(tt.NonOptional().Field(3).Type, len(m.FArray))
+			if err != nil {
+				return err
+			}
+			for i, elem16 := range m.FArray {
+				elemTarget15, err := listTarget14.StartElem(i)
+				if err != nil {
+					return err
+				}
+				if err := elemTarget15.FromInt(int64(elem16), tt.NonOptional().Field(3).Type.Elem()); err != nil {
+					return err
+				}
+				if err := listTarget14.FinishElem(elemTarget15); err != nil {
+					return err
+				}
+			}
+			if err := fieldTarget12.FinishList(listTarget14); err != nil {
+				return err
+			}
+		}
+		if err := fieldsTarget1.FinishField(keyTarget11, fieldTarget12); err != nil {
 			return err
 		}
 	}
-	keyTarget15, fieldTarget16, err := fieldsTarget1.StartField("FInt16")
+	keyTarget17, fieldTarget18, err := fieldsTarget1.StartField("FBool")
 	if err != vdl.ErrFieldNoExist && err != nil {
 		return err
 	}
 	if err != vdl.ErrFieldNoExist {
-		if err := fieldTarget16.FromInt(int64(m.FInt16), tt.NonOptional().Field(5).Type); err != nil {
+
+		var19 := (m.FBool == false)
+		if var19 {
+			if err := fieldTarget18.FromZero(tt.NonOptional().Field(4).Type); err != nil {
+				return err
+			}
+		} else {
+			if err := fieldTarget18.FromBool(bool(m.FBool), tt.NonOptional().Field(4).Type); err != nil {
+				return err
+			}
+		}
+		if err := fieldsTarget1.FinishField(keyTarget17, fieldTarget18); err != nil {
 			return err
 		}
-		if err := fieldsTarget1.FinishField(keyTarget15, fieldTarget16); err != nil {
+	}
+	keyTarget20, fieldTarget21, err := fieldsTarget1.StartField("FInt16")
+	if err != vdl.ErrFieldNoExist && err != nil {
+		return err
+	}
+	if err != vdl.ErrFieldNoExist {
+
+		var22 := (m.FInt16 == int16(0))
+		if var22 {
+			if err := fieldTarget21.FromZero(tt.NonOptional().Field(5).Type); err != nil {
+				return err
+			}
+		} else {
+			if err := fieldTarget21.FromInt(int64(m.FInt16), tt.NonOptional().Field(5).Type); err != nil {
+				return err
+			}
+		}
+		if err := fieldsTarget1.FinishField(keyTarget20, fieldTarget21); err != nil {
 			return err
 		}
 	}
@@ -1683,6 +1827,10 @@
 
 	return nil
 }
+func (t *MultiVersionStructTarget) FromZero(tt *vdl.Type) error {
+	*t.Value = MultiVersionStruct{}
+	return nil
+}
 
 type MultiVersionStructV3 struct {
 	FInt32  int32
@@ -1700,41 +1848,64 @@
 	if err != nil {
 		return err
 	}
-
 	keyTarget2, fieldTarget3, err := fieldsTarget1.StartField("FInt32")
 	if err != vdl.ErrFieldNoExist && err != nil {
 		return err
 	}
 	if err != vdl.ErrFieldNoExist {
-		if err := fieldTarget3.FromInt(int64(m.FInt32), tt.NonOptional().Field(0).Type); err != nil {
-			return err
+
+		var4 := (m.FInt32 == int32(0))
+		if var4 {
+			if err := fieldTarget3.FromZero(tt.NonOptional().Field(0).Type); err != nil {
+				return err
+			}
+		} else {
+			if err := fieldTarget3.FromInt(int64(m.FInt32), tt.NonOptional().Field(0).Type); err != nil {
+				return err
+			}
 		}
 		if err := fieldsTarget1.FinishField(keyTarget2, fieldTarget3); err != nil {
 			return err
 		}
 	}
-	keyTarget4, fieldTarget5, err := fieldsTarget1.StartField("FRect")
+	keyTarget5, fieldTarget6, err := fieldsTarget1.StartField("FRect")
 	if err != vdl.ErrFieldNoExist && err != nil {
 		return err
 	}
 	if err != vdl.ErrFieldNoExist {
 
-		if err := m.FRect.FillVDLTarget(fieldTarget5, tt.NonOptional().Field(1).Type); err != nil {
-			return err
+		var7 := (m.FRect == Rect{})
+		if var7 {
+			if err := fieldTarget6.FromZero(tt.NonOptional().Field(1).Type); err != nil {
+				return err
+			}
+		} else {
+
+			if err := m.FRect.FillVDLTarget(fieldTarget6, tt.NonOptional().Field(1).Type); err != nil {
+				return err
+			}
 		}
-		if err := fieldsTarget1.FinishField(keyTarget4, fieldTarget5); err != nil {
+		if err := fieldsTarget1.FinishField(keyTarget5, fieldTarget6); err != nil {
 			return err
 		}
 	}
-	keyTarget6, fieldTarget7, err := fieldsTarget1.StartField("FString")
+	keyTarget8, fieldTarget9, err := fieldsTarget1.StartField("FString")
 	if err != vdl.ErrFieldNoExist && err != nil {
 		return err
 	}
 	if err != vdl.ErrFieldNoExist {
-		if err := fieldTarget7.FromString(string(m.FString), tt.NonOptional().Field(2).Type); err != nil {
-			return err
+
+		var10 := (m.FString == "")
+		if var10 {
+			if err := fieldTarget9.FromZero(tt.NonOptional().Field(2).Type); err != nil {
+				return err
+			}
+		} else {
+			if err := fieldTarget9.FromString(string(m.FString), tt.NonOptional().Field(2).Type); err != nil {
+				return err
+			}
 		}
-		if err := fieldsTarget1.FinishField(keyTarget6, fieldTarget7); err != nil {
+		if err := fieldsTarget1.FinishField(keyTarget8, fieldTarget9); err != nil {
 			return err
 		}
 	}
@@ -1789,23 +1960,10 @@
 
 	return nil
 }
-
-// Create zero values for each type.
-var (
-	__VDLZeroAnEnum          = AnEnumFirst
-	__VDLZeroPodUnion        = PodUnion(PodUnionFInt8{})
-	__VDLZeroPodUnionWrapper = PodUnionWrapper{
-		PodUnion: PodUnionFInt8{},
-	}
-	__VDLZeroDummyStruct        = DummyStruct{}
-	__VDLZeroObjectUnion        = ObjectUnion(ObjectUnionFInt8{})
-	__VDLZeroObjectUnionWrapper = ObjectUnionWrapper{
-		ObjectUnion: ObjectUnionFInt8{},
-	}
-	__VDLZeroRect                 = Rect{}
-	__VDLZeroMultiVersionStruct   = MultiVersionStruct{}
-	__VDLZeroMultiVersionStructV3 = MultiVersionStructV3{}
-)
+func (t *MultiVersionStructV3Target) FromZero(tt *vdl.Type) error {
+	*t.Value = MultiVersionStructV3{}
+	return nil
+}
 
 var __VDLInitCalled bool
 
@@ -1826,6 +1984,7 @@
 	if __VDLInitCalled {
 		return struct{}{}
 	}
+	__VDLInitCalled = true
 
 	// Register types.
 	vdl.Register((*AnEnum)(nil))
diff --git a/go/src/v.io/x/mojo/transcoder/to_mojom.go b/go/src/v.io/x/mojo/transcoder/to_mojom.go
index 21ea9d5..73196de 100644
--- a/go/src/v.io/x/mojo/transcoder/to_mojom.go
+++ b/go/src/v.io/x/mojo/transcoder/to_mojom.go
@@ -59,8 +59,28 @@
 func (vtm *targetToMojomTranscoder) FromTypeObject(src *vdl.Type) error {
 	panic("cannot encode top level type object")
 }
-func (vtm *targetToMojomTranscoder) FromNil(tt *vdl.Type) error {
-	panic("cannot encode top level nil")
+func (vtm *targetToMojomTranscoder) FromZero(tt *vdl.Type) error {
+	if tt.Kind() == vdl.Struct {
+		st, err := vtm.StartFields(tt)
+		if err != nil {
+			return err
+		}
+		for i := 0; i < tt.NumField(); i++ {
+			fld := tt.Field(i)
+			kt, ft, err := st.StartField(fld.Name)
+			if err != nil {
+				return err
+			}
+			if err := ft.FromZero(fld.Type); err != nil {
+				return err
+			}
+			if err := st.FinishField(kt, ft); err != nil {
+				return err
+			}
+		}
+		return vtm.FinishFields(st)
+	}
+	panic("UNIMPLEMENTED")
 }
 
 func (vtm *targetToMojomTranscoder) StartList(tt *vdl.Type, len int) (vdl.ListTarget, error) {