1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 |
- package modern
- import (
- "fmt"
- //cpm "fw/cp/module"
- "fw/cp"
- "fw/cp/node"
- "fw/cp/object"
- rtm "fw/rt2/module"
- "fw/rt2/scope"
- "reflect"
- "ypk/assert"
- "ypk/halt"
- )
- type halloc struct {
- area *area
- }
- func (h *halloc) Allocate(n node.Node, par ...interface{}) scope.ValueFor {
- fmt.Println("HEAP ALLOCATE")
- mod := rtm.ModuleOfNode(h.area.d, n)
- if h.area.data == nil {
- h.area.data = append(h.area.data, newlvl())
- }
- var ol []object.Object
- skip := make(map[cp.ID]interface{})
- l := h.area.data[0]
- var res scope.Value
- f_res := func(x scope.Value) scope.Value {
- return res
- }
- var talloc func(t object.PointerType)
- talloc = func(t object.PointerType) {
- switch bt := t.Base().(type) {
- case object.RecordType:
- fake := object.New(object.VARIABLE, int(cp.SomeAdr()))
- fake.SetComplex(bt)
- fake.SetType(object.COMPLEX)
- fake.SetName("{}")
- l.alloc(mod, nil, append(ol, fake), skip)
- res = &ptrValue{scope: h.area, id: fake.Adr()}
- case object.DynArrayType:
- assert.For(len(par) > 0, 20)
- fake := object.New(object.VARIABLE, int(cp.SomeAdr()))
- fake.SetComplex(bt)
- fake.SetType(object.COMPLEX)
- fake.SetName("[]")
- l.alloc(mod, nil, append(ol, fake), skip)
- h.area.Select(fake.Adr(), func(v scope.Value) {
- arr, ok := v.(*dynarr)
- assert.For(ok, 60)
- arr.Set(par[0].(scope.Value))
- })
- res = &ptrValue{scope: h.area, id: fake.Adr()}
- default:
- halt.As(100, fmt.Sprintln("cannot allocate", reflect.TypeOf(bt)))
- }
- }
- switch v := n.(type) {
- case node.VariableNode:
- switch t := v.Object().Complex().(type) {
- case object.PointerType:
- talloc(t)
- //h.area.data[0].alloc(mod, nil, )
- default:
- halt.As(100, reflect.TypeOf(t))
- }
- default:
- halt.As(101, reflect.TypeOf(v))
- }
- return f_res
- }
- func (h *halloc) Dispose(n node.Node) {}
- func (a *halloc) Join(m scope.Manager) { a.area = m.(*area) }
|