Jelajahi Sumber

попытка сделать лог со скрытой реализацией

kpmy 10 tahun lalu
induk
melakukan
02b0f6a576
27 mengubah file dengan 115 tambahan dan 20 penghapusan
  1. TEMPAT SAMPAH
      code/XevConsole.oz
  2. TEMPAT SAMPAH
      code/XevDemo0.oz
  3. TEMPAT SAMPAH
      code/XevDemo1.oz
  4. TEMPAT SAMPAH
      code/XevDemo10.oz
  5. TEMPAT SAMPAH
      code/XevDemo11.oz
  6. TEMPAT SAMPAH
      code/XevDemo12.oz
  7. TEMPAT SAMPAH
      code/XevDemo14.oz
  8. TEMPAT SAMPAH
      code/XevDemo15.oz
  9. TEMPAT SAMPAH
      code/XevDemo16.oz
  10. TEMPAT SAMPAH
      code/XevDemo17.oz
  11. TEMPAT SAMPAH
      code/XevDemo19.oz
  12. TEMPAT SAMPAH
      code/XevDemo5.oz
  13. TEMPAT SAMPAH
      code/XevDemo6.oz
  14. TEMPAT SAMPAH
      code/XevDemo8.oz
  15. TEMPAT SAMPAH
      code/XevInit.oz
  16. TEMPAT SAMPAH
      code/XevLog.oz
  17. TEMPAT SAMPAH
      code/XevStrings.oz
  18. TEMPAT SAMPAH
      code/XevTest0.oz
  19. TEMPAT SAMPAH
      code/XevXLog.oz
  20. 8 10
      cp/module/module.go
  21. 39 0
      cp/object/object.go
  22. 1 1
      fw.go
  23. 2 1
      fw_test_all.bat
  24. 51 7
      rt2/rules/call.go
  25. 1 0
      rt2/scope/data.go
  26. 12 0
      rt2/scope/modern/val.go
  27. 1 1
      utils/debug.go

TEMPAT SAMPAH
code/XevConsole.oz


TEMPAT SAMPAH
code/XevDemo0.oz


TEMPAT SAMPAH
code/XevDemo1.oz


TEMPAT SAMPAH
code/XevDemo10.oz


TEMPAT SAMPAH
code/XevDemo11.oz


TEMPAT SAMPAH
code/XevDemo12.oz


TEMPAT SAMPAH
code/XevDemo14.oz


TEMPAT SAMPAH
code/XevDemo15.oz


TEMPAT SAMPAH
code/XevDemo16.oz


TEMPAT SAMPAH
code/XevDemo17.oz


TEMPAT SAMPAH
code/XevDemo19.oz


TEMPAT SAMPAH
code/XevDemo5.oz


TEMPAT SAMPAH
code/XevDemo6.oz


TEMPAT SAMPAH
code/XevDemo8.oz


TEMPAT SAMPAH
code/XevInit.oz


TEMPAT SAMPAH
code/XevLog.oz


TEMPAT SAMPAH
code/XevStrings.oz


TEMPAT SAMPAH
code/XevTest0.oz


TEMPAT SAMPAH
code/XevXLog.oz


+ 8 - 10
cp/module/module.go

@@ -25,28 +25,26 @@ type named interface {
 	Name() string
 }
 
