Class: Type

Inherits:
Node show all
Defined in:
lib/tecsgen/core/types.rb,
lib/tecsgen/core/tecsinfo.rb

Constant Summary collapse

@@typeinfo_printed =
{}

Class Method Summary collapse

Instance Method Summary collapse

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

#initializeType

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_infoObject



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

#checkObject

型をチェック

正当な型定義かどうか、チェックする


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)
  # tag が存在しなければエラーを出力する
  # 配列型では、要素の型を再帰的にチェック
  # ポインタ型では、指す先の tag チェックはしない
  # 関数型ではパラメータリストのすべてについて行う
end

#clear_maxObject



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 された型も字面で一致を見るため、元の型が同じでも型名が異なれば不一致となる

Returns:

  • (Boolean)


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_sizeObject

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_strObject

Type# 型文字列の識別子化

型文字列に含まれる識別子として用いることのできない文字を用いることのできる文字列に置き換える 空白 => __

  • > Ptr

> 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
  # puts "get_ID_str: #{self.class.name}"
  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
  # p "before: #{str}"
  str.gsub!(/ /, "__")
  # p "after: #{str}"
  return str
end

#get_original_typeObject

元の型を得る

typedef された型の場合、その元の型を返す. それ以外は、自分自身を返す. (DefinedType では本メソッドがオーバーライドされる)



209
210
211
# File 'lib/tecsgen/core/types.rb', line 209

def get_original_type
  return self
end

#get_type_strObject



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

内部にポインタ型を持つ

ポインタ型、またはポインタ型メンバを持つ構造体、または要素がポインタ型を持つ配列

Returns:

  • (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 指定されたポインタ型、またはそれをメンバに持つ構造体、またはそれをを要素に持つ配列

Returns:

  • (Boolean)


221
222
223
# File 'lib/tecsgen/core/types.rb', line 221

def has_sized_pointer?
  false
end

#has_unsized_string?Boolean

長さ指定のない string を持つ

なさ指定のない string 指定されたポインタ型、またはそれをメンバに持つ構造体、またはそれを要素に持つ配列

Returns:

  • (Boolean)


227
228
229
# File 'lib/tecsgen/core/types.rb', line 227

def has_unsized_string?
  false
end

#is_const?Boolean

Returns:

  • (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

Returns:

  • (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

Returns:

  • (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


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)
  # Type の info は、最後にまとめて出力するので、ここでは記録するだけ
  if @@typeinfo_printed[get_ID_str]
    return
  end
  # p "ID Str: #{get_ID_str}"
  @@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 の場合 types.rb のクラス
    type_name = self.class.name
  else
    type_name = self.class.superclass.name # ctypes.rb のクラス (親クラスが types.rb のクラス)
  end
  # p "type: #{type_name}, #{self.class.name}"

  # p "class=#{self.class.name} size=#{bit_size}"
  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
#      if @b_const then
#        cdl_error( "T1001 const duplicate"  )
#      end
    @b_const = true
  when :VOLATILE
#      if @b_volatile then
#        cdl_error( "T1002 volatile duplicate"  )
#      end
    @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