source: dev/trunk/abdev/BasicCompiler_Common/Subroutine.cpp@ 193

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