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

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