Pārlūkot izejas kodu

в очередной раз переписывать аллокатор данных

kpmy 10 gadi atpakaļ
vecāks
revīzija
ceb1928d20

+ 3 - 4
domain.go

@@ -26,11 +26,8 @@ func (d *stdDomain) Attach(name string, x context.ContextAware) {
 	d.list[name] = x
 	d.list[name] = x
 }
 }
 
 
-func (d *stdDomain) Discover(name string, opts ...interface{}) (ret context.ContextAware) {
+func (d *stdDomain) Discover(name string) (ret context.ContextAware) {
 	assert.For(name != "", 20)
 	assert.For(name != "", 20)
-	if name == context.VSCOPE {
-		assert.For(len(opts) != 0, 20)
-	}
 	if d.list != nil {
 	if d.list != nil {
 		ret = d.list[name]
 		ret = d.list[name]
 	}
 	}
@@ -40,6 +37,8 @@ func (d *stdDomain) Discover(name string, opts ...interface{}) (ret context.Cont
 			ret = d.global
 			ret = d.global
 		case name == context.HEAP && !d.god:
 		case name == context.HEAP && !d.god:
 			ret = d.global.Discover(name)
 			ret = d.global.Discover(name)
+		case name == context.SCOPE && !d.god:
+			ret = d.global.Discover(name)
 		}
 		}
 	}
 	}
 	assert.For(ret != nil, 60) //все плохо
 	assert.For(ret != nil, 60) //все плохо

+ 2 - 3
fw.go

