1 //
2 // Copyright (c) 2006, Brian Frank and Andy Frank
3 // Licensed under the Academic Free License version 3.0
4 //
5 // History:
6 // 30 Jan 06 Brian Frank Creation
7 // 19 Aug 06 Brian Frank Ported from Java to Fan
8 //
9
10 **
11 ** FTypeRef stores a typeRef structure used to reference type signatures.
12 **
13 const class FTypeRef
14 {
15
16 new make(Int podName, Int typeName, Str sig)
17 {
18 this.podName = podName
19 this.typeName = typeName
20 this.sig = sig
21 this.hashcode = (podName << 17) ^ (typeName) ^ (sig.hash)
22 }
23
24 override Int hash() { return hashcode }
25
26 override Bool equals(Obj obj)
27 {
28 x := (FTypeRef)obj
29 return podName === x.podName && typeName === x.typeName && sig == x.sig
30 }
31
32 Bool isGenericInstance() { return sig.size > 0 }
33
34 Str signature(FPod pod)
35 {
36 if (isGenericInstance) return sig
37 return pod.n(podName) + "::" + pod.n(typeName)
38 }
39
40 Str format(FPod pod) { return signature(pod) }
41
42 Void write(OutStream out)
43 {
44 out.writeI2(podName)
45 out.writeI2(typeName)
46 out.writeUtf(sig)
47 }
48
49 static FTypeRef read(InStream in)
50 {
51 return make(in.readU2, in.readU2, in.readUtf)
52 }
53
54 const Int podName // names index
55 const Int typeName // names index
56 const Str sig
57 const Int hashcode
58
59 }
60
61 **************************************************************************
62 ** FFieldRef
63 **************************************************************************
64
65 const class FFieldRef
66 {
67
68 new make(Int parent, Int name, Int typeRef)
69 {
70 this.parent = parent
71 this.name = name
72 this.typeRef = typeRef
73 this.hashcode = (parent << 23) ^ (name << 7) ^ (typeRef)
74 }
75
76 override Int hash()
77 {
78 return hashcode
79 }
80
81 override Bool equals(Obj obj)
82 {
83 x := (FFieldRef)obj
84 return parent === x.parent && name === x.name && typeRef === x.typeRef
85 }
86
87 Str format(FPod pod)
88 {
89 return pod.typeRefStr(parent) + "." + pod.names[name] + " -> " + pod.typeRefStr(typeRef)
90 }
91
92 Void write(OutStream out)
93 {
94 out.writeI2(parent)
95 out.writeI2(name)
96 out.writeI2(typeRef)
97 }
98
99 static FFieldRef read(InStream in)
100 {
101 return make(in.readU2, in.readU2, in.readU2)
102 }
103
104 const Int parent // typeRefs index
105 const Int name // names index
106 const Int typeRef // typeRefs index
107 const Int hashcode
108 }
109
110 **************************************************************************
111 ** FMethodRef
112 **************************************************************************
113
114 const class FMethodRef
115 {
116
117 new make(Int parent, Int name, Int ret, Int[] params)
118 {
119 this.parent = parent
120 this.name = name
121 this.ret = ret
122 this.params = params.toImmutable
123 this.hashcode = (parent << 23) ^ (name << 7) ^ (ret)
124 }
125
126 override Int hash()
127 {
128 return hashcode
129 }
130
131 override Bool equals(Obj obj)
132 {
133 x := (FMethodRef)obj
134 return parent === x.parent && name === x.name && ret === x.ret && params == x.params
135 }
136
137 Str format(FPod pod)
138 {
139 s := pod.typeRefStr(parent) + "." + pod.names[name] + "("
140 params.each |Int p, Int i|
141 {
142 if (i > 0) s += ", "
143 s += pod.typeRefStr(p)
144 }
145 s += ") -> " + pod.typeRefStr(ret)
146 return s
147 }
148
149 Void write(OutStream out)
150 {
151 out.writeI2(parent)
152 out.writeI2(name)
153 out.writeI2(ret)
154 out.write(params.size)
155 params.each |Int param| { out.writeI2(param) }
156 }
157
158 static FMethodRef read(InStream in)
159 {
160 parent := in.readU2
161 name := in.readU2
162 ret := in.readU2
163 p := Int[,]
164 in.readU1.times |,| { p.add(in.readU2) }
165 return make(parent, name, ret, p)
166 }
167
168 const Int parent // typeRefs index
169 const Int name // names index
170 const Int ret // typeRefs index
171 const Int[] params // typeRefs indices
172 const Int hashcode
173 }
2 // Copyright (c) 2006, Brian Frank and Andy Frank
3 // Licensed under the Academic Free License version 3.0
4 //
5 // History:
6 // 30 Jan 06 Brian Frank Creation
7 // 19 Aug 06 Brian Frank Ported from Java to Fan
8 //
9
10 **
11 ** FTypeRef stores a typeRef structure used to reference type signatures.
12 **
13 const class FTypeRef
14 {
15
16 new make(Int podName, Int typeName, Str sig)
17 {
18 this.podName = podName
19 this.typeName = typeName
20 this.sig = sig
21 this.hashcode = (podName << 17) ^ (typeName) ^ (sig.hash)
22 }
23
24 override Int hash() { return hashcode }
25
26 override Bool equals(Obj obj)
27 {
28 x := (FTypeRef)obj
29 return podName === x.podName && typeName === x.typeName && sig == x.sig
30 }
31
32 Bool isGenericInstance() { return sig.size > 0 }
33
34 Str signature(FPod pod)
35 {
36 if (isGenericInstance) return sig
37 return pod.n(podName) + "::" + pod.n(typeName)
38 }
39
40 Str format(FPod pod) { return signature(pod) }
41
42 Void write(OutStream out)
43 {
44 out.writeI2(podName)
45 out.writeI2(typeName)
46 out.writeUtf(sig)
47 }
48
49 static FTypeRef read(InStream in)
50 {
51 return make(in.readU2, in.readU2, in.readUtf)
52 }
53
54 const Int podName // names index
55 const Int typeName // names index
56 const Str sig
57 const Int hashcode
58
59 }
60
61 **************************************************************************
62 ** FFieldRef
63 **************************************************************************
64
65 const class FFieldRef
66 {
67
68 new make(Int parent, Int name, Int typeRef)
69 {
70 this.parent = parent
71 this.name = name
72 this.typeRef = typeRef
73 this.hashcode = (parent << 23) ^ (name << 7) ^ (typeRef)
74 }
75
76 override Int hash()
77 {
78 return hashcode
79 }
80
81 override Bool equals(Obj obj)
82 {
83 x := (FFieldRef)obj
84 return parent === x.parent && name === x.name && typeRef === x.typeRef
85 }
86
87 Str format(FPod pod)
88 {
89 return pod.typeRefStr(parent) + "." + pod.names[name] + " -> " + pod.typeRefStr(typeRef)
90 }
91
92 Void write(OutStream out)
93 {
94 out.writeI2(parent)
95 out.writeI2(name)
96 out.writeI2(typeRef)
97 }
98
99 static FFieldRef read(InStream in)
100 {
101 return make(in.readU2, in.readU2, in.readU2)
102 }
103
104 const Int parent // typeRefs index
105 const Int name // names index
106 const Int typeRef // typeRefs index
107 const Int hashcode
108 }
109
110 **************************************************************************
111 ** FMethodRef
112 **************************************************************************
113
114 const class FMethodRef
115 {
116
117 new make(Int parent, Int name, Int ret, Int[] params)
118 {
119 this.parent = parent
120 this.name = name
121 this.ret = ret
122 this.params = params.toImmutable
123 this.hashcode = (parent << 23) ^ (name << 7) ^ (ret)
124 }
125
126 override Int hash()
127 {
128 return hashcode
129 }
130
131 override Bool equals(Obj obj)
132 {
133 x := (FMethodRef)obj
134 return parent === x.parent && name === x.name && ret === x.ret && params == x.params
135 }
136
137 Str format(FPod pod)
138 {
139 s := pod.typeRefStr(parent) + "." + pod.names[name] + "("
140 params.each |Int p, Int i|
141 {
142 if (i > 0) s += ", "
143 s += pod.typeRefStr(p)
144 }
145 s += ") -> " + pod.typeRefStr(ret)
146 return s
147 }
148
149 Void write(OutStream out)
150 {
151 out.writeI2(parent)
152 out.writeI2(name)
153 out.writeI2(ret)
154 out.write(params.size)
155 params.each |Int param| { out.writeI2(param) }
156 }
157
158 static FMethodRef read(InStream in)
159 {
160 parent := in.readU2
161 name := in.readU2
162 ret := in.readU2
163 p := Int[,]
164 in.readU1.times |,| { p.add(in.readU2) }
165 return make(parent, name, ret, p)
166 }
167
168 const Int parent // typeRefs index
169 const Int name // names index
170 const Int ret // typeRefs index
171 const Int[] params // typeRefs indices
172 const Int hashcode
173 }