Skip to content
This repository was archived by the owner on Mar 23, 2023. It is now read-only.

Commit 543e14f

Browse files
committed
[WIP] attr_mode="rw" for writtable attributes
Still does not set the value, just eats it.
1 parent 88adf45 commit 543e14f

4 files changed

Lines changed: 38 additions & 3 deletions

File tree

runtime/descriptor.go

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -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
}

runtime/descriptor_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ func TestMakeStructFieldDescriptor(t *testing.T) {
9090
return nil, raised
9191
}
9292
t := toTypeUnsafe(args[0])
93-
desc := makeStructFieldDescriptor(t, toStrUnsafe(args[1]).Value(), toStrUnsafe(args[2]).Value())
93+
desc := makeStructFieldDescriptor(t, toStrUnsafe(args[1]).Value(), toStrUnsafe(args[2]).Value(), false)
9494
get, raised := GetAttr(f, desc, NewStr("__get__"), nil)
9595
if raised != nil {
9696
return nil, raised

runtime/native.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -268,6 +268,14 @@ func initSliceIteratorType(map[string]*Object) {
268268
sliceIteratorType.slots.Next = &unaryOpSlot{sliceIteratorNext}
269269
}
270270

271+
func SetNative(f *Frame, v *reflect.StructField, newvalue *Object) (*Object, *BaseException) {
272+
//fmt.Printf("Field: -> %+v <- \n", v) // DEBUG
273+
//fmt.Printf("New Value: -> %+v <- \n", newvalue) // DEBUG
274+
//TODO: DO SET THE VALUE
275+
//v.SetInt(WrapNative(f, newvalue))
276+
return None, nil
277+
}
278+
271279
// WrapNative takes a reflect.Value object and converts the underlying Go
272280
// object to a Python object in the following way:
273281
//

runtime/type.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,11 @@ func prepareBuiltinType(typ *Type, init builtinTypeInit) {
153153
for i := 0; i < numFields; i++ {
154154
field := basis.Field(i)
155155
if attr := field.Tag.Get("attr"); attr != "" {
156-
dict[attr] = makeStructFieldDescriptor(typ, field.Name, attr)
156+
writtable := false
157+
if mode := field.Tag.Get("attr_mode"); mode == "rw" {
158+
writtable = true
159+
}
160+
dict[attr] = makeStructFieldDescriptor(typ, field.Name, attr, writtable)
157161
}
158162
}
159163
}

0 commit comments

Comments
 (0)