Changeset 64 in dev for BasicCompiler_Common
- Timestamp:
- Mar 8, 2007, 2:49:34 AM (18 years ago)
- Location:
- BasicCompiler_Common
- Files:
-
- 17 edited
Legend:
- Unmodified
- Added
- Removed
-
BasicCompiler_Common/BasicFixed.h
r55 r64 13 13 // 型 14 14 //////////////// 15 16 #define DEF_NON -1 15 17 16 18 /* basic\command.sbp内の "_System_Type_***" 定数と同期が必要 */ … … 48 50 #define DEF_ANY 0x00000015 49 51 #define DEF_OBJECT 0x00000016 52 #define DEF_STRUCT 0x00000017 50 53 #define DEF_ELLIPSE 0x00000018 51 54 … … 60 63 #define PTR_LEVEL_DOWN(t) t = MAKE_PTR_TYPE(NATURAL_TYPE(t),PTR_LEVEL(t)-1) 61 64 62 #define DEF_PTR_ BYTE MAKE_PTR_TYPE(DEF_BYTE,1)65 #define DEF_PTR_CHAR MAKE_PTR_TYPE(DEF_CHAR,1) 63 66 #define DEF_PTR_OBJECT MAKE_PTR_TYPE(DEF_OBJECT,1) 67 #define DEF_PTR_STRUCT MAKE_PTR_TYPE(DEF_STRUCT,1) 64 68 65 69 … … 191 195 #define ESC_ENDINTERFACE (char)0xAA 192 196 #define ESC_OPERATOR (char)0xAB 193 -
BasicCompiler_Common/Class.cpp
r63 r64 101 101 102 102 int CMember::GetSize(){ 103 if( IsRef() ){104 // 参照型105 return PTR_SIZE;106 }107 108 103 //メンバサイズを取得 109 104 return GetTypeSize(TypeInfo.type,TypeInfo.u.lpIndex); … … 126 121 char temporary[VN_SIZE]; 127 122 sprintf(temporary,"%s.%s",pobj_c->name,member->name); 128 AddGlobalVariable(123 dim( 129 124 false, 130 125 temporary, 131 126 member->SubScripts, 132 &member->TypeInfo,127 member->TypeInfo, 133 128 GetTypeSize(member->TypeInfo.type,member->TypeInfo.u.lpIndex), 134 129 member->InitBuf, 135 130 member->ConstractParameter, 136 131 0); 137 138 if(member->TypeInfo.type==DEF_OBJECT){139 //エラー用140 cp=member->source_code_address;141 142 CallConstructor(temporary,143 member->SubScripts,144 member->TypeInfo,145 member->ConstractParameter);146 }147 132 148 133 //ネイティブコードバッファの再確保 … … 220 205 } 221 206 } 207 208 bool CClass::IsStructure() const 209 { 210 return classType == CClass::Structure; 211 } 212 222 213 void CClass::Inherits( CClass *pInheritsClass ){ 223 214 int i3; … … 437 428 //アラインメントを算出 438 429 int member_size; 439 if(pMember->TypeInfo.type==DEF_ OBJECT){430 if(pMember->TypeInfo.type==DEF_STRUCT){ 440 431 //メンバクラスのアラインメントを取得 441 432 member_size=pMember->TypeInfo.u.pobj_Class->GetAlignment(); … … 500 491 CMember *pMember = ppobj_Member[i]; 501 492 502 if(pMember->TypeInfo.type==DEF_ OBJECT && pMember->IsRef() == false){493 if(pMember->TypeInfo.type==DEF_STRUCT){ 503 494 //メンバクラスのアラインメントを取得 504 495 member_size=pMember->TypeInfo.u.pobj_Class->GetAlignment(); … … 598 589 //コンポジションの関係にあるメンバも検査する 599 590 for(int i=0;i < iMemberNum;i++){ 600 if(ppobj_Member[i]->TypeInfo.type==DEF_OBJECT && ppobj_Member[i]->IsRef() == false){591 if(ppobj_Member[i]->TypeInfo.type==DEF_OBJECT){ 601 592 if(ppobj_Member[i]->TypeInfo.u.pobj_Class->IsAbstract()) 602 593 return true; … … 805 796 806 797 //クラスを追加 807 pobj_DBClass->AddClass(temporary,NowLine); 798 CClass *pClass = pobj_DBClass->AddClass(temporary,NowLine); 799 if( pClass ){ 800 if( basbuf[NowLine+1] == ESC_CLASS ){ 801 pClass->classType = CClass::Class; 802 } 803 else if( basbuf[NowLine+1] == ESC_INTERFACE ){ 804 pClass->classType = CClass::Interface; 805 } 806 else{ 807 pClass->classType = CClass::Structure; 808 } 809 } 808 810 } 809 811 } … … 843 845 if(psi->ParmNum==0) fConstructor=1; 844 846 847 // TODO: 消す 845 848 //コピーコンストラクタ 846 849 if(psi->ParmNum==1){ … … 953 956 for(i=0;i<pobj_c->iMemberNum;i++){ 954 957 CMember *pMember = pobj_c->ppobj_Member[i]; 955 if(pMember->TypeInfo.type==DEF_OBJECT && pMember->IsRef()==false){958 if(pMember->TypeInfo.type==DEF_OBJECT){ 956 959 //循環参照でないかをチェック 957 960 if(pobj_LoopRefCheck->check(pMember->TypeInfo.u.pobj_Class->name)){ … … 976 979 extern char *basbuf; 977 980 int i,i2,i3,sub_address,top_pos; 978 DWORD dwClassType;979 981 DWORD dwAccess; 980 982 char temporary[8192]; … … 1132 1134 top_pos=i; 1133 1135 1134 dwClassType=basbuf[i+1];1136 const DWORD dwClassType=basbuf[i+1]; 1135 1137 1136 1138 i+=2; … … 1263 1265 i += 2; 1264 1266 } 1265 1267 /* 1266 1268 //Ref修飾子 1267 1269 bool isRef = false; … … 1269 1271 isRef = true; 1270 1272 i += 2; 1271 } 1273 }*/ 1272 1274 1273 1275 if(basbuf[i]==1&&( … … 1348 1350 //静的メンバを追加 1349 1351 cp=i; //エラー用 1350 pobj_c->AddStaticMember( dwAccess, isConst, isRef, temporary, i);1352 pobj_c->AddStaticMember( dwAccess, isConst, false, temporary, i); 1351 1353 } 1352 1354 else{ 1353 1355 //メンバを追加 1354 1356 cp=i; //エラー用 1355 pobj_c->AddMember( dwAccess, isConst, isRef, temporary ); 1356 1357 1358 if(pobj_c->ppobj_Member[pobj_c->iMemberNum-1]->TypeInfo.type==DEF_OBJECT){ 1357 pobj_c->AddMember( dwAccess, isConst, false, temporary ); 1358 1359 1360 if(pobj_c->ppobj_Member[pobj_c->iMemberNum-1]->TypeInfo.type==DEF_OBJECT|| 1361 pobj_c->ppobj_Member[pobj_c->iMemberNum-1]->TypeInfo.type==DEF_STRUCT){ 1359 1362 if(pobj_c->ppobj_Member[pobj_c->iMemberNum-1]->TypeInfo.u.pobj_Class->ppobj_Member==0){ 1360 1363 //参照先が読み取られていないとき … … 1376 1379 } 1377 1380 else{ 1378 // 文法エラーチェック1379 if( isRef ){1380 SetError(1,NULL,cp);1381 }1382 1383 1381 //メソッドを追加 1384 1382 cp=i; //エラー用 -
BasicCompiler_Common/Class.h
r63 r64 79 79 std::vector<CMethod *> staticMethods; 80 80 81 enum ClassType{ 82 Class, 83 Structure, 84 Interface, 85 }; 86 87 ClassType classType; 88 81 89 public: 82 90 //クラス名 … … 100 108 CClass(const char *name); 101 109 ~CClass(); 110 111 bool IsStructure() const; 102 112 103 113 //継承させる … … 186 196 //線形リスト用 187 197 CClass *pobj_NextClass; 198 199 200 //メンバの参照方法 201 enum RefType{ 202 Dot, // obj.member 203 Pointer, // obj->member 204 Non, // no reference member 205 }; 188 206 }; 189 207 -
BasicCompiler_Common/Compile.cpp
r56 r64 243 243 break; 244 244 case COM_DELETE: 245 OpcodeDelete(Command+2); 245 OpcodeDelete(Command+2, false); 246 break; 247 case COM_SWEEPINGDELETE: 248 OpcodeDelete(Command+2, true); 246 249 break; 247 250 -
BasicCompiler_Common/DebugMiddleFile.cpp
r53 r64 11 11 12 12 void SetLpIndex_DebugFile(char *buffer,int *p,int type,LONG_PTR lpIndex){ 13 if(NATURAL_TYPE(type)==DEF_OBJECT ){13 if(NATURAL_TYPE(type)==DEF_OBJECT || NATURAL_TYPE(type)==DEF_STRUCT){ 14 14 lstrcpy(buffer+(*p),((CClass *)lpIndex)->name); 15 15 (*p)+=lstrlen(buffer+(*p))+1; … … 23 23 24 24 void GetLpIndex_DebugFile(char *buffer,int *p,int type,LONG_PTR *plpIndex){ 25 if(NATURAL_TYPE(type)==DEF_OBJECT ){25 if(NATURAL_TYPE(type)==DEF_OBJECT || NATURAL_TYPE(type)==DEF_STRUCT){ 26 26 char szClassName[VN_SIZE]; 27 27 lstrcpy(szClassName,buffer+(*p)); -
BasicCompiler_Common/Intermediate_Step1.cpp
r54 r64 2 2 3 3 void ChangeReturnCode(char *buffer){ 4 5 #ifdef _DEBUG 6 //改行コードの整合性チェック 7 for( int i=0; ; i++ ){ 8 if( buffer[i] == '\0' ){ 9 break; 10 } 11 if( buffer[i]!='\r' && buffer[i+1]=='\n' 12 || buffer[i]=='\r' && buffer[i+1]!='\n' ){ 13 char temporary[255]; 14 strncpy( temporary, buffer + i-100, 130 ); 15 temporary[130] = 0; 16 for(int i2=0; ;i2++){ 17 if(temporary[i2]=='\r') temporary[i2]='A'; 18 if(temporary[i2]=='\n') temporary[i2]='B'; 19 if(temporary[i2]=='\0') break; 20 } 21 MessageBox( hOwnerEditor, temporary, "改行コードの整合性チェック", MB_OK | MB_ICONEXCLAMATION ); 22 } 23 } 24 #endif 25 4 26 //改行コードのCRLFをLFに変換 5 int i,i2; 6 for(i=0,i2=0;;i++,i2++){ 27 for(int i=0,i2=0;;i++,i2++){ 7 28 if(buffer[i]=='\r'&&buffer[i+1]=='\n') i++; 8 29 buffer[i2]=buffer[i]; -
BasicCompiler_Common/Intermediate_Step2.cpp
r43 r64 582 582 ComNum=COM_DELETE; 583 583 } 584 else if( lstrcmpi( com, "_System_SweepingDelete" ) == 0 ){ 585 KillSpaces(Command+i,pam); 586 ComNum=COM_SWEEPINGDELETE; 587 } 584 588 585 589 //その他 -
BasicCompiler_Common/LexicalScoping.cpp
r51 r64 182 182 183 183 184 int i3 ,i4;184 int i3; 185 185 int indexSystemGC=-1; 186 186 for( i3 = num - 1; i3 >= 0; i3-- ){ //確保したのと逆順序で解放するため、バックサーチにする … … 197 197 if( pVar[i3].ScopeLevel != GetNowLevel() ) continue; 198 198 199 if(pVar[i3].type==DEF_OBJECT&&pVar[i3].fRef&OBJECT_PARAMETER){ 200 //実態オブジェクトのパラメータを持つとき 201 202 //デストラクタを呼び出す 203 CMethod *method = pVar[i3].u.pobj_c->GetDestructorMethod(); 204 if( method ){ 205 Opcode_CallProc("", method->psi,0,pVar[i3].name,DEF_OBJECT); 206 } 199 if(pVar[i3].type==DEF_STRUCT&&pVar[i3].fRef&OBJECT_PARAMETER){ 200 //構造体パラメータを持つとき 207 201 208 202 //メモリを解放する … … 241 235 } 242 236 } 237 238 /* 239 TODO: 消す 243 240 else if(pVar[i3].type==DEF_OBJECT&&pVar[i3].fRef==0){ 244 241 //デストラクタの呼び出し … … 285 282 } 286 283 } 284 */ 287 285 } 288 286 -
BasicCompiler_Common/NumOpe_GetType.cpp
r55 r64 255 255 } 256 256 257 int Operator_New_GetType(const char *Parameter,LONG_PTR *plpIndex,const TYPEINFO &baseTypeInfo ){ 258 char TypeName[VN_SIZE],CreateParameter[VN_SIZE],objectSizeStr[VN_SIZE]; 259 int i,i2; 260 261 i=0; 262 263 if(Parameter[0]=='['){ 264 i=GetStringInBracket(objectSizeStr,Parameter); 265 266 SlideString(objectSizeStr+1,-1); 267 objectSizeStr[i-2]=0; 268 } 269 else objectSizeStr[0]=0; 270 271 for(i2=0;;i++,i2++){ 272 if(Parameter[i]=='('){ 273 TypeName[i2]=0; 274 275 //コンストラクタに渡すパラメータを取得 276 i2=GetStringInPare(CreateParameter,Parameter+i); 277 RemoveStringPare(CreateParameter); 278 i+=i2; 279 if(Parameter[i]!='\0'){ 280 SetError(42,NULL,cp); 281 return 0; 282 } 283 break; 284 } 285 TypeName[i2]=Parameter[i]; 286 if(Parameter[i]=='\0'){ 287 CreateParameter[0]=0; 288 break; 289 } 290 } 291 292 int type; 293 type=GetTypeFixed(TypeName,plpIndex); 294 295 if( baseTypeInfo.type == DEF_OBJECT ){ 296 return DEF_OBJECT; 297 } 298 return DEF_PTR_OBJECT; 299 } 300 257 301 int NumOpe_GetType(char *Command,TYPEINFO *pBaseType,LONG_PTR *plpIndex){ 258 302 extern int cp; … … 265 309 } 266 310 267 if(Command[0]==1&& Command[1]==ESC_NEW){311 if(Command[0]==1&& Command[1]==ESC_NEW ){ 268 312 //New演算子(オブジェクト生成) 269 return DEF_PTR_OBJECT;313 return Operator_New_GetType(Command+2,plpIndex, *pBaseType ); 270 314 } 271 315 … … 333 377 if(pBaseType->type==DEF_OBJECT){ 334 378 if(IsStringSubsituation(pBaseType->u.pobj_Class) 335 || IsStringObjectType( pBaseType)){379 || IsStringObjectType(*pBaseType)){ 336 380 //要求タイプがオブジェクトであり、Stringの受け入れが可能な場合 337 381 extern CClass *pobj_StringClass; … … 346 390 } 347 391 348 type[sp]=DEF_PTR_ BYTE;392 type[sp]=DEF_PTR_CHAR; 349 393 bLiteralCalculation=0; 350 394 } -
BasicCompiler_Common/Overload.cpp
r50 r64 28 28 char MethodName[VN_SIZE]; 29 29 if( !SplitMemberName( name, NULL, MethodName ) ) lstrcpy( MethodName, name ); 30 30 /* 31 31 //メソッドの場合は静的かどうかを調べる 32 32 bool isStatic = false; … … 35 35 isStatic = pClass->IsExistStaticMethod( MethodName ); 36 36 } 37 37 */ 38 38 //パラメータオブジェクトを生成 39 39 pobj_parameter=new CParameter(Parameter); -
BasicCompiler_Common/Parameter.cpp
r52 r64 58 58 } 59 59 60 ReturnTypeInfo.type= 0;61 ReturnTypeInfo.u.lpIndex= 0;60 ReturnTypeInfo.type=DEF_NON; 61 ReturnTypeInfo.u.lpIndex=-1; 62 62 } 63 63 CParameter::CParameter(const PARAMETER_INFO *pParamInfo,const int ParmNum){ … … 70 70 this->ParmsNum=ParmNum; 71 71 72 ReturnTypeInfo.type= 0;73 ReturnTypeInfo.u.lpIndex= 0;72 ReturnTypeInfo.type=DEF_NON; 73 ReturnTypeInfo.u.lpIndex=-1; 74 74 } 75 75 CParameter::~CParameter(){ … … 99 99 if(Parms[i]){ 100 100 TYPEINFO BaseType={ppi[i].type,ppi[i].u.index}; 101 type=NumOpe_GetType(Parms[i],&BaseType,&lpIndex); 101 type=NumOpe_GetType(Parms[i], 102 (overload_level==OVERLOAD_LEVEL0) ? NULL : &BaseType, 103 &lpIndex); 102 104 } 103 105 else{ … … 107 109 108 110 if(type!=ppi[i].type){ 109 if(overload_level==OVERLOAD_LEVEL1 ){111 if(overload_level==OVERLOAD_LEVEL1 || overload_level == OVERLOAD_LEVEL0){ 110 112 return 0; 111 113 } … … 121 123 } 122 124 else{ 123 if(NATURAL_TYPE(type)==DEF_OBJECT ){125 if(NATURAL_TYPE(type)==DEF_OBJECT || NATURAL_TYPE(type)==DEF_STRUCT){ 124 126 if(lpIndex!=ppi[i].u.index) return 0; 125 127 } … … 130 132 //戻り値も比較対象にする 131 133 if(ReturnTypeInfo.type==pReturnTypeInfo->type){ 132 if(NATURAL_TYPE(ReturnTypeInfo.type)==DEF_OBJECT){ 133 if(ReturnTypeInfo.u.lpIndex != pReturnTypeInfo->u.lpIndex) return 0; 134 if(NATURAL_TYPE(ReturnTypeInfo.type)==DEF_OBJECT 135 || NATURAL_TYPE(ReturnTypeInfo.type)==DEF_STRUCT ){ 136 if(ReturnTypeInfo.u.lpIndex != pReturnTypeInfo->u.lpIndex) return 0; 134 137 } 135 138 } … … 145 148 psi=0; 146 149 147 foreach( psi, subs ){ 148 149 TYPEINFO ReturnTypeInfo; 150 ReturnTypeInfo.type=psi->ReturnType; 151 ReturnTypeInfo.u.lpIndex=psi->u.ReturnIndex; 152 153 //エラーチェック 154 if(_overload_check(psi->pParmInfo,psi->ParmNum,&ReturnTypeInfo,OVERLOAD_LEVEL1)){ 155 if(sw){ 156 SetError(52,name,cp); 157 return 0; 158 } 159 sw=1; 160 break; 161 } 162 } 163 164 if(!sw){ 165 foreach( psi, subs ){ 150 for( int level=OVERLOAD_MIN_LEVEL; level<=OVERLOAD_MAX_LEVEL; level++ ){ 151 foreach( SUBINFO *temp_psi, subs ){ 166 152 167 153 TYPEINFO ReturnTypeInfo; 168 ReturnTypeInfo.type= psi->ReturnType;169 ReturnTypeInfo.u.lpIndex= psi->u.ReturnIndex;154 ReturnTypeInfo.type=temp_psi->ReturnType; 155 ReturnTypeInfo.u.lpIndex=temp_psi->u.ReturnIndex; 170 156 171 157 //エラーチェック 172 if(_overload_check( psi->pParmInfo,psi->ParmNum,&ReturnTypeInfo,OVERLOAD_LEVEL2)){158 if(_overload_check(temp_psi->pParmInfo,temp_psi->ParmNum,&ReturnTypeInfo,level)){ 173 159 if(sw){ 174 160 SetError(52,name,cp); … … 176 162 } 177 163 sw=1; 164 165 psi = temp_psi; 178 166 break; 179 167 } 180 168 } 181 } 182 183 if(!sw){ 184 foreach( psi, subs ){ 185 186 TYPEINFO ReturnTypeInfo; 187 ReturnTypeInfo.type=psi->ReturnType; 188 ReturnTypeInfo.u.lpIndex=psi->u.ReturnIndex; 189 190 //エラーチェック 191 if(_overload_check(psi->pParmInfo,psi->ParmNum,&ReturnTypeInfo,OVERLOAD_LEVEL3)){ 192 if(sw){ 193 SetError(52,name,cp); 194 return 0; 195 } 196 sw=1; 197 break; 198 } 199 } 169 170 if( sw ) break; 200 171 } 201 172 … … 212 183 psi=0; 213 184 214 foreach( psi, subs ){ 215 216 //エラーチェック 217 if(_overload_check(psi->pParmInfo,psi->ParmNum,NULL,OVERLOAD_LEVEL1)){ 218 if(sw){ 219 return OverloadSolutionWithReturnType(name,subs); 220 } 221 sw=1; 222 break; 223 } 224 } 225 226 if(!sw){ 227 foreach( psi, subs ){ 185 for( int level=OVERLOAD_MIN_LEVEL; level<=OVERLOAD_MAX_LEVEL; level++ ){ 186 187 foreach( SUBINFO *temp_psi, subs ){ 228 188 229 189 //エラーチェック 230 if(_overload_check( psi->pParmInfo,psi->ParmNum,NULL,OVERLOAD_LEVEL2)){190 if(_overload_check(temp_psi->pParmInfo,temp_psi->ParmNum,NULL,level)){ 231 191 if(sw){ 232 192 return OverloadSolutionWithReturnType(name,subs); 233 193 } 234 194 sw=1; 235 break; 236 } 237 } 238 } 239 240 if(!sw){ 241 foreach( psi, subs ){ 242 243 //エラーチェック 244 if(_overload_check(psi->pParmInfo,psi->ParmNum,NULL,OVERLOAD_LEVEL3)){ 245 if(sw){ 246 return OverloadSolutionWithReturnType(name,subs); 247 } 248 sw=1; 249 break; 250 } 251 } 195 196 psi = temp_psi; 197 } 198 } 199 200 if( sw ) break; 252 201 } 253 202 -
BasicCompiler_Common/Subroutine.cpp
r54 r64 460 460 _int64 i64data; 461 461 type = StaticCalculation( true, temporary, 0, &i64data, &lpIndex ); 462 if( type != DEF_PTR_ BYTE){462 if( type != DEF_PTR_CHAR ){ 463 463 SetError(1,NULL,NowLine); 464 464 return; … … 483 483 if( temporary[0] ){ 484 484 type = StaticCalculation( true, temporary, 0, &i64data, &lpIndex ); 485 if( type != DEF_PTR_ BYTE){485 if( type != DEF_PTR_CHAR ){ 486 486 SetError(1,NULL,NowLine); 487 487 return; … … 604 604 i+=2; 605 605 pdi->ReturnType=GetTypeFixed(buffer+i,&pdi->u.ReturnIndex); 606 if(pdi->ReturnType== -1) SetError(3,buffer+i,NowLine);606 if(pdi->ReturnType==DEF_NON) SetError(3,buffer+i,NowLine); 607 607 if(pdi->ReturnType==DEF_OBJECT) SetError(40,NULL,NowLine); 608 608 } 609 609 else if(buffer[i]) SetError(1,NULL,NowLine); 610 else pdi->ReturnType= -1;610 else pdi->ReturnType=DEF_NON; 611 611 612 612 pdi->pos=NowLine; … … 635 635 } 636 636 else{ 637 if(NATURAL_TYPE(ppi1[i].type)==DEF_OBJECT){ 637 if(NATURAL_TYPE(ppi1[i].type)==DEF_OBJECT 638 || NATURAL_TYPE(ppi1[i].type)==DEF_STRUCT ){ 638 639 if(ppi1[i].u.index!=ppi2[i].u.index) return 1; 639 640 } … … 827 828 } 828 829 psi->ReturnType=GetTypeFixed(temporary,&psi->u.ReturnIndex); 829 if(psi->ReturnType== -1) SetError(3,temporary,NowLine);830 if(psi->ReturnType==DEF_NON) SetError(3,temporary,NowLine); 830 831 831 832 sw_as=1; … … 842 843 else{ 843 844 //戻り値なしのSub定義 844 psi->ReturnType= -1;845 psi->ReturnType=DEF_NON; 845 846 psi->u.ReturnIndex=-1; 846 847 } … … 1129 1130 } 1130 1131 1131 //リアルパラメータ領域を取得(_System_LocalThis 、_System_ReturnValueを考慮して2つだけ多く確保する)1132 //リアルパラメータ領域を取得(_System_LocalThisを考慮して2つだけ多く確保する) 1132 1133 psi->pRealParmInfo=(PARAMETER_INFO *)HeapAlloc(hHeap,0,(psi->ParmNum+2)*sizeof(PARAMETER_INFO)); 1133 1134 psi->RealParmNum=0; … … 1147 1148 } 1148 1149 1149 if(psi->ReturnType==DEF_ OBJECT && psi->isReturnRef == false){1150 if(psi->ReturnType==DEF_STRUCT){ 1150 1151 i = psi->RealParmNum; 1151 1152 1152 // 実体オブジェクトを戻り値として持つ場合1153 //構造体を戻り値として持つ場合 1153 1154 //※第一パラメータ(Thisポインタありの場合は第二パラメータ)を戻り値用の参照宣言にする 1154 1155 … … 1156 1157 psi->pRealParmInfo[i].name="_System_ReturnValue"; 1157 1158 else psi->pRealParmInfo[i].name=psi->name; 1158 psi->pRealParmInfo[i].type=DEF_ OBJECT;1159 psi->pRealParmInfo[i].type=DEF_STRUCT; 1159 1160 psi->pRealParmInfo[i].u.index=psi->u.ReturnIndex; 1160 1161 psi->pRealParmInfo[i].bByVal=0; … … 1521 1522 } 1522 1523 pi->ReturnType=GetTypeFixed(temporary,&pi->u.ReturnIndex); 1523 if(pi->ReturnType==-1) SetError(3,temporary,cp); 1524 if(pi->ReturnType==DEF_OBJECT) SetError(40,NULL,cp); 1524 if(pi->ReturnType==DEF_NON) SetError(3,temporary,cp); 1525 1525 } 1526 1526 else pi->ReturnType=DEF_DOUBLE; 1527 1527 } 1528 else pi->ReturnType= -1;1528 else pi->ReturnType=DEF_NON; 1529 1529 1530 1530 return ProcPtrInfoNum-1; -
BasicCompiler_Common/Variable.cpp
r63 r64 157 157 else if(IsPtrType(type)) return PTR_SIZE; 158 158 159 else if( type==DEF_OBJECT){159 else if( type == DEF_STRUCT ){ 160 160 CClass *pobj_c; 161 161 pobj_c=(CClass *)lpIndex; 162 if(!pobj_c) return 0; 162 if(!pobj_c){ 163 SetError(300,NULL,cp); 164 return 0; 165 } 166 163 167 return pobj_c->GetSize(); 168 } 169 170 else if(type==DEF_OBJECT){ 171 return PTR_SIZE; 164 172 } 165 173 else{ … … 232 240 if(pobj_c){ 233 241 *lpNum=(LONG_PTR)pobj_c; 234 return DEF_OBJECT; 242 243 if( pobj_c->IsStructure() ){ 244 return DEF_STRUCT; 245 } 246 else{ 247 return DEF_OBJECT; 248 } 235 249 } 236 250 … … 282 296 283 297 //オブジェクト 284 else if(type==DEF_OBJECT ){298 else if(type==DEF_OBJECT || type==DEF_STRUCT){ 285 299 if(lpIndex==0) lstrcpy(name,"non"); 286 300 else{ … … 296 310 else{ 297 311 extern PROCPTRINFO *pProcPtrInfo; 298 if(pProcPtrInfo[lpIndex].ReturnType== -1)312 if(pProcPtrInfo[lpIndex].ReturnType==DEF_NON) 299 313 lstrcpy(name,"*Sub"); 300 314 else lstrcpy(name,"*Function"); … … 316 330 } 317 331 318 bool FormatUseProcReturnObject( const char *term, char *procName, char *parameter, int &RefType, char *member ){332 bool FormatUseProcReturnObject( const char *term, char *procName, char *parameter, CClass::RefType &refType, char *member ){ 319 333 int p1 = 0, p2 = 0; 320 334 … … 323 337 if( term[i] == '[' ){ 324 338 i = JumpStringInBracket( term, i + 1 ); 339 if( term[i] == '\0' ) break; 325 340 continue; 326 341 } … … 328 343 int temp_p = i; 329 344 i = JumpStringInPare( term, i + 1 ) + 1; 345 if( term[i] == '\0' ) break; 330 346 if( term[i] == '.' 331 347 || term[i] == 1 && term[i] == ESC_PSMEM ){ … … 348 364 //参照タイプ 349 365 if( term[p2] == '.' ){ 350 RefType = DEF_OBJECT;366 refType = CClass::Dot; 351 367 } 352 368 else{ 353 RefType = DEF_PTR_OBJECT;369 refType = CClass::Pointer; 354 370 p2++; 355 371 } … … 361 377 } 362 378 363 BOOL GetVarFormatString(char *buffer,char *array,char *array2,char *NestMember, int *pRefType){379 BOOL GetVarFormatString(char *buffer,char *array,char *array2,char *NestMember,CClass::RefType &refType){ 364 380 extern int cp; 365 381 int i,i2,i3; … … 369 385 array2[0]=0; 370 386 NestMember[0]=0; 371 *pRefType=0;372 387 for(i=0;;i++){ 373 388 if(buffer[i]=='\"'){ … … 428 443 if(buffer[i]=='.'){ 429 444 lstrcpy(NestMember,buffer+i+1); 430 *pRefType=DEF_OBJECT;445 refType = CClass::Dot; 431 446 buffer[i]=0; 432 447 break; … … 434 449 if(buffer[i]==1&&buffer[i+1]==ESC_PSMEM){ 435 450 lstrcpy(NestMember,buffer+i+2); 436 *pRefType=DEF_PTR_OBJECT;451 refType = CClass::Pointer; 437 452 buffer[i]=0; 438 453 break; … … 614 629 char lpPtrOffset[VN_SIZE]; //第2次配列 615 630 char NestMember[VN_SIZE]; //入れ子メンバ 616 int object_type; //"."参照のときは0、"->"参照のときは1631 CClass::RefType refType = CClass::Non; 617 632 lstrcpy(VarName,member); 618 if(!GetVarFormatString(VarName,array,lpPtrOffset,NestMember, &object_type)) return 0;633 if(!GetVarFormatString(VarName,array,lpPtrOffset,NestMember,refType)) return 0; 619 634 620 635 for(i=0;i<pobj_c->iMemberNum;i++){ … … 664 679 } 665 680 666 if( object_type){681 if( refType != CClass::Non ){ 667 682 //入れ子構造の場合 668 683 … … 704 719 705 720 706 int RefType;707 if( FormatUseProcReturnObject( variable, VarName, array, RefType, member ) ){721 CClass::RefType refType; 722 if( FormatUseProcReturnObject( variable, VarName, array, refType, member ) ){ 708 723 // 戻り値オブジェクトのメンバを直接参照しているとき 709 724 //例: func().member … … 723 738 724 739 lstrcpy(VarName,variable); 725 GetVarFormatString(VarName,array,lpPtrOffset,member, &RefType);740 GetVarFormatString(VarName,array,lpPtrOffset,member,refType); 726 741 727 742 int *pSubScripts; … … 825 840 char tempMember[VN_SIZE]; 826 841 char tempArray[VN_SIZE]; 827 GetVarFormatString(temporary,tempArray,lpPtrOffset,tempMember,&i); 842 { 843 CClass::RefType refType; 844 GetVarFormatString(temporary,tempArray,lpPtrOffset,tempMember,refType); 845 } 828 846 829 847 char temp2[VN_SIZE]; … … 897 915 898 916 if(member[0]){ 899 if(NATURAL_TYPE(type)==DEF_OBJECT) 900 return GetMemberType((CClass *)lpIndex,member,plpIndex,0,bError); 917 if( NATURAL_TYPE(type)==DEF_OBJECT 918 || NATURAL_TYPE(type)==DEF_STRUCT){ 919 return GetMemberType((CClass *)lpIndex,member,plpIndex,0,bError); 920 } 901 921 } 902 922 … … 921 941 } 922 942 923 BOOL GetVarOffsetReadOnly(const char *NameBuffer,int *pType,RELATIVE_VAR *pRelativeVar,LONG_PTR *plpIndex,int *pss ){943 BOOL GetVarOffsetReadOnly(const char *NameBuffer,int *pType,RELATIVE_VAR *pRelativeVar,LONG_PTR *plpIndex,int *pss ){ 924 944 //読み取り専用で変数へアクセス 925 945 return GetVarOffset( … … 932 952 pss); 933 953 } 934 BOOL GetVarOffsetReadWrite(const char *NameBuffer,int *pType,RELATIVE_VAR *pRelativeVar,LONG_PTR *plpIndex,int *pss ){954 BOOL GetVarOffsetReadWrite(const char *NameBuffer,int *pType,RELATIVE_VAR *pRelativeVar,LONG_PTR *plpIndex,int *pss ){ 935 955 //読み書き両用で変数へアクセス 936 956 return GetVarOffset( … … 1095 1115 } 1096 1116 1117 /* 1118 TODO: 消す 1097 1119 if( pTypeInfo->type == DEF_OBJECT && InitBuf[0] != '\0' && InitBuf[0] != '[' && isRef == false ){ 1098 1120 if( pTypeInfo->u.pobj_Class->GetCopyConstructorMethod() ){ … … 1101 1123 InitBuf[0] = 0; 1102 1124 } 1103 } 1125 }*/ 1104 1126 1105 1127 GetArrange(variable,VarName,SubScripts); … … 1191 1213 lstrcpy(pVar->ConstractParameter,ConstractParameter); 1192 1214 1193 if(InitBuf[0]||dwFlag==DIMFLAG_INITDEBUGVAR){1194 //初期バッファがあるとき1195 pVar->offset=AllInitGlobalVarSize;1196 AllInitGlobalVarSize+=VarSize;1197 }1198 else{1199 //初期バッファがないとき1200 pVar->offset=AllGlobalVarSize | 0x80000000;1201 AllGlobalVarSize+=VarSize;1202 }1203 1204 1215 //レキシカルスコープ 1205 1216 pVar->ScopeLevel=obj_LexScopes.GetNowLevel(); … … 1210 1221 pVar->source_code_address=cp; 1211 1222 1212 //初期バッファにデータをセット 1213 extern BYTE *initGlobalBuf; 1214 initGlobalBuf=(BYTE *)HeapReAlloc(hHeap, 1215 HEAP_ZERO_MEMORY, 1216 initGlobalBuf, 1217 AllInitGlobalVarSize); 1223 //アラインメントを考慮 1224 int alignment = 0; 1225 if( pVar->type==DEF_STRUCT ){ 1226 alignment = pVar->u.pobj_c->iAlign; 1227 } 1228 1229 if(InitBuf[0]||dwFlag==DIMFLAG_INITDEBUGVAR){ 1230 //初期バッファがあるとき 1231 1232 if( alignment ){ 1233 if( AllInitGlobalVarSize % alignment ){ 1234 AllInitGlobalVarSize += alignment - (AllInitGlobalVarSize % alignment); 1235 } 1236 } 1237 1238 pVar->offset=AllInitGlobalVarSize; 1239 AllInitGlobalVarSize+=VarSize; 1240 } 1241 else{ 1242 //初期バッファがないとき 1243 1244 if( alignment ){ 1245 if( AllGlobalVarSize % alignment ){ 1246 AllGlobalVarSize += alignment - (AllGlobalVarSize % alignment); 1247 } 1248 } 1249 1250 pVar->offset=AllGlobalVarSize | 0x80000000; 1251 AllGlobalVarSize+=VarSize; 1252 } 1253 1218 1254 if(InitBuf[0]){ 1219 i f( pVar->type == DEF_OBJECT && InitBuf[0] != '[' ){1220 //単発式が初期値のオブジェクトの場合1221 //初期 値をコピーコンストラクタに渡す1222 1223 i f( isRef ){1224 SetRefVariable( name, InitBuf );1225 }1226 }1227 else{ 1228 intresult = SetInitGlobalData(pVar->offset,1255 int result = 0; 1256 if( pVar->type != DEF_OBJECT ){ 1257 //初期バッファにデータをセット 1258 extern BYTE *initGlobalBuf; 1259 initGlobalBuf=(BYTE *)HeapReAlloc(hHeap, 1260 HEAP_ZERO_MEMORY, 1261 initGlobalBuf, 1262 AllInitGlobalVarSize); 1263 1264 result = SetInitGlobalData(pVar->offset, 1229 1265 pVar->type, 1230 1266 pVar->u.index, 1231 1267 pVar->SubScripts, 1232 1268 InitBuf); 1233 1234 if(!result){ 1235 //動的な式だった場合は代入演算を行う1236 1237 //初期代入時のみ、書き込みアクセスを許可する 1238 bool bConstBack = pVar->bConst;1239 pVar->bConst = false;1240 1241 //代入 1242 char temporary[8192];1243 sprintf(temporary,"%s=%s",name,InitBuf);1244 OpcodeCalc(temporary);1245 1246 //アクセス制限を元に戻す 1247 pVar->bConst = bConstBack;1248 }1269 } 1270 1271 if(!result){ 1272 //動的な式だった場合は代入演算を行う 1273 1274 //初期代入時のみ、書き込みアクセスを許可する 1275 bool bConstBack = pVar->bConst; 1276 pVar->bConst = false; 1277 1278 //代入 1279 char temporary[8192]; 1280 sprintf(temporary,"%s=%s",name,InitBuf); 1281 OpcodeCalc(temporary); 1282 1283 //アクセス制限を元に戻す 1284 pVar->bConst = bConstBack; 1249 1285 } 1250 1286 } … … 1260 1296 1261 1297 /* 1298 TODO: 消す 1262 1299 if(pTypeInfo->type==DEF_OBJECT){ 1263 1300 //利用対象のクラスコンストラクタ、デストラクタに使用チェックをつける -
BasicCompiler_Common/Variable.h
r62 r64 16 16 void GetOriginalTypeName(char *buffer); 17 17 BOOL GetTypeName(int type,LONG_PTR lpIndex,char *name); 18 bool FormatUseProcReturnObject( const char *term, char *procName, char *parameter, int &RefType, char *member );19 BOOL GetVarFormatString(char *buffer,char *array,char *array2,char *NestMember, int *pRefType);18 bool FormatUseProcReturnObject( const char *term, char *procName, char *parameter, CClass::RefType &refType, char *member ); 19 BOOL GetVarFormatString(char *buffer,char *array,char *array2,char *NestMember, CClass::RefType &refType ); 20 20 void GetArrayElement(char *buffer,char *variable,char *array_element); 21 21 BOOL CheckVarNameError(char *name,int NowLine); -
BasicCompiler_Common/calculation.cpp
r55 r64 524 524 StrPtr[pnum][i2]=0; 525 525 526 type[pnum]=DEF_PTR_ BYTE;526 type[pnum]=DEF_PTR_CHAR; 527 527 before_index[pnum]=LITERAL_STRING; 528 528 } … … 538 538 StrPtr[pnum][i2]=0; 539 539 540 type[pnum]=DEF_PTR_ BYTE;540 type[pnum]=DEF_PTR_CHAR; 541 541 before_index[pnum]=LITERAL_STRING; 542 542 } 543 else if(IsVariableTopChar(Parms[0])||Parms[0]=='*' ){543 else if(IsVariableTopChar(Parms[0])||Parms[0]=='*'||(Parms[0]=='.'&&IsVariableTopChar(Parms[1]))){ 544 544 if(bDebuggingWatchList){ 545 545 ////////////////////////// … … 1187 1187 return -1; 1188 1188 } 1189 BOOL IsStringObjectType(TYPEINFO *pTypeInfo){1190 if( pTypeInfo->type==DEF_OBJECT){1191 if(lstrcmp( pTypeInfo->u.pobj_Class->name,"String")==0){1189 bool IsStringObjectType(const TYPEINFO &TypeInfo){ 1190 if(TypeInfo.type==DEF_OBJECT){ 1191 if(lstrcmp(TypeInfo.u.pobj_Class->name,"String")==0){ 1192 1192 return 1; 1193 1193 } … … 1209 1209 if(psi->ParmNum==2){ 1210 1210 TYPEINFO TypeInfo={psi->pParmInfo[1].type,psi->pParmInfo[1].u.index}; 1211 if(IsStringObjectType( &TypeInfo)){1211 if(IsStringObjectType( TypeInfo )){ 1212 1212 bRet=1; 1213 1213 goto finish; … … 1277 1277 TypeInfo.type=pdi->ReturnType; 1278 1278 TypeInfo.u.lpIndex=pdi->u.ReturnIndex; 1279 if(IsStringObjectType( &TypeInfo)) return 1;1279 if(IsStringObjectType( TypeInfo )) return 1; 1280 1280 return 0; 1281 1281 } … … 1287 1287 TypeInfo.type=psi->ReturnType; 1288 1288 TypeInfo.u.lpIndex=psi->u.ReturnIndex; 1289 if(IsStringObjectType( &TypeInfo)) return 1;1289 if(IsStringObjectType(TypeInfo)) return 1; 1290 1290 return 0; 1291 1291 } -
BasicCompiler_Common/common.h
r63 r64 546 546 BOOL GetConstCalcBuffer(char *name,char *Parameter,char *pCalcBuffer); 547 547 DWORD GetConstValue(char *name,double *dbl,char *buffer,LONG_PTR *plpIndex); 548 BOOL IsStringObjectType(TYPEINFO *pTypeInfo);548 bool IsStringObjectType(const TYPEINFO &TypeInfo); 549 549 BOOL IsStringSubsituation(CClass *pobj_c); 550 550 int IsStrCalculation(char *Command); … … 615 615 //error.cpp 616 616 void SetError(int ErrorNum,const char *KeyWord,int pos); 617 void SetError(); 617 618 void CompileMessage(char *buffer); 618 619 bool CheckDifferentType(const int VarType,const LONG_PTR lpVarIndex,const int CalcType,const LONG_PTR lpCalcIndex,const char *pszFuncName,const int ParmNum); -
BasicCompiler_Common/error.cpp
r59 r64 183 183 if(num==131) lstrcpy(msg,"Const定義されたメソッド内でクラスメンバへの書き込みアクセスはできません。"); 184 184 if(num==132) lstrcpy(msg,"明示的なコンストラクタ呼び出しと初期値の指定を同時に行うことはできません。"); 185 if(num==133) lstrcpy(msg,"Thisに代入はできません。"); 185 186 186 187 //Enum関連 … … 359 360 ErrorNum++; 360 361 } 362 void SetError(){ 363 SetError(300,NULL,cp); 364 } 361 365 void CompileMessage(char *buffer){ 362 366 SetError(-2,buffer,-1); … … 397 401 398 402 bool CheckDifferentType(const int VarType,const LONG_PTR lpVarIndex,int CalcType,const LONG_PTR lpCalcIndex,const char *pszFuncName,const int ParmNum){ 403 404 if(VarType==DEF_STRUCT||CalcType==DEF_STRUCT){ 405 //いずれかが構造体場合 406 if( VarType != CalcType || lpVarIndex != lpCalcIndex ){ 407 DifferentTypeError(VarType,lpVarIndex,CalcType,lpCalcIndex,3,pszFuncName,ParmNum); 408 return false; 409 } 410 } 399 411 400 412 if(VarType==DEF_OBJECT||CalcType==DEF_OBJECT){
Note:
See TracChangeset
for help on using the changeset viewer.