hp.go 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. package modern
  2. import (
  3. "fmt"
  4. //cpm "fw/cp/module"
  5. "fw/cp"
  6. "fw/cp/node"
  7. "fw/cp/object"
  8. rtm "fw/rt2/module"
  9. "fw/rt2/scope"
  10. "reflect"
  11. "ypk/assert"
  12. "ypk/halt"
  13. )
  14. type halloc struct {
  15. area *area
  16. }
  17. func (h *halloc) Allocate(n node.Node, par ...interface{}) scope.ValueFor {
  18. fmt.Println("HEAP ALLOCATE")
  19. mod := rtm.ModuleOfNode(h.area.d, n)
  20. if h.area.data == nil {
  21. h.area.data = append(h.area.data, newlvl())
  22. }
  23. var ol []object.Object
  24. skip := make(map[cp.ID]interface{})
  25. l := h.area.data[0]
  26. var res scope.Value
  27. f_res := func(x scope.Value) scope.Value {
  28. return res
  29. }
  30. var talloc func(t object.PointerType)
  31. talloc = func(t object.PointerType) {
  32. switch bt := t.Base().(type) {
  33. case object.RecordType:
  34. fake := object.New(object.VARIABLE, int(cp.SomeAdr()))
  35. fake.SetComplex(bt)
  36. fake.SetType(object.COMPLEX)
  37. fake.SetName("{}")
  38. l.alloc(mod, nil, append(ol, fake), skip)
  39. res = &ptrValue{scope: h.area, id: fake.Adr()}
  40. case object.DynArrayType:
  41. assert.For(len(par) > 0, 20)
  42. fake := object.New(object.VARIABLE, int(cp.SomeAdr()))
  43. fake.SetComplex(bt)
  44. fake.SetType(object.COMPLEX)
  45. fake.SetName("[]")
  46. l.alloc(mod, nil, append(ol, fake), skip)
  47. h.area.Select(fake.Adr(), func(v scope.Value) {
  48. arr, ok := v.(*dynarr)
  49. assert.For(ok, 60)
  50. arr.Set(par[0].(scope.Value))
  51. })
  52. res = &ptrValue{scope: h.area, id: fake.Adr()}
  53. default:
  54. halt.As(100, fmt.Sprintln("cannot allocate", reflect.TypeOf(bt)))
  55. }
  56. }
  57. switch v := n.(type) {
  58. case node.VariableNode:
  59. switch t := v.Object().Complex().(type) {
  60. case object.PointerType:
  61. talloc(t)
  62. //h.area.data[0].alloc(mod, nil, )
  63. default:
  64. halt.As(100, reflect.TypeOf(t))
  65. }
  66. default:
  67. halt.As(101, reflect.TypeOf(v))
  68. }
  69. return f_res
  70. }
  71. func (h *halloc) Dispose(n node.Node) {}
  72. func (a *halloc) Join(m scope.Manager) { a.area = m.(*area) }