-func (m *Module) ObjectByName(scope node.Node, name string) (ret object.Object) {
+func (m *Module) ObjectByName(scope node.Node, name string) (rl []object.Object) {
 	assert.For(name != "", 20)
-	find := func(v []object.Object) object.Object {
+	find := func(v []object.Object) (ret []object.Object) {
 		for _, o := range v {
 			if o.Name() == name {
-				return o
+				ret = append(ret, o)
 			}
+			//fmt.Println(o.Name(), name, o.Name() == name)
 		}
-		return nil
+		return ret
 	}
 	if scope == nil {
 		for _, v := range m.Objects {
-			ret = find(v)
-			if ret != nil {
-				break
-			}
+			rl = append(rl, find(v)...)
 		}
 	} else {
-		ret = find(m.Objects[scope])
+		rl = find(m.Objects[scope])
 	}
 
-	return ret
+	return rl
 }
 
 func (m *Module) TypeByName(scope node.Node, name string) (ret object.ComplexType) {

+ 39 - 0
cp/object/object.go

@@ -2,6 +2,7 @@ package object
 
 import (
 	"fw/cp"
+	"strconv"
 	"ypk/assert"
 )
 
@@ -20,6 +21,33 @@ const (
 	MODULE
 )
 
+func (m Mode) String() string {
+	switch m {
+	case HEAD:
+		return "HEAD"
+	case VARIABLE:
+		return "VARIABLE"
+	case LOCAL_PROC:
+		return "LOCAL PROCEDURE"
+	case EXTERNAL_PROC:
+		return "EXTERNAL PROCEDURE"
+	case TYPE_PROC:
+		return "METHOD"
+	case CONSTANT:
+		return "CONSTANT"
+	case PARAMETER:
+		return "PARAMETER"
+	case FIELD:
+		return "FIELD"
+	case TYPE:
+		return "TYPE"
+	case MODULE:
+		return "MODULE"
+	default:
+		return strconv.Itoa(int(m))
+	}
+}
+
 type Object interface {
 	SetName(name string)
 	SetType(typ Type)
@@ -32,6 +60,7 @@ type Object interface {
 	SetRef(n Ref)
 	Ref() []Ref
 	cp.Id
+	Mode(...Mode) Mode
 }
 
 type Ref interface {
@@ -98,6 +127,7 @@ func New(mode Mode, id int) (ret Object) {
 	default:
 		panic("no such object mode")
 	}
+	ret.Mode(mode)
 	ret.Adr(id)
 	return ret
 }
@@ -109,6 +139,7 @@ type objectFields struct {
 	comp ComplexType
 	ref  []Ref
 	adr  cp.ID
+	mod  Mode
 }
 
 func (of *objectFields) SetType(typ Type)         { of.typ = typ }
@@ -128,6 +159,14 @@ func (of *objectFields) Adr(a ...int) cp.ID {
 	return of.adr
 }
 
+func (of *objectFields) Mode(a ...Mode) Mode {
+	assert.For(len(a) <= 1, 20)
+	if len(a) == 1 {
+		of.mod = a[0]
+	}
+	return of.mod
+}
+
 func (of *objectFields) SetRef(n Ref) {
 	assert.For(n != nil, 20)
 	exists := func() bool {

+ 1 - 1
fw.go

@@ -33,7 +33,7 @@ func close() {
 func main() {
 	flag.Parse()
 	if name == "" {
-		name = "XevTest0"
+		name = "XevInit"
 	}
 	global := &stdDomain{god: true}
 	global.global = global

+ 2 - 1
fw_test_all.bat

@@ -23,4 +23,5 @@ start fw_test XevDemo20
 start fw_test XevDemo21
 start fw_test XevDemo22
 
-start fw_test XevTest0
+start fw_test XevTest0
+start fw_test XevInit

+ 51 - 7
rt2/rules/call.go

@@ -161,16 +161,60 @@ func callSeq(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
 			seq = Propose(Tail(STOP))
 			ret = frame.NOW
 		} else {
-			if imp := m.ImportOf(n.Left().Object()); imp == "" {
-				proc := m.NodeByObject(n.Left().Object())
+			if imp := m.ImportOf(n.Left().Object()); imp == "" || imp == m.Name {
+				switch p.Object().Mode() {
+				case object.LOCAL_PROC, object.EXTERNAL_PROC:
+					proc := m.NodeByObject(n.Left().Object())
+					call(proc[0], nil)
+				case object.TYPE_PROC:
+					sc := f.Domain().Discover(context.SCOPE).(scope.Manager)
+					var fn object.ProcedureObject
+					var dm context.Domain
+					sc.Select(n.Right().Object().Adr(), func(v scope.Value) {
+						_, c := scope.Ops.TypeOf(v)
+						mod := rtm.ModuleOfType(f.Domain(), c)
+						dm = f.Domain().Discover(context.UNIVERSE).(context.Domain).Discover(mod.Name).(context.Domain)
+						ol := mod.Objects[mod.Enter]
+						for _, _po := range ol {
+							switch po := _po.(type) {
+							case object.ProcedureObject:
+								if po.Name() == p.Object().Name() && po.Link().Complex() == c {
+									fn = po
+								}
+
+							}
+						}
+					})
+					assert.For(fn != nil, 40)
+					proc := m.NodeByObject(fn)
+					call(proc[0], nil)
+					panic(0)
+				default:
+					halt.As(100, "wrong proc mode ", p.Object().Mode())
+				}
+
 				//fmt.Println(len(proc), len(n.Left().Object().Ref()))
-				call(proc[0], nil)
+				//fmt.Println("proc refs", proc)
+
 			} else {
 				m := ml.Loaded(imp)
-				proc := m.ObjectByName(m.Enter, n.Left().Object().Name())
-				nl := m.NodeByObject(proc)
-				utils.PrintFrame("foreign call", len(nl))
-				call(nl[0], f.Domain().Discover(context.UNIVERSE).(context.Domain).Discover(imp).(context.Domain))
+				pl := m.ObjectByName(m.Enter, n.Left().Object().Name())
+				var proc object.ProcedureObject
+				var nl []node.Node
+				for _, n := range pl {
+					if n.Mode() == p.Object().Mode() {
+						proc = n.(object.ProcedureObject)
+					}
+				}
+				//utils.PrintFrame("proc refs", len(proc))
+				switch proc.Mode() {
+				case object.LOCAL_PROC, object.EXTERNAL_PROC:
+					nl = m.NodeByObject(proc)
+					utils.PrintFrame("foreign call", len(nl), "proc refs", proc)
+					call(nl[0], f.Domain().Discover(context.UNIVERSE).(context.Domain).Discover(imp).(context.Domain))
+				default:
+					halt.As(100, "wrong proc mode ", p.Object().Mode())
+				}
 			}
 		}
 	case node.VariableNode:

+ 1 - 0
rt2/scope/data.go

@@ -34,6 +34,7 @@ type Operations interface {
 	Is(Value, object.ComplexType) Value
 	Conv(Value, object.Type, ...object.ComplexType) Value
 	Len(object.Object, Value, Value) Value
+	TypeOf(Value) (object.Type, object.ComplexType)
 }
 
 type Value interface {

+ 12 - 0
rt2/scope/modern/val.go

@@ -1377,6 +1377,18 @@ func (o *ops) Geq(a, b scope.Value) scope.Value {
 	panic(0)
 }
 
+func (o *ops) TypeOf(x scope.Value) (object.Type, object.ComplexType) {
+	switch v := x.(type) {
+	case *ptr:
+		if v.val != nil {
+			return v.val.link.Type(), v.val.link.Complex()
+		}
+	default:
+		halt.As(100, reflect.TypeOf(v))
+	}
+	return object.NOTYPE, nil
+}
+
 func init() {
 	scope.ValueFrom = vfrom
 	scope.GoTypeFrom = gfrom

+ 1 - 1
utils/debug.go

@@ -2,7 +2,7 @@ package utils
 
 import "fmt"
 
-var debugFrame = false
+var debugFrame = true
 var debugScope = false
 var debugTrap = true