소스 검색

разобрался с полями из импортированных типов

kpmy 10 년 전
부모
커밋
31aa3d7863
6개의 변경된 파일66개의 추가작업 그리고 5개의 파일을 삭제
  1. 8 0
      cp/adr.go
  2. 9 0
      cp/module/module.go
  3. 9 0
      cp/object/object.go
  4. 2 1
      fw_test_all.bat
  5. 18 3
      rt2/rules2/wrap/data/stack.go
  6. 20 1
      rt2/rules2/wrap/eval/expr.go

+ 8 - 0
cp/adr.go

@@ -18,6 +18,14 @@ func (i ID) String() string {
 	}
 }
 
+func Degrade(i ID) int {
+	if i > 0 {
+		return getId(i)
+	} else {
+		return int(i)
+	}
+}
+
 type Digest interface{}
 
 type dig struct {

+ 9 - 0
cp/module/module.go

@@ -167,6 +167,15 @@ func (m *Module) Init(inittd ...func(t object.ComplexType)) {
 		for _, s := range m.Types {
 			for _, t := range s {
 				inittd[0](t)
+				switch rec := t.(type) {
+				case object.RecordType:
+					for x := rec.Link(); x != nil; x = x.Link() {
+						switch f := x.(type) {
+						case object.FieldObject:
+							f.TypeOf(rec)
+						}
+					}
+				}
 			}
 		}
 	}

+ 9 - 0
cp/object/object.go

@@ -87,6 +87,7 @@ type ParameterObject interface {
 type FieldObject interface {
 	Object
 	self() FieldObject
+	TypeOf(...ComplexType) ComplexType
 }
 
 type ProcedureObject interface {
@@ -243,10 +244,18 @@ func (v *parameterObject) self() ParameterObject { return v }
 
 type fieldObject struct {
 	objectFields
+	comp ComplexType
 }
 
 func (v *fieldObject) self() FieldObject { return v }
 
+func (v *fieldObject) TypeOf(t ...ComplexType) ComplexType {
+	if len(t) == 1 {
+		v.comp = t[0]
+	}
+	return v.comp
+}
+
 type typeObject struct {
 	objectFields
 }

+ 2 - 1
fw_test_all.bat

@@ -27,4 +27,5 @@ start fw_test XevDemo23
 start fw_test TestA0
 start fw_test Start
 start fw_test Start2
-start fw_test Start3
+start fw_test Start3
+start fw_test Start4

+ 18 - 3
rt2/rules2/wrap/data/stack.go

@@ -109,12 +109,18 @@ func push(dom context.Domain, il items.Data, _o object.Object) {
 			r := newRec(o)
 			x = r
 			fl := make([]object.Object, 0)
+			var tl []object.Object
 			for rec := t; rec != nil; {
+				//fmt.Println(rec.Qualident())
+				if tl != nil {
+					fl = append(fl, tl...)
+					tl = nil
+				}
 				for x := rec.Link(); x != nil; x = x.Link() {
 					switch x.(type) {
 					case object.FieldObject:
-						fmt.Println(o.Name(), ".", x.Name(), x.Adr())
-						fl = append(fl, x)
+						//fmt.Println(rec.Qualident(), o.Name(), ".", x.Name(), x.Adr())
+						tl = append(tl, x)
 					case object.ParameterObject, object.ProcedureObject, object.VariableObject:
 						//do nothing
 					default:
@@ -125,12 +131,21 @@ func push(dom context.Domain, il items.Data, _o object.Object) {
 					x := ml.NewTypeCalc()
 					x.ConnectTo(rec)
 					_, frec := x.ForeignBase()
-					fmt.Println(frec)
+					if frec != nil {
+						//fmt.Println("fbase", frec.Qualident())
+						tl = nil
+					}
 					rec, _ = frec.(object.RecordType)
 				} else {
 					rec = rec.BaseRec()
+					if rec != nil {
+						//fmt.Println("base", rec.Qualident())
+					}
 				}
 			}
+			if tl != nil {
+				fl = append(fl, tl...)
+			}
 			r.fi = items.New()
 			r.fi.Begin()
 			for _, f := range fl {

+ 20 - 1
rt2/rules2/wrap/eval/expr.go

@@ -54,7 +54,26 @@ func getField(in IN) OUT {
 		_v := rt2.ValueOf(in.Frame)[KeyOf(in, left)]
 		switch v := _v.(type) {
 		case scope.Record:
-			fld := v.Get(f.Object().Adr()).(scope.Variable)
+			_fo := f.Object()
+			switch fo := _fo.(type) {
+			case object.FieldObject:
+				tc := in.Frame.Domain().Global().Discover(context.MOD).(rtm.List).NewTypeCalc()
+				tc.ConnectTo(fo.TypeOf())
+				if _, ft := tc.ForeignBase(); ft != nil {
+					for x := ft.Link(); x != nil; x = x.Link() {
+						switch fx := x.(type) {
+						case object.FieldObject:
+							if fx.Name() == fo.Name() {
+								_fo = fx
+							}
+						}
+					}
+
+				}
+			default:
+				halt.As(100, reflect.TypeOf(fo))
+			}
+			fld := v.Get(_fo.Adr()).(scope.Variable)
 			rt2.ValueOf(in.Parent)[f.Adr()] = fld
 			rt2.RegOf(in.Parent)[in.Key] = f.Adr()
 			//rt2.RegOf(in.Parent)[context.META] = &Meta{Scope: nil, Rec: v, Id: fld.Id()}