source: dev/BasicCompiler_Common/Overload.cpp@ 26

Last change on this file since 26 was 5, checked in by dai_9181, 18 years ago
File size: 2.6 KB
Line 
1#include "../BasicCompiler_Common/common.h"
2
3#ifdef _AMD64_
4#include "../BasicCompiler64/opcode.h"
5#else
6#include "../BasicCompiler32/opcode.h"
7#endif
8
9SUBINFO *OverloadSolutionWithStrParam(char *name,SUBINFO **ppsi,int num,char *Parameter,char *ObjectName,TYPEINFO *pReturnTypeInfo){
10 // オーバーロードの解決
11
12 //オーバーロードされていないとき
13 if(num==1) return ppsi[0];
14
15
16 ////////////////////////
17 // パラメータをセット
18 ////////////////////////
19
20 CParameter *pobj_parameter=0;
21
22 BOOL bStatic=0;
23 if(ObjectName[0]){
24 if(pobj_DBClass->check(ObjectName)) bStatic=1;
25 }
26
27 char temporary[VN_SIZE];
28 if((ObjectName[0]||ppsi[0]->pobj_ParentClass)&&bStatic==0){
29 //Thisポインタ(第一パラメータ)のダミーを作成
30 if(Parameter[0]) sprintf(temporary,"0%c%cVoidPtr,%s",1,ESC_AS,Parameter);
31 else sprintf(temporary,"0%c%cVoidPtr",1,ESC_AS);
32 }
33 else lstrcpy(temporary,Parameter);
34
35 //パラメータオブジェクトを生成
36 pobj_parameter=new CParameter(temporary);
37 if(pReturnTypeInfo) pobj_parameter->SetReturnType(pReturnTypeInfo);
38
39
40 SUBINFO *psi;
41 psi=pobj_parameter->OverloadSolution(name,ppsi,num);
42
43
44 //パラメータオブジェクトを破棄
45 delete pobj_parameter;
46 pobj_parameter=0;
47
48 return psi;
49}
50
51BOOL OverloadCheck(PARAMETER_INFO *ppi1,int ParmNum1,PARAMETER_INFO *ppi2,int ParmNum2){
52 //パラメータの個数が不一致の場合
53 if(ParmNum1!=ParmNum2) return 0;
54
55 int i;
56 for(i=0;i<ParmNum1;i++){
57 if(ppi1[i].type!=ppi2[i].type) return 0;
58 else{
59 if(NATURAL_TYPE(ppi1[i].type)==DEF_OBJECT){
60 if(ppi1[i].u.index!=ppi2[i].u.index) return 0;
61 }
62 }
63 }
64
65 return 1;
66}
67BOOL OverloadCheckLevel2(PARAMETER_INFO *ppi1,int ParmNum1,PARAMETER_INFO *ppi2,int ParmNum2){
68 //パラメータの個数が不一致の場合
69 if(ParmNum1!=ParmNum2) return 0;
70
71 int i;
72 for(i=0;i<ParmNum1;i++){
73 if(ppi1[i].type!=ppi2[i].type){
74 if(!(
75 IsNaturalWholeNumberType(ppi1[i].type)&&IsNaturalWholeNumberType(ppi2[i].type)||
76 IsRealNumberType(ppi1[i].type)&&IsRealNumberType(ppi2[i].type)
77 )) return 0;
78 }
79 else{
80 if(NATURAL_TYPE(ppi1[i].type)==DEF_OBJECT){
81 if(ppi1[i].u.index!=ppi2[i].u.index) return 0;
82 }
83 }
84 }
85
86 return 1;
87}
88SUBINFO *OverloadSolution(char *name,SUBINFO **ppsi,int num,PARAMETER_INFO *ppi,int ParmNum,TYPEINFO *pReturnTypeInfo){
89 // オーバーロードの解決
90
91 //オーバーロードされていないとき
92 if(num==1) return ppsi[0];
93
94
95 CParameter *pobj_Parameter=new CParameter(ppi,ParmNum);
96 if(pReturnTypeInfo) pobj_Parameter->SetReturnType(pReturnTypeInfo);
97
98 SUBINFO *psi;
99 psi=pobj_Parameter->OverloadSolution(name,ppsi,num);
100
101 delete pobj_Parameter;
102
103 return psi;
104}
Note: See TracBrowser for help on using the repository browser.