source: dev/trunk/ab5.0/abdev/BasicCompiler_Common/src/Type.cpp@ 465

Last change on this file since 465 was 465, checked in by dai_9181, 16 years ago

Messenger/ErrorMessengerクラスを導入。SetError関数によるエラー生成を廃止した。

File size: 10.8 KB
RevLine 
[206]1#include "stdafx.h"
2
3#include <Class.h>
4
5using namespace std;
6
7const int Type::basicTypeList[] = {
8 DEF_BYTE,
9 DEF_SBYTE,
10 DEF_WORD,
11 DEF_INTEGER,
12 DEF_DWORD,
13 DEF_LONG,
14 DEF_QWORD,
15 DEF_INT64,
16
17 DEF_SINGLE,
18 DEF_DOUBLE,
19
20 DEF_BOOLEAN,
21
22 DEF_PTR_VOID,
23
24 DEF_ANY,
25
26 DEF_NON
27};
28
29const string Type::basicTypeNameList[] = {
30 "Byte",
31 "SByte",
32 "Word",
33 "Integer",
34 "DWord",
35 "Long",
36 "QWord",
37 "Int64",
38
39 "Single",
40 "Double",
41
42 "Boolean",
43
44 "VoidPtr",
45
46 "Any",
47
48 ""
49};
50
[290]51Type::~Type()
52{
53}
54
[206]55bool Type::StringToBasicType( const string &typeName, int &basicType ){
56 for( int i=0; ; i++ ){
57 if( basicTypeList[i] == DEF_NON ){
58 break;
59 }
60 if( basicTypeNameList[i] == typeName ){
61 basicType = basicTypeList[i];
62 return true;
63 }
64 }
65 return false;
66}
67const char *Type::BasicTypeToCharPtr( const Type &type )
68{
69 for( int i=0; ; i++ ){
70 if( basicTypeList[i] == DEF_NON ){
71 break;
72 }
73 if( basicTypeList[i] == type.GetBasicType() ){
74 return basicTypeNameList[i].c_str();
75 }
76 }
77 return NULL;
78}
79
80int Type::GetBasicSize( int basicType )
81{
82
83 // 基本型
84 switch( basicType ){
85 case DEF_SBYTE:
86 case DEF_BYTE:
87 case DEF_BOOLEAN:
88 return sizeof(BYTE);
89
90 case DEF_INTEGER:
91 case DEF_WORD:
92 return sizeof(WORD);
93
94 case DEF_LONG:
95 case DEF_DWORD:
96 return sizeof(DWORD);
97
98 case DEF_INT64:
99 case DEF_QWORD:
100 return sizeof(_int64);
101
102 case DEF_DOUBLE:
103 return sizeof(double);
104 case DEF_SINGLE:
105 return sizeof(float);
106 }
107
108 // ポインタ
109 if(IsPointer( basicType )){
110 return PTR_SIZE;
111 }
112
113 // オブジェクト
114 if(basicType==DEF_OBJECT){
115 return PTR_SIZE;
116 }
117
[465]118 compiler.errorMessenger.OutputFatalError();
[206]119
120 return 0;
121}
122
[290]123const CClass &Type::GetClass() const
124{
125 if( !HasMember() )
126 {
127 Jenga::Throw( "クラスまたは構造体でない型に対してGetClassを呼び出した" );
128 }
[206]129
[290]130 return *pClass;
131}
132
[206]133bool Type::Equals( const Type &type ) const
134{
135 if( basicType == type.basicType ){
136 if( NATURAL_TYPE( basicType ) == DEF_OBJECT
137 || NATURAL_TYPE( basicType ) == DEF_STRUCT ){
138
139 if( index == type.index ){
140 return true;
141 }
142
143 }
144 else{
145 return true;
146 }
147 }
148 return false;
149}
150
[447]151bool Type::IsCovariant( const Type &type ) const
152{
153 if( !this->IsObject() || !type.IsObject() )
154 {
155 // 共変性の判別はクラス型のみ
156 return false;
157 }
158
159 return this->GetClass().IsSubClass( &type.GetClass() );
160}
[448]161bool Type::IsContravariant( const Type &type ) const
162{
163 if( !this->IsObject() || !type.IsObject() )
164 {
165 // 反変性の判別はクラス型のみ
166 return false;
167 }
[447]168
[448]169 return type.GetClass().IsSubClass( &this->GetClass() );
170}
171
[206]172int Type::GetBasicSize() const
173{
174 return GetBasicSize( basicType );
175}
176int Type::GetSize() const
177{
178
179 // 基本型
180 switch( basicType ){
181 case DEF_LONG:
182 if(index==LITERAL_NULL||index==LITERAL_M128_0||index==LITERAL_0_255){
183 return sizeof(BYTE);
184 }
185 else if(index==LITERAL_M32768_0||index==LITERAL_0_65535){
186 return sizeof(WORD);
187 }
188 return sizeof(DWORD);
189
190 case DEF_SBYTE:
191 case DEF_BYTE:
192 case DEF_BOOLEAN:
193 return sizeof(BYTE);
194
195 case DEF_INTEGER:
196 case DEF_WORD:
197 return sizeof(WORD);
198
199 case DEF_DWORD:
200 return sizeof(DWORD);
201
202 case DEF_INT64:
203 case DEF_QWORD:
204 return sizeof(_int64);
205
206 case DEF_DOUBLE:
207 return sizeof(double);
208 case DEF_SINGLE:
209 return sizeof(float);
210 }
211
212 // ポインタ
213 if(IsPointer()){
214 return PTR_SIZE;
215 }
216
217 // 構造体
[290]218 if( IsStruct() )
219 {
[206]220 if( !pClass ){
[465]221 compiler.errorMessenger.OutputFatalError();
[206]222 return 0;
223 }
224
225 return pClass->GetSize();
226 }
227
228 // オブジェクト
[290]229 if( IsObject() )
230 {
[206]231 return PTR_SIZE;
232 }
233
[465]234 compiler.errorMessenger.OutputFatalError();
[206]235 return 0;
236}
237
238bool Type::IsNull() const{
239 if( basicType == DEF_NON ){
240 return true;
241 }
242 return false;
243}
244
245bool Type::IsByte() const{
246 if( basicType == DEF_BYTE ){
247 return true;
248 }
249 return false;
250}
251bool Type::IsSByte() const{
252 if( basicType == DEF_SBYTE ){
253 return true;
254 }
255 return false;
256}
257bool Type::IsWord() const{
258 if( basicType == DEF_WORD ){
259 return true;
260 }
261 return false;
262}
263bool Type::IsInteger() const{
264 if( basicType == DEF_INTEGER ){
265 return true;
266 }
267 return false;
268}
269bool Type::IsDWord() const{
270 if( basicType == DEF_DWORD ){
271 return true;
272 }
273 return false;
274}
275bool Type::IsLong() const{
276 if( basicType == DEF_LONG ){
277 return true;
278 }
279 return false;
280}
281bool Type::IsQWord() const{
282 if( basicType == DEF_QWORD ){
283 return true;
284 }
285 return false;
286}
287bool Type::IsInt64() const{
288 if( basicType == DEF_INT64 ){
289 return true;
290 }
291 return false;
292}
293bool Type::IsSingle() const{
294 if( basicType == DEF_SINGLE ){
295 return true;
296 }
297 return false;
298}
299bool Type::IsDouble() const{
300 if( basicType == DEF_DOUBLE ){
301 return true;
302 }
303 return false;
304}
305bool Type::IsBoolean() const{
306 if( basicType == DEF_BOOLEAN ){
307 return true;
308 }
309 return false;
310}
311
312bool Type::IsPointer( int basicType )
313{
[350]314 if( basicType == DEF_NON )
315 {
316 return false;
317 }
318
[206]319 if(PTR_LEVEL( basicType )|| basicType == DEF_PTR_VOID || basicType == DEF_PTR_PROC
320 || ( basicType & FLAG_PTR ) ){
321 return true;
322 }
323
324 return false;
325}
326bool Type::IsPointer() const
327{
328 return IsPointer( basicType );
329}
330bool Type::IsSigned() const
331{
332 switch( basicType ){
333 case DEF_SBYTE:
334 case DEF_INTEGER:
335 case DEF_LONG:
336 case DEF_INT64:
337 case DEF_SINGLE:
338 case DEF_DOUBLE:
339 return true;
340 default:
341 break;
342 }
343 return false;
344}
345bool Type::IsNaturalWhole() const
346{
347 switch( basicType ){
348 case DEF_SBYTE:
349 case DEF_BYTE:
350 case DEF_INTEGER:
351 case DEF_WORD:
352 case DEF_LONG:
353 case DEF_DWORD:
354 case DEF_INT64:
355 case DEF_QWORD:
356 return true;
357 default:
358 break;
359 }
360 return false;
361}
362bool Type::IsWhole() const
363{
364 return (
365 IsNaturalWhole()
366 || IsPointer( basicType )
367 || basicType == DEF_BOOLEAN
368 );
369}
370bool Type::IsReal() const
371{
372 switch( basicType ){
373 case DEF_SINGLE:
374 case DEF_DOUBLE:
375 return true;
376 default:
377 break;
378 }
379 return false;
380}
381bool Type::Is64() const
382{
383 switch( basicType ){
384 case DEF_QWORD:
385 case DEF_INT64:
386 return true;
387 default:
388 break;
389 }
390 return false;
391}
392bool Type::IsProcPtr() const
393{
394 if( basicType == DEF_PTR_PROC ){
395 return true;
396 }
397 return false;
398}
399bool Type::IsStruct() const
400{
401 if( basicType == DEF_STRUCT ){
402 return true;
403 }
404 return false;
405}
406bool Type::IsStructPtr() const
407{
408 if( basicType == DEF_PTR_STRUCT ){
409 return true;
410 }
411 return false;
412}
413bool Type::IsObject() const
414{
[290]415 return (
416 basicType == DEF_OBJECT
[316]417 || basicType == DEF_TYPE_PARAMETER
[290]418 );
[206]419}
420bool Type::IsObjectPtr() const
421{
422 if( basicType == DEF_PTR_OBJECT ){
423 return true;
424 }
425 return false;
426}
[290]427bool Type::IsTypeParameter() const
428{
[292]429 return ( NATURAL_TYPE(basicType) == DEF_TYPE_PARAMETER );
[290]430}
[206]431bool Type::IsObjectClass() const
432{
433 if( basicType == DEF_OBJECT ){
434 if( pClass->GetName() == "Object" ){
435 return true;
436 }
437 }
438 return false;
439}
440bool Type::IsStringClass() const
441{
442 if( basicType == DEF_OBJECT ){
443 if( pClass->GetName() == "String" ){
444 return true;
445 }
446 }
447 return false;
448}
449bool Type::IsVoidPtr() const
450{
451 if( basicType == DEF_PTR_VOID ){
452 return true;
453 }
454 return false;
455}
456
457bool Type::IsAny() const
458{
459 if( basicType == DEF_ANY ){
460 return true;
461 }
462 return false;
463}
464
[332]465bool Type::IsDelegate() const
466{
467 return ( IsObject() && GetClass().IsDelegate() );
468}
[350]469bool Type::IsInterface() const
470{
471 return ( IsObject() && GetClass().IsInterface() );
472}
[370]473bool Type::IsComInterface() const
474{
475 return ( IsObject() && GetClass().IsComInterface() );
476}
[332]477
[350]478
[206]479bool Type::HasMember() const
480{
481 if( NATURAL_TYPE( basicType ) == DEF_OBJECT
[290]482 || NATURAL_TYPE( basicType ) == DEF_STRUCT
483 || NATURAL_TYPE( basicType ) == DEF_TYPE_PARAMETER
484 ){
485 return true;
[206]486 }
487 return false;
488}
489
[301]490const Type &Type::GetActualGenericType( int index ) const
[290]491{
[301]492 return actualGenericTypes[index].GetType();
[290]493}
494bool Type::HasActualGenericType() const
495{
496 return ( actualGenericTypes.size() > 0 );
497}
498
[378]499std::string Type::ToString() const
500{
501 const char *basicTypeName = BasicTypeToCharPtr( *this );
502 if( basicTypeName )
503 {
504 return basicTypeName;
505 }
506
507 if( IsTypeParameter() )
508 {
509 return GetFormalTypeName();
510 }
511
512 std::string typeName = GetClass().GetFullName();
513 if( HasActualGenericType() )
514 {
515 std::string actualGenericTypesName;
516 BOOST_FOREACH( const GenericType &actualGenericType, actualGenericTypes )
517 {
518 if( actualGenericTypesName.size() )
519 {
520 actualGenericTypesName += ",";
521 }
522 actualGenericTypesName += actualGenericType.GetName();
523 }
524
525 typeName += "<" + actualGenericTypesName + ">";
526 }
527 return typeName;
528}
529
[206]530int Type::GetBasicTypeFromSimpleName( const char *variable ){
531 extern char DefIntVari[26],DefSngVari[26],DefStrVari[26],divNum,dsvNum,dStrvNum;
532 int i;
533 char name[VN_SIZE];
534
535 //構造体メンバの場合を考慮
536 for(i=lstrlen(variable);i>0;i--){
537 if(variable[i]=='.'){
538 i++;
539 break;
540 }
541 }
542
543 for(;;i++){
544 if(variable[i]=='('||variable[i]=='\0'){
545 name[i]=0;
546 break;
547 }
548 name[i]=variable[i];
549 }
550 //変数名から選択
551 i--;
552 if(name[i]=='#') return DEF_DOUBLE;
553 if(name[i]=='!') return DEF_SINGLE;
554 if(name[i]=='%') return DEF_INTEGER;
555 return DEF_DOUBLE;
556}
557
558
[299]559void ResolveFormalGenericTypeParameter( Type &typeParameter, const Type &classType, const UserProc *pUserProc )
560{
[424]561 if( !typeParameter.IsTypeParameter() )
562 {
563 // ジェネリックな型ではなかったとき
564 return;
565 }
566
[299]567 /////////////////////////////////////////////////////////
568 // ☆★☆ ジェネリクスサポート ☆★☆
569
[424]570 // ポインタレベルを抽出
571 int ptrLevel = PTR_LEVEL( typeParameter.GetBasicType() );
572
573 if( pUserProc )
[299]574 {
[424]575 if( classType.IsObject() )
[299]576 {
[424]577 // 基底クラスでの自己解決
578 const CClass *pClass = &classType.GetClass();
579 while( pClass->HasSuperClass() )
[299]580 {
[424]581 if( pUserProc->GetParentClassPtr() == &pClass->GetSuperClass() )
[299]582 {
[424]583 if( pClass->GetSuperClassActualTypeParameters().size() )
[299]584 {
[424]585 // TODO: 適切な形に実装し直す(暫定的にトップの型を持ってきている)
586 typeParameter = pClass->GetSuperClassActualTypeParameters()[0];
[299]587 }
588 }
[424]589 pClass = &pClass->GetSuperClass();
[299]590 }
591 }
[424]592 }
[299]593
[424]594 if( typeParameter.IsTypeParameter() )
595 {
596 if( classType.HasActualGenericType() )
[299]597 {
[424]598 typeParameter = classType.GetActualGenericType( typeParameter.GetFormalTypeIndex() );
[299]599 }
[424]600 else
[299]601 {
[424]602 // 制約クラス(指定されていないときはObjectクラス)にセットする
603 typeParameter.SetBasicType( DEF_OBJECT );
[299]604 }
605 }
606
[424]607 for( int i=0; i<ptrLevel; i++ )
608 {
609 typeParameter.PtrLevelUp();
610 }
611
[299]612 //
613 /////////////////////////////////////////////////////////
614}
615
616
[206]617const string BlittableType::GetCreateStaticMethodFullName() const
618{
619 return pClass->GetNamespaceScopes().ToString() + "." + pClass->GetName() + "._Create";
620}
Note: See TracBrowser for help on using the repository browser.