|
@@ -66,14 +66,14 @@ func (v *direct) Get() interface{} { return v.data }
|
|
|
func (v *indirect) Set(x interface{}) {
|
|
|
assert.For(x != nil, 20)
|
|
|
assert.For(v.ref != nil, 21)
|
|
|
- v.mgr.Update(v.ref, func(old interface{}) interface{} {
|
|
|
+ v.mgr.UpdateObj(v.ref, func(old interface{}) interface{} {
|
|
|
return x
|
|
|
})
|
|
|
}
|
|
|
|
|
|
func (v *indirect) Get() interface{} {
|
|
|
assert.For(v.ref != nil, 20)
|
|
|
- return v.mgr.Select(v.ref)
|
|
|
+ return v.mgr.SelectObj(v.ref)
|
|
|
}
|
|
|
|
|
|
func (m *manager) init() *manager {
|
|
@@ -89,12 +89,31 @@ func (m *manager) Allocate(n node.Node) {
|
|
|
for _, o := range mod.Objects[n] {
|
|
|
//fmt.Println(reflect.TypeOf(o))
|
|
|
switch o.(type) {
|
|
|
- case object.VariableObject, object.FieldObject:
|
|
|
- h.heap[o] = &direct{data: def}
|
|
|
+ case object.VariableObject:
|
|
|
+ switch o.(object.VariableObject).Type() {
|
|
|
+ case object.COMPLEX:
|
|
|
+ switch o.(object.VariableObject).Complex().(type) {
|
|
|
+ case object.RecordType:
|
|
|
+ for rec := o.(object.VariableObject).Complex().(object.RecordType); rec != nil; {
|
|
|
+ for x := rec.Link(); x != nil; x = x.Link() {
|
|
|
+ fmt.Println(o.Name(), ".", x.Name())
|
|
|
+ }
|
|
|
+ if rec.Base() != "" {
|
|
|
+ rec = mod.TypeByName(n, rec.Base()).(object.RecordType)
|
|
|
+ } else {
|
|
|
+ rec = nil
|
|
|
+ }
|
|
|
+ }
|
|
|
+ default:
|
|
|
+ h.heap[o] = &direct{data: def}
|
|
|
+ }
|
|
|
+ default:
|
|
|
+ h.heap[o] = &direct{data: def}
|
|
|
+ }
|
|
|
case object.ParameterObject:
|
|
|
h.heap[o] = &indirect{mgr: m}
|
|
|
default:
|
|
|
- panic(fmt.Sprintln("wrong object type", reflect.TypeOf(o)))
|
|
|
+ fmt.Println("wrong object type", reflect.TypeOf(o))
|
|
|
}
|
|
|
}
|
|
|
m.areas.PushFront(h)
|
|
@@ -105,8 +124,8 @@ func (m *manager) set(a *area, o object.Object, val node.Node) {
|
|
|
switch val.(type) {
|
|
|
case node.ConstantNode:
|
|
|
switch o.(type) {
|
|
|
- case object.VariableObject, object.FieldObject:
|
|
|
- m.Update(o, func(old interface{}) interface{} {
|
|
|
+ case object.VariableObject:
|
|
|
+ m.UpdateObj(o, func(old interface{}) interface{} {
|
|
|
return val.(node.ConstantNode).Data()
|
|
|
})
|
|
|
case object.ParameterObject:
|
|
@@ -119,9 +138,9 @@ func (m *manager) set(a *area, o object.Object, val node.Node) {
|
|
|
}
|
|
|
case node.VariableNode, node.ParameterNode, node.FieldNode:
|
|
|
switch o.(type) {
|
|
|
- case object.VariableObject, object.FieldObject:
|
|
|
- m.Update(o, func(old interface{}) interface{} {
|
|
|
- return m.Select(val.Object())
|
|
|
+ case object.VariableObject:
|
|
|
+ m.UpdateObj(o, func(old interface{}) interface{} {
|
|
|
+ return m.SelectObj(val.Object())
|
|
|
})
|
|
|
case object.ParameterObject:
|
|
|
a.heap[o].(*indirect).ref = val.Object()
|
|
@@ -169,7 +188,7 @@ func (m *manager) FindObjByName(name string) (ret object.Object) {
|
|
|
return ret
|
|
|
}
|
|
|
|
|
|
-func (m *manager) Select(o object.Object) (ret interface{}) {
|
|
|
+func (m *manager) SelectObj(o object.Object) (ret interface{}) {
|
|
|
assert.For(o != nil, 20)
|
|
|
for e := m.areas.Front(); (e != nil) && (ret == nil); e = e.Next() {
|
|
|
h := e.Value.(*area)
|
|
@@ -183,7 +202,7 @@ func (m *manager) Select(o object.Object) (ret interface{}) {
|
|
|
return ret
|
|
|
}
|
|
|
|
|
|
-func (m *manager) Update(o object.Object, val ValueFor) {
|
|
|
+func (m *manager) UpdateObj(o object.Object, val ValueFor) {
|
|
|
assert.For(o != nil, 20)
|
|
|
assert.For(val != nil, 21)
|
|
|
var x *area
|
|
@@ -203,6 +222,13 @@ func (m *manager) Update(o object.Object, val ValueFor) {
|
|
|
x.heap[o].Set(tmp)
|
|
|
}
|
|
|
|
|
|
+func (m *manager) SelectNode(n node.Node) interface{} {
|
|
|
+ return nil
|
|
|
+}
|
|
|
+
|
|
|
+func (m *manager) UpdateNode(n node.Node, val ValueFor) {
|
|
|
+
|
|
|
+}
|
|
|
func (m *manager) Init(d context.Domain) {
|
|
|
m.d = d
|
|
|
}
|