Class: Type
- Inherits:
-
Node
show all
- Defined in:
- lib/tecsgen/core/types.rb,
lib/tecsgen/core/tecsinfo.rb
Direct Known Subclasses
ArrayType, BoolType, DefinedType, DescriptorType, EnumType, FloatType, FuncType, IntType, PtrType, StructType, VoidType
Constant Summary
collapse
- @@typeinfo_printed =
{}
Class Method Summary
collapse
Instance Method Summary
collapse
-
#cast(const_val) ⇒ Object
const_val を指定の型にキャストする 派生クラスでオーバーライドしていないとエラー.
-
#check ⇒ Object
型をチェック 正当な型定義かどうか、チェックする.
-
#check_init(locale, ident, initializer, kind, attribute = nil) ⇒ Object
初期化可能かチェック attribute など初期化可能かチェックする(型に対し正当な初期化子が与えられているか) ident:: string 被代入変数命 initialize:: Expression, Array of initializer or C_EXP 代入値、C_EXP が与えられるのは IntType の場合のみ kind:: symbol (:ATTRIBUTE, :VAR, :CONSTNAT ) attribute:: NameList kind == :VAR のとき参照できる attribute.
-
#check_struct_tag(kind) ⇒ Object
struct の tag をチェック 正当な型定義かどうか、チェックする kind:: Decl の @kind を参照.
-
#clear_max ⇒ Object
-
#equal?(type2) ⇒ Boolean
型が一致するかのチェック 型名の字面でチェック. typedef された型も字面で一致を見るため、元の型が同じでも型名が異なれば不一致となる.
-
#get_bit_size ⇒ Object
bit size を得る IntType, FloatType 以外は0.
-
#get_ID_str ⇒ Object
Type# 型文字列の識別子化 型文字列に含まれる識別子として用いることのできない文字を用いることのできる文字列に置き換える 空白 => __ * => Ptr [] => Array Descriptor() => Descriptor_of_.
-
#get_original_type ⇒ Object
元の型を得る typedef された型の場合、その元の型を返す.
-
#get_type_str ⇒ Object
-
#has_pointer? ⇒ Boolean
内部にポインタ型を持つ ポインタ型、またはポインタ型メンバを持つ構造体、または要素がポインタ型を持つ配列.
-
#has_sized_pointer? ⇒ Boolean
size_is, count_is, string 指定されたポインタを持つか size_is, count_is, string 指定されたポインタ型、またはそれをメンバに持つ構造体、またはそれをを要素に持つ配列.
-
#has_unsized_string? ⇒ Boolean
長さ指定のない string を持つ なさ指定のない string 指定されたポインタ型、またはそれをメンバに持つ構造体、またはそれを要素に持つ配列.
-
#initialize ⇒ Type
constructor
-
#is_const? ⇒ Boolean
-
#is_void? ⇒ Boolean
-
#is_volatile? ⇒ Boolean
-
#print_info(f, indent) ⇒ Object
-
#print_info_post(f, indent) ⇒ Object
-
#set_qualifier(qualifier) ⇒ Object
-
#set_scs(size, count, string, max = nil, b_nullable = false) ⇒ Object
size_is, count_is, string を設定 派生クラスでオーバーライドする(デフォルトではエラー).
-
#show_tree(indent) ⇒ Object
Methods inherited from Node
#cdl_error, #cdl_error2, #cdl_error3, #cdl_info, #cdl_info2, #cdl_warning, #cdl_warning2, #get_locale, #locale_str, #set_locale
Constructor Details
#initialize ⇒ Type
Returns a new instance of Type.
67
68
69
|
# File 'lib/tecsgen/core/types.rb', line 67
def initialize
super
end
|
Class Method Details
.print_info_post(f, indent) ⇒ Object
794
795
796
797
798
|
# File 'lib/tecsgen/core/tecsinfo.rb', line 794
def self.print_info_post(f, indent)
@@typeinfo_printed.each{|nm, type|
type.print_info_post f, indent
}
end
|
.reset_print_info ⇒ Object
770
771
772
|
# File 'lib/tecsgen/core/tecsinfo.rb', line 770
def self.reset_print_info
@@typeinfo_printed = {}
end
|
Instance Method Details
#cast(const_val) ⇒ Object
const_val を指定の型にキャストする
派生クラスでオーバーライドしていないとエラー
188
189
190
|
# File 'lib/tecsgen/core/types.rb', line 188
def cast(const_val)
cdl_error("T1004 cannot cast to $1", self.class)
end
|
155
156
157
|
# File 'lib/tecsgen/core/types.rb', line 155
def check
end
|
#check_init(locale, ident, initializer, kind, attribute = nil) ⇒ Object
初期化可能かチェック
attribute など初期化可能かチェックする(型に対し正当な初期化子が与えられているか)
- ident
-
string 被代入変数命
- initialize
-
Expression, Array of initializer or C_EXP
代入値、C_EXP が与えられるのは IntType の場合のみ
- kind
-
symbol (:ATTRIBUTE, :VAR, :CONSTNAT )
- attribute
-
NameList kind == :VAR のとき参照できる attribute
locale を第一引数として取るのは、以下の理由による。
このメソッドは、変数への代入が行われる「行」に対して呼び出されるが、
Type クラスのインスタンスは、変数が定義された「行」を記憶している。
STAGE: S
182
183
184
|
# File 'lib/tecsgen/core/types.rb', line 182
def check_init(locale, ident, initializer, kind, attribute = nil)
end
|
#check_struct_tag(kind) ⇒ Object
struct の tag をチェック
正当な型定義かどうか、チェックする
- kind
-
Decl の @kind を参照
162
163
164
165
166
167
|
# File 'lib/tecsgen/core/types.rb', line 162
def check_struct_tag(kind)
end
|
#clear_max ⇒ Object
138
139
140
|
# File 'lib/tecsgen/core/types.rb', line 138
def clear_max
raise "clear_max called: #{self.class}"
end
|
#equal?(type2) ⇒ Boolean
型が一致するかのチェック
型名の字面でチェック. typedef された型も字面で一致を見るため、元の型が同じでも型名が異なれば不一致となる
195
196
197
|
# File 'lib/tecsgen/core/types.rb', line 195
def equal?(type2)
return (get_type_str == type2.get_type_str) && (get_type_str_post == type2.get_type_str_post)
end
|
#get_bit_size ⇒ Object
bit size を得る
IntType, FloatType 以外は0
201
202
203
|
# File 'lib/tecsgen/core/types.rb', line 201
def get_bit_size
return 0
end
|
#get_ID_str ⇒ Object
Type# 型文字列の識別子化
型文字列に含まれる識別子として用いることのできない文字を用いることのできる文字列に置き換える 空白 => __
-
-
> Array
Descriptor() => Descriptor_of_
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
|
# File 'lib/tecsgen/core/tecsinfo.rb', line 842
def get_ID_str
if is_a? PtrType
str = get_referto.get_ID_str + "_Ptr_"
elsif is_a? ArrayType
str = get_type.get_ID_str + "_Array" + get_subscript.eval_const(nil).to_s + "_"
elsif is_a? StructType
str = "struct #{@tag}"
elsif is_a? DescriptorType
str = "Descriptor_of_" + get_signature.get_global_name.to_s
else
str = get_type_str + get_type_str_post
end
str.gsub!(/ /, "__")
return str
end
|
#get_original_type ⇒ Object
元の型を得る
typedef された型の場合、その元の型を返す. それ以外は、自分自身を返す. (DefinedType では本メソッドがオーバーライドされる)
209
210
211
|
# File 'lib/tecsgen/core/types.rb', line 209
def get_original_type
return self
end
|
#get_type_str ⇒ Object
142
143
144
145
146
147
148
149
150
151
|
# File 'lib/tecsgen/core/types.rb', line 142
def get_type_str
str = ""
if @b_const
str = "#{str}const "
end
if @b_volatile
str = "#{str}volatile "
end
return str
end
|
#has_pointer? ⇒ Boolean
内部にポインタ型を持つ
ポインタ型、またはポインタ型メンバを持つ構造体、または要素がポインタ型を持つ配列
215
216
217
|
# File 'lib/tecsgen/core/types.rb', line 215
def has_pointer?
false
end
|
#has_sized_pointer? ⇒ Boolean
size_is, count_is, string 指定されたポインタを持つか
size_is, count_is, string 指定されたポインタ型、またはそれをメンバに持つ構造体、またはそれをを要素に持つ配列
221
222
223
|
# File 'lib/tecsgen/core/types.rb', line 221
def has_sized_pointer?
false
end
|
#has_unsized_string? ⇒ Boolean
長さ指定のない string を持つ
なさ指定のない string 指定されたポインタ型、またはそれをメンバに持つ構造体、またはそれを要素に持つ配列
227
228
229
|
# File 'lib/tecsgen/core/types.rb', line 227
def has_unsized_string?
false
end
|
#is_const? ⇒ Boolean
88
89
90
91
92
93
94
|
# File 'lib/tecsgen/core/types.rb', line 88
def is_const?
if @b_const
return true
else
return false
end
end
|
#is_void? ⇒ Boolean
104
105
106
107
108
109
110
111
112
|
# File 'lib/tecsgen/core/types.rb', line 104
def is_void?
if self.is_a? DefinedType
return @type.is_void?
elsif self.is_a? VoidType
return true
else
return false
end
end
|
#is_volatile? ⇒ Boolean
96
97
98
99
100
101
102
|
# File 'lib/tecsgen/core/types.rb', line 96
def is_volatile?
if @b_volatile
return true
else
return false
end
end
|
#print_info(f, indent) ⇒ Object
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
|
# File 'lib/tecsgen/core/tecsinfo.rb', line 774
def print_info(f, indent)
if @@typeinfo_printed[get_ID_str]
return
end
@@typeinfo_printed[get_ID_str] = self
if self.is_a? PtrType
get_referto.print_info f, indent
elsif self.is_a? ArrayType
get_type.print_info f, indent
elsif self.is_a? DefinedType
get_type.print_info f, indent
elsif self.is_a? StructType
get_members_decl.get_items.each{|decl|
decl.print_info f, get_ID_str, indent, :DECLTYPE_STMEMBER
}
end
end
|
#print_info_post(f, indent) ⇒ Object
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
|
# File 'lib/tecsgen/core/tecsinfo.rb', line 800
def print_info_post(f, indent)
if self.class.superclass == Type type_name = self.class.name
else
type_name = self.class.superclass.name end
f.print <<EOT
#{indent}cell nTECSInfo::t#{type_name}Info #{get_ID_str}TypeInfo{
#{indent} name = "#{get_type_str}#{get_type_str_post}";
#{indent} typeKind = TECSTypeKind_#{type_name};
#{indent} size = C_EXP( "sizeof(#{get_type_str}#{get_type_str_post})" );
#{indent} b_const = #{is_const?};
#{indent} b_volatile = #{is_volatile?};
EOT
if self.is_a? PtrType
f.print "#{indent} cTypeInfo = #{get_referto.get_ID_str}TypeInfo.eTypeInfo;\n"
elsif self.is_a? ArrayType
f.print "#{indent} cTypeInfo = #{get_type.get_ID_str}TypeInfo.eTypeInfo;\n"
elsif self.is_a? DefinedType
f.print "#{indent} cTypeInfo = #{get_type.get_ID_str}TypeInfo.eTypeInfo;\n"
elsif self.is_a? StructType
get_members_decl.get_items.each{|decl|
f.print "#{indent} cVarDeclInfo[] = #{get_ID_str}_#{decl.get_name}VarDeclInfo.eVarDeclInfo;\n"
}
elsif self.is_a? DescriptorType
f.print "#{indent} cSignatureInfo = #{get_signature.get_global_name}SignatureInfo.eSignatureInfo;\n"
end
f.print <<EOT
#{indent}};
EOT
end
|
#set_qualifier(qualifier) ⇒ Object
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
|
# File 'lib/tecsgen/core/types.rb', line 71
def set_qualifier(qualifier)
case qualifier
when :CONST
@b_const = true
when :VOLATILE
@b_volatile = true
else
raise "Unknown qualifier #{qualifier}"
end
end
|
#set_scs(size, count, string, max = nil, b_nullable = false) ⇒ Object
size_is, count_is, string を設定
派生クラスでオーバーライドする(デフォルトではエラー)
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
|
# File 'lib/tecsgen/core/types.rb', line 116
def set_scs(size, count, string, max = nil, b_nullable = false)
str = ""
delim = ""
if size
str = "size_is"
delim = ", "
end
if count
str = "#{str}#{delim}count_is"
delim = ", "
end
if string
str = "#{str}#{delim}string"
delim = ", "
end
if b_nullable
str = "#{str}#{delim}nullable"
delim = ", "
end
cdl_error("T1003 $1: unsuitable specifier for $2", str, self.class)
end
|
#show_tree(indent) ⇒ Object
231
232
233
234
235
236
|
# File 'lib/tecsgen/core/types.rb', line 231
def show_tree(indent)
indent.times { print " " }
puts "const=#{@b_const} volatile=#{@b_volatile} #{locale_str}"
indent.times { print " " }
puts "has_pointer=#{has_pointer?} has_sized_pointer=#{has_sized_pointer?} has_unsized_string=#{has_unsized_string?}"
end
|