source: dev/trunk/ab5.0/abdev/BasicCompiler_Common/Object.cpp@ 465

Last change on this file since 465 was 465, checked in by dai_9181, 16 years ago

Messenger/ErrorMessengerクラスを導入。SetError関数によるエラー生成を廃止した。

File size: 3.1 KB
RevLine 
[206]1#include "stdafx.h"
2
[193]3#include <Compiler.h>
[182]4
[4]5#include "../BasicCompiler_Common/common.h"
6
7#ifdef _AMD64_
8#include "../BasicCompiler64/opcode.h"
9#else
[5]10#include "../BasicCompiler32/opcode.h"
[4]11#endif
12
13extern HANDLE hHeap;
14
[206]15void CallConstructor( const char *ObjectName,const Subscripts &subscripts,const Type &type,const char *Parameter){
[75]16 if( !type.IsObject() ){
17 return;
18 }
[4]19
20 /////////////////////////////////////
21 // クラスオブジェクトの場合
22 // ※コンストラクタの呼び出し
23 /////////////////////////////////////
24
[206]25 const UserProc *pUserProc = GetMethodHash(ObjectName,type.GetClass().GetName().c_str(),Parameter);
[75]26 if(!pUserProc){
[465]27 if(Parameter[0]) compiler.errorMessenger.Output(113,type.GetClass().GetName().c_str(),cp);
[4]28 return;
29 }
[5]30
31
32 char temporary[VN_SIZE];
33
[206]34 if( subscripts.size() > 0 ){
[4]35 int ss[MAX_ARRAYDIM];
36 memset(ss,0,MAX_ARRAYDIM*sizeof(int));
37 while(1){
38 int i3;
[206]39 for(i3=0; i3<(int)subscripts.size(); i3++){
40 if(ss[i3]>subscripts[i3]){
[4]41 ss[i3]=0;
42 ss[i3+1]++;
43 }
44 else break;
45 }
[206]46 if( i3 == subscripts.size() )
47 {
48 break;
49 }
[5]50 sprintf(temporary,"%s[%d",ObjectName,ss[0]);
[206]51 for(i3=1; i3<(int)subscripts.size(); i3++){
[4]52 sprintf(temporary+lstrlen(temporary),",%d",ss[i3]);
53 }
54 lstrcat(temporary,"]");
55
[75]56 Type dummyType;
[131]57 sprintf(temporary+lstrlen(temporary),".%s",type.GetClass().GetName().c_str());
[75]58 CallProc( PROC_DEFAULT,
59 pUserProc,
[4]60 temporary,
61 Parameter,
[331]62 Type(), // baseTypeはなし
[75]63 dummyType );
[4]64
65 ss[0]++;
66 }
67 }
68 else{
[75]69 Type dummyType;
[131]70 sprintf(temporary,"%s.%s",ObjectName,type.GetClass().GetName().c_str());
[75]71 CallProc( PROC_DEFAULT,
72 pUserProc,
[4]73 temporary,
74 Parameter,
[331]75 Type(), // baseTypeはなし
[75]76 dummyType );
[4]77 }
78}
[75]79
80bool Operator_New( const char *expression, const Type &baseType, Type &resultType ){
81 char CreateParameter[VN_SIZE],objectSizeStr[VN_SIZE];
82 int i,i2;
83
84 i=0;
85
86 if(expression[0]=='['){
87 i=GetStringInBracket(objectSizeStr,expression);
88
89 SlideString(objectSizeStr+1,-1);
90 objectSizeStr[i-2]=0;
91 }
92 else objectSizeStr[0]=0;
93
94 char typeName[VN_SIZE];
95 for(i2=0;;i++,i2++){
96 if(expression[i]=='('){
97 typeName[i2]=0;
98
99 //コンストラクタに渡すパラメータを取得
100 i2=GetStringInPare(CreateParameter,expression+i);
101 RemoveStringPare(CreateParameter);
102 i+=i2;
103 if(expression[i]!='\0'){
[465]104 compiler.errorMessenger.Output(42,NULL,cp);
[75]105 return false;
106 }
107 break;
108 }
109 typeName[i2]=expression[i];
110 if(expression[i]=='\0'){
111 CreateParameter[0]=0;
112 break;
113 }
114 }
115
[198]116 if( !compiler.StringToType( typeName, resultType ) ){
[465]117 compiler.errorMessenger.Output(3,typeName,cp);
[75]118 return false;
119 }
120
121 if( !resultType.IsObject() ){
122 ////////////////////////
123 // 通常のデータ型の場合
124 ////////////////////////
125
[465]126 compiler.errorMessenger.Output(121,NULL,cp);
[75]127 return false;
128 }
129
130 Operator_New( resultType.GetClass(), objectSizeStr, CreateParameter, baseType );
131
132 if( !baseType.IsObject() ){
133 // オブジェクトポインタ向け
134 resultType.SetBasicType( DEF_PTR_OBJECT );
135 }
136
137 return true;
138}
Note: See TracBrowser for help on using the repository browser.