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

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

ヘッダファイルを整理中

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