source: dev/trunk/abdev/BasicCompiler_Common/src/ProcedureImpl.cpp@ 196

Last change on this file since 196 was 195, checked in by dai_9181, 17 years ago
File size: 18.0 KB
Line 
1#include <jenga/include/smoothie/SmoothieException.h>
2#include <jenga/include/smoothie/LexicalAnalysis.h>
3
4#include <Compiler.h>
5#include <ProcedureImpl.h>
6#include <NamespaceSupporter.h>
7
8#include "../common.h"
9#ifdef _AMD64_
10#include "../../BasicCompiler64/opcode.h"
11#else
12#include "../../BasicCompiler32/opcode.h"
13#endif
14
15bool UserProcImpl::SetParamsAndReturnType( const char *sourceOfParams, int nowLine, bool isStatic ){
16 int i = 0;
17 int i2,i3,sw;
18 char temporary[8192],temp2[VN_SIZE];
19
20 //ソースコードの位置
21 this->codePos = nowLine;
22
23 //パラメータ
24 if(sourceOfParams[i]!='('){
25 SmoothieException::Throw(1,NULL,nowLine);
26 return 0;
27 }
28 i++;
29 if(sourceOfParams[i]!=')'&& this->pParentClass ){
30 //クラスのメンバ関数の場合のみ、デストラクタにパラメータがある場合にエラーをだす
31 if(this->GetName()[0]=='~'){
32 SmoothieException::Throw(114,NULL,nowLine);
33 i=JumpStringInPare(sourceOfParams,i);
34 }
35 }
36 while(1){
37 if(sourceOfParams[i]==')') break;
38
39 //ByRef
40 bool isRef;
41 if(sourceOfParams[i]==1&&sourceOfParams[i+1]==ESC_BYVAL){
42 isRef = false;
43 i+=2;
44 }
45 else if(sourceOfParams[i]==1&&sourceOfParams[i+1]==ESC_BYREF){
46 isRef = true;
47 i+=2;
48 }
49 else isRef = false;
50
51 //パラメータ名
52 bool isArray = false;
53 int subScripts[MAX_ARRAYDIM];
54 char name[VN_SIZE];
55 sw=0;
56 for(i2=0;;i++,i2++){
57 if(sourceOfParams[i]=='('){
58 if(!sw) sw=1;
59
60 i3=GetStringInPare(name+i2,sourceOfParams+i);
61 i2+=i3-1;
62 i+=i3-1;
63 continue;
64 }
65 if(sourceOfParams[i]=='['){
66 if(!sw) sw=1;
67
68 i3=GetStringInBracket(name+i2,sourceOfParams+i);
69 i2+=i3-1;
70 i+=i3-1;
71 continue;
72 }
73 if(!IsVariableChar(sourceOfParams[i])){
74 name[i2]=0;
75 break;
76 }
77 name[i2]=sourceOfParams[i];
78 }
79 if(sw){
80 //配列パラメータ
81 if( isRef == false ) SmoothieException::Throw(29,NULL,nowLine);
82 isArray = true;
83
84 if((name[i2-2]=='('&&name[i2-1]==')')||
85 (name[i2-2]=='['&&name[i2-1]==']')){
86 subScripts[0]=LONG_MAX;
87 subScripts[1]=-1;
88
89 name[i2-2]=0;
90 }
91 else{
92 GetArrange(name,temp2,subScripts);
93 lstrcpy(name,temp2);
94 }
95
96 i2=lstrlen(name);
97 }
98
99 Type type( DEF_NON );
100 char initValue[8192] = "";
101 if( sourceOfParams[i] == '=' ){
102 i++;
103 i = GetOneParameter( sourceOfParams, i, initValue );
104
105 // TODO: エラー用 fix me!!!
106 //cp = nowLine;
107
108 NumOpe_GetType( initValue, GetStringTypeInfo(), type );
109 }
110 else if(sourceOfParams[i]==1&&sourceOfParams[i+1]==ESC_AS){
111 // As指定
112 i+=2;
113
114 i2=0;
115 while(sourceOfParams[i]=='*'){
116 temporary[i2]=sourceOfParams[i];
117 i++;
118 i2++;
119 }
120 for(;;i++,i2++){
121 if(!IsVariableChar(sourceOfParams[i])){
122 if(sourceOfParams[i]==1&&(sourceOfParams[i+1]==ESC_FUNCTION||sourceOfParams[i+1]==ESC_SUB)){
123 temporary[i2++]=sourceOfParams[i++];
124 temporary[i2]=sourceOfParams[i];
125 continue;
126 }
127 temporary[i2]=0;
128 break;
129 }
130 temporary[i2]=sourceOfParams[i];
131 }
132
133 Compiler::StringToType( temporary, type );
134
135 if( type.IsNull() ){
136 SmoothieException::Throw(3,temporary,nowLine);
137 type.SetBasicType( DEF_PTR_VOID );
138 }
139
140 if( type.IsObject() ){
141 if( type.GetClass().IsBlittableType() ){
142 // Blittable型のときは基本型として扱う
143 type = type.GetClass().GetBlittableType();
144 }
145 }
146 }
147 else{
148 type.SetBasicType( Type::GetBasicTypeFromSimpleName(temporary) );
149 SmoothieException::Throw(-103,temporary,nowLine);
150 }
151
152 Parameter *pParam = new Parameter( name, type, isRef, initValue );
153 if( isArray ){
154 pParam->SetArray( subScripts );
155 }
156
157 //パラメータを追加
158 this->params.push_back( pParam );
159
160 if(sourceOfParams[i]==','){
161 i++;
162 continue;
163 }
164 else if(sourceOfParams[i]==')') continue;
165 else{
166 SmoothieException::Throw(1,NULL,nowLine);
167 break;
168 }
169 }
170 this->secondParmNum = (int)this->params.size();
171 i++;
172 if(sourceOfParams[i]=='('){
173 i++;
174 while(1){
175 if(sourceOfParams[i]==')') break;
176
177 //ByRef
178 bool isRef;
179 if(sourceOfParams[i]==1&&sourceOfParams[i+1]==ESC_BYVAL){
180 isRef = false;
181 i+=2;
182 }
183 else if(sourceOfParams[i]==1&&sourceOfParams[i+1]==ESC_BYREF){
184 isRef = true;
185 i+=2;
186 }
187 else isRef = false;
188
189 //パラメータ名
190 bool isArray = false;
191 int subScripts[MAX_ARRAYDIM];
192 char name[VN_SIZE];
193 sw=0;
194 for(i2=0;;i++,i2++){
195 if(sourceOfParams[i]=='('){
196 if(!sw) sw=1;
197
198 i3=GetStringInPare(name+i2,sourceOfParams+i);
199 i2+=i3-1;
200 i+=i3-1;
201 continue;
202 }
203 if(sourceOfParams[i]=='['){
204 if(!sw) sw=1;
205
206 i3=GetStringInBracket(name+i2,sourceOfParams+i);
207 i2+=i3-1;
208 i+=i3-1;
209 continue;
210 }
211 if(!IsVariableChar(sourceOfParams[i])){
212 name[i2]=0;
213 break;
214 }
215 name[i2]=sourceOfParams[i];
216 }
217 if(sw){
218 //配列パラメータ
219 if( isRef == false ) SmoothieException::Throw(29,NULL,nowLine);
220 isArray = true;
221
222 if((name[i2-2]=='('&&name[i2-1]==')')||
223 (name[i2-2]=='['&&name[i2-1]==']')){
224 subScripts[0]=LONG_MAX;
225 subScripts[1]=-1;
226
227 name[i2-2]=0;
228 }
229 else{
230 GetArrange(name,temp2,subScripts);
231 lstrcpy(name,temp2);
232 }
233
234 i2=lstrlen(name);
235 }
236
237 //型
238 Type type( DEF_NON );
239 if(sourceOfParams[i]==1&&sourceOfParams[i+1]==ESC_AS){
240 i+=2;
241
242 i2=0;
243 while(sourceOfParams[i]=='*'){
244 temporary[i2]=sourceOfParams[i];
245 i++;
246 i2++;
247 }
248 for(;;i++,i2++){
249 if(!IsVariableChar(sourceOfParams[i])){
250 if(sourceOfParams[i]==1&&(sourceOfParams[i+1]==ESC_FUNCTION||sourceOfParams[i+1]==ESC_SUB)){
251 temporary[i2++]=sourceOfParams[i++];
252 temporary[i2]=sourceOfParams[i];
253 continue;
254 }
255 temporary[i2]=0;
256 break;
257 }
258 temporary[i2]=sourceOfParams[i];
259 }
260
261 Compiler::StringToType( temporary, type );
262
263 if( type.IsNull() ){
264 SmoothieException::Throw(3,temporary,nowLine);
265 type.SetBasicType( DEF_PTR_VOID );
266 }
267 }
268 else{
269 type.SetBasicType( Type::GetBasicTypeFromSimpleName(temporary) );
270 SmoothieException::Throw(-103,temporary,nowLine);
271 }
272
273 Parameter *pParam = new Parameter( name, type, isRef );
274 if( isArray ){
275 pParam->SetArray( subScripts );
276 }
277
278 //パラメータを追加
279 this->params.push_back( pParam );
280
281 if(sourceOfParams[i]==','){
282 i++;
283 continue;
284 }
285 else if(sourceOfParams[i]==')') continue;
286 else{
287 SmoothieException::Throw(1,NULL,nowLine);
288 break;
289 }
290 }
291 i++;
292 }
293
294 if(sourceOfParams[i]){
295 ///////////////////
296 // 戻り値を取得
297 ///////////////////
298
299 if( !this->IsFunction() ){
300 // Sub/Macroの場合
301 SmoothieException::Throw(38,this->GetName(),nowLine);
302 }
303
304 if( this->pParentClass ){
305 if( this->GetName() == this->pParentClass->GetName() ||
306 this->GetName()[0]=='~'){
307 //クラスのコンストラクタ、デストラクタがFunction定義の場合はエラーをだす
308 SmoothieException::Throw(115,NULL,nowLine);
309 }
310 }
311
312
313 i2=lstrlen(sourceOfParams)-2;
314
315 int sw_as=0;
316 for(;i2>0;i2--){
317 if(sourceOfParams[i2]==')') break;
318
319 if(sourceOfParams[i2]==1&&sourceOfParams[i2+1]==ESC_AS){
320 i2+=2;
321 i3=0;
322 while(sourceOfParams[i2]=='*') temporary[i3++]=sourceOfParams[i2++];
323 for(;;i2++,i3++){
324 if(!IsVariableChar(sourceOfParams[i2])){
325 temporary[i3]=0;
326 break;
327 }
328 temporary[i3]=sourceOfParams[i2];
329 }
330 Compiler::StringToType( temporary, this->returnType );
331 if( this->returnType.IsNull() ) SmoothieException::Throw(3,temporary,nowLine);
332
333 sw_as=1;
334 break;
335 }
336 }
337
338 if(!sw_as){
339 SmoothieException::Throw(-104,this->GetName().c_str(),nowLine);
340
341 this->returnType.SetBasicType( DEF_DOUBLE );
342 }
343 }
344 else{
345 //戻り値なしのSub定義
346 this->returnType.SetNull();
347 }
348
349 //リアルパラメータ領域を取得(_System_LocalThisを考慮して2つだけ多く確保する場合がある)
350
351 if( this->pParentClass && isStatic == false ){
352 //オブジェクトメンバの場合は、第一パラメータを_System_LocalThis引き渡し用として利用
353 string name = "_System_LocalThis";
354 Type type( DEF_PTR_VOID );
355 this->realParams.push_back( new Parameter( name, type ) );
356 }
357
358 if( this->returnType.IsStruct() ){
359 //構造体を戻り値として持つ場合
360 //※第一パラメータ(Thisポインタありの場合は第二パラメータ)を戻り値用の参照宣言にする
361
362 string name = this->GetName();
363 if(name[0]==1&&name[1]==ESC_OPERATOR){
364 name="_System_ReturnValue";
365 }
366 Type type( DEF_STRUCT, this->returnType.GetIndex() );
367 this->realParams.push_back( new Parameter( name, type, true ) );
368 }
369
370 //パラメータをコピー
371 BOOST_FOREACH( Parameter *pParam, params ){
372 this->realParams.push_back( new Parameter( *pParam ) );
373 }
374
375 return true;
376}
377
378const NamespaceScopes &GlobalProc::GetNamespaceScopes() const
379{
380 if( HasParentClass() ){
381 return GetParentClassPtr()->GetNamespaceScopes();
382 }
383 return namespaceScopes;
384}
385bool GlobalProc::IsEqualSymbol( const NamespaceScopes &namespaceScopes, const string &name ) const
386{
387 if( GetName() != name ){
388 return false;
389 }
390
391 return namespaceSupporter.IsSameAreaNamespace( GetNamespaceScopes(), namespaceScopes );
392}
393bool GlobalProc::IsEqualSymbol( const GlobalProc &globalProc ) const
394{
395 return IsEqualSymbol( globalProc.GetNamespaceScopes(), globalProc.GetName() );
396}
397bool GlobalProc::IsEqualSymbol( const string &fullName ) const
398{
399 char AreaName[VN_SIZE] = ""; //オブジェクト変数
400 char NestName[VN_SIZE] = ""; //入れ子メンバ
401 bool isNest = CClass::SplitName( fullName.c_str(), AreaName, NestName );
402
403 return IsEqualSymbol( NamespaceScopes( AreaName ), NestName );
404}
405
406bool DllProcImpl::IsEqualSymbol( const NamespaceScopes &namespaceScopes, const string &name ) const
407{
408 if( GetName() != name ){
409 return false;
410 }
411 return namespaceSupporter.IsSameAreaNamespace( this->GetNamespaceScopes(), namespaceScopes );
412}
413bool DllProcImpl::SetParamsAndReturnType( const char *sourceOfParams, int nowLine ){
414 int i = 0;
415 int i2,i3,sw;
416 char temporary[8192],temp2[VN_SIZE];
417
418 //ソースコードの位置
419 this->codePos = nowLine;
420
421 //パラメータ
422 if(sourceOfParams[i]!='('){
423 SmoothieException::Throw(1,NULL,nowLine);
424 return 0;
425 }
426 i++;
427
428 while(1){
429 if(sourceOfParams[i]==')') break;
430
431 //ByRef
432 bool isRef;
433 if(sourceOfParams[i]==1&&sourceOfParams[i+1]==ESC_BYVAL){
434 isRef = false;
435 i+=2;
436 }
437 else if(sourceOfParams[i]==1&&sourceOfParams[i+1]==ESC_BYREF){
438 isRef = true;
439 i+=2;
440 }
441 else isRef = false;
442
443 //パラメータ名
444 bool isArray = false;
445 int subScripts[MAX_ARRAYDIM];
446 char name[VN_SIZE];
447 sw=0;
448 for(i2=0;;i++,i2++){
449 if(sourceOfParams[i]=='('){
450 if(!sw) sw=1;
451
452 i3=GetStringInPare(name+i2,sourceOfParams+i);
453 i2+=i3-1;
454 i+=i3-1;
455 continue;
456 }
457 if(sourceOfParams[i]=='['){
458 if(!sw) sw=1;
459
460 i3=GetStringInBracket(name+i2,sourceOfParams+i);
461 i2+=i3-1;
462 i+=i3-1;
463 continue;
464 }
465 if(!IsVariableChar(sourceOfParams[i])){
466 name[i2]=0;
467 break;
468 }
469 name[i2]=sourceOfParams[i];
470 }
471 if(sw){
472 //配列パラメータ
473 if( isRef == false ) SmoothieException::Throw(29,NULL,nowLine);
474 isArray = true;
475
476 if((name[i2-2]=='('&&name[i2-1]==')')||
477 (name[i2-2]=='['&&name[i2-1]==']')){
478 subScripts[0]=LONG_MAX;
479 subScripts[1]=-1;
480
481 name[i2-2]=0;
482 }
483 else{
484 GetArrange(name,temp2,subScripts);
485 lstrcpy(name,temp2);
486 }
487
488 i2=lstrlen(name);
489 }
490
491 //型
492 Type type( DEF_NON );
493 if(lstrcmp(name,"...")==0) type.SetBasicType( DEF_ELLIPSE );
494 else if(sourceOfParams[i]==1&&sourceOfParams[i+1]==ESC_AS){
495 i+=2;
496
497 i2=0;
498 while(sourceOfParams[i]=='*'){
499 temporary[i2]=sourceOfParams[i];
500 i++;
501 i2++;
502 }
503 for(;;i++,i2++){
504 if(!IsVariableChar(sourceOfParams[i])){
505 if(sourceOfParams[i]==1&&(sourceOfParams[i+1]==ESC_FUNCTION||sourceOfParams[i+1]==ESC_SUB)){
506 temporary[i2++]=sourceOfParams[i++];
507 temporary[i2]=sourceOfParams[i];
508 continue;
509 }
510 temporary[i2]=0;
511 break;
512 }
513 temporary[i2]=sourceOfParams[i];
514 }
515
516 Compiler::StringToType( temporary, type );
517
518 if( type.IsNull() ){
519 SmoothieException::Throw(3,temporary,nowLine);
520 type.SetBasicType( DEF_PTR_VOID );
521 }
522 }
523 else{
524 type.SetBasicType( Type::GetBasicTypeFromSimpleName(temporary) );
525 SmoothieException::Throw(-103,temporary,nowLine);
526 }
527
528 Parameter *pParam = new Parameter( name, type, isRef );
529 if( isArray ){
530 pParam->SetArray( subScripts );
531 }
532
533 //パラメータを追加
534 this->params.push_back( pParam );
535
536 if(sourceOfParams[i]==','){
537 i++;
538 continue;
539 }
540 else if(sourceOfParams[i]==')') continue;
541 else{
542 SmoothieException::Throw(1,NULL,nowLine);
543 break;
544 }
545 }
546 i++;
547
548 if(sourceOfParams[i]){
549 ///////////////////
550 // 戻り値を取得
551 ///////////////////
552
553 i2=lstrlen(sourceOfParams)-2;
554
555 int sw_as=0;
556 for(;i2>0;i2--){
557 if(sourceOfParams[i2]==')') break;
558
559 if(sourceOfParams[i2]==1&&sourceOfParams[i2+1]==ESC_AS){
560 i2+=2;
561 i3=0;
562 while(sourceOfParams[i2]=='*') temporary[i3++]=sourceOfParams[i2++];
563 for(;;i2++,i3++){
564 if(!IsVariableChar(sourceOfParams[i2])){
565 temporary[i3]=0;
566 break;
567 }
568 temporary[i3]=sourceOfParams[i2];
569 }
570 Compiler::StringToType( temporary, this->returnType );
571 if( this->returnType.IsNull() ) SmoothieException::Throw(3,temporary,nowLine);
572
573 sw_as=1;
574 break;
575 }
576 }
577 }
578 else{
579 //戻り値なしのSub定義
580 this->returnType.SetNull();
581 }
582
583 return true;
584}
585
586bool ProcPointerImpl::SetParamsAndReturnType( const char *sourceOfParams, int nowLine ){
587 int i = 0;
588 int i2,i3,sw;
589 char temporary[8192],temp2[VN_SIZE];
590
591 //ソースコードの位置
592 this->codePos = nowLine;
593
594 //パラメータ
595 if(sourceOfParams[i]!='('){
596 SmoothieException::Throw(1,NULL,nowLine);
597 return 0;
598 }
599 i++;
600 while(1){
601 if(sourceOfParams[i]==')') break;
602
603 //ByRef
604 bool isRef;
605 if(sourceOfParams[i]==1&&sourceOfParams[i+1]==ESC_BYVAL){
606 isRef = false;
607 i+=2;
608 }
609 else if(sourceOfParams[i]==1&&sourceOfParams[i+1]==ESC_BYREF){
610 isRef = true;
611 i+=2;
612 }
613 else isRef = false;
614
615 //パラメータ名
616 bool isArray = false;
617 int subScripts[MAX_ARRAYDIM];
618 char name[VN_SIZE];
619 sw=0;
620 for(i2=0;;i++,i2++){
621 if(sourceOfParams[i]=='('){
622 if(!sw) sw=1;
623
624 i3=GetStringInPare(name+i2,sourceOfParams+i);
625 i2+=i3-1;
626 i+=i3-1;
627 continue;
628 }
629 if(sourceOfParams[i]=='['){
630 if(!sw) sw=1;
631
632 i3=GetStringInBracket(name+i2,sourceOfParams+i);
633 i2+=i3-1;
634 i+=i3-1;
635 continue;
636 }
637 if(!IsVariableChar(sourceOfParams[i])){
638 name[i2]=0;
639 break;
640 }
641 name[i2]=sourceOfParams[i];
642 }
643 if(sw){
644 //配列パラメータ
645 if( isRef == false ) SmoothieException::Throw(29,NULL,nowLine);
646 isArray = true;
647
648 if((name[i2-2]=='('&&name[i2-1]==')')||
649 (name[i2-2]=='['&&name[i2-1]==']')){
650 subScripts[0]=LONG_MAX;
651 subScripts[1]=-1;
652
653 name[i2-2]=0;
654 }
655 else{
656 GetArrange(name,temp2,subScripts);
657 lstrcpy(name,temp2);
658 }
659
660 i2=lstrlen(name);
661 }
662
663 //型
664 Type type( DEF_NON );
665 if(sourceOfParams[i]==1&&sourceOfParams[i+1]==ESC_AS){
666 i+=2;
667
668 i2=0;
669 while(sourceOfParams[i]=='*'){
670 temporary[i2]=sourceOfParams[i];
671 i++;
672 i2++;
673 }
674 for(;;i++,i2++){
675 if(!IsVariableChar(sourceOfParams[i])){
676 if(sourceOfParams[i]==1&&(sourceOfParams[i+1]==ESC_FUNCTION||sourceOfParams[i+1]==ESC_SUB)){
677 temporary[i2++]=sourceOfParams[i++];
678 temporary[i2]=sourceOfParams[i];
679 continue;
680 }
681 temporary[i2]=0;
682 break;
683 }
684 temporary[i2]=sourceOfParams[i];
685 }
686
687 Compiler::StringToType( temporary, type );
688
689 if( type.IsNull() ){
690 SmoothieException::Throw(3,temporary,nowLine);
691 type.SetBasicType( DEF_PTR_VOID );
692 }
693 }
694 else{
695 type.SetBasicType( Type::GetBasicTypeFromSimpleName(temporary) );
696 SmoothieException::Throw(-103,temporary,nowLine);
697 }
698
699 Parameter *pParam = new Parameter( name, type, isRef );
700 if( isArray ){
701 pParam->SetArray( subScripts );
702 }
703
704 //パラメータを追加
705 this->params.push_back( pParam );
706
707 if(sourceOfParams[i]==','){
708 i++;
709 continue;
710 }
711 else if(sourceOfParams[i]==')') continue;
712 else{
713 SmoothieException::Throw(1,NULL,nowLine);
714 break;
715 }
716 }
717 i++;
718
719 if(sourceOfParams[i]){
720 ///////////////////
721 // 戻り値を取得
722 ///////////////////
723
724 i2=lstrlen(sourceOfParams)-2;
725
726 int sw_as=0;
727 for(;i2>0;i2--){
728 if(sourceOfParams[i2]==')') break;
729
730 if(sourceOfParams[i2]==1&&sourceOfParams[i2+1]==ESC_AS){
731 i2+=2;
732 i3=0;
733 while(sourceOfParams[i2]=='*') temporary[i3++]=sourceOfParams[i2++];
734 for(;;i2++,i3++){
735 if(!IsVariableChar(sourceOfParams[i2])){
736 temporary[i3]=0;
737 break;
738 }
739 temporary[i3]=sourceOfParams[i2];
740 }
741 Compiler::StringToType( temporary, this->returnType );
742 if( this->returnType.IsNull() ) SmoothieException::Throw(3,temporary,nowLine);
743
744 sw_as=1;
745 break;
746 }
747 }
748 }
749 else{
750 //戻り値なしのSub定義
751 this->returnType.SetNull();
752 }
753
754 //戻り値のエラーチェック
755 if( IsFunction() ){
756 // Function定義
757
758 if( this->ReturnType().IsNull() ){
759 // 戻り値がない
760 SmoothieException::Throw(26,this->GetName(),nowLine);
761 }
762 }
763 else{
764 if( !this->ReturnType().IsNull() ){
765 // Sub定義なのに、戻り値がある
766 SmoothieException::Throw(38,this->GetName(),nowLine);
767 }
768 }
769
770 return true;
771}
772
773int ProcPointersImpl::Add( const string &typeExpression )
774{
775 DWORD dwProcType = (DWORD)typeExpression[2];
776 const string &paramStr = typeExpression.substr( 3 );
777
778 Procedure::Kind kind = Procedure::Sub;
779 if( dwProcType == ESC_FUNCTION ){
780 kind = Procedure::Function;
781 }
782
783 ProcPointer *pProcPointer = new ProcPointerImpl( kind );
784
785 //buffer[0]は'('となっている
786 extern int cp;
787 pProcPointer->SetParamsAndReturnType( paramStr.c_str(), cp );
788
789 this->push_back( pProcPointer );
790
791 return (int)this->size()-1;
792}
793
794void ProcPointersImpl::Clear()
795{
796 ProcPointersImpl &procPointers = *this;
797 BOOST_FOREACH( ProcPointer *pProcPointer, procPointers ){
798 delete pProcPointer;
799 }
800 this->clear();
801}
Note: See TracBrowser for help on using the repository browser.