1 # coding: utf-8
2 # frozen_string_literal: true
3
4
5
6 module Umu
7
8 module Value
9
10 module Core
11
12 class Top < ::Object
13 def self.class_method_infos
14 infos = @class_method_infos
15
16 (infos ? infos : []).map {
17 |
18 meth_sym, mess_sym,
19 param_class_types, ret_class_type
20 |
21
22 ECTS.make_method_info(
23 meth_sym, mess_sym,
24 param_class_types, ret_class_type
25 )
26 }
27 end
28
29
30 def self.instance_method_infos
31 infos = @instance_method_infos
32
33 (infos ? infos : []).map {
34 |
35 meth_sym, message_sym,
36 param_class_types, ret_class_type
37 |
38
39 ECTS.make_method_info(
40 meth_sym, message_sym,
41 param_class_types, ret_class_type
42 )
43 }
44 end
45
46
47 def self.define_class_method(
48 meth_sym, hd_mess_sym, tl_mess_syms,
49 param_class_types, ret_class_type
50 )
51 # printf "CLASS METHOD OF %s\n", self
52
53 @class_method_infos ||= []
54
55 self.__define_method__(
56 @class_method_infos,
57 meth_sym, hd_mess_sym, tl_mess_syms,
58 param_class_types, ret_class_type
59 )
60 end
61
62
63 def self.define_instance_method(
64 meth_sym, hd_mess_sym, tl_mess_syms,
65 param_class_types, ret_class_type
66 )
67 # printf "INSTANCE METHOD OF %s\n", self
68
69 @instance_method_infos ||= []
70
71 self.__define_method__(
72 @instance_method_infos,
73 meth_sym, hd_mess_sym, tl_mess_syms,
74 param_class_types, ret_class_type
75 )
76 end
77
78
79 def self.__define_method__(
80 infos,
81 meth_sym, hd_mess_sym, tl_mess_syms,
82 param_class_types, ret_class_type
83 )
84 =begin
85 pp [
86 meth_sym, hd_mess_sym, tl_mess_syms,
87 param_class_types, ret_class_type
88 ]
89 =end
90 ASSERT.kind_of infos, ::Array
91 ASSERT.kind_of meth_sym, ::Symbol
92 ASSERT.kind_of hd_mess_sym, ::Symbol
93 tl_mess_syms.each do |mess_alias_sym|
94 ASSERT.kind_of mess_alias_sym, ::Symbol
95 end
96 ASSERT.kind_of param_class_types, ::Array
97 param_class_types.each do |param_class_type|
98 ASSERT.subclass_of param_class_type, VC::Top
99 end
100 ASSERT.subclass_of ret_class_type, VC::Top
101
102 ([hd_mess_sym] + tl_mess_syms).each do |message_sym|
103 infos << [
104 meth_sym, message_sym,
105 param_class_types, ret_class_type
106 ]
107 end
108 end
109
110
111 def self.type_sym
112 begin
113 self.const_get :TYPE_SYM, false
114 rescue ::NameError
115 class_path = self.to_s.split(/::/).map(&:to_sym)
116 self_sym = class_path[-1]
117
118 if self_sym == :Abstract
119 class_path[-2]
120 else
121 self_sym
122 end
123 end
124 end
125
126
127 def type_sym
128 self.class.type_sym
129 end
130
131
132 def pretty_print(q)
133 q.text self.to_s
134 end
135
136
137 def invoke(method_signat, loc, env, _event, *arg_values)
138 ASSERT.kind_of method_signat, ECTSM::Entry
139 ASSERT.kind_of loc, LOC::Entry
140 ASSERT.kind_of env, E::Entry
141 ASSERT.kind_of arg_values, ::Array
142 ASSERT.assert arg_values.all? { |v| v.kind_of? VC::Top }
143
144 msg = format("(%s).%s%s -> %s",
145 self.to_s,
146
147 method_signat.meth_sym,
148
149 if arg_values.empty?
150 ''
151 else
152 format("(%s)",
153 arg_values.zip(
154 method_signat.param_class_signats
155 ).map{ |(value, signat)|
156 format "%s : %s", value, signat.to_sym
157 }.join(', ')
158 )
159 end,
160
161 method_signat.ret_class_signat.to_sym
162 )
163
164 value = E::Tracer.trace(
165 env.pref,
166 env.trace_stack.count,
167 'Invoke',
168 self.class,
169 loc,
170 msg,
171 ) { |event|
172 __invoke__(
173 method_signat.meth_sym,
174 loc,
175 env,
176 event,
177 arg_values
178 )
179 }
180 ASSERT.kind_of value, VC::Top
181 end
182
183
184 def apply(_head_value, _tail_values, loc, env)
185 ASSERT.kind_of loc, LOC::Entry
186 ASSERT.kind_of env, E::Entry
187
188 raise X::ApplicationError.new(
189 loc,
190 env,
191 "Application error for %s : %s",
192 self.to_s,
193 self.type_sym.to_s
194 )
195 end
196
197
198 private
199
200 def __invoke__(meth_sym, loc, env, event, arg_values)
201 ASSERT.kind_of meth_sym, ::Symbol
202 ASSERT.kind_of loc, LOC::Entry
203 ASSERT.kind_of env, E::Entry
204 ASSERT.kind_of event, E::Tracer::Event
205 ASSERT.kind_of arg_values, ::Array
206
207 self.send meth_sym, loc, env, event, *arg_values
208 end
209
210 end
211 Top.freeze
212
213 end # Umu::Value::Core
214
215 end # Umu::Value
216
217 end # Umu