source: dev/BasicCompiler_Common/Subroutine.cpp@ 108

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

関数、クラスメソッドにImports機構を適用。

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