source: dev/BasicCompiler_Common/Subroutine.cpp@ 75

Last change on this file since 75 was 75, checked in by dai_9181, 17 years ago

TYPEINFO→Typeへのリファクタリングを実施。64bitはほぼ完了。32bitが全般的に未完成。

File size: 17.1 KB
RevLine 
[4]1#include "../BasicCompiler_Common/common.h"
2
3#ifdef _AMD64_
4#include "../BasicCompiler64/opcode.h"
5#else
[5]6#include "../BasicCompiler32/opcode.h"
[4]7#endif
8
9int GetCallProcName(char *buffer,char *name){
10 int i2,i3,IsStr=0;
11
12 for(i2=0;;i2++){
13 if(buffer[i2]=='\"') IsStr^=1;
14 if(IsDBCSLeadByte(buffer[i2])){
15 name[i2]=buffer[i2];
16 i2++;
17 name[i2]=buffer[i2];
18 continue;
19 }
20 if(buffer[i2]=='['&&IsStr==0){
21 i3=GetStringInBracket(name+i2,buffer+i2);
22 i2+=i3-1;
23 continue;
24 }
25 if(buffer[i2]=='('&&IsStr==0){
26 name[i2]=0;
27 break;
28 }
29 if(buffer[i2]=='='&&IsStr==0){
30 name[i2]=0;
31 break;
32 }
33
34 name[i2]=buffer[i2];
35 if(buffer[i2]=='\0') break;
36 }
37 return i2;
38}
39
40int GetProc(char *name,void **ppInfo){
41
42 //ユーザー定義関数
43 *ppInfo=(void *)GetSubHash(name);
44 if(*ppInfo) return PROC_DEFAULT;
45
46 //DLL関数
47 *ppInfo=(void *)GetDeclareHash(name);
48 if(*ppInfo) return PROC_DLL;
49
50 //コンパイラ埋め込み型
51 *ppInfo=(void *)(_int64)GetFunctionFromName(name);
52 if(*ppInfo) return PROC_BUILTIN;
53
54 //関数ポインタ
[75]55 Type type;
56 if( !GetVarType( name, type, false ) ){
57 return 0;
58 }
59 if( type.IsProcPtr() ){
60 return PROC_PTR;
61 }
[4]62
63 return 0;
64}
65
[46]66void SplitObjectName(const char *name,char *ObjectName,int *pRefType){
[4]67 int i4;
68 for(i4=lstrlen(name)-1;i4>=0;i4--){
69 if(name[i4]=='.'||(name[i4]==1&&name[i4+1]==ESC_PSMEM))
70 break;
71 }
72 if(i4==-1) ObjectName[0]=0;
73 else{
74 //参照タイプを判別
75 if(name[i4]=='.') *pRefType=DEF_OBJECT;
76 else *pRefType=DEF_PTR_OBJECT;
77
78 if(i4==0) GetWithName(ObjectName);
79 else{
80 memcpy(ObjectName,name,i4);
81 ObjectName[i4]=0;
82 }
83 }
84}
[28]85bool SplitMemberName( const char *desc, char *object, char *member ){
86 int i;
87 for(i=lstrlen(desc)-1;i>=0;i--){
88 if(desc[i]=='.'||(desc[i]==1&&desc[i+1]==ESC_PSMEM))
89 break;
90 }
91 if(i==-1) return false;
92 else{
93 if(desc[i]=='.')
94 lstrcpy(member,desc+i+1);
95 else
96 lstrcpy(member,desc+i+2);
97
98 if( object ){
99 lstrcpy( object, desc );
100 object[i]=0;
101 }
102 }
103
104 return true;
105}
[50]106
[75]107bool CallProc( int kind, const void *pProc, const char *fullCallName, const char *lpszParms, Type &resultType, bool isCallOn ){
[50]108
[75]109 //GetSubHash内でエラー提示が行われた場合
110 if(pProc==(Procedure *)-1){
111 return false;
112 }
[50]113
[75]114 if(kind==PROC_DEFAULT){
[50]115 /////////////////////
116 // ユーザー定義関数
117 /////////////////////
118
[75]119 UserProc *pUserProc = (UserProc *)pProc;
[50]120
121 //オブジェクト名を取得
122 char ObjectName[VN_SIZE];
123 int RefType;
[75]124 SplitObjectName(fullCallName,ObjectName,&RefType);
[50]125
126
127 ////////////////////////
128 // オーバーロードを解決
129 ////////////////////////
130
[75]131 std::vector<UserProc *> subs;
132 GetOverloadSubHash(fullCallName,subs);
[50]133 if(subs.size()){
134 //オーバーロードを解決
[75]135 pUserProc=OverloadSolutionWithStrParam(fullCallName,subs,lpszParms,ObjectName);
[50]136
[75]137 if(!pUserProc){
138 return false;
139 }
[50]140 }
141
[75]142 resultType = pUserProc->ReturnType();
[50]143
[75]144 if( isCallOn ){
145 if( !Opcode_CallProc(lpszParms,pUserProc,0,ObjectName,RefType) ){
146 return false;
147 }
[50]148 }
149 }
[75]150 else if(kind==PROC_DLL){
[50]151 /////////////////////////
152 // DLL関数
153 /////////////////////////
[75]154 DllProc *pDllProc = (DllProc *)pProc;
[50]155
[75]156 resultType = pDllProc->ReturnType();
157
158 if( isCallOn ){
159 if( !Opcode_CallDllProc(lpszParms,pDllProc) ){
160 return false;
161 }
162 }
[50]163 }
[75]164 else if(kind==PROC_BUILTIN){
[50]165 /////////////////////////
166 // 組み込み関数
167 /////////////////////////
[75]168 int FuncId = (int)(_int64)pProc;
[50]169
[75]170 if( !Opcode_CallFunc( lpszParms, FuncId, resultType, isCallOn ) ){
171 return false;
[50]172 }
173 }
[75]174 else if(kind==PROC_PTR){
[50]175 /////////////////
176 // 関数ポインタ
177 /////////////////
178
[75]179 Type type;
180 GetVarType(fullCallName,type,false);
[50]181
[75]182 extern ProcPointer **ppProcPointer;
183 ProcPointer *pProcPtr = ppProcPointer[type.GetIndex()];
184 resultType = pProcPtr->ReturnType();
185
186 if( isCallOn ){
187 if( !Opcode_CallProcPtr(fullCallName,lpszParms,pProcPtr) ){
188 return false;
189 }
190 }
[50]191 }
[75]192 else{
193 return false;
194 }
[50]195
[75]196 return true;
[50]197}
[75]198bool CallPropertyMethod( const char *variable, const char *rightSide, Type &resultType){
[50]199 //プロパティ用のメソッドを呼び出す
200
201 //配列要素を取得
202 char VarName[VN_SIZE],ArrayElements[VN_SIZE];
203 GetArrayElement(variable,VarName,ArrayElements);
204
205 //オブジェクト名を取得
206 char ObjectName[VN_SIZE];
207 int RefType;
208 SplitObjectName(VarName,ObjectName,&RefType);
209
210 //オーバーロード用の関数リストを作成
[75]211 std::vector<UserProc *> subs;
[50]212 GetOverloadSubHash(VarName,subs);
213 if(subs.size()==0){
[75]214 return false;
[50]215 }
216
217 //パラメータを整備
218 char *Parameter;
[75]219 Parameter=(char *)HeapAlloc(hHeap,0,lstrlen(ArrayElements)+lstrlen(rightSide)+32);
[50]220 lstrcpy(Parameter,ArrayElements);
[75]221 if(rightSide){
222 if(Parameter[0]&&rightSide[0]) lstrcat(Parameter,",");
223 lstrcat(Parameter,rightSide);
[50]224 }
225
226 //オーバーロードを解決
[75]227 UserProc *pUserProc;
228 pUserProc=OverloadSolutionWithStrParam(VarName,subs,Parameter,ObjectName);
[50]229
[75]230 if(pUserProc){
[50]231 //呼び出し
[75]232 Opcode_CallProc(Parameter,pUserProc,0,ObjectName,RefType);
[50]233
[75]234 resultType = pUserProc->ReturnType();
[50]235 }
236
237 HeapDefaultFree(Parameter);
238
[75]239 return true;
[50]240}
241
[75]242bool GetReturnTypeOfPropertyMethod( const char *variable, const char *rightSide, Type &resultType ){
[4]243 //プロパティ用のメソッドを呼び出す
244
245 //配列要素を取得
246 char VarName[VN_SIZE],ArrayElements[VN_SIZE];
247 GetArrayElement(variable,VarName,ArrayElements);
248
249 //オブジェクト名を取得
250 char ObjectName[VN_SIZE];
251 int RefType;
[28]252 SplitObjectName(VarName,ObjectName,&RefType);
[4]253
254 //オーバーロード用の関数リストを作成
[75]255 std::vector<UserProc *> subs;
[50]256 GetOverloadSubHash(VarName,subs);
257 if(subs.size()==0){
[4]258 return 0;
259 }
260
261 //パラメータを整備
262 char *Parameter;
[75]263 Parameter=(char *)HeapAlloc(hHeap,0,lstrlen(ArrayElements)+lstrlen(rightSide)+32);
[4]264 lstrcpy(Parameter,ArrayElements);
[75]265 if(rightSide){
266 if(Parameter[0]&&rightSide[0]) lstrcat(Parameter,",");
267 lstrcat(Parameter,rightSide);
[4]268 }
269
270 //オーバーロードを解決
[75]271 UserProc *pUserProc;
272 pUserProc=OverloadSolutionWithStrParam(VarName,subs,Parameter,ObjectName);
[4]273
[75]274 if(pUserProc){
275 resultType = pUserProc->ReturnType();
[4]276 }
277
278 return 1;
279}
280
[38]281//インデクサ(getter)の戻り値を取得
[75]282bool GetReturnTypeOfIndexerGetterProc( const CClass &objClass, Type &resultType ){
283 std::vector<UserProc *> subs;
284 objClass.EnumMethod( CALC_ARRAY_GET, subs );
[50]285 if( subs.size() == 0 ){
[38]286 return false;
287 }
288
[75]289 resultType = subs[0]->ReturnType();
[38]290
291 return true;
292}
293
294
[75]295void AddDeclareData(char *buffer,int nowLine){
[4]296 extern HANDLE hHeap;
[75]297 int i2;
[4]298
[75]299 int i=0;
[4]300
[75]301 //Sub/Function
302 Procedure::Kind kind = Procedure::Sub;
303 if(buffer[i]==ESC_SUB){
[4]304 }
[75]305 else if(buffer[i]==ESC_FUNCTION){
306 kind = Procedure::Function;
307 }
[4]308 else{
[75]309 SetError(1,NULL,nowLine);
[4]310 return;
311 }
312 i++;
313
314 //プロシージャ名
[75]315 char procName[VN_SIZE];
316 bool isCdecl = false;
[4]317 for(i2=0;;i++,i2++){
318 if(buffer[i]==1&&buffer[i+1]==ESC_CDECL){
[75]319 isCdecl = true;
[4]320
321 i+=2;
[75]322 procName[i2]=0;
[4]323 break;
324 }
325 if(buffer[i]==','){
[75]326 procName[i2]=0;
[4]327 break;
328 }
329 if(buffer[i]=='\0'){
[75]330 SetError(1,NULL,nowLine);
[4]331 return;
332 }
[75]333 procName[i2]=buffer[i];
[4]334 }
[75]335 i++;
[4]336
337 //ユーザー定義関数との重複チェック
[75]338 if(GetSubHash(procName)){
339 SetError(15,procName,nowLine);
[4]340 return;
341 }
342
343
344 //ライブラリ
[75]345 char dllFileName[MAX_PATH];
346 i = GetOneParameter( buffer, i, dllFileName );
347 Type resultType;
[54]348 _int64 i64data;
[75]349 if( !StaticCalculation( true, dllFileName, 0, &i64data, resultType ) ){
[4]350 return;
351 }
[75]352 if( resultType.GetBasicType() != typeOfPtrChar ){
353 SetError(1,NULL,nowLine);
354 return;
355 }
356 lstrcpy( dllFileName, (char *)i64data );
357 CharUpper(dllFileName);
358 if(!strstr(dllFileName,".")){
359 lstrcat(dllFileName,".DLL");
360 if(lstrlen(dllFileName)>=16){
361 SetError(7,NULL,nowLine);
362 return;
[4]363 }
364 }
365
[54]366 //エイリアス
[75]367 char alias[VN_SIZE];
368 i = GetOneParameter( buffer, i, alias );
369 if( alias[0] ){
370 if( !StaticCalculation( true, alias, 0, &i64data, resultType ) ){
[4]371 return;
372 }
[75]373 if( resultType.GetBasicType() != typeOfPtrChar ){
374 SetError(1,NULL,nowLine);
375 return;
376 }
377 lstrcpy( alias, (char *)i64data );
[4]378 }
379 else{
[54]380 //省略されたときは関数名
[75]381 lstrcpy( alias, procName );
[4]382 }
383
384
[75]385 // オブジェクトを生成
386 DllProc *pDllProc = new DllProc( procName, kind, isCdecl, dllFileName, alias );
[4]387
[75]388 // パラメータを解析
389 // ※第1パラメータにに指定するデータの例:"( s As String ) As String"
390 pDllProc->SetParamsAndReturnType( buffer + i, nowLine );
[4]391
[75]392 // パラメータのエラーチェック
393 foreach( const Parameter *pParam, pDllProc->Params() ){
394 if( pParam->IsObject() ){
395 SetError(25,pParam->GetVarName(),nowLine);
[4]396 }
[75]397 if( !pParam->IsRef() ){
398 if( pParam->IsStruct() ){
399 SetError(28,pParam->GetVarName(),nowLine);
400 }
[4]401 }
[75]402 }
[4]403
[75]404 //戻り値のエラーチェック
405 if( pDllProc->IsFunction() ){
406 // Function定義
[4]407
[75]408 if( pDllProc->ReturnType().IsObject() ){
409 // DLL関数ではオブジェクトを戻り値にできない
410 SetError(40,pDllProc->GetName(),nowLine);
[4]411 }
[75]412 }
[4]413
414
[75]415 /////////////////////////////////
416 // 格納位置を計算してppDeclareHashにセット
417 /////////////////////////////////
[4]418
[75]419 //ハッシュ値を取得
420 int key;
421 key=hash_default(procName);
[4]422
[75]423 extern DllProc **ppDeclareHash;
424 if(ppDeclareHash[key]){
425 DllProc *pTempProc;
426 pTempProc=ppDeclareHash[key];
427 while(1){
428 if( pDllProc->GetName() == pTempProc->GetName() ){
429 //重複エラー
430 SetError(15,procName,nowLine);
431 return;
432 }
[4]433
[75]434 if(pTempProc->pNextData==0){
435 pTempProc->pNextData=pDllProc;
436 break;
437 }
438 pTempProc=pTempProc->pNextData;
[4]439 }
[75]440 pTempProc=pTempProc->pNextData;
[4]441 }
[75]442 else{
443 ppDeclareHash[key]=pDllProc;
[4]444 }
445}
446
[75]447UserProc *AddSubData(char *buffer,int nowLine,BOOL bVirtual,CClass *pobj_c, bool isStatic){
448 int i2,i3;
449 char temporary[8192];
[4]450
[75]451 int i=1;
[4]452
[75]453 UserProc::Kind kind = Procedure::Sub;
454 bool isMacro = false;
455 if(buffer[i]==ESC_FUNCTION) kind = Procedure::Function;
456 if(buffer[i]==ESC_MACRO){
457 isMacro = true;
[4]458 }
459
460 i++;
461
[75]462 bool isCdecl = false;
463 bool isExport = false;
[4]464 while(1){
[75]465 if(buffer[i]==1&&buffer[i+1]==ESC_CDECL&& isCdecl == false ){
466 isCdecl = true;
[4]467
468 i+=2;
469 }
[75]470 else if(buffer[i]==1&&buffer[i+1]==ESC_EXPORT&& isExport == false ){
471 isExport = true;
[4]472
473 i+=2;
474 }
475 else break;
476 }
477
478 i2=0;
479 if(buffer[i]==1&&buffer[i+1]==ESC_OPERATOR){
480 if(!pobj_c){
[75]481 SetError(126,NULL,nowLine);
[4]482 return 0;
483 }
484
485 //オペレータの場合
486 temporary[i2++]=buffer[i++];
487 temporary[i2++]=buffer[i++];
488
489 int iCalcId;
490 if(buffer[i]=='='&&buffer[i+1]=='='){
491 iCalcId=CALC_EQUAL;
492 i3=2;
493 }
494 else if(buffer[i]=='='){
495 iCalcId=CALC_SUBSITUATION;
496 i3=1;
497 }
498 else if(buffer[i]=='('){
499 iCalcId=CALC_AS;
500 i3=0;
501 }
502 else if(buffer[i]=='['&&buffer[i+1]==']'&&buffer[i+2]=='='){
503 iCalcId=CALC_ARRAY_SET;
504 i3=3;
505 }
506 else if(buffer[i]=='['&&buffer[i+1]==']'){
507 iCalcId=CALC_ARRAY_GET;
508 i3=2;
509 }
510 else{
511 iCalcId=GetCalcId(buffer+i,&i3);
512 i3++;
513 }
514 if(!iCalcId){
[75]515 SetError(1,NULL,nowLine);
[4]516 return 0;
517 }
518 temporary[i2++]=iCalcId;
519 temporary[i2]=0;
520
521 i+=i3;
522 }
523 else{
524 if(pobj_c){
525 //クラスメンバの場合、デストラクタには~が付くことを考慮
526 if(buffer[i]=='~'){
527 temporary[i2]='~';
528 i++;
529 i2++;
530 }
531 }
532
533 for(;;i++,i2++){
534 if(!IsVariableChar(buffer[i])){
535 temporary[i2]=0;
536 break;
537 }
538 temporary[i2]=buffer[i];
539 }
540 }
541
[75]542 if( isMacro ){
[4]543 //大文字に変換
544 CharUpper(temporary);
545
546 //マクロ関数の場合は名前リストに追加
547 extern char **ppMacroNames;
548 extern int MacroNum;
549 ppMacroNames=(char **)HeapReAlloc(hHeap,0,ppMacroNames,(MacroNum+1)*sizeof(char *));
550 ppMacroNames[MacroNum]=(char *)HeapAlloc(hHeap,0,lstrlen(temporary)+1);
551 lstrcpy(ppMacroNames[MacroNum],temporary);
552 MacroNum++;
553 }
554
[30]555 if(!pobj_c){
[4]556 //クラスメンバ以外の場合のみ
557 //重複チェック
558
559 if(GetDeclareHash(temporary)){
[75]560 SetError(15,temporary,nowLine);
[4]561 return 0;
562 }
563 }
564
565 extern int SubNum;
566 SubNum++;
567
568
[75]569 UserProc *pUserProc = new UserProc( temporary, kind, isMacro, isCdecl, isExport );
570 pUserProc->SetParentClass( pobj_c );
[4]571
572 //ID
[5]573 static int id_base=0;
[75]574 pUserProc->id = (id_base++);
[4]575
[75]576 if(isExport){
577 pUserProc->Using();
[4]578 }
579
[75]580 // パラメータを解析
581 // ※第1パラメータにに指定するデータの例:"( s As String ) As String"
582 pUserProc->SetParamsAndReturnType( buffer + i, nowLine, isStatic );
[4]583
584
585 /////////////////////////////////
586 // ハッシュデータに追加
587 /////////////////////////////////
588
589 int key;
[75]590 key=hash_default(pUserProc->GetName().c_str());
[4]591
[75]592 extern UserProc **ppSubHash;
[4]593 if(ppSubHash[key]){
[75]594 UserProc *psi2;
[4]595 psi2=ppSubHash[key];
596 while(1){
[75]597 if(pobj_c==psi2->GetParentClassPtr()){
[4]598 //重複エラーチェックを行う
[75]599 if( pUserProc->GetName() == psi2->GetName() ){
600 if( Parameter::Equals( psi2->Params(), pUserProc->Params() ) ){
601 SetError(15,pUserProc->GetName().c_str(),nowLine);
[4]602 return 0;
603 }
604 }
605 }
606
607 if(psi2->pNextData==0) break;
608 psi2=psi2->pNextData;
609 }
[75]610 psi2->pNextData=pUserProc;
[4]611 }
612 else{
[75]613 ppSubHash[key]=pUserProc;
[4]614 }
615
[75]616 return pUserProc;
[4]617}
618
619void GetSubInfo(void){ //サブルーチン情報を取得
620 extern HANDLE hHeap;
621 extern char *basbuf;
622 int i,i2,i3;
623 char temporary[8192];
624
625 //Declare(DLL関数)情報を初期化
[75]626 extern DllProc **ppDeclareHash;
627 ppDeclareHash=(DllProc **)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,MAX_HASH*sizeof(DllProc *));
[4]628
629 //サブルーチン(ユーザー定義)情報を初期化
[75]630 extern UserProc **ppSubHash;
[4]631 extern int SubNum;
[75]632 ppSubHash=(UserProc **)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,MAX_HASH*sizeof(UserProc *));
[4]633 SubNum=0;
634
635 //マクロ関数の名前リストを初期化
636 extern char **ppMacroNames;
637 extern int MacroNum;
638 ppMacroNames=(char **)HeapAlloc(hHeap,0,1);
639 MacroNum=0;
640
641 i=-1;
642 while(1){
643 i++;
644
645 if(basbuf[i]==1&&(basbuf[i+1]==ESC_CLASS||basbuf[i+1]==ESC_INTERFACE)){
646 /* Class ~ End Class
647 Interface ~ End Interface
648 を飛び越す */
649 i3=GetEndXXXCommand(basbuf[i+1]);
650 for(i+=2,i2=0;;i++,i2++){
651 if(basbuf[i]=='\0') break;
652 if(basbuf[i]==1&&basbuf[i+1]==(char)i3){
653 i++;
654 break;
655 }
656 }
657 if(basbuf[i]=='\0') break;
658 continue;
659 }
660
661 if(basbuf[i]==1&&basbuf[i+1]==ESC_DECLARE){
662 for(i+=2,i2=0;;i2++,i++){
663 if(basbuf[i]=='\n'){
664 temporary[i2]=0;
665 break;
666 }
667 temporary[i2]=basbuf[i];
668 if(basbuf[i]=='\0') break;
669 }
670 AddDeclareData(temporary,i);
671
672 continue;
673 }
674 if(basbuf[i]==1&&(basbuf[i+1]==ESC_SUB||basbuf[i+1]==ESC_FUNCTION||basbuf[i+1]==ESC_MACRO)){
675 for(i2=0;;i2++,i++){
676 if(IsCommandDelimitation(basbuf[i])){
677 temporary[i2]=0;
678 break;
679 }
680 temporary[i2]=basbuf[i];
681 if(basbuf[i]=='\0') break;
682 }
683 AddSubData(temporary,i,0,0);
684
685 continue;
686 }
687
688 //次の行
689 for(;;i++){
690 if(IsCommandDelimitation(basbuf[i])) break;
691 }
692 if(basbuf[i]=='\0') break;
693 }
694
695 ////////////
696 // 特殊関数
697 ////////////
698
699 sprintf(temporary,"%c%c_allrem()",1,ESC_SUB);
700 AddSubData(temporary,0,0,0);
701
702 sprintf(temporary,"%c%c_aullrem()",1,ESC_SUB);
703 AddSubData(temporary,0,0,0);
704
705 sprintf(temporary,"%c%c_allmul()",1,ESC_SUB);
706 AddSubData(temporary,0,0,0);
707
708 sprintf(temporary,"%c%c_alldiv()",1,ESC_SUB);
709 AddSubData(temporary,0,0,0);
710
711 sprintf(temporary,"%c%c_aulldiv()",1,ESC_SUB);
712 AddSubData(temporary,0,0,0);
713
714 sprintf(temporary,"%c%c_allshl()",1,ESC_SUB);
715 AddSubData(temporary,0,0,0);
716
717 sprintf(temporary,"%c%c_allshr()",1,ESC_SUB);
718 AddSubData(temporary,0,0,0);
719
720 sprintf(temporary,"%c%c_aullshr()",1,ESC_SUB);
721 AddSubData(temporary,0,0,0);
722
723 sprintf(temporary,"%c%c_System_InitStaticLocalVariables()",1,ESC_SUB);
724 AddSubData(temporary,0,0,0);
725}
[75]726void Delete_si(UserProc *pUserProc){
727 if(pUserProc->pNextData) Delete_si(pUserProc->pNextData);
728 delete pUserProc;
[4]729}
[75]730void DeleteSubInfo(UserProc **ppSubHash,char **ppMacroNames,int MacroNum){ //サブルーチン情報のメモリ解放
[4]731 int i;
732 for(i=0;i<MAX_HASH;i++){
733 if(!ppSubHash[i]) continue;
734
735 Delete_si(ppSubHash[i]);
736 }
737 HeapDefaultFree(ppSubHash);
738
739 //マクロの名前リスト
740 if(ppMacroNames){
741 for(i=0;i<MacroNum;i++){
742 HeapDefaultFree(ppMacroNames[i]);
743 }
744 HeapDefaultFree(ppMacroNames);
745 }
746}
[75]747void Delete_di(DllProc *pDllProc){
748 if(pDllProc->pNextData) Delete_di(pDllProc->pNextData);
[4]749
[75]750 delete pDllProc;
[4]751}
752void DeleteDeclareInfo(void){
753 //DLL情報を解放
[75]754 extern DllProc **ppDeclareHash;
[4]755 int i;
756 for(i=0;i<MAX_HASH;i++){
757 if(!ppDeclareHash[i]) continue;
758
759 Delete_di(ppDeclareHash[i]);
760 }
761 HeapDefaultFree(ppDeclareHash);
762}
763
764
765
766///////////////////////
767// 関数ポインタの管理
768///////////////////////
769
[75]770int AddProcPtrInfo( char *buffer, DWORD dwProcType, int nowLine ){
[4]771
[75]772 Procedure::Kind kind = Procedure::Sub;
773 if( dwProcType == ESC_FUNCTION ){
774 kind = Procedure::Function;
775 }
[4]776
[75]777 ProcPointer *pProcPointer = new ProcPointer( kind );
[4]778
779 //buffer[0]は'('となっている
[75]780 pProcPointer->SetParamsAndReturnType( buffer, nowLine );
[4]781
[75]782 extern ProcPointer **ppProcPointer;
783 extern int ProcPtrInfoNum;
784 ppProcPointer=(ProcPointer **)HeapReAlloc(hHeap,0,ppProcPointer,(ProcPtrInfoNum+1)*sizeof(ProcPointer *));
785 ppProcPointer[ProcPtrInfoNum] = pProcPointer;
786 ProcPtrInfoNum++;
[4]787
788 return ProcPtrInfoNum-1;
789}
790void DeleteProcPtrInfo(void){
[75]791 extern ProcPointer **ppProcPointer;
[4]792 extern int ProcPtrInfoNum;
793
[75]794 for(int i=0;i<ProcPtrInfoNum;i++){
795 delete ppProcPointer[i];
[4]796 }
797
[75]798 HeapDefaultFree(ppProcPointer);
[4]799}
Note: See TracBrowser for help on using the repository browser.