Changeset 40 in dev
- Timestamp:
- Jan 28, 2007, 3:48:22 AM (18 years ago)
- Files:
-
- 27 edited
Legend:
- Unmodified
- Added
- Removed
-
BasicCompiler32/Compile_Calc.cpp
r36 r40 600 600 } 601 601 } 602 603 void SetRefVariable( const char *varname, const char *expression ){ 604 //////////////////////////////////////// 605 // 変数のタイプ型を識別して、演算を行う 606 //////////////////////////////////////// 607 608 int VarType,CalcType; 609 LONG_PTR lpVarIndex,lpCalcIndex; 610 RELATIVE_VAR VarRelativeVar; 611 BOOL bCalcUseHeap; 612 613 //型を識別 614 VarType=GetVarType(varname,&lpVarIndex,0); 615 if(VarType==-1){ 616 SetError(300,NULL,cp); 617 return; 618 } 619 620 extern LONG_PTR ProcPtr_BaseIndex; 621 if(VarType==DEF_PTR_PROC) ProcPtr_BaseIndex=lpVarIndex; 622 else ProcPtr_BaseIndex=-1; 623 624 if(VarType==DEF_OBJECT){ 625 //代入演算のオーバーロード オペレータに備える 626 627 //変数アドレスを取得 628 if(!GetVarOffsetReadWrite( 629 varname, 630 &VarType, 631 &VarRelativeVar, 632 &lpVarIndex)) return; 633 634 SetVarPtrToEax(&VarRelativeVar); 635 636 //push eax 637 op_push(REG_EAX); 638 } 639 640 641 //NumOpe...(スタックに答えが格納される) 642 CalcType=NumOpe(expression,VarType,lpVarIndex,&lpCalcIndex,&bCalcUseHeap); 643 if(VarType==-1||CalcType==-1) return; 644 645 //変数アドレスを取得 646 if(!GetVarOffsetReadWrite( 647 varname, 648 &VarType, 649 &VarRelativeVar, 650 &lpVarIndex)) return; 651 652 if(VarType&FLAG_PTR){ 653 SetError(14,varname,cp); 654 return; 655 } 656 657 658 if( VarType == DEF_OBJECT && VarRelativeVar.dwKind == VAR_REFLOCAL ){ 659 // 参照型オブジェクトへの代入(初期化)はポインタ変数と同様の処理に値する 660 VarType = PTR_LEVEL_UP( VarType ); 661 662 VarRelativeVar.dwKind = VAR_LOCAL; 663 664 if( CalcType == DEF_OBJECT ){ 665 //右辺値が実体オブジェクトのときは、参照をコピー 666 CalcType = PTR_LEVEL_UP( DEF_OBJECT ); 667 } 668 } 669 else{ 670 SetError(300,NULL,cp); 671 } 672 673 674 ///////////////////////////////// 675 // 右辺、左辺の型チェックを行う 676 ///////////////////////////////// 677 678 CheckDifferentType(VarType,lpVarIndex,CalcType,lpCalcIndex,0,0); 679 680 681 ///////////////////////////////////////////////// 682 // スタックの内容を変数にコピーするコードを抽出 683 ///////////////////////////////////////////////// 684 685 if(VarType==DEF_BOOLEAN){ 686 //bool 687 SetBooleanVariable(CalcType,&VarRelativeVar); 688 } 689 else if(VarType==DEF_CHAR||VarType==DEF_BYTE){ 690 //8ビット整数型変数へスタックの内容を格納する 691 Set8Variable(CalcType,VarRelativeVar.dwKind,VarRelativeVar.offset,VarRelativeVar.bOffsetOffset); 692 } 693 else if(VarType==DEF_INTEGER||VarType==DEF_WORD){ 694 //16ビット整数型変数へスタックの内容を格納する 695 Set16Variable(CalcType,VarRelativeVar.dwKind,VarRelativeVar.offset,VarRelativeVar.bOffsetOffset); 696 } 697 else if(VarType==DEF_LONG||VarType==DEF_DWORD||IsPtrType(VarType)){ 698 //32ビット整数型変数へスタックの内容を格納する 699 if(VarType==DEF_LONG) 700 SetLongVariable(CalcType,VarRelativeVar.dwKind,VarRelativeVar.offset,VarRelativeVar.bOffsetOffset); 701 else 702 SetDWordVariable(CalcType,VarRelativeVar.dwKind,VarRelativeVar.offset,VarRelativeVar.bOffsetOffset); 703 } 704 else if(VarType==DEF_INT64||VarType==DEF_QWORD){ 705 //64ビット整数型変数へスタックの内容を格納する 706 SetInt64Variable(CalcType,&VarRelativeVar); 707 } 708 else if(VarType==DEF_DOUBLE){ 709 //Double型変数へスタックの内容を格納する 710 SetDoubleVariable(CalcType,VarRelativeVar.dwKind,VarRelativeVar.offset,VarRelativeVar.bOffsetOffset); 711 } 712 else if(VarType==DEF_SINGLE){ 713 //Single型変数へスタックの内容を格納する 714 SetSingleVariable(CalcType,VarRelativeVar.dwKind,VarRelativeVar.offset,VarRelativeVar.bOffsetOffset); 715 } 716 } -
BasicCompiler32/Compile_CallProc.cpp
r31 r40 337 337 } 338 338 339 if(psi->ReturnType==DEF_OBJECT ){339 if(psi->ReturnType==DEF_OBJECT && psi->isReturnRef == false ){ 340 340 //_System_ReturnObject(第一または第二パラメータのダミーを作成) 341 341 sprintf(temporary+lstrlen(temporary),"%c%c0,",1,ESC_BYVAL); … … 375 375 376 376 377 378 if(psi->ReturnType==DEF_OBJECT){ 377 if(psi->ReturnType==DEF_OBJECT && psi->isReturnRef == false){ 379 378 ////////////////////////////////////////////////////// 380 379 // 戻り値にオブジェクト インスタンスを持つ場合 -
BasicCompiler32/Compile_Object.cpp
r31 r40 75 75 } 76 76 } 77 int Operator_New(c har *Parameter,LONG_PTR *plpIndex){77 int Operator_New(const char *Parameter,LONG_PTR *plpIndex){ 78 78 char TypeName[VN_SIZE],CreateParameter[VN_SIZE],ObjectSize[VN_SIZE]; 79 79 int i,i2; -
BasicCompiler32/Compile_ProcOp.cpp
r36 r40 374 374 else temp=psi->name; 375 375 376 if(psi->ReturnType==DEF_OBJECT ){376 if(psi->ReturnType==DEF_OBJECT && psi->isReturnRef == false){ 377 377 //戻り値用オブジェクトのコンストラクタを呼び出す 378 378 if(psi->u.Return_pobj_c->ConstructorMemberSubIndex!=-1){ … … 383 383 else{ 384 384 //戻り値用の変数の定義 385 sprintf(temporary,"%s%c%c",temp,1,ESC_AS); 385 if( psi->isReturnRef ){ 386 sprintf(temporary,"%c%c",1,ESC_BYREF); 387 } 388 else temporary[0]=0; 389 390 sprintf(temporary+lstrlen(temporary),"%s%c%c",temp,1,ESC_AS); 386 391 GetTypeName(psi->ReturnType,psi->u.ReturnIndex,temporary+lstrlen(temporary)); 392 387 393 OpcodeDim(temporary,0); 388 394 } … … 514 520 else offset=0; 515 521 for(i3=0;i3<pobj_CompilingClass->iMemberNum;i3++){ 516 offset=GetSizeOfClassMember(pobj_CompilingClass,pobj_CompilingClass->ppobj_Member[i3]->name,NULL); 517 518 if(pobj_CompilingClass->ppobj_Member[i3]->TypeInfo.type==DEF_OBJECT){ 519 if(pobj_CompilingClass->ppobj_Member[i3]->TypeInfo.u.pobj_Class->ConstructorMemberSubIndex!=-1){ 520 i5=pobj_CompilingClass->ppobj_Member[i3]->TypeInfo.u.pobj_Class->ConstructorMemberSubIndex; 521 if(pobj_CompilingClass->ppobj_Member[i3]->TypeInfo.u.pobj_Class->ppobj_Method[i5]->psi->RealParmNum==1){ //Thisポインタを第一引数に持ち合わせるため、引数なしの場合はこの値が1になる 522 CMember *pMember = pobj_CompilingClass->ppobj_Member[i3]; 523 524 offset=GetSizeOfClassMember(pobj_CompilingClass,pMember->name,NULL); 525 526 if(pMember->TypeInfo.type==DEF_OBJECT){ 527 if(pMember->TypeInfo.u.pobj_Class->ConstructorMemberSubIndex!=-1){ 528 i5=pMember->TypeInfo.u.pobj_Class->ConstructorMemberSubIndex; 529 if(pMember->TypeInfo.u.pobj_Class->ppobj_Method[i5]->psi->RealParmNum==1){ //Thisポインタを第一引数に持ち合わせるため、引数なしの場合はこの値が1になる 522 530 523 531 MemberTypeSize= 524 GetTypeSize(p obj_CompilingClass->ppobj_Member[i3]->TypeInfo.type,525 p obj_CompilingClass->ppobj_Member[i3]->TypeInfo.u.lpIndex);532 GetTypeSize(pMember->TypeInfo.type, 533 pMember->TypeInfo.u.lpIndex); 526 534 527 535 MemberObjectNum= 528 JumpSubScripts(p obj_CompilingClass->ppobj_Member[i3]->SubScripts);536 JumpSubScripts(pMember->SubScripts); 529 537 530 538 for(i4=0;i4<MemberObjectNum;i4++){ … … 542 550 543 551 //call constructor 544 op_call(p obj_CompilingClass->ppobj_Member[i3]->TypeInfo.u.pobj_Class->ppobj_Method[i5]->psi);552 op_call(pMember->TypeInfo.u.pobj_Class->ppobj_Method[i5]->psi); 545 553 } 546 554 } … … 624 632 offset=GetTypeSize(DEF_OBJECT,(LONG_PTR)pobj_CompilingClass); 625 633 for(i3=pobj_CompilingClass->iMemberNum-1;i3>=0;i3--){ 634 CMember *pMember = pobj_CompilingClass->ppobj_Member[i3]; 635 626 636 MemberTypeSize= 627 GetTypeSize(p obj_CompilingClass->ppobj_Member[i3]->TypeInfo.type,628 p obj_CompilingClass->ppobj_Member[i3]->TypeInfo.u.lpIndex);637 GetTypeSize(pMember->TypeInfo.type, 638 pMember->TypeInfo.u.lpIndex); 629 639 630 640 MemberObjectNum= 631 JumpSubScripts(p obj_CompilingClass->ppobj_Member[i3]->SubScripts);641 JumpSubScripts(pMember->SubScripts); 632 642 633 643 offset-=MemberTypeSize*MemberObjectNum; 634 644 635 if(p obj_CompilingClass->ppobj_Member[i3]->TypeInfo.type==DEF_OBJECT){636 if(p obj_CompilingClass->ppobj_Member[i3]->TypeInfo.u.pobj_Class->DestructorMemberSubIndex!=-1){645 if(pMember->TypeInfo.type==DEF_OBJECT){ 646 if(pMember->TypeInfo.u.pobj_Class->DestructorMemberSubIndex!=-1){ 637 647 for(i4=MemberObjectNum-1;i4>=0;i4--){ 638 648 //Thisポインタをecxにコピー … … 649 659 650 660 //call destructor 651 i5=p obj_CompilingClass->ppobj_Member[i3]->TypeInfo.u.pobj_Class->DestructorMemberSubIndex;652 op_call(p obj_CompilingClass->ppobj_Member[i3]->TypeInfo.u.pobj_Class->ppobj_Method[i5]->psi);661 i5=pMember->TypeInfo.u.pobj_Class->DestructorMemberSubIndex; 662 op_call(pMember->TypeInfo.u.pobj_Class->ppobj_Method[i5]->psi); 653 663 } 654 664 } -
BasicCompiler32/Compile_Statement.cpp
r36 r40 1359 1359 else temp=pCompilingSubInfo->name; 1360 1360 1361 char temporary[VN_SIZE]; 1362 sprintf(temporary,"%s=%s",temp,Parameter); 1363 OpcodeCalc(temporary); 1361 if( pCompilingSubInfo->isReturnRef ){ 1362 //参照型 1363 SetRefVariable( temp, Parameter ); 1364 } 1365 else{ 1366 //値型 1367 char temporary[VN_SIZE]; 1368 sprintf(temporary,"%s=%s",temp,Parameter); 1369 OpcodeCalc(temporary); 1370 } 1364 1371 } 1365 1372 -
BasicCompiler32/Compile_Var.cpp
r36 r40 179 179 } 180 180 181 CMember *pMember=pobj_c->ppobj_Member[i]; 182 181 183 //アクセシビリティをチェック 182 184 if(pobj_c==pobj_CompilingClass){ 183 185 //同一クラスオブジェクトの場合はプライベートアクセスを容認する 184 if(p obj_c->ppobj_Member[i]->dwAccess==ACCESS_NON){186 if(pMember->dwAccess==ACCESS_NON){ 185 187 if(isErrorEnabled) SetError(107,VarName,cp); 186 188 return 0; … … 188 190 } 189 191 else{ 190 if((bPrivateAccess==0&&p obj_c->ppobj_Member[i]->dwAccess==ACCESS_PRIVATE)||191 p obj_c->ppobj_Member[i]->dwAccess==ACCESS_NON){192 if((bPrivateAccess==0&&pMember->dwAccess==ACCESS_PRIVATE)|| 193 pMember->dwAccess==ACCESS_NON){ 192 194 if(isErrorEnabled) SetError(107,VarName,cp); 193 195 return 0; 194 196 } 195 else if(bPrivateAccess==0&&p obj_c->ppobj_Member[i]->dwAccess==ACCESS_PROTECTED){197 else if(bPrivateAccess==0&&pMember->dwAccess==ACCESS_PROTECTED){ 196 198 if(isErrorEnabled) SetError(108,VarName,cp); 197 199 return 0; … … 201 203 //Const定義の場合は書き込みアクセスを制限する 202 204 //※コンストラクタをコンパイル中の場合は例外的に許可する 203 if( p obj_c->ppobj_Member[i]->IsConst() && //定数メンバである205 if( pMember->IsConst() && //定数メンバである 204 206 isWriteAccess && //書き込みアクセスを要求されている 205 207 pobj_c->IsCompilingConstructor() == false //コンストラクタ コンパイル中を除く … … 209 211 } 210 212 211 *pType=p obj_c->ppobj_Member[i]->TypeInfo.type;212 *plpNestIndex=p obj_c->ppobj_Member[i]->TypeInfo.u.lpIndex;213 *pType=pMember->TypeInfo.type; 214 *plpNestIndex=pMember->TypeInfo.u.lpIndex; 213 215 214 216 //ポインタ変数の場合 215 217 if(IsPtrType(*pType)){ 216 if(p obj_c->ppobj_Member[i]->SubScripts[0]==-1){218 if(pMember->SubScripts[0]==-1){ 217 219 lstrcpy(lpPtrOffset,array); 218 220 array[0]=0; … … 236 238 if(array[0]){ 237 239 //配列オフセット 238 if(!GetArrayOffset(p obj_c->ppobj_Member[i]->SubScripts,array,*pType,pobj_c->ppobj_Member[i]->TypeInfo.u.lpIndex))240 if(!GetArrayOffset(pMember->SubScripts,array,*pType,pMember->TypeInfo.u.lpIndex)) 239 241 if(isErrorEnabled) SetError(14,member,cp); 240 242 } 241 else if(p obj_c->ppobj_Member[i]->SubScripts[0]!=-1){243 else if(pMember->SubScripts[0]!=-1){ 242 244 *pType|=FLAG_PTR; 243 245 } … … 320 322 isErrorEnabled, 321 323 isWriteAccess, 322 p obj_c->ppobj_Member[i]->TypeInfo.u.pobj_Class,324 pMember->TypeInfo.u.pobj_Class, 323 325 NestMember, 324 326 pType, … … 357 359 } 358 360 359 BOOL GetVarOffset(bool isErrorEnabled, bool isWriteAccess, c har *NameBuffer, int *pType, RELATIVE_VAR *pRelativeVar, LONG_PTR *plpIndex, int *pss){361 BOOL GetVarOffset(bool isErrorEnabled, bool isWriteAccess, const char *NameBuffer, int *pType, RELATIVE_VAR *pRelativeVar, LONG_PTR *plpIndex, int *pss){ 360 362 extern BOOL bCompilingGlobal; 361 363 int i,RefType; … … 907 909 /////////////////////////////////////// 908 910 909 if( type == DEF_OBJECT){910 //オブジェクトの場合はありえない911 SetError(300,NULL,cp);912 return 0;913 }914 915 911 if(SubScripts[0]!=-1){ 916 912 SetError(41,0,cp); … … 1064 1060 } 1065 1061 1066 void dim(char *Parameter,DWORD dwFlag ){1062 void dim(char *Parameter,DWORD dwFlags){ 1067 1063 extern BOOL bCompilingGlobal; 1068 1064 extern HANDLE hHeap; … … 1071 1067 1072 1068 1073 if(dwFlag & DIMFLAG_CONST){ 1069 //参照型かどうか 1070 bool isRef = false; 1071 1072 i2 = 0; 1073 1074 if( Parameter[i2] == 1 && Parameter[i2+1] == ESC_BYREF ){ 1075 //参照型 1076 isRef = true; 1077 Parameter += 2; 1078 } 1079 1080 1081 if(dwFlags & DIMFLAG_CONST){ 1074 1082 ////////////////////////////////// 1075 1083 // 定数変数の場合を考慮 1076 1084 ////////////////////////////////// 1077 for( i2=0;;i2++){1085 for(;;i2++){ 1078 1086 if(Parameter[i2] == '=' || 1079 1087 Parameter[i2] == 1 && Parameter[i2] == ESC_AS || … … 1102 1110 char InitBuf[8192]; 1103 1111 char ConstractParameter[VN_SIZE]; 1104 if(!GetDimentionFormat(Parameter, VarName,SubScripts,&TypeInfo,InitBuf,ConstractParameter))1112 if(!GetDimentionFormat(Parameter, isRef, VarName,SubScripts,&TypeInfo,InitBuf,ConstractParameter)) 1105 1113 return; 1106 1114 … … 1123 1131 TypeSize=GetTypeSize(TypeInfo.type,TypeInfo.u.lpIndex); 1124 1132 1125 if(dwFlag &DIMFLAG_STATIC){1133 if(dwFlags&DIMFLAG_STATIC){ 1126 1134 if(bCompilingGlobal){ 1127 1135 SetError(60,NULL,cp); … … 1137 1145 GetNowStaticVarFullName(VarName,temporary); 1138 1146 1139 AddGlobalVariable(temporary,SubScripts,&TypeInfo,TypeSize,InitBuf,ConstractParameter,dwFlag );1147 AddGlobalVariable(temporary,SubScripts,&TypeInfo,TypeSize,InitBuf,ConstractParameter,dwFlags); 1140 1148 1141 1149 /* … … 1150 1158 ///////////////////////// 1151 1159 1152 AddGlobalVariable(VarName,SubScripts,&TypeInfo,TypeSize,InitBuf,ConstractParameter,dwFlag );1160 AddGlobalVariable(VarName,SubScripts,&TypeInfo,TypeSize,InitBuf,ConstractParameter,dwFlags); 1153 1161 } 1154 1162 else{ … … 1168 1176 1169 1177 LocalVar=(VARIABLE *)HeapReAlloc(hHeap,0,LocalVar,(MaxLocalVarNum+1)*sizeof(VARIABLE)); 1178 VARIABLE *pVar = &LocalVar[MaxLocalVarNum]; 1179 MaxLocalVarNum++; 1180 1181 if( isRef ){ 1182 //参照型 1183 pVar->fRef = REF_VARIABLE; 1184 TypeSize = PTR_SIZE; 1185 } 1186 else pVar->fRef=0; 1170 1187 1171 1188 for(i2=1,i3=0;i3<255;i3++){ 1172 1189 //配列要素数 1173 LocalVar[MaxLocalVarNum].SubScripts[i3]=SubScripts[i3];1190 pVar->SubScripts[i3]=SubScripts[i3]; 1174 1191 1175 1192 if(SubScripts[i3]==-1) break; … … 1179 1196 if(VarSize%4) VarSize+=4-(VarSize%4); 1180 1197 1181 VARIABLE *pVar = &LocalVar[MaxLocalVarNum];1182 1183 MaxLocalVarNum++;1184 1185 1198 //変数データを追加 1186 1199 lstrcpy(pVar->name,VarName); 1187 pVar->fRef=0; 1188 if(dwFlag & DIMFLAG_CONST) pVar->bConst = true; 1200 if(dwFlags & DIMFLAG_CONST) pVar->bConst = true; 1189 1201 else pVar->bConst = false; 1190 1202 if(SubScripts[0]==-1) pVar->bArray=0; … … 1212 1224 1213 1225 if(!result){ 1214 //動的な式だった場合は代入演算を行う 1215 char temporary[8192]; 1216 sprintf(temporary,"%s=%s",VarName,InitBuf); 1217 OpcodeCalc(temporary); 1226 if( isRef ){ 1227 SetRefVariable( VarName, InitBuf ); 1228 } 1229 else{ 1230 char temporary[8192]; 1231 sprintf(temporary,"%s=%s",VarName,InitBuf); 1232 OpcodeCalc(temporary); 1233 } 1218 1234 } 1219 1235 … … 1252 1268 1253 1269 //コンストラクタ呼び出し 1254 if(TypeInfo.type==DEF_OBJECT&&(dwFlag &DIMFLAG_NONCALL_CONSTRACTOR)==0){1270 if(TypeInfo.type==DEF_OBJECT&&(dwFlags&DIMFLAG_NONCALL_CONSTRACTOR)==0&& isRef == false ){ 1255 1271 CallConstractor(VarName,SubScripts,TypeInfo,ConstractParameter); 1256 1272 } … … 1264 1280 } 1265 1281 } 1266 void OpcodeDim(char *Parameter,DWORD dwFlag ){1282 void OpcodeDim(char *Parameter,DWORD dwFlags){ 1267 1283 int i,i2,i3,IsStr=0; 1268 1284 char temporary[8192]; … … 1286 1302 temporary[i2]=0; 1287 1303 1288 dim(temporary,dwFlag );1304 dim(temporary,dwFlags); 1289 1305 1290 1306 if(Parameter[i]=='\0') break; -
BasicCompiler32/NumOpe.cpp
r38 r40 113 113 114 114 115 int NumOpe(c har *Command,int BaseType,LONG_PTR lpBaseIndex,LONG_PTR *plpIndex,BOOL *pbUseHeap){115 int NumOpe(const char *Command,int BaseType,LONG_PTR lpBaseIndex,LONG_PTR *plpIndex,BOOL *pbUseHeap){ 116 116 extern HANDLE hHeap; 117 117 int i,i2,i3,i4; -
BasicCompiler32/Opcode.h
r38 r40 95 95 void ChangeTypeToByte(int OldType); 96 96 void OpcodeCalc(char *Command); 97 void SetRefVariable( const char *varname, const char *expression ); 97 98 98 99 //NumOpe.cpp 99 100 void PushReturnValue(int type); 100 int NumOpe(c har *Command,int BaseType,LONG_PTR lpBaseIndex,LONG_PTR *plpIndex,BOOL *pbUseHeap=0);101 int NumOpe(const char *Command,int BaseType,LONG_PTR lpBaseIndex,LONG_PTR *plpIndex,BOOL *pbUseHeap=0); 101 102 102 103 //NumOpe_Arithmetic.cpp … … 167 168 168 169 //Compile_Object.cpp 169 int Operator_New(c har *Parameter,LONG_PTR *plpIndex);170 int Operator_New(const char *Parameter,LONG_PTR *plpIndex); 170 171 void OpcodeDelete(char *Parameter); 171 172 … … 173 174 void GetWithName(char *buffer); 174 175 void SetThisPtrToReg(int reg); 175 BOOL GetVarOffset(bool isErrorEnabled,bool isWriteAccess,c har *NameBuffer,int *pType,RELATIVE_VAR *pRelativeVar,LONG_PTR *plpIndex,int *pss=0);176 BOOL GetVarOffset(bool isErrorEnabled,bool isWriteAccess,const char *NameBuffer,int *pType,RELATIVE_VAR *pRelativeVar,LONG_PTR *plpIndex,int *pss=0); 176 177 BOOL SetInitGlobalData(int offset,int type,LONG_PTR lpIndex,int *SubScripts,char *InitBuf); 177 178 #define DIMFLAG_INITDEBUGVAR 1 -
BasicCompiler64/Compile_Calc.cpp
r36 r40 237 237 SetVariableFromRax(VarType,CalcType,&VarRelativeVar); 238 238 } 239 240 void SetRefVariable( const char *varname, const char *expression ){ 241 //////////////////////////////////////// 242 // 変数のタイプ型を識別して、演算を行う 243 //////////////////////////////////////// 244 245 int VarType,CalcType; 246 LONG_PTR lpVarIndex,lpCalcIndex; 247 BOOL bCalcUseHeap; 248 249 //型を識別 250 VarType=GetVarType(varname,&lpVarIndex,0); 251 if(VarType==-1){ 252 SetError(300,NULL,cp); 253 return; 254 } 255 256 extern LONG_PTR ProcPtr_BaseIndex; 257 if(VarType==DEF_PTR_PROC) ProcPtr_BaseIndex=lpVarIndex; 258 else ProcPtr_BaseIndex=-1; 259 260 //NumOpe...(rax、またはxmm0に答えが格納される) 261 int reg=REG_RAX; 262 CalcType=NumOpe(®,expression,VarType,lpVarIndex,&lpCalcIndex,&bCalcUseHeap); 263 264 //結果を格納しているレジスタをブロッキング 265 pobj_BlockReg->lock(reg); 266 267 if(VarType==-1||CalcType==-1) return; 268 269 //変数アドレスを取得 270 RELATIVE_VAR VarRelativeVar; 271 if(!GetVarOffsetReadWrite( 272 varname, 273 &VarType, 274 &VarRelativeVar, 275 &lpVarIndex)) return; 276 277 //レジスタのブロッキングを解除 278 pobj_BlockReg->clear(); 279 280 if(VarType&FLAG_PTR){ 281 SetError(14,varname,cp); 282 return; 283 } 284 285 if( VarType == DEF_OBJECT && VarRelativeVar.dwKind == VAR_REFLOCAL ){ 286 // 参照型オブジェクトへの代入(初期化)はポインタ変数と同様の処理に値する 287 VarType = PTR_LEVEL_UP( VarType ); 288 289 VarRelativeVar.dwKind = VAR_LOCAL; 290 291 if( CalcType == DEF_OBJECT ){ 292 //右辺値が実体オブジェクトのときは、参照をコピー 293 CalcType = PTR_LEVEL_UP( DEF_OBJECT ); 294 } 295 } 296 else{ 297 SetError(300,NULL,cp); 298 } 299 300 301 ///////////////////////////////// 302 // 右辺、左辺の型チェックを行う 303 ///////////////////////////////// 304 305 CheckDifferentType(VarType,lpVarIndex,CalcType,lpCalcIndex,0,0); 306 307 308 ///////////////////////////////////////////////// 309 // rax(実数はxmm0)の内容を変数にコピー 310 ///////////////////////////////////////////////// 311 SetVariableFromRax(VarType,CalcType,&VarRelativeVar); 312 } -
BasicCompiler64/Compile_Calc_PushVar.cpp
r3 r40 53 53 } 54 54 } 55 else if( pRelativeVar->dwKind==VAR_REFLOCAL){55 else if( pRelativeVar->dwKind == VAR_REFLOCAL ){ 56 56 if(pRelativeVar->bOffsetOffset){ 57 57 //add r11,qword ptr[rsp+offset] … … 134 134 } 135 135 } 136 else if( pRelativeVar->dwKind==VAR_REFLOCAL){136 else if( pRelativeVar->dwKind == VAR_REFLOCAL ){ 137 137 if(pRelativeVar->bOffsetOffset){ 138 138 //add r11,qword ptr[rsp+offset] … … 204 204 } 205 205 } 206 else if( pRelativeVar->dwKind==VAR_REFLOCAL){206 else if( pRelativeVar->dwKind == VAR_REFLOCAL ){ 207 207 if(pRelativeVar->bOffsetOffset){ 208 208 //add r11,qword ptr[rsp+offset] -
BasicCompiler64/Compile_CallProc.cpp
r31 r40 339 339 } 340 340 341 if(psi->ReturnType==DEF_OBJECT ){341 if(psi->ReturnType==DEF_OBJECT && psi->isReturnRef == false ){ 342 342 //_System_ReturnObject(第一または第二パラメータのダミーを作成) 343 343 sprintf(temporary+lstrlen(temporary),"%c%c0,",1,ESC_BYVAL); … … 378 378 379 379 380 if(psi->ReturnType==DEF_OBJECT ){380 if(psi->ReturnType==DEF_OBJECT && psi->isReturnRef == false){ 381 381 ////////////////////////////////////////////////////// 382 382 // 戻り値にオブジェクト インスタンスを持つ場合 -
BasicCompiler64/Compile_ProcOp.cpp
r34 r40 461 461 else temp=psi->name; 462 462 463 if(psi->ReturnType==DEF_OBJECT ){463 if(psi->ReturnType==DEF_OBJECT && psi->isReturnRef == false){ 464 464 //戻り値用オブジェクトのコンストラクタを呼び出す 465 465 if(psi->u.Return_pobj_c->ConstructorMemberSubIndex!=-1){ … … 470 470 else{ 471 471 //戻り値用の変数の定義 472 sprintf(temporary,"%s%c%c",temp,1,ESC_AS); 472 if( psi->isReturnRef ){ 473 sprintf(temporary,"%c%c",1,ESC_BYREF); 474 } 475 else temporary[0]=0; 476 477 sprintf(temporary+lstrlen(temporary),"%s%c%c",temp,1,ESC_AS); 473 478 GetTypeName(psi->ReturnType,psi->u.ReturnIndex,temporary+lstrlen(temporary)); 479 474 480 OpcodeDim(temporary,0); 475 481 } … … 568 574 else offset=0; 569 575 for(i3=0;i3<pobj_CompilingClass->iMemberNum;i3++){ 576 CMember *pMember = pobj_CompilingClass->ppobj_Member[i3]; 570 577 MemberTypeSize= 571 GetTypeSize(p obj_CompilingClass->ppobj_Member[i3]->TypeInfo.type,572 p obj_CompilingClass->ppobj_Member[i3]->TypeInfo.u.lpIndex);578 GetTypeSize(pMember->TypeInfo.type, 579 pMember->TypeInfo.u.lpIndex); 573 580 574 581 MemberObjectNum= 575 JumpSubScripts(p obj_CompilingClass->ppobj_Member[i3]->SubScripts);576 577 offset=GetSizeOfClassMember(pobj_CompilingClass,p obj_CompilingClass->ppobj_Member[i3]->name,NULL);578 579 if(p obj_CompilingClass->ppobj_Member[i3]->TypeInfo.type==DEF_OBJECT){580 if(p obj_CompilingClass->ppobj_Member[i3]->TypeInfo.u.pobj_Class->ConstructorMemberSubIndex!=-1){581 i5=p obj_CompilingClass->ppobj_Member[i3]->TypeInfo.u.pobj_Class->ConstructorMemberSubIndex;582 if(p obj_CompilingClass->ppobj_Member[i3]->TypeInfo.u.pobj_Class->ppobj_Method[i5]->psi->RealParmNum==1){ //Thisポインタを第一引数に持ち合わせるため、引数なしの場合はこの値が1になる582 JumpSubScripts(pMember->SubScripts); 583 584 offset=GetSizeOfClassMember(pobj_CompilingClass,pMember->name,NULL); 585 586 if(pMember->TypeInfo.type==DEF_OBJECT && pMember->IsRef() == false){ 587 if(pMember->TypeInfo.u.pobj_Class->ConstructorMemberSubIndex!=-1){ 588 i5=pMember->TypeInfo.u.pobj_Class->ConstructorMemberSubIndex; 589 if(pMember->TypeInfo.u.pobj_Class->ppobj_Method[i5]->psi->RealParmNum==1){ //Thisポインタを第一引数に持ち合わせるため、引数なしの場合はこの値が1になる 583 590 for(i4=0;i4<MemberObjectNum;i4++){ 584 591 //Thisポインタをrcxにコピー … … 589 596 590 597 //call constructor 591 op_call(p obj_CompilingClass->ppobj_Member[i3]->TypeInfo.u.pobj_Class->ppobj_Method[i5]->psi);598 op_call(pMember->TypeInfo.u.pobj_Class->ppobj_Method[i5]->psi); 592 599 } 593 600 } … … 672 679 int MemberObjectNum; 673 680 for(i3=pobj_CompilingClass->iMemberNum-1;i3>=0;i3--){ 681 CMember *pMember = pobj_CompilingClass->ppobj_Member[i3]; 674 682 MemberTypeSize= 675 GetTypeSize(p obj_CompilingClass->ppobj_Member[i3]->TypeInfo.type,676 p obj_CompilingClass->ppobj_Member[i3]->TypeInfo.u.lpIndex);683 GetTypeSize(pMember->TypeInfo.type, 684 pMember->TypeInfo.u.lpIndex); 677 685 678 686 MemberObjectNum= 679 JumpSubScripts(p obj_CompilingClass->ppobj_Member[i3]->SubScripts);680 681 offset=GetSizeOfClassMember(pobj_CompilingClass,p obj_CompilingClass->ppobj_Member[i3]->name,NULL);682 683 if(p obj_CompilingClass->ppobj_Member[i3]->TypeInfo.type==DEF_OBJECT){684 if(p obj_CompilingClass->ppobj_Member[i3]->TypeInfo.u.pobj_Class->DestructorMemberSubIndex!=-1){687 JumpSubScripts(pMember->SubScripts); 688 689 offset=GetSizeOfClassMember(pobj_CompilingClass,pMember->name,NULL); 690 691 if(pMember->TypeInfo.type==DEF_OBJECT && pMember->IsRef() == false){ 692 if(pMember->TypeInfo.u.pobj_Class->DestructorMemberSubIndex!=-1){ 685 693 for(i4=MemberObjectNum-1;i4>=0;i4--){ 686 694 //Thisポインタをrcxにコピー … … 691 699 692 700 //call destructor 693 i5=p obj_CompilingClass->ppobj_Member[i3]->TypeInfo.u.pobj_Class->DestructorMemberSubIndex;694 op_call(p obj_CompilingClass->ppobj_Member[i3]->TypeInfo.u.pobj_Class->ppobj_Method[i5]->psi);701 i5=pMember->TypeInfo.u.pobj_Class->DestructorMemberSubIndex; 702 op_call(pMember->TypeInfo.u.pobj_Class->ppobj_Method[i5]->psi); 695 703 } 696 704 } -
BasicCompiler64/Compile_Set_Var.cpp
r36 r40 179 179 } 180 180 } 181 else if( pRelative->dwKind==VAR_REFLOCAL){181 else if( pRelative->dwKind == VAR_REFLOCAL ){ 182 182 if(pRelative->bOffsetOffset){ 183 183 //add r11,qword ptr[rsp+offset] … … 267 267 } 268 268 } 269 else if( pRelative->dwKind==VAR_REFLOCAL){269 else if( pRelative->dwKind == VAR_REFLOCAL ){ 270 270 if(pRelative->bOffsetOffset){ 271 271 //add r11,qword ptr[rsp+offset] … … 383 383 } 384 384 } 385 else if( pRelative->dwKind==VAR_REFLOCAL){385 else if( pRelative->dwKind == VAR_REFLOCAL ){ 386 386 if(pRelative->bOffsetOffset){ 387 387 //add r11,qword ptr[rsp+offset] -
BasicCompiler64/Compile_Statement.cpp
r36 r40 959 959 else temp=pCompilingSubInfo->name; 960 960 961 char temporary[VN_SIZE]; 962 sprintf(temporary,"%s=%s",temp,Parameter); 963 OpcodeCalc(temporary); 961 if( pCompilingSubInfo->isReturnRef ){ 962 //参照型 963 SetRefVariable( temp, Parameter ); 964 } 965 else{ 966 //値型 967 char temporary[VN_SIZE]; 968 sprintf(temporary,"%s=%s",temp,Parameter); 969 OpcodeCalc(temporary); 970 } 964 971 } 965 972 -
BasicCompiler64/Compile_Var.cpp
r36 r40 206 206 } 207 207 208 CMember *pMember=pobj_c->ppobj_Member[i]; 209 208 210 209 211 //アクセシビリティをチェック 210 212 if(pobj_c==pobj_CompilingClass){ 211 213 //同一クラスオブジェクトの場合はプライベートアクセスを容認する 212 if(p obj_c->ppobj_Member[i]->dwAccess==ACCESS_NON){214 if(pMember->dwAccess==ACCESS_NON){ 213 215 if(isErrorEnabled) SetError(107,VarName,cp); 214 216 return 0; … … 216 218 } 217 219 else{ 218 if((bPrivateAccess==0&&p obj_c->ppobj_Member[i]->dwAccess==ACCESS_PRIVATE)||219 p obj_c->ppobj_Member[i]->dwAccess==ACCESS_NON){220 if((bPrivateAccess==0&&pMember->dwAccess==ACCESS_PRIVATE)|| 221 pMember->dwAccess==ACCESS_NON){ 220 222 if(isErrorEnabled) SetError(107,VarName,cp); 221 223 return 0; 222 224 } 223 else if(bPrivateAccess==0&&p obj_c->ppobj_Member[i]->dwAccess==ACCESS_PROTECTED){225 else if(bPrivateAccess==0&&pMember->dwAccess==ACCESS_PROTECTED){ 224 226 if(isErrorEnabled) SetError(108,VarName,cp); 225 227 return 0; … … 229 231 //Const定義の場合は書き込みアクセスを制限する 230 232 //※コンストラクタをコンパイル中の場合は例外的に許可する 231 if( p obj_c->ppobj_Member[i]->IsConst() && //定数メンバである233 if( pMember->IsConst() && //定数メンバである 232 234 isWriteAccess && //書き込みアクセスを要求されている 233 235 pobj_c->IsCompilingConstructor() == false //コンストラクタ コンパイル中を除く … … 237 239 } 238 240 239 *pType=p obj_c->ppobj_Member[i]->TypeInfo.type;240 *plpNestIndex=p obj_c->ppobj_Member[i]->TypeInfo.u.lpIndex;241 *pType=pMember->TypeInfo.type; 242 *plpNestIndex=pMember->TypeInfo.u.lpIndex; 241 243 242 244 //ポインタ変数の場合 243 245 if(IsPtrType(*pType)){ 244 if(p obj_c->ppobj_Member[i]->SubScripts[0]==-1){246 if(pMember->SubScripts[0]==-1){ 245 247 lstrcpy(lpPtrOffset,array); 246 248 array[0]=0; … … 265 267 if(array[0]){ 266 268 //配列オフセット 267 if(!GetArrayOffset(p obj_c->ppobj_Member[i]->SubScripts,array,*pType,pobj_c->ppobj_Member[i]->TypeInfo.u.lpIndex)){269 if(!GetArrayOffset(pMember->SubScripts,array,*pType,pMember->TypeInfo.u.lpIndex)){ 268 270 if(isErrorEnabled) SetError(14,member,cp); 269 271 } 270 272 } 271 else if(p obj_c->ppobj_Member[i]->SubScripts[0]!=-1){273 else if(pMember->SubScripts[0]!=-1){ 272 274 *pType|=FLAG_PTR; 273 275 } … … 276 278 //入れ子構造の場合 277 279 278 if(*pType==DEF_OBJECT ){280 if(*pType==DEF_OBJECT && pMember->IsRef() == false){ 279 281 if(RefType!=DEF_OBJECT){ 280 282 if(isErrorEnabled) SetError(104,member,cp); … … 282 284 } 283 285 } 284 else if(*pType==DEF_PTR_OBJECT ){286 else if(*pType==DEF_PTR_OBJECT || ( *pType==DEF_OBJECT && pMember->IsRef() )){ 285 287 //構造体ポインタ型メンバ変数 286 288 287 289 if(lpPtrOffset[0]){ 288 290 //pObj[n].member 289 if( RefType!=DEF_OBJECT){291 if(*pType==DEF_PTR_OBJECT&&RefType!=DEF_OBJECT){ 290 292 if(isErrorEnabled) SetError(104,member,cp); 291 293 return 0; … … 300 302 else{ 301 303 //pObj->member 302 if( RefType!=DEF_PTR_OBJECT){304 if(*pType==DEF_PTR_OBJECT&&RefType!=DEF_PTR_OBJECT){ 303 305 if(isErrorEnabled) SetError(104,member,cp); 304 306 return 0; … … 347 349 isErrorEnabled, 348 350 isWriteAccess, 349 p obj_c->ppobj_Member[i]->TypeInfo.u.pobj_Class,351 pMember->TypeInfo.u.pobj_Class, 350 352 NestMember, 351 353 pType, … … 383 385 SetReg_WholeVariable(DEF_PTR_VOID,&RelativeVar,reg); 384 386 } 385 BOOL GetVarOffset(bool isErrorEnabled,bool isWriteAccess,c har *NameBuffer,int *pType,RELATIVE_VAR *pRelativeVar,LONG_PTR *plpIndex,int *pss){387 BOOL GetVarOffset(bool isErrorEnabled,bool isWriteAccess,const char *NameBuffer,int *pType,RELATIVE_VAR *pRelativeVar,LONG_PTR *plpIndex,int *pss){ 386 388 extern BOOL bCompilingGlobal; 387 389 int i,RefType; … … 432 434 pRelativeVar->offset=-LocalVar[i].offset; 433 435 pRelativeVar->bOffsetOffset=0; 434 if(LocalVar[i].fRef) pRelativeVar->dwKind=VAR_REFLOCAL; 436 if(LocalVar[i].fRef){ 437 // 参照型 438 pRelativeVar->dwKind = VAR_REFLOCAL; 439 } 435 440 else pRelativeVar->dwKind=VAR_LOCAL; 436 441 *pType=LocalVar[i].type; … … 1045 1050 1046 1051 1047 void dim(char *Parameter,DWORD dwFlag ){1052 void dim(char *Parameter,DWORD dwFlags){ 1048 1053 extern BOOL bCompilingGlobal; 1049 1054 extern HANDLE hHeap; … … 1051 1056 char VarName[VN_SIZE]; 1052 1057 1053 1054 if(dwFlag & DIMFLAG_CONST){ 1058 //参照型かどうか 1059 bool isRef = false; 1060 1061 i2 = 0; 1062 1063 if( Parameter[i2] == 1 && Parameter[i2+1] == ESC_BYREF ){ 1064 //参照型 1065 isRef = true; 1066 Parameter += 2; 1067 } 1068 1069 if(dwFlags & DIMFLAG_CONST){ 1070 1055 1071 ////////////////////////////////// 1056 1072 // 定数変数の場合を考慮 1057 1073 ////////////////////////////////// 1058 for( i2=0;;i2++){1074 for(;;i2++){ 1059 1075 if(Parameter[i2] == '=' || 1060 1076 Parameter[i2] == 1 && Parameter[i2] == ESC_AS || … … 1083 1099 char InitBuf[8192]; 1084 1100 char ConstractParameter[VN_SIZE]; 1085 if(!GetDimentionFormat(Parameter, VarName,SubScripts,&TypeInfo,InitBuf,ConstractParameter))1101 if(!GetDimentionFormat(Parameter, isRef , VarName,SubScripts,&TypeInfo,InitBuf,ConstractParameter)) 1086 1102 return; 1087 1103 … … 1104 1120 TypeSize=GetTypeSize(TypeInfo.type,TypeInfo.u.lpIndex); 1105 1121 1106 if(dwFlag &DIMFLAG_STATIC){1122 if(dwFlags&DIMFLAG_STATIC){ 1107 1123 if(bCompilingGlobal){ 1108 1124 SetError(60,NULL,cp); … … 1118 1134 GetNowStaticVarFullName(VarName,temporary); 1119 1135 1120 AddGlobalVariable(temporary,SubScripts,&TypeInfo,TypeSize,InitBuf,ConstractParameter,dwFlag );1136 AddGlobalVariable(temporary,SubScripts,&TypeInfo,TypeSize,InitBuf,ConstractParameter,dwFlags); 1121 1137 1122 1138 /* … … 1131 1147 ///////////////////////// 1132 1148 1133 AddGlobalVariable(VarName,SubScripts,&TypeInfo,TypeSize,InitBuf,ConstractParameter,dwFlag );1149 AddGlobalVariable(VarName,SubScripts,&TypeInfo,TypeSize,InitBuf,ConstractParameter,dwFlags); 1134 1150 } 1135 1151 else{ … … 1149 1165 1150 1166 LocalVar=(VARIABLE *)HeapReAlloc(hHeap,0,LocalVar,(MaxLocalVarNum+1)*sizeof(VARIABLE)); 1167 VARIABLE *pVar = &LocalVar[MaxLocalVarNum]; 1168 MaxLocalVarNum++; 1169 1170 if( isRef ){ 1171 //参照型 1172 pVar->fRef = REF_VARIABLE; 1173 TypeSize = PTR_SIZE; 1174 } 1175 else pVar->fRef=0; 1151 1176 1152 1177 for(i2=1,i3=0;i3<255;i3++){ 1153 1178 //配列要素数 1154 LocalVar[MaxLocalVarNum].SubScripts[i3]=SubScripts[i3];1179 pVar->SubScripts[i3]=SubScripts[i3]; 1155 1180 1156 1181 if(SubScripts[i3]==-1) break; … … 1160 1185 if(VarSize%8) VarSize+=8-(VarSize%8); 1161 1186 1162 VARIABLE *pVar = &LocalVar[MaxLocalVarNum];1163 1164 MaxLocalVarNum++;1165 1166 1187 //変数データを追加 1167 1188 lstrcpy(pVar->name,VarName); 1168 pVar->fRef=0; 1169 if(dwFlag & DIMFLAG_CONST) pVar->bConst = true; 1189 if(dwFlags & DIMFLAG_CONST) pVar->bConst = true; 1170 1190 else pVar->bConst = false; 1171 1191 if(SubScripts[0]==-1) pVar->bArray=0; … … 1194 1214 if(!result){ 1195 1215 //動的な式だった場合は代入演算を行う 1196 char temporary[8192]; 1197 sprintf(temporary,"%s=%s",VarName,InitBuf); 1198 OpcodeCalc(temporary); 1216 if( isRef ){ 1217 SetRefVariable( VarName, InitBuf ); 1218 } 1219 else{ 1220 char temporary[8192]; 1221 sprintf(temporary,"%s=%s",VarName,InitBuf); 1222 OpcodeCalc(temporary); 1223 } 1199 1224 } 1200 1225 … … 1227 1252 1228 1253 //コンストラクタ呼び出し 1229 if(TypeInfo.type==DEF_OBJECT&&(dwFlag &DIMFLAG_NONCALL_CONSTRACTOR)==0){1254 if(TypeInfo.type==DEF_OBJECT&&(dwFlags&DIMFLAG_NONCALL_CONSTRACTOR)==0&& isRef == false ){ 1230 1255 CallConstractor(VarName,SubScripts,TypeInfo,ConstractParameter); 1231 1256 } … … 1239 1264 } 1240 1265 } 1241 void OpcodeDim(char *Parameter,DWORD dwFlag ){1266 void OpcodeDim(char *Parameter,DWORD dwFlags){ 1242 1267 int i,i2,i3,IsStr=0; 1243 1268 char temporary[8192]; … … 1261 1286 temporary[i2]=0; 1262 1287 1263 dim(temporary,dwFlag );1288 dim(temporary,dwFlags); 1264 1289 1265 1290 if(Parameter[i]=='\0') break; … … 1322 1347 } 1323 1348 } 1324 else if( pRelativeVar->dwKind==VAR_REFLOCAL){1349 else if( pRelativeVar->dwKind == VAR_REFLOCAL ){ 1325 1350 if(pRelativeVar->bOffsetOffset){ 1326 1351 //add r11,qword ptr[rsp+offset] -
BasicCompiler64/Opcode.h
r38 r40 52 52 53 53 //変数の種類 54 #define NON_VAR 0 55 #define VAR_GLOBAL 1 //Global Variable 56 #define VAR_LOCAL 2 //Local Variable 57 #define VAR_REFLOCAL 3 //Local Refference Variable 58 #define VAR_DIRECTMEM 4 //Direct memory 54 #define NON_VAR 0 55 #define VAR_GLOBAL 1 //Global Variable 56 #define VAR_LOCAL 2 //Local Variable 57 #define VAR_REFLOCAL 3 //Local Refference Variable 58 #define VAR_DIRECTMEM 5 //Direct memory 59 59 60 60 61 extern int cp; … … 245 246 void SetVariableFromRax(int VarType,int CalcType,RELATIVE_VAR *pRelativeVar); 246 247 void OpcodeCalc(char *Command); 248 void SetRefVariable( const char *varname, const char *expression ); 247 249 248 250 //NumOpe.cpp … … 310 312 void GetWithName(char *buffer); 311 313 void SetThisPtrToReg(int reg); 312 BOOL GetVarOffset(bool isErrorEnabled,bool isWriteAccess,c har *NameBuffer,int *pType,RELATIVE_VAR *pRelativeVar,LONG_PTR *plpIndex,int *pss=0);314 BOOL GetVarOffset(bool isErrorEnabled,bool isWriteAccess,const char *NameBuffer,int *pType,RELATIVE_VAR *pRelativeVar,LONG_PTR *plpIndex,int *pss=0); 313 315 BOOL SetInitGlobalData(int offset,int type,LONG_PTR lpIndex,int *SubScripts,char *InitBuf); 314 #define DIMFLAG_INITDEBUGVAR 1315 #define DIMFLAG_NONCALL_CONSTRACTOR 2316 #define DIMFLAG_STATIC 4317 #define DIMFLAG_CONST 8316 #define DIMFLAG_INITDEBUGVAR 0x01 317 #define DIMFLAG_NONCALL_CONSTRACTOR 0x02 318 #define DIMFLAG_STATIC 0x04 319 #define DIMFLAG_CONST 0x08 318 320 void OpcodeDim(char *Parameter,DWORD dwFlag); 319 321 void SetVarPtrToReg(int reg,RELATIVE_VAR *pRelativeVar); -
BasicCompiler64/WatchList.cpp
r3 r40 24 24 return pobj_dti->lplpSpBase[i2]+pRelativeVar->offset; 25 25 } 26 else if( pRelativeVar->dwKind==VAR_REFLOCAL){26 else if( pRelativeVar->dwKind == VAR_REFLOCAL ){ 27 27 extern HWND hDebugWnd; 28 28 i2=(int)SendDlgItemMessage(hDebugWnd,IDC_PROCCOMBO,CB_GETCURSEL,0,0); -
BasicCompiler_Common/BasicFixed.h
r36 r40 54 54 #define NATURAL_TYPE(t) ((t)&MASK_NATURAL) 55 55 #define MAKE_PTR_TYPE(t,p) ((t)|((p)<<8)) 56 #define PTR_LEVEL_UP(t) MAKE_PTR_TYPE(NATURAL_TYPE(t),PTR_LEVEL(t)+1) 56 57 57 58 #define DEF_PTR_BYTE MAKE_PTR_TYPE(DEF_BYTE,1) … … 168 169 #define ESC_ENDTRY 'm' //End Try 169 170 //EXEファイル用制御エスケープシーケンス 170 #define ESC_USING ' n' //Print命令語のUsing171 #define ESC_FOR ' o' //Open命令語のFor172 #define ESC_LINENUM ' p' //行番号を示す171 #define ESC_USING 'o' //Print命令語のUsing 172 #define ESC_FOR 'p' //Open命令語のFor 173 #define ESC_LINENUM 'q' //行番号を示す 173 174 174 175 //オブジェクト指向エスケープシーケンス -
BasicCompiler_Common/Class.cpp
r31 r40 18 18 19 19 20 CMember::CMember( CClass *pobj_c, DWORD access, bool isConst, char *buffer, int NowLine ){20 CMember::CMember( CClass *pobj_c, DWORD access, bool isConst, bool isRef, char *buffer, int NowLine ){ 21 21 extern int cp; 22 22 … … 25 25 char init_buf[VN_SIZE]; 26 26 char constract_parameter[VN_SIZE]; 27 GetDimentionFormat(buffer, VarName,SubScripts,&TypeInfo,init_buf,constract_parameter);27 GetDimentionFormat(buffer,isRef,VarName,SubScripts,&TypeInfo,init_buf,constract_parameter); 28 28 29 29 //重複チェック … … 49 49 this->isConst = isConst; 50 50 51 //参照型かどうか 52 this->isRef = isRef; 53 51 54 //初期データ 52 55 InitBuf=(char *)HeapAlloc(hHeap,0,lstrlen(init_buf)+1); … … 70 73 //定数扱いかどうか 71 74 isConst = pobj->isConst; 75 76 //参照型かどうか 77 isRef = pobj->isRef; 72 78 73 79 //SubScripts … … 91 97 bool CMember::IsConst(){ 92 98 return isConst; 99 } 100 bool CMember::IsRef(){ 101 return isRef; 102 } 103 104 int CMember::GetSize(){ 105 if( IsRef() ){ 106 // 参照型 107 return PTR_SIZE; 108 } 109 110 //メンバサイズを取得 111 return GetTypeSize(TypeInfo.type,TypeInfo.u.lpIndex); 93 112 } 94 113 … … 264 283 pobj_InheritsClass = pInheritsClass; 265 284 } 266 void CClass::AddMember( DWORD dwAccess, bool isConst, char *buffer ){285 void CClass::AddMember( DWORD dwAccess, bool isConst, bool isRef, char *buffer ){ 267 286 ppobj_Member = (CMember **)HeapReAlloc( hHeap, 0, ppobj_Member, ( iMemberNum + 1 ) * sizeof(CMember *) ); 268 ppobj_Member[iMemberNum] = new CMember( this, dwAccess, isConst, buffer );287 ppobj_Member[iMemberNum] = new CMember( this, dwAccess, isConst, isRef, buffer ); 269 288 iMemberNum++; 270 289 } 271 void CClass::AddStaticMember( DWORD dwAccess, bool isConst, char *buffer, int NowLine ){290 void CClass::AddStaticMember( DWORD dwAccess, bool isConst, bool isRef, char *buffer, int NowLine ){ 272 291 ppobj_StaticMember=(CMember **)HeapReAlloc(hHeap,0,ppobj_StaticMember,(iStaticMemberNum+1)*sizeof(CMember *)); 273 ppobj_StaticMember[iStaticMemberNum]=new CMember( this, dwAccess, isConst, buffer, NowLine );292 ppobj_StaticMember[iStaticMemberNum]=new CMember( this, dwAccess, isConst, isRef, buffer, NowLine ); 274 293 iStaticMemberNum++; 275 294 } … … 439 458 //コンポジションの関係にあるメンバも検査する 440 459 for(int i=0;i < iMemberNum;i++){ 441 if(ppobj_Member[i]->TypeInfo.type==DEF_OBJECT ){460 if(ppobj_Member[i]->TypeInfo.type==DEF_OBJECT && ppobj_Member[i]->IsRef() == false){ 442 461 if(ppobj_Member[i]->TypeInfo.u.pobj_Class->IsAbstract()) 443 462 return true; … … 809 828 int i,i2,bRet=1; 810 829 for(i=0;i<pobj_c->iMemberNum;i++){ 811 if(pobj_c->ppobj_Member[i]->TypeInfo.type==DEF_OBJECT){ 830 CMember *pMember = pobj_c->ppobj_Member[i]; 831 if(pMember->TypeInfo.type==DEF_OBJECT && pMember->IsRef()==false ){ 812 832 //循環参照でないかをチェック 813 if(pobj_LoopRefCheck->check(p obj_c->ppobj_Member[i]->TypeInfo.u.pobj_Class->name)){833 if(pobj_LoopRefCheck->check(pMember->TypeInfo.u.pobj_Class->name)){ 814 834 extern int cp; 815 SetError(12 3,pobj_c->ppobj_Member[i]->TypeInfo.u.pobj_Class->name,cp);835 SetError(124,pMember->TypeInfo.u.pobj_Class->name,cp); 816 836 return 0; 817 837 } … … 819 839 pobj_LoopRefCheck->add(pobj_c->name); 820 840 821 i2=MemberVar_LoopRefCheck(p obj_c->ppobj_Member[i]->TypeInfo.u.pobj_Class);841 i2=MemberVar_LoopRefCheck(pMember->TypeInfo.u.pobj_Class); 822 842 if(bRet==1) bRet=i2; 823 843 … … 1132 1152 } 1133 1153 1154 //Ref修飾子 1155 bool isRef = false; 1156 if( basbuf[i] == 1 && basbuf[i + 1] == ESC_BYREF ){ 1157 isRef = true; 1158 i += 2; 1159 } 1160 1134 1161 if(basbuf[i]==1&&( 1135 1162 basbuf[i+1]==ESC_ABSTRACT||basbuf[i+1]==ESC_VIRTUAL||basbuf[i+1]==ESC_OVERRIDE|| … … 1209 1236 //静的メンバを追加 1210 1237 cp=i; //エラー用 1211 pobj_c->AddStaticMember( dwAccess, isConst, temporary, i);1238 pobj_c->AddStaticMember( dwAccess, isConst, isRef, temporary, i); 1212 1239 } 1213 1240 else{ 1214 1241 //メンバを追加 1215 1242 cp=i; //エラー用 1216 pobj_c->AddMember( dwAccess, isConst, temporary );1243 pobj_c->AddMember( dwAccess, isConst, isRef, temporary ); 1217 1244 1218 1245 … … 1237 1264 } 1238 1265 else{ 1266 // 文法エラーチェック 1267 if( isRef ){ 1268 SetError(1,NULL,cp); 1269 } 1270 1239 1271 //メソッドを追加 1240 1272 cp=i; //エラー用 -
BasicCompiler_Common/Class.h
r29 r40 20 20 class CMember{ 21 21 bool isConst; 22 bool isRef; 22 23 public: 23 24 char *name; … … 33 34 34 35 35 CMember( CClass *pobj_c, DWORD access, bool idConst, char *buffer, int NowLine=-1 );36 CMember( CClass *pobj_c, DWORD access, bool idConst, bool isRef, char *buffer, int NowLine=-1 ); 36 37 CMember( CMember *pobj ); 37 38 CMember(); … … 39 40 40 41 bool IsConst(); 42 bool IsRef(); 43 int GetSize(); 41 44 42 45 … … 98 101 void Inherits( CClass *pInheritsClass ); 99 102 100 void AddMember( DWORD dwAccess, bool idConst, char *buffer );101 void AddStaticMember( DWORD dwAccess, bool isConst, char *buffer, int NowLine );103 void AddMember( DWORD dwAccess, bool idConst, bool isRef, char *buffer ); 104 void AddStaticMember( DWORD dwAccess, bool isConst, bool isRef, char *buffer, int NowLine ); 102 105 void AddMethod( SUBINFO *psi,DWORD dwAccess, bool isConst, BOOL bAbstract, BOOL bVirtual ); 103 106 void AddStaticMethod(SUBINFO *psi,DWORD dwAccess); -
BasicCompiler_Common/Intermediate_Step2.cpp
r37 r40 375 375 break; 376 376 case ESC_CONST: 377 case ESC_BYREF: 377 378 KillStringSpaces(Command+2); 378 379 break; -
BasicCompiler_Common/Object.cpp
r34 r40 17 17 18 18 for(i=0;i<pobj_c->iMemberNum;i++){ 19 if(pobj_c->ppobj_Member[i]->TypeInfo.type==DEF_OBJECT){ 19 CMember *pMember = pobj_c->ppobj_Member[i]; 20 21 if(pMember->TypeInfo.type==DEF_OBJECT && pMember->IsRef() == false){ 20 22 //メンバクラスのアラインメントを取得 21 member_size=GetAlignment(p obj_c->ppobj_Member[i]->TypeInfo.u.pobj_Class);23 member_size=GetAlignment(pMember->TypeInfo.u.pobj_Class); 22 24 } 23 25 else{ 24 26 //メンバサイズを取得 25 member_size =GetTypeSize(pobj_c->ppobj_Member[i]->TypeInfo.type,pobj_c->ppobj_Member[i]->TypeInfo.u.lpIndex);27 member_size = pMember->GetSize(); 26 28 } 27 29 … … 49 51 int iMaxAlign=0; 50 52 for(i=0;i<pobj_c->iMemberNum;i++){ 51 //メンバ変数の型サイズを取得52 i2=GetTypeSize(pobj_c->ppobj_Member[i]->TypeInfo.type,pobj_c->ppobj_Member[i]->TypeInfo.u.lpIndex); 53 i f(i2==-1) return -1;53 CMember *pMember = pobj_c->ppobj_Member[i]; 54 55 i2 = pMember->GetSize(); 54 56 55 57 //アラインメントを算出 56 58 int member_size; 57 if(p obj_c->ppobj_Member[i]->TypeInfo.type==DEF_OBJECT){59 if(pMember->TypeInfo.type==DEF_OBJECT){ 58 60 //メンバクラスのアラインメントを取得 59 member_size=GetAlignment(p obj_c->ppobj_Member[i]->TypeInfo.u.pobj_Class);61 member_size=GetAlignment(pMember->TypeInfo.u.pobj_Class); 60 62 } 61 63 else{ … … 83 85 if(pMemberName){ 84 86 //メンバ指定がある場合は、オフセットを返す 85 if(lstrcmp(p obj_c->ppobj_Member[i]->name,pMemberName)==0){87 if(lstrcmp(pMember->name,pMemberName)==0){ 86 88 if(pMemberNum) *pMemberNum=i; 87 89 return offset; … … 90 92 91 93 //配列を考慮したメンバサイズを取得 92 member_size=i2 * JumpSubScripts(p obj_c->ppobj_Member[i]->SubScripts);94 member_size=i2 * JumpSubScripts(pMember->SubScripts); 93 95 94 96 //メンバサイズを加算 -
BasicCompiler_Common/Subroutine.cpp
r38 r40 687 687 /////////////////// 688 688 689 psi->isReturnRef = false; 690 689 691 if(pobj_c){ 690 692 if(lstrcmp(psi->name,pobj_c->name)==0|| … … 701 703 for(;i2>0;i2--){ 702 704 if(buffer[i2]==')') break; 705 703 706 if(buffer[i2]==1&&buffer[i2+1]==ESC_AS){ 707 if( buffer[i2-2] == 1 && buffer[i2-1] == ESC_BYREF ){ 708 //参照型 709 psi->isReturnRef = true; 710 } 711 704 712 i2+=2; 705 713 i3=0; … … 1033 1041 } 1034 1042 1035 if(psi->ReturnType==DEF_OBJECT ){1043 if(psi->ReturnType==DEF_OBJECT && psi->isReturnRef == false){ 1036 1044 i = psi->RealParmNum; 1037 1045 -
BasicCompiler_Common/Variable.cpp
r36 r40 629 629 return type; 630 630 } 631 int GetVarType(c har *NameBuffer,LONG_PTR *plpIndex,BOOL bError){631 int GetVarType(const char *NameBuffer,LONG_PTR *plpIndex,BOOL bError){ 632 632 extern BOOL bCompilingGlobal; 633 633 int i; … … 840 840 } 841 841 842 BOOL GetVarOffsetReadOnly(c har *NameBuffer,int *pType,RELATIVE_VAR *pRelativeVar,LONG_PTR *plpIndex,int *pss){842 BOOL GetVarOffsetReadOnly(const char *NameBuffer,int *pType,RELATIVE_VAR *pRelativeVar,LONG_PTR *plpIndex,int *pss){ 843 843 //読み取り専用で変数へアクセス 844 844 return GetVarOffset( … … 851 851 pss); 852 852 } 853 BOOL GetVarOffsetReadWrite(c har *NameBuffer,int *pType,RELATIVE_VAR *pRelativeVar,LONG_PTR *plpIndex,int *pss){853 BOOL GetVarOffsetReadWrite(const char *NameBuffer,int *pType,RELATIVE_VAR *pRelativeVar,LONG_PTR *plpIndex,int *pss){ 854 854 //読み書き両用で変数へアクセス 855 855 return GetVarOffset( … … 865 865 866 866 867 BOOL GetDimentionFormat(c har *buffer,char *VarName,int *SubScripts,TYPEINFO *pTypeInfo,char *InitBuf,char *ConstractParameter){867 BOOL GetDimentionFormat(const char *buffer, const bool isRef, char *VarName,int *SubScripts,TYPEINFO *pTypeInfo,char *InitBuf,char *ConstractParameter){ 868 868 int i,i2,i3,IsStr; 869 869 char variable[VN_SIZE],temporary[8192]; … … 998 998 else{ 999 999 //初期値の型を判別して自動的に型情報を付加する 1000 1001 1000 TYPEINFO BaseType = GetStringTypeInfo(); 1002 1001 int result = NumOpe_GetType( InitBuf, &BaseType, &pTypeInfo->u.lpIndex ); … … 1015 1014 } 1016 1015 1017 if( pTypeInfo->type == DEF_OBJECT && InitBuf[0] != '\0' && InitBuf[0] != '[' ){1016 if( pTypeInfo->type == DEF_OBJECT && InitBuf[0] != '\0' && InitBuf[0] != '[' && isRef == false ){ 1018 1017 lstrcpy( ConstractParameter, InitBuf ); 1019 1018 InitBuf[0] = 0; -
BasicCompiler_Common/Variable.h
r10 r40 22 22 void GetArrange(char *variable,char *variAnswer,int *SubScripts); 23 23 int GetTypeFromSimpleName(char *variable); 24 int GetVarType(c har *NameBuffer,LONG_PTR *plpIndex,BOOL bError);25 BOOL GetVarOffsetReadOnly(c har *NameBuffer,int *pType,RELATIVE_VAR *pRelativeVar,LONG_PTR *plpIndex,int *pss=0);26 BOOL GetVarOffsetReadWrite(c har *NameBuffer,int *pType,RELATIVE_VAR *pRelativeVar,LONG_PTR *plpIndex,int *pss=0);27 BOOL GetDimentionFormat(c har *buffer,char *VarName,int *SubScripts,TYPEINFO *pTypeInfo,char *InitBuf,char *ConstractParameter);24 int GetVarType(const char *NameBuffer,LONG_PTR *plpIndex,BOOL bError); 25 BOOL GetVarOffsetReadOnly(const char *NameBuffer,int *pType,RELATIVE_VAR *pRelativeVar,LONG_PTR *plpIndex,int *pss=0); 26 BOOL GetVarOffsetReadWrite(const char *NameBuffer,int *pType,RELATIVE_VAR *pRelativeVar,LONG_PTR *plpIndex,int *pss=0); 27 BOOL GetDimentionFormat(const char *buffer, const bool isRef, char *VarName,int *SubScripts,TYPEINFO *pTypeInfo,char *InitBuf,char *ConstractParameter); 28 28 BOOL GetNowStaticVarFullName(char *VarName,char *FullName); 29 29 void AddGlobalVariable(char *name,int *SubScripts,TYPEINFO *pTypeInfo,int TypeSize,char *InitBuf,char *ConstractParameter,DWORD dwFlag); -
BasicCompiler_Common/common.h
r38 r40 157 157 #define REF_PARAMETER 1 158 158 #define OBJECT_PARAMETER 2 159 #define REF_VARIABLE 4 159 160 struct VARIABLE{ 160 161 char name[255]; … … 243 244 CClass *Return_pobj_c; 244 245 }u; 246 bool isReturnRef; 245 247 246 248 DWORD CompileAddress; … … 574 576 575 577 //error.cpp 576 void SetError(int ErrorNum,c har *KeyWord,int pos);578 void SetError(int ErrorNum,const char *KeyWord,int pos); 577 579 void CompileMessage(char *buffer); 578 580 void CheckDifferentType(int VarType,LONG_PTR lpVarIndex,int CalcType,LONG_PTR lpCalcIndex,char *pszFuncName,int ParmNum); -
BasicCompiler_Common/error.cpp
r34 r40 1 1 #include "../BasicCompiler_Common/common.h" 2 2 3 BOOL GetErrorMsg(int num,c har *KeyWord,char *msg,int pos){3 BOOL GetErrorMsg(int num,const char *KeyWord,char *msg,int pos){ 4 4 extern HANDLE hHeap; 5 5 int i2; 6 6 char temporary[64]; 7 7 8 char tempKeyWord[1024]; 8 9 if(KeyWord){ 10 lstrcpy(tempKeyWord,KeyWord); 9 11 for(i2=0;;i2++){ 10 if( KeyWord[i2]=='\0') break;11 if( KeyWord[i2]==1){12 GetDefaultNameFromES( KeyWord[i2+1],temporary);13 SlideString( KeyWord+i2+2,lstrlen(temporary)-2);14 memcpy( KeyWord+i2,temporary,lstrlen(temporary));12 if(tempKeyWord[i2]=='\0') break; 13 if(tempKeyWord[i2]==1){ 14 GetDefaultNameFromES(tempKeyWord[i2+1],temporary); 15 SlideString(tempKeyWord+i2+2,lstrlen(temporary)-2); 16 memcpy(tempKeyWord+i2,temporary,lstrlen(temporary)); 15 17 } 16 18 } 17 19 } 18 19 if(num==-1||num==-2) lstrcpy(msg,KeyWord); //部分エラー 20 else{ 21 lstrcpy(tempKeyWord,""); 22 } 23 24 if(num==-1||num==-2) lstrcpy(msg,tempKeyWord); //部分エラー 20 25 21 26 if(num==3){ 22 temporary[0]= KeyWord[0];27 temporary[0]=tempKeyWord[0]; 23 28 for(i2=1;;i2++){ 24 if((!IsVariableChar( KeyWord[i2]))||i2>=255){29 if((!IsVariableChar(tempKeyWord[i2]))||i2>=255){ 25 30 temporary[i2]=0; 26 31 break; 27 32 } 28 temporary[i2]= KeyWord[i2];33 temporary[i2]=tempKeyWord[i2]; 29 34 } 30 35 … … 52 57 #if defined(JPN) 53 58 //日本語 54 if(temporary[0]) sprintf(msg,"\"%s\" の使い方が不正です", KeyWord);59 if(temporary[0]) sprintf(msg,"\"%s\" の使い方が不正です",tempKeyWord); 55 60 else lstrcpy(msg,"文法が間違っています"); 56 61 #else 57 62 //英語 58 if(temporary[0]) sprintf(msg,"How to use the \"%s\" is wrong.", KeyWord);63 if(temporary[0]) sprintf(msg,"How to use the \"%s\" is wrong.",tempKeyWord); 59 64 else lstrcpy(msg,"Syntax Error."); 60 65 #endif … … 69 74 //日本語 70 75 //////////////////// 71 if(num==-101) sprintf(msg,"[警告] %sに強制変換されています。データが失われる可能性があります。", KeyWord);72 if(num==-102) sprintf(msg,"[警告] %sに強制変換されています。", KeyWord);73 if(num==-103) sprintf(msg,"[警告] \"%s\" 型が指定されていません。Double型として扱います。", KeyWord);74 if(num==-104) sprintf(msg,"[警告] \"%s\" 戻り値の型が指定されていません。Double型として扱います。", KeyWord);75 if(num==-105) sprintf(msg,"[警告] 一時オブジェクトの解放を行えません。キャスト用オブジェクトを用意してください。", KeyWord);76 if(num==-106) sprintf(msg,"[警告] DLLファイル \"%s\" が見つかりません。", KeyWord);77 if(num==-107) sprintf(msg,"[警告] DLL関数 \"%s\" を参照できません。", KeyWord);76 if(num==-101) sprintf(msg,"[警告] %sに強制変換されています。データが失われる可能性があります。",tempKeyWord); 77 if(num==-102) sprintf(msg,"[警告] %sに強制変換されています。",tempKeyWord); 78 if(num==-103) sprintf(msg,"[警告] \"%s\" 型が指定されていません。Double型として扱います。",tempKeyWord); 79 if(num==-104) sprintf(msg,"[警告] \"%s\" 戻り値の型が指定されていません。Double型として扱います。",tempKeyWord); 80 if(num==-105) sprintf(msg,"[警告] 一時オブジェクトの解放を行えません。キャスト用オブジェクトを用意してください。",tempKeyWord); 81 if(num==-106) sprintf(msg,"[警告] DLLファイル \"%s\" が見つかりません。",tempKeyWord); 82 if(num==-107) sprintf(msg,"[警告] DLL関数 \"%s\" を参照できません。",tempKeyWord); 78 83 #else 79 84 #endif … … 91 96 if(num==2) sprintf(msg,"左のオペランドが、左辺値になっていません"); 92 97 //num==3は予約されています 93 if(num==4) sprintf(msg,"%sの相互関係が一致しません", KeyWord);98 if(num==4) sprintf(msg,"%sの相互関係が一致しません",tempKeyWord); 94 99 if(num==5) sprintf(msg,"ダブルクォートの数が一致しません"); 95 if(num==6) sprintf(msg,"\"%s\" ジャンプ先が不正です", KeyWord);100 if(num==6) sprintf(msg,"\"%s\" ジャンプ先が不正です",tempKeyWord); 96 101 if(num==7) lstrcpy(msg,"DLL名が長すぎます(拡張子を含め、16文字以下にして下さい)"); 97 102 if(num==8) lstrcpy(msg,"コンパイラが認識できない文字コードが含まれています"); 98 103 if(num==9) sprintf(msg,"型が違います"); 99 if(num==10) sprintf(msg,"\"%s\" のパラメータ指定が間違っています", KeyWord);100 if(num==11) sprintf(msg,"\"%s\" 型が違います", KeyWord);101 if(num==12) sprintf(msg,"\"%s\" の使い方が不正です", KeyWord);102 if(num==13) sprintf(msg,"\"%s\" を参照できません", KeyWord);103 if(num==14) sprintf(msg,"\"%s\" 配列指定が不正です", KeyWord);104 if(num==15) sprintf(msg,"\"%s\" はすでに定義されています", KeyWord);105 if(num==16) sprintf(msg,"\"%s\" 配列、またはポインタ以外の変数に添え字が指定されています", KeyWord);104 if(num==10) sprintf(msg,"\"%s\" のパラメータ指定が間違っています",tempKeyWord); 105 if(num==11) sprintf(msg,"\"%s\" 型が違います",tempKeyWord); 106 if(num==12) sprintf(msg,"\"%s\" の使い方が不正です",tempKeyWord); 107 if(num==13) sprintf(msg,"\"%s\" を参照できません",tempKeyWord); 108 if(num==14) sprintf(msg,"\"%s\" 配列指定が不正です",tempKeyWord); 109 if(num==15) sprintf(msg,"\"%s\" はすでに定義されています",tempKeyWord); 110 if(num==16) sprintf(msg,"\"%s\" 配列、またはポインタ以外の変数に添え字が指定されています",tempKeyWord); 106 111 if(num==17) sprintf(msg,"リソース データが不正です"); 107 if(num==18) sprintf(msg,"\"%s\"はポインタ変数型です。文字列演算を指定することはできません", KeyWord);108 if(num==19) sprintf(msg,"\"%s\"は値参照型です。ByVal指定することはできません", KeyWord);112 if(num==18) sprintf(msg,"\"%s\"はポインタ変数型です。文字列演算を指定することはできません",tempKeyWord); 113 if(num==19) sprintf(msg,"\"%s\"は値参照型です。ByVal指定することはできません",tempKeyWord); 109 114 if(num==20) lstrcpy(msg,"全角スペースが含まれています(全角スペースはコンパイラが認識できないので、半角スペースまたはタブ文字にしてください)"); 110 115 if(num==21) sprintf(msg,"If制御のブロック指定が不正です"); 111 if(num==22) sprintf(msg,"\"%s\" に対する \"End %s\" が見つかりません", KeyWord,KeyWord);112 if(num==23) sprintf(msg,"リソース ファイル \"%s\" の読み込みに失敗", KeyWord);116 if(num==22) sprintf(msg,"\"%s\" に対する \"End %s\" が見つかりません",tempKeyWord,tempKeyWord); 117 if(num==23) sprintf(msg,"リソース ファイル \"%s\" の読み込みに失敗",tempKeyWord); 113 118 if(num==24) lstrcpy(msg,"Export指定の関数のパラメータには実体オブジェクトを利用することはできません(BytePtr型などを利用して下さい)"); 114 if(num==27) sprintf(msg,"\"%s\" は定義されていません", KeyWord);115 if(num==28) sprintf(msg,"構造体パラメータはポインタ参照にしてください(%s)", KeyWord);119 if(num==27) sprintf(msg,"\"%s\" は定義されていません",tempKeyWord); 120 if(num==28) sprintf(msg,"構造体パラメータはポインタ参照にしてください(%s)",tempKeyWord); 116 121 if(num==29) sprintf(msg,"配列ポインタを要素と同時に引渡すときは、ポインタ参照(ByRef)にしてください"); 117 122 //num==30は予約されています 118 if(num==31) sprintf(msg,"\"%s\" は構造体です(メンバの参照はピリオド \".\" で区切ってください)", KeyWord);119 if(num==32) sprintf(msg,"\"%s\" は構造体ポインタです(メンバの参照は \"->\" で区切ってください)", KeyWord);123 if(num==31) sprintf(msg,"\"%s\" は構造体です(メンバの参照はピリオド \".\" で区切ってください)",tempKeyWord); 124 if(num==32) sprintf(msg,"\"%s\" は構造体ポインタです(メンバの参照は \"->\" で区切ってください)",tempKeyWord); 120 125 if(num==33) sprintf(msg,"定数式にリテラル値、または定数以外のものが含まれています"); 121 126 if(num==34) sprintf(msg,"定数はモジュールレベルで宣言して下さい"); 122 if(num==38) sprintf(msg,"\"%s\" 戻り値が存在しないプロシージャです", KeyWord);123 if(num==39) sprintf(msg,"\"%s\" はオブジェクトポインタではありません(\"->\" 参照はできません)", KeyWord);127 if(num==38) sprintf(msg,"\"%s\" 戻り値が存在しないプロシージャです",tempKeyWord); 128 if(num==39) sprintf(msg,"\"%s\" はオブジェクトポインタではありません(\"->\" 参照はできません)",tempKeyWord); 124 129 if(num==40) lstrcpy(msg,"関数の戻り値にオブジェクトを指定することはできません"); 125 130 if(num==41) lstrcpy(msg,"初期データが不正です"); 126 131 if(num==42) lstrcpy(msg,"閉じカッコ \")\" の後に不正な文字が含まれています"); 127 132 if(num==43) lstrcpy(msg,"ダブルクォートの後に不正な文字が含まれています"); 128 if(num==45) sprintf(msg,"実数に対して \"%s\" 演算子は利用できません", KeyWord);133 if(num==45) sprintf(msg,"実数に対して \"%s\" 演算子は利用できません",tempKeyWord); 129 134 if(num==46) lstrcpy(msg,"配列の添え字に整数以外の値が与えられています"); 130 135 if(num==47) lstrcpy(msg,"As演算子の右辺値に型名以外の識別子が指定されています"); 131 if(num==48) sprintf(msg,"%s演算子に対して型名が指定されています", KeyWord);136 if(num==48) sprintf(msg,"%s演算子に対して型名が指定されています",tempKeyWord); 132 137 if(num==49) lstrcpy(msg,"添え字に整数以外の型が指定されています"); 133 if(num==50) sprintf(msg,"%sに変換できません", KeyWord);138 if(num==50) sprintf(msg,"%sに変換できません",tempKeyWord); 134 139 if(num==51) lstrcpy(msg,"オブジェクト、構造体のアラインメント値は1,2,4,8,16のいずれかでなければなりません"); 135 if(num==52) sprintf(msg,"\"%s\" オーバーロードを解決できません", KeyWord);136 if(num==53) sprintf(msg,"\"%s\" 出力ファイルの書き込みに失敗しました。実行されている可能性があります", KeyWord);137 if(num==54) sprintf(msg,"対応する%sが存在しません。", KeyWord);138 if(num==55) sprintf(msg,"\"%s\" は対応するForステートメントで利用されるカウンタ変数ではありません。", KeyWord);140 if(num==52) sprintf(msg,"\"%s\" オーバーロードを解決できません",tempKeyWord); 141 if(num==53) sprintf(msg,"\"%s\" 出力ファイルの書き込みに失敗しました。実行されている可能性があります",tempKeyWord); 142 if(num==54) sprintf(msg,"対応する%sが存在しません。",tempKeyWord); 143 if(num==55) sprintf(msg,"\"%s\" は対応するForステートメントで利用されるカウンタ変数ではありません。",tempKeyWord); 139 144 if(num==56) lstrcpy(msg,"ゼロ割りが行われました。"); 140 145 if(num==57) lstrcpy(msg,"8進数のリテラル表記が不正です。"); 141 146 if(num==58) lstrcpy(msg,"16進数のリテラル表記が不正です。"); 142 if(num==59) sprintf(msg,"マニフェスト ファイル \"%s\" の読み込みに失敗。", KeyWord);147 if(num==59) sprintf(msg,"マニフェスト ファイル \"%s\" の読み込みに失敗。",tempKeyWord); 143 148 if(num==60) lstrcpy(msg,"Staticステートメントはグローバル領域では使用できません。"); 144 if(num==61) sprintf(msg,"\"%s\" は定数です。書き込みアクセスはできません。", KeyWord);145 if(num==62) sprintf(msg,"グローバル領域でのReturnは禁止されています。", KeyWord);149 if(num==61) sprintf(msg,"\"%s\" は定数です。書き込みアクセスはできません。",tempKeyWord); 150 if(num==62) sprintf(msg,"グローバル領域でのReturnは禁止されています。",tempKeyWord); 146 151 147 152 148 153 //オブジェクト関連 149 if(num==102) sprintf(msg,"\"%s\" オブジェクトは定義されていません", KeyWord);150 if(num==103) sprintf(msg,"\"%s\" メンバは定義されていません", KeyWord);151 if(num==104) sprintf(msg,"\"%s\" 参照方法が違います", KeyWord);152 if(num==105) sprintf(msg,"\"%s\" 自身のクラスを継承することはできません", KeyWord);153 if(num==106) sprintf(msg,"\"%s\" クラスは定義されていません", KeyWord);154 if(num==107) sprintf(msg,"Privateメンバ \"%s\" にアクセスすることはできません", KeyWord);155 if(num==108) sprintf(msg,"Protectedメンバ \"%s\" にアクセスすることはできません", KeyWord);156 if(num==109) sprintf(msg,"Privateメンバ関数 \"%s\" を呼び出すことはできません", KeyWord);157 if(num==110) sprintf(msg,"Protectedメンバ関数 \"%s\" を呼び出すことはできません", KeyWord);154 if(num==102) sprintf(msg,"\"%s\" オブジェクトは定義されていません",tempKeyWord); 155 if(num==103) sprintf(msg,"\"%s\" メンバは定義されていません",tempKeyWord); 156 if(num==104) sprintf(msg,"\"%s\" 参照方法が違います",tempKeyWord); 157 if(num==105) sprintf(msg,"\"%s\" 自身のクラスを継承することはできません",tempKeyWord); 158 if(num==106) sprintf(msg,"\"%s\" クラスは定義されていません",tempKeyWord); 159 if(num==107) sprintf(msg,"Privateメンバ \"%s\" にアクセスすることはできません",tempKeyWord); 160 if(num==108) sprintf(msg,"Protectedメンバ \"%s\" にアクセスすることはできません",tempKeyWord); 161 if(num==109) sprintf(msg,"Privateメンバ関数 \"%s\" を呼び出すことはできません",tempKeyWord); 162 if(num==110) sprintf(msg,"Protectedメンバ関数 \"%s\" を呼び出すことはできません",tempKeyWord); 158 163 if(num==111) lstrcpy(msg,"InheritsはClass定義内の先頭に記述する必要があります"); 159 if(num==112) sprintf(msg,"\"%s\" はクラス型ではないため、初期パラメータを指定することはできません", KeyWord);160 if(num==113) sprintf(msg,"\"%s\" コンストラクタへ渡すパラメータが不正です", KeyWord);164 if(num==112) sprintf(msg,"\"%s\" はクラス型ではないため、初期パラメータを指定することはできません",tempKeyWord); 165 if(num==113) sprintf(msg,"\"%s\" コンストラクタへ渡すパラメータが不正です",tempKeyWord); 161 166 if(num==114) lstrcpy(msg,"デストラクタはパラメータを持てません"); 162 167 if(num==115) lstrcpy(msg,"コンストラクタ及びデストラクタは戻り値を持てません"); … … 164 169 if(num==117) lstrcpy(msg,"デストラクタの名前が \"~クラス名\" になっていません"); 165 170 if(num==118) lstrcpy(msg,"参照する基底クラスが存在しません"); 166 if(num==119) sprintf(msg,"\"%s\" メンバは基底クラスで定義されていません", KeyWord);171 if(num==119) sprintf(msg,"\"%s\" メンバは基底クラスで定義されていません",tempKeyWord); 167 172 if(num==120) lstrcpy(msg,"デストラクトするオブジェクトの型が不明です"); 168 173 if(num==121) lstrcpy(msg,"New演算子にはクラス以外の型を指定できません"); … … 170 175 if(num==123) lstrcpy(msg,"ループ継承が行われました"); 171 176 if(num==124) lstrcpy(msg,"循環参照が行われました"); 172 if(num==125) sprintf(msg,"\"%s\" は抽象クラスです。インスタンス化することはできません。", KeyWord);177 if(num==125) sprintf(msg,"\"%s\" は抽象クラスです。インスタンス化することはできません。",tempKeyWord); 173 178 if(num==126) lstrcpy(msg,"オペレータのオーバーロードをクラスの外で行うことはできません。"); 174 179 if(num==127) lstrcpy(msg,"Override修飾子の指定が無い状況でオーバーライドを行うことはできません。"); 175 180 if(num==128) lstrcpy(msg,"オーバーライドを行うときはアクセシビリティを同一にしなければなりません。"); 176 if(num==129) sprintf(msg,"静的メンバ \"%s\" は定義されていません。", KeyWord);177 if(num==130) sprintf(msg,"\"%s\" はオブジェクト定数です。書き込みアクセスはできません。", KeyWord);181 if(num==129) sprintf(msg,"静的メンバ \"%s\" は定義されていません。",tempKeyWord); 182 if(num==130) sprintf(msg,"\"%s\" はオブジェクト定数です。書き込みアクセスはできません。",tempKeyWord); 178 183 if(num==131) lstrcpy(msg,"Const定義されたメソッド内でクラスメンバへの書き込みアクセスはできません。"); 179 184 if(num==132) lstrcpy(msg,"明示的なコンストラクタ呼び出しと初期値の指定を同時に行うことはできません。"); 180 185 181 186 //Enum関連 182 if(num==150) sprintf(msg,"\"%s\" 値が定義されていません", KeyWord);183 if(num==151) sprintf(msg,"\"%s\" 列挙リストに登録されていません", KeyWord);187 if(num==150) sprintf(msg,"\"%s\" 値が定義されていません",tempKeyWord); 188 if(num==151) sprintf(msg,"\"%s\" 列挙リストに登録されていません",tempKeyWord); 184 189 185 190 //リンカ 186 if(num==200) sprintf(msg,"\"%s\" 未解決です (リンク エラー)", KeyWord);187 if(num==201) sprintf(msg,"\"%s\" の読み込みに失敗", KeyWord);191 if(num==200) sprintf(msg,"\"%s\" 未解決です (リンク エラー)",tempKeyWord); 192 if(num==201) sprintf(msg,"\"%s\" の読み込みに失敗",tempKeyWord); 188 193 189 194 //原因不明 … … 197 202 if(num==2) sprintf(msg,"Left operand must be l-value."); 198 203 //num==3は予約されています 199 if(num==4) sprintf(msg,"Correlation of %s is wrong.", KeyWord);204 if(num==4) sprintf(msg,"Correlation of %s is wrong.",tempKeyWord); 200 205 if(num==5) sprintf(msg,"Correlation of double quotes is wrong."); 201 if(num==6) sprintf(msg,"\"%s\" Label not found.", KeyWord);206 if(num==6) sprintf(msg,"\"%s\" Label not found.",tempKeyWord); 202 207 if(num==7) lstrcpy(msg,"The DLL name is too long. Must be 16 characters or less."); 203 208 if(num==8) lstrcpy(msg,"The inaccurate characters are contained."); 204 209 if(num==9) sprintf(msg,"Type is wrong."); 205 if(num==10) sprintf(msg,"\"%s\" Rule of parameter is wrong.", KeyWord);206 if(num==11) sprintf(msg,"\"%s\" Type is wrong.", KeyWord);207 if(num==12) sprintf(msg,"\"%s\" Not a valid use.", KeyWord);208 if(num==13) sprintf(msg,"Cannot refer to \"%s\".", KeyWord);209 if(num==14) sprintf(msg,"\"%s\" Array argument(s) out of bound.", KeyWord);210 if(num==15) sprintf(msg,"\"%s\" is already defined.", KeyWord);211 if(num==16) sprintf(msg,"\"%s\" Argument(s) following variable which is not pointer or array.", KeyWord);210 if(num==10) sprintf(msg,"\"%s\" Rule of parameter is wrong.",tempKeyWord); 211 if(num==11) sprintf(msg,"\"%s\" Type is wrong.",tempKeyWord); 212 if(num==12) sprintf(msg,"\"%s\" Not a valid use.",tempKeyWord); 213 if(num==13) sprintf(msg,"Cannot refer to \"%s\".",tempKeyWord); 214 if(num==14) sprintf(msg,"\"%s\" Array argument(s) out of bound.",tempKeyWord); 215 if(num==15) sprintf(msg,"\"%s\" is already defined.",tempKeyWord); 216 if(num==16) sprintf(msg,"\"%s\" Argument(s) following variable which is not pointer or array.",tempKeyWord); 212 217 if(num==17) sprintf(msg,"Invalid resource data."); 213 if(num==18) sprintf(msg,"\"%s\" Invalid operation on a pointer variable.", KeyWord);214 if(num==19) sprintf(msg,"\"%s\" is already to be passed by value. You cannot use \"ByVal\".", KeyWord);218 if(num==18) sprintf(msg,"\"%s\" Invalid operation on a pointer variable.",tempKeyWord); 219 if(num==19) sprintf(msg,"\"%s\" is already to be passed by value. You cannot use \"ByVal\".",tempKeyWord); 215 220 if(num==21) sprintf(msg,"Wrong structure of \"If\" block."); 216 if(num==22) sprintf(msg,"No matching \"End %s\" found for \"%s\".", KeyWord,KeyWord);217 if(num==23) sprintf(msg,"Cannot read the resource file \"%s\".", KeyWord);221 if(num==22) sprintf(msg,"No matching \"End %s\" found for \"%s\".",tempKeyWord,tempKeyWord); 222 if(num==23) sprintf(msg,"Cannot read the resource file \"%s\".",tempKeyWord); 218 223 if(num==24) lstrcpy(msg,"Must not use String type as an argument for exported function. (Use BytePtr type instead.)"); 219 if(num==27) sprintf(msg,"\"%s\" Undefined procedure.", KeyWord);220 if(num==28) sprintf(msg,"\"%s\" Structure must not be passed by value. (Use \"ByRef\".)", KeyWord);224 if(num==27) sprintf(msg,"\"%s\" Undefined procedure.",tempKeyWord); 225 if(num==28) sprintf(msg,"\"%s\" Structure must not be passed by value. (Use \"ByRef\".)",tempKeyWord); 221 226 if(num==29) sprintf(msg,"Array must not be passed by value. (Use \"ByRef\".)"); 222 227 //num==30は予約されています 223 if(num==31) sprintf(msg,"\"%s\" is a struct. (Use period \".\" to refer to the members.)", KeyWord);224 if(num==32) sprintf(msg,"\"%s\" is a pointer of struct. (Use arrow \"->\" to refer to the members.)", KeyWord);228 if(num==31) sprintf(msg,"\"%s\" is a struct. (Use period \".\" to refer to the members.)",tempKeyWord); 229 if(num==32) sprintf(msg,"\"%s\" is a pointer of struct. (Use arrow \"->\" to refer to the members.)",tempKeyWord); 225 230 if(num==33) sprintf(msg,"Constant formula has a thing that is not literal value or constant value."); 226 231 if(num==34) sprintf(msg,"Constant formula must be defined in the module level."); 227 if(num==38) sprintf(msg,"\"%s\" is a procedure without a return value.", KeyWord);228 if(num==39) sprintf(msg,"\"%s\" is not object pointer. \"->\" is invalid.", KeyWord);232 if(num==38) sprintf(msg,"\"%s\" is a procedure without a return value.",tempKeyWord); 233 if(num==39) sprintf(msg,"\"%s\" is not object pointer. \"->\" is invalid.",tempKeyWord); 229 234 if(num==40) lstrcpy(msg,"Cannot set a object to return value."); 230 235 if(num==41) lstrcpy(msg,"Init data is wrong."); … … 233 238 234 239 //オブジェクト関連 235 if(num==102) sprintf(msg,"\"%s\" The object is not defined.", KeyWord);236 if(num==103) sprintf(msg,"\"%s\" The member is not defined.", KeyWord);237 if(num==104) sprintf(msg,"\"%s\" The reference character is different.", KeyWord);238 if(num==105) sprintf(msg,"\"%s\" An own class is not inheritable.", KeyWord);239 if(num==106) sprintf(msg,"\"%s\" It class is not defined.", KeyWord);240 if(num==107) sprintf(msg,"\"%s\" Cannot access the private member.", KeyWord);241 if(num==108) sprintf(msg,"\"%s\" Cannot access the protected member.", KeyWord);242 if(num==109) sprintf(msg,"\"%s\" Cannot call the private member.", KeyWord);243 if(num==110) sprintf(msg,"\"%s\" Cannot call the protected member.", KeyWord);240 if(num==102) sprintf(msg,"\"%s\" The object is not defined.",tempKeyWord); 241 if(num==103) sprintf(msg,"\"%s\" The member is not defined.",tempKeyWord); 242 if(num==104) sprintf(msg,"\"%s\" The reference character is different.",tempKeyWord); 243 if(num==105) sprintf(msg,"\"%s\" An own class is not inheritable.",tempKeyWord); 244 if(num==106) sprintf(msg,"\"%s\" It class is not defined.",tempKeyWord); 245 if(num==107) sprintf(msg,"\"%s\" Cannot access the private member.",tempKeyWord); 246 if(num==108) sprintf(msg,"\"%s\" Cannot access the protected member.",tempKeyWord); 247 if(num==109) sprintf(msg,"\"%s\" Cannot call the private member.",tempKeyWord); 248 if(num==110) sprintf(msg,"\"%s\" Cannot call the protected member.",tempKeyWord); 244 249 if(num==111) lstrcpy(msg,"The Inherits phrase must be described to the 1st line of class module"); 245 if(num==112) sprintf(msg,"\"%s\" is not class object. Therefor you cannot set the parameter for constructor.", KeyWord);246 if(num==113) sprintf(msg,"\"%s\" The parameter for constructor is wrong.", KeyWord);250 if(num==112) sprintf(msg,"\"%s\" is not class object. Therefor you cannot set the parameter for constructor.",tempKeyWord); 251 if(num==113) sprintf(msg,"\"%s\" The parameter for constructor is wrong.",tempKeyWord); 247 252 if(num==114) lstrcpy(msg,"Destructor cannot have a parameter."); 248 253 if(num==115) lstrcpy(msg,"Constructor and Destructor cannot have a return value."); … … 250 255 if(num==117) lstrcpy(msg,"Destructors name must be \"~ClassName\"."); 251 256 if(num==118) lstrcpy(msg,"Super class is not found."); 252 if(num==119) sprintf(msg,"\"%s\" The member is not defined in the super class.", KeyWord);257 if(num==119) sprintf(msg,"\"%s\" The member is not defined in the super class.",tempKeyWord); 253 258 254 259 //Enum関連 255 if(num==150) sprintf(msg,"\"%s\" The value is not set", KeyWord);256 if(num==151) sprintf(msg,"\"%s\" is not found from enum lists.", KeyWord);260 if(num==150) sprintf(msg,"\"%s\" The value is not set",tempKeyWord); 261 if(num==151) sprintf(msg,"\"%s\" is not found from enum lists.",tempKeyWord); 257 262 258 263 //リンカ 259 if(num==200) sprintf(msg,"\"%s\" Unknown error.", KeyWord);264 if(num==200) sprintf(msg,"\"%s\" Unknown error.",tempKeyWord); 260 265 #endif 261 266 262 267 return 1; 263 268 } 264 void SetError(int num,c har *KeyWord,int pos){269 void SetError(int num,const char *KeyWord,int pos){ 265 270 extern HANDLE hHeap; 266 271 extern HWND hMainDlg;
Note:
See TracChangeset
for help on using the changeset viewer.