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

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