@@ -9,7 +9,6 @@ import (
 	rtm "fw/rt2/module"
 	rtm "fw/rt2/module"
 	_ "fw/rt2/rules2"
 	_ "fw/rt2/rules2"
 	"fw/rt2/scope"
 	"fw/rt2/scope"
-	_ "fw/rt2/scope/modern"
 	"fw/utils"
 	"fw/utils"
 	"log"
 	"log"
 	"time"
 	"time"
@@ -45,8 +44,8 @@ func main() {
 	modList := rtm.New()
 	modList := rtm.New()
 	global.Attach(context.MOD, modList)
 	global.Attach(context.MOD, modList)
 	global.Attach(context.DIGEST, context.Data(cp.Init()))
 	global.Attach(context.DIGEST, context.Data(cp.Init()))
-	heap = scope.New(context.HEAP)
-	global.Attach(context.HEAP, heap)
+	global.Attach(context.HEAP, scope.New(context.HEAP))
+	global.Attach(context.SCOPE, scope.New(context.SCOPE))
 	t0 := time.Now()
 	t0 := time.Now()
 	var init []*cpm.Module
 	var init []*cpm.Module
 	_, err := modList.Load(name, func(m *cpm.Module) {
 	_, err := modList.Load(name, func(m *cpm.Module) {

+ 0 - 0
rt2/scope/modern/hp.go → rt2/_modern/hp.go


+ 0 - 0
rt2/scope/modern/ms.go → rt2/_modern/ms.go


+ 0 - 0
rt2/scope/modern/val.go → rt2/_modern/val.go


+ 3 - 4
rt2/context/ctx.go

@@ -2,7 +2,7 @@ package context
 
 
 const (
 const (
 	STACK    = "fw/rt2/frame"
 	STACK    = "fw/rt2/frame"
-	VSCOPE   = "fw/rt2/scope"
+	SCOPE    = "fw/rt2/scope"
 	MOD      = "fw/rt2/module"
 	MOD      = "fw/rt2/module"
 	UNIVERSE = "fw/rt2/ctx"
 	UNIVERSE = "fw/rt2/ctx"
 	HEAP     = "fw/rt2/scope,heap"
 	HEAP     = "fw/rt2/scope,heap"
@@ -10,8 +10,7 @@ const (
 	DIGEST   = "fw/cp"
 	DIGEST   = "fw/cp"
 
 
 	RETURN = "RETURN"
 	RETURN = "RETURN"
-	META   = "META"
-	KEY    = "eval:key"
+	KEY    = "KEY"
 )
 )
 
 
 type Factory interface {
 type Factory interface {
@@ -20,7 +19,7 @@ type Factory interface {
 
 
 type Domain interface {
 type Domain interface {
 	Attach(name string, c ContextAware)
 	Attach(name string, c ContextAware)
-	Discover(name string, opts ...interface{}) ContextAware
+	Discover(name string) ContextAware
 	Id(c ContextAware) string
 	Id(c ContextAware) string
 	ContextAware
 	ContextAware
 	Global() Domain
 	Global() Domain

+ 0 - 2
rt2/frame/std/sf.go

@@ -4,7 +4,6 @@ import (
 	"container/list"
 	"container/list"
 	"fw/rt2/context"
 	"fw/rt2/context"
 	"fw/rt2/frame"
 	"fw/rt2/frame"
-	"fw/rt2/scope"
 	"fw/utils"
 	"fw/utils"
 	"reflect"
 	"reflect"
 	"ypk/assert"
 	"ypk/assert"
@@ -58,7 +57,6 @@ func (f *RootFrame) PushFor(fr, parent frame.Frame) {
 	if fr.Domain() == nil {
 	if fr.Domain() == nil {
 		if parent == nil {
 		if parent == nil {
 			domain := f.Domain().(context.Factory).New()
 			domain := f.Domain().(context.Factory).New()
-			domain.Attach(context.VSCOPE, scope.New(context.VSCOPE))
 			fr.Init(domain)
 			fr.Init(domain)
 		} else {
 		} else {
 			fr.Init(parent.Domain())
 			fr.Init(parent.Domain())

+ 1 - 1
rt2/nodeframe/frame.go

@@ -99,7 +99,7 @@ func (f *nodeFrame) Do() frame.WAIT {
 			var fu NodeFrameUtils
 			var fu NodeFrameUtils
 			utils.PrintTrap()
 			utils.PrintTrap()
 			utils.PrintTrap("something WRONG")
 			utils.PrintTrap("something WRONG")
-			utils.PrintTrap(f.Domain().Discover(context.VSCOPE, 0))
+			utils.PrintTrap(f.Domain().Discover(context.SCOPE))
 			depth := 10
 			depth := 10
 			f.root.ForEach(func(old frame.Frame) bool {
 			f.root.ForEach(func(old frame.Frame) bool {
 				n := fu.NodeOf(old)
 				n := fu.NodeOf(old)

+ 14 - 13
rt2/rules2/wrap/eval/call.go

@@ -90,19 +90,20 @@ func go_math(in IN, par node.Node) OUT {
 	res := math.NaN()
 	res := math.NaN()
 	switch p := par.(type) {
 	switch p := par.(type) {
 	case node.VariableNode:
 	case node.VariableNode:
-		val := sm.Select(p.Object().Adr())
-		rv, ok := scope.GoTypeFrom(val).([]float64)
-		assert.For(ok && (len(rv) > 1), 100, rv)
-		switch rv[0] {
-		case LN:
-			res = math.Log(rv[1])
-		case MANT:
-			res, _ = mathe.Me(rv[1])
-		case EXP:
-			_, res = mathe.Me(rv[1])
-		default:
-			halt.As(100, rv[0])
-		}
+		sm.Select(p.Object().Adr(), func(val scope.Value) {
+			rv, ok := scope.GoTypeFrom(val).([]float64)
+			assert.For(ok && (len(rv) > 1), 100, rv)
+			switch rv[0] {
+			case LN:
+				res = math.Log(rv[1])
+			case MANT:
+				res, _ = mathe.Me(rv[1])
+			case EXP:
+				_, res = mathe.Me(rv[1])
+			default:
+				halt.As(100, rv[0])
+			}
+		})
 	default:
 	default:
 		halt.As(100, reflect.TypeOf(p))
 		halt.As(100, reflect.TypeOf(p))
 	}
 	}

+ 2 - 2
rt2/rules2/wrap/eval/expr.go

@@ -19,7 +19,7 @@ func getConst(in IN) OUT {
 	sc := rt2.ThisScope(in.Frame)
 	sc := rt2.ThisScope(in.Frame)
 	fn := sc.Provide(c)
 	fn := sc.Provide(c)
 	assert.For(fn != nil, 40)
 	assert.For(fn != nil, 40)
-	rt2.ValueOf(in.Parent)[c.Adr()] = fn(nil)
+	rt2.ValueOf(in.Parent)[c.Adr()] = fn
 	rt2.RegOf(in.Parent)[in.Key] = c.Adr()
 	rt2.RegOf(in.Parent)[in.Key] = c.Adr()
 	return End()
 	return End()
 }
 }
@@ -90,7 +90,7 @@ func getProc(in IN) OUT {
 	sc := rt2.ThisScope(in.Frame)
 	sc := rt2.ThisScope(in.Frame)
 	fn := sc.Provide(p.Object())
 	fn := sc.Provide(p.Object())
 	assert.For(fn != nil, 40)
 	assert.For(fn != nil, 40)
-	rt2.ValueOf(in.Parent)[p.Adr()] = fn(nil)
+	rt2.ValueOf(in.Parent)[p.Adr()] = fn
 	rt2.RegOf(in.Parent)[in.Key] = p.Adr()
 	rt2.RegOf(in.Parent)[in.Key] = p.Adr()
 	return End()
 	return End()
 }
 }

+ 6 - 4
rt2/rules2/wrap/eval/stmt.go

@@ -146,7 +146,7 @@ func doAssign(in IN) (out OUT) {
 				return GetDesignator(in, left, a.Left(), func(in IN) OUT {
 				return GetDesignator(in, left, a.Left(), func(in IN) OUT {
 					v := rt2.ValueOf(in.Frame)[KeyOf(in, left)].(scope.Variable)
 					v := rt2.ValueOf(in.Frame)[KeyOf(in, left)].(scope.Variable)
 					fn := heap.Allocate(obj, obj.Complex().(object.PointerType), size)
 					fn := heap.Allocate(obj, obj.Complex().(object.PointerType), size)
-					v.Set(fn(nil))
+					v.Set(fn)
 					return End()
 					return End()
 				})
 				})
 			})
 			})
@@ -154,7 +154,7 @@ func doAssign(in IN) (out OUT) {
 			out = GetDesignator(in, left, a.Left(), func(IN) OUT {
 			out = GetDesignator(in, left, a.Left(), func(IN) OUT {
 				v := rt2.ValueOf(in.Frame)[KeyOf(in, left)].(scope.Variable)
 				v := rt2.ValueOf(in.Frame)[KeyOf(in, left)].(scope.Variable)
 				fn := heap.Allocate(obj, obj.Complex().(object.PointerType))
 				fn := heap.Allocate(obj, obj.Complex().(object.PointerType))
-				v.Set(fn(nil))
+				v.Set(fn)
 				return End()
 				return End()
 			})
 			})
 		}
 		}
@@ -423,8 +423,10 @@ func doCall(in IN) (out OUT) {
 	case node.VariableNode:
 	case node.VariableNode:
 		m := rtm.DomainModule(in.Frame.Domain())
 		m := rtm.DomainModule(in.Frame.Domain())
 		sc := rt2.ScopeFor(in.Frame, p.Object().Adr())
 		sc := rt2.ScopeFor(in.Frame, p.Object().Adr())
-		obj := scope.GoTypeFrom(sc.Select(p.Object().Adr()))
-
+		var obj interface{}
+		sc.Select(p.Object().Adr(), func(in scope.Value) {
+			obj = scope.GoTypeFrom(in)
+		})
 		if obj, ok := obj.(object.Object); ok {
 		if obj, ok := obj.(object.Object); ok {
 			proc := m.NodeByObject(obj)
 			proc := m.NodeByObject(obj)
 			call(proc[0], nil)
 			call(proc[0], nil)

+ 3 - 5
rt2/scope/area.go

@@ -19,11 +19,9 @@ type PARAM struct {
 // pk, 20150112, инициализация параметров теперь происходит как и обычный frame.Sequence, с использованием стека
 // pk, 20150112, инициализация параметров теперь происходит как и обычный frame.Sequence, с использованием стека
 type Manager interface {
 type Manager interface {
 	context.ContextAware
 	context.ContextAware
-	Update(id cp.ID, val ValueFor)
-	Select(cp.ID, ...ValueOf) Value
+	Select(cp.ID, ValueOf)
 	Target(...Allocator) Allocator
 	Target(...Allocator) Allocator
-	Exists(cp.ID) bool
-	Provide(interface{}) ValueFor
+	Provide(interface{}) Value
 	String() string
 	String() string
 }
 }
 
 
@@ -40,7 +38,7 @@ type ScopeAllocator interface {
 
 
 type HeapAllocator interface {
 type HeapAllocator interface {
 	Allocator
 	Allocator
-	Allocate(object.Object, object.PointerType, ...interface{}) ValueFor //указатель лежит в скоупе процедуры/модуля, а рекорд - в куче, поэтому нужно после создания экземпляра обновить указатель
+	Allocate(object.Object, object.PointerType, ...interface{}) Value //указатель лежит в скоупе процедуры/модуля, а рекорд - в куче, поэтому нужно после создания экземпляра обновить указатель
 	Dispose(id cp.ID)
 	Dispose(id cp.ID)
 }
 }
 
 

+ 1 - 8
rt2/scope/data.go

@@ -72,16 +72,9 @@ type Pointer interface {
 	Get() Value
 	Get() Value
 }
 }
 
 
-//средство обновления значенияx
-type ValueFor func(in Value) (out Value)
+//средство обновления значенияxb
 type ValueOf func(in Value)
 type ValueOf func(in Value)
 
 
-func Simple(v Value) ValueFor {
-	return func(Value) Value {
-		return v
-	}
-}
-
 var ValueFrom func(v Value) Value
 var ValueFrom func(v Value) Value
 var GoTypeFrom func(v Value) interface{}
 var GoTypeFrom func(v Value) interface{}
 var TypeFromGo func(v interface{}) Value
 var TypeFromGo func(v interface{}) Value

+ 16 - 18
rt2/utils.go

@@ -5,10 +5,8 @@ import (
 	"fw/cp/node"
 	"fw/cp/node"
 	"fw/rt2/context"
 	"fw/rt2/context"
 	"fw/rt2/frame"
 	"fw/rt2/frame"
-	rtm "fw/rt2/module"
 	"fw/rt2/nodeframe"
 	"fw/rt2/nodeframe"
 	"fw/rt2/scope"
 	"fw/rt2/scope"
-	"ypk/assert"
 )
 )
 
 
 var utils nodeframe.NodeFrameUtils
 var utils nodeframe.NodeFrameUtils
@@ -21,26 +19,26 @@ func Push(f, p frame.Frame)                           { utils.Push(f, p) }
 func New(n node.Node) frame.Frame                     { return utils.New(n) }
 func New(n node.Node) frame.Frame                     { return utils.New(n) }
 
 
 func ThisScope(f frame.Frame) scope.Manager {
 func ThisScope(f frame.Frame) scope.Manager {
-	return f.Domain().Discover(context.VSCOPE, 0).(scope.Manager)
+	return f.Domain().Discover(context.SCOPE).(scope.Manager)
 }
 }
 
 
 func ScopeFor(f frame.Frame, id cp.ID, fn ...scope.ValueOf) (ret scope.Manager) {
 func ScopeFor(f frame.Frame, id cp.ID, fn ...scope.ValueOf) (ret scope.Manager) {
-	glob := f.Domain().Discover(context.UNIVERSE).(context.Domain)
-	ml := glob.Discover(context.MOD).(rtm.List)
-	for _, m := range ml.AsList() {
-		md := glob.Discover(m.Name).(context.Domain)
-		sc := md.Discover(context.VSCOPE, 0).(scope.Manager)
-		//fmt.Println(m.Name, sc.Exists(id), id)
-		if sc.Exists(id) {
-			assert.For(ret == nil, 40) //только в одном скоупе!
-			ret = sc
-			break
+	/*	glob := f.Domain().Discover(context.UNIVERSE).(context.Domain)
+		ml := glob.Discover(context.MOD).(rtm.List)
+		for _, m := range ml.AsList() {
+			md := glob.Discover(m.Name).(context.Domain)
+			sc := md.Discover(context.SCOPE).(scope.Manager)
+			//fmt.Println(m.Name, sc.Exists(id), id)
+			if sc.Exists(id) {
+				assert.For(ret == nil, 40) //только в одном скоупе!
+				ret = sc
+				break
+			}
 		}
 		}
-	}
-	assert.For(ret != nil, 60, id)
-	if len(fn) == 1 {
-		ret.Select(id, fn...)
-	}
+		assert.For(ret != nil, 60, id)
+		if len(fn) == 1 {
+			ret.Select(id, fn...)
+		}*/
 	return
 	return
 }
 }