source: dev/BasicCompiler_Common/Subroutine.cpp@ 97

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

関数の戻り値オブジェクトのメンバ・メソッドを一時オブジェクトを介さずに参照できるようにした。

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