@@ -98,11 +98,13 @@ func propertySet(f *Frame, desc, inst, value *Object) *BaseException {
9898
9999// makeStructFieldDescriptor creates a descriptor with a getter that returns
100100// the field given by fieldName from t's basis structure.
101- func makeStructFieldDescriptor (t * Type , fieldName , propertyName string ) * Object {
101+ func makeStructFieldDescriptor (t * Type , fieldName , propertyName string , writtable bool ) * Object {
102102 field , ok := t .basis .FieldByName (fieldName )
103103 if ! ok {
104104 logFatal (fmt .Sprintf ("no such field %q for basis %s" , fieldName , nativeTypeName (t .basis )))
105105 }
106+ nativeFieldType := getNativeType (field .Type )
107+
106108 getterFunc := func (f * Frame , args Args , _ KWArgs ) (* Object , * BaseException ) {
107109 var ret * Object
108110 var raised * BaseException
@@ -117,5 +119,26 @@ func makeStructFieldDescriptor(t *Type, fieldName, propertyName string) *Object
117119 }
118120 return ret , raised
119121 }
122+ if writtable {
123+ setterFunc := func (f * Frame , args Args , _ KWArgs ) (* Object , * BaseException ) {
124+ var ret * Object
125+ var raised * BaseException
126+ if raised = checkFunctionArgs (f , fieldName , args , ObjectType , ObjectType ); raised == nil {
127+ //self := args[0]
128+ newvalue := args [1 ]
129+ if ! newvalue .isInstance (nativeFieldType ) {
130+ format := "descriptor '%s' for '%s' objects doesn't apply to '%s' objects"
131+ raised = f .RaiseType (TypeErrorType , fmt .Sprintf (format , propertyName , t .Name (), newvalue .typ .Name ()))
132+ } else {
133+ ret , raised = SetNative (f , & field , newvalue )
134+ }
135+ }
136+ return ret , raised
137+ }
138+ return newProperty (
139+ newBuiltinFunction ("_get" + fieldName , getterFunc ).ToObject (),
140+ newBuiltinFunction ("_set" + fieldName , setterFunc ).ToObject (),
141+ None ).ToObject ()
142+ }
120143 return newProperty (newBuiltinFunction ("_get" + fieldName , getterFunc ).ToObject (), None , None ).ToObject ()
121144}
0 commit comments