Changeset 64 in dev
- Timestamp:
- Mar 8, 2007, 2:49:34 AM (18 years ago)
- Files:
-
- 57 edited
Legend:
- Unmodified
- Added
- Removed
-
BasicCompiler32/CParameter.cpp
r63 r64 2 2 #include "opcode.h" 3 3 4 voidCParameter::NewTempParameters( const char *FuncName,PARAMETER_INFO *ppi,int pi_num,int SecondParmNum ){4 int CParameter::NewTempParameters( const char *FuncName,PARAMETER_INFO *ppi,int pi_num,int SecondParmNum ){ 5 5 /////////////////////////////////////////////////////// 6 6 // 一時オブジェクトをあらかじめスタックに積んでおく 7 7 /////////////////////////////////////////////////////// 8 //TODO: 64ビットコードのままなので、32ビット用に書き換える9 8 10 9 useTempObject = false; 11 10 12 //一時 オブジェクトの数11 //一時参照の数 13 12 nCountOfTempObjects = 0; 14 13 … … 64 63 int type = NumOpe( Parms[i2], DummyTypeInfo.type, DummyTypeInfo.u.lpIndex, &lpVarIndex ); 65 64 //↑ここでスタックに積む 65 66 nCountOfTempObjects++; 67 68 if( type == DEF_OBJECT ){ 69 //一時参照を作成 70 71 //push esp 72 op_push( REG_ESP ); 73 74 nCountOfTempObjects++; 75 } 66 76 67 77 bool result = CheckDifferentType( … … 80 90 types[i2].u.lpIndex = lpVarIndex; 81 91 } 82 83 nCountOfTempObjects++;84 85 } 86 }92 } 93 } 94 } 95 96 return nCountOfTempObjects * PTR_SIZE; 87 97 } 98 88 99 void CParameter::DeleteTempParameters(){ 89 100 /////////////////////////////////////////////////////// 90 101 // 一時オブジェクトを破棄 91 102 /////////////////////////////////////////////////////// 92 //TODO: 64ビットコードのままなので、32ビット用に書き換える93 94 103 if( !useTempObject ) return; 95 104 96 105 for(int i2=ParmsNum-1;i2>=0;i2--){ 97 106 if( useTempParameters[i2] ){ 98 //スタックフレームから取得 99 // ※関数呼び出し時も値が普遍のebxを利用する 100 op_pop(REG_EBX); 101 102 103 /////////////////////////// 104 // デストラクタを呼び出す 105 /////////////////////////// 106 107 //push ebx 108 op_push(REG_EBX); 109 110 //call destructor 111 CMethod *method = types[i2].u.pobj_Class->GetDestructorMethod(); 112 if( method ){ 113 op_call( method->psi ); 114 } 115 116 117 ///////////////////////// 118 // メモリを解放する 119 ///////////////////////// 120 121 //push ebx 122 op_push(REG_EBX); 123 124 //call free 125 extern SUBINFO *pSub_free; 126 op_call(pSub_free); 107 if( types[i2].type == DEF_STRUCT ){ 108 // 構造体の一時メモリ 109 110 //メモリを解放する 111 112 //call free 113 extern SUBINFO *pSub_free; 114 op_call(pSub_free); 115 } 116 else if( types[i2].type == DEF_OBJECT ){ 117 op_pop( REG_NON ); 118 op_pop( REG_NON ); 119 } 120 else{ 121 SetError(300,NULL,cp); 122 } 123 127 124 } 128 125 } 129 126 } 130 127 131 void CParameter::Set ObjectParameter(CClass *pobj_Class,LPSTR Parameter){128 void CParameter::SetStructParameter(CClass *pobj_Class,LPSTR Parameter){ 132 129 int object_size = pobj_Class->GetSize(); 133 130 … … 143 140 144 141 145 TYPEINFO BaseType={DEF_ OBJECT,(LONG_PTR)pobj_Class};142 TYPEINFO BaseType={DEF_STRUCT,(LONG_PTR)pobj_Class}; 146 143 TYPEINFO CalcType; 147 144 CalcType.type=NumOpe_GetType(Parameter,&BaseType,&CalcType.u.lpIndex); 148 145 146 /* 147 TODO: 消す 149 148 if( pobj_Class->GetCopyConstructorMethod() 150 149 && CalcType.type==DEF_OBJECT&&CalcType.u.pobj_Class==pobj_Class){ … … 185 184 } 186 185 } 187 else{ 186 else{*/ 187 188 188 189 //push eax 189 190 op_push(REG_EAX); 190 191 191 192 /* 193 TODO: 消す 192 194 if( pobj_Class->GetConstructorMethod() ){ 193 195 //////////////////////////////// … … 201 203 op_call(pobj_Class->GetConstructorMethod()->psi); 202 204 } 203 204 205 TYPEINFO CalcType; 205 */ 206 206 207 BOOL bUseHeap; 207 CalcType.type=NumOpe(Parameter,DEF_ OBJECT,(LONG_PTR)pobj_Class,&CalcType.u.lpIndex,&bUseHeap);208 209 210 211 Set ObjectVariable((LONG_PTR)pobj_Class,CalcType.type,CalcType.u.lpIndex,bUseHeap);212 }208 CalcType.type=NumOpe(Parameter,DEF_STRUCT,(LONG_PTR)pobj_Class,&CalcType.u.lpIndex,&bUseHeap); 209 210 211 212 SetStructVariable((LONG_PTR)pobj_Class,CalcType.type,CalcType.u.lpIndex,bUseHeap); 213 //} 213 214 } 214 215 … … 280 281 } 281 282 282 if(DummyTypeInfo.type==DEF_ OBJECT){283 Set ObjectParameter(DummyTypeInfo.u.pobj_Class,Parms[i2]);283 if(DummyTypeInfo.type==DEF_STRUCT){ 284 SetStructParameter(DummyTypeInfo.u.pobj_Class,Parms[i2]); 284 285 goto next; 285 286 } … … 299 300 300 301 if(CalcType==DEF_OBJECT){ 301 //キャスト演算子のオーバーロードに対応する 302 CallCastOperatorProc(CalcType,lpCalcIndex,bCalcUseHeap,DummyTypeInfo.type,DummyTypeInfo.u.lpIndex); 302 if( DummyTypeInfo.type != DEF_OBJECT 303 || 304 DummyTypeInfo.type == DEF_OBJECT && 305 !DummyTypeInfo.u.pobj_Class->IsEqualsOrSubClass( (CClass *)lpCalcIndex ) ){ 306 //キャスト演算子のオーバーロードに対応する 307 CallCastOperatorProc(CalcType,lpCalcIndex,bCalcUseHeap,DummyTypeInfo.type,DummyTypeInfo.u.lpIndex); 308 } 303 309 } 304 310 … … 328 334 ParmSize+=sizeof(long)*2; 329 335 } 330 else if(DummyTypeInfo.type==DEF_LONG||DummyTypeInfo.type==DEF_DWORD|| 336 else if(DummyTypeInfo.type==DEF_LONG||DummyTypeInfo.type==DEF_DWORD||DummyTypeInfo.type==DEF_OBJECT||DummyTypeInfo.type==DEF_STRUCT|| 331 337 (IsPtrType(DummyTypeInfo.type)/*&&DummyTypeInfo.type!=DEF_PTR_VOID&&DummyTypeInfo.type!=DEF_PTR_BYTE*/)){ 332 338 ChangeTypeToLong(CalcType); … … 354 360 } 355 361 else{ 356 //変数のアドレスを取得 357 int VarType; 358 LONG_PTR lpVarIndex; 359 if(GetVarOffset( 360 false, 361 false, 362 Parms[i2], 363 &VarType, 364 &RelativeVar, 365 &lpVarIndex)){ 366 if(DummyTypeInfo.type!=DEF_ANY){ 367 //型チェックを行う 368 if(DummyTypeInfo.type==VarType){ 369 if(DummyTypeInfo.type==DEF_OBJECT){ 370 if( !DummyTypeInfo.u.pobj_Class->IsEqualsOrSubClass( (CClass *)lpVarIndex ) ){ 371 SetError(11,Parms[i2],cp); 372 } 373 } 374 } 375 else if((VarType&FLAG_PTR)&&((int)(VarType^FLAG_PTR)==DummyTypeInfo.type)){ 376 //仮引数がポインタ参照で、実引数が配列の先頭ポインタのとき 377 } 378 else{ 379 SetError(11,Parms[i2],cp); 380 } 381 } 382 383 //変数アドレスをレジスタにセット 384 SetVarPtrToEax(&RelativeVar); 385 386 //push eax 387 op_push(REG_EAX); 388 } 389 else{ 362 if( useTempParameters[i2] ){ 390 363 //一時オブジェクトをコピー 364 365 if( types[i2].type == DEF_OBJECT ){ 366 // 一時参照のための領域を考慮する 367 nCountOfNowTempObjects++; 368 } 369 370 nCountOfNowTempObjects++; 391 371 392 372 //mov eax, dword ptr[esp+offset] … … 395 375 REG_EAX, 396 376 REG_ESP, 397 ( ( ParmsNum - i2 - 1 ) + ( nCountOfTempObjects - nCountOfNowTempObjects - 1) ) * PTR_SIZE,377 ( ( ParmsNum - i2 - 1 ) + ( nCountOfTempObjects - nCountOfNowTempObjects ) ) * PTR_SIZE, 398 378 MOD_BASE_DISP32 ); 399 400 nCountOfNowTempObjects++;401 379 402 380 //push eax 403 381 op_push(REG_EAX); 404 405 //VarType = NumOpe( Parms[i2], DummyTypeInfo.type, DummyTypeInfo.u.lpIndex, &lpVarIndex ); 382 } 383 else{ 384 //変数のアドレスを取得 385 int VarType; 386 LONG_PTR lpVarIndex; 387 if(GetVarOffset( 388 false, 389 false, 390 Parms[i2], 391 &VarType, 392 &RelativeVar, 393 &lpVarIndex)){ 394 if(DummyTypeInfo.type!=DEF_ANY){ 395 //型チェックを行う 396 if(DummyTypeInfo.type==VarType){ 397 if(DummyTypeInfo.type==DEF_OBJECT){ 398 if( !DummyTypeInfo.u.pobj_Class->IsEqualsOrSubClass( (CClass *)lpVarIndex ) ){ 399 SetError(11,Parms[i2],cp); 400 } 401 } 402 else if(DummyTypeInfo.type==DEF_STRUCT){ 403 if( !DummyTypeInfo.u.pobj_Class->IsEquals( (CClass *)lpVarIndex ) ){ 404 SetError(11,Parms[i2],cp); 405 } 406 } 407 } 408 else if((VarType&FLAG_PTR)&&((int)(VarType^FLAG_PTR)==DummyTypeInfo.type)){ 409 //仮引数がポインタ参照で、実引数が配列の先頭ポインタのとき 410 } 411 else{ 412 SetError(11,Parms[i2],cp); 413 } 414 } 415 416 //変数アドレスをレジスタにセット 417 SetVarPtrToEax(&RelativeVar); 418 419 //push eax 420 op_push(REG_EAX); 421 } 406 422 } 407 423 } -
BasicCompiler32/Compile_Calc.cpp
r62 r64 364 364 //push eax 365 365 op_push(REG_EAX); 366 } 367 368 369 370 371 372 373 374 375 376 void RestoreDefaultRegisterFromStackMemory( int type ){ 377 //現在のスタックの内容を実数レジスタに保存する 378 //NumOpeの直後専用 379 if(type==DEF_DOUBLE){ 380 //fld qword ptr[esp] 381 op_fld_ptr_esp(DEF_DOUBLE); 382 383 //add esp,8 384 op_add_esp(8); 385 } 386 else if(type==DEF_SINGLE){ 387 //fld dword ptr[esp] 388 op_fld_ptr_esp(DEF_SINGLE); 389 390 //add esp,4 391 op_add_esp(4); 392 } 393 else if( Is64Type( type ) ){ 394 //pop eax 395 op_pop(REG_EAX); 396 397 //pop edx 398 op_pop(REG_EDX); 399 } 400 else{ 401 //pop eax 402 op_pop(REG_EAX); 403 } 404 } 405 406 void SetVariableFromEax(int VarType,int CalcType,RELATIVE_VAR *pRelativeVar){ 407 ///////////////////////////////////////////////// 408 // eaxの内容を変数にコピーするコードを抽出 409 ///////////////////////////////////////////////// 410 411 if(VarType==DEF_BOOLEAN){ 412 //bool 413 SetBooleanVariable(CalcType,pRelativeVar); 414 } 415 else if( IsRealNumberType( VarType ) ){ 416 // Double/Single型変数へレジスタの値を代入 417 SetRealVariable(VarType, CalcType, pRelativeVar); 418 } 419 else if( IsWholeNumberType( VarType ) || VarType == DEF_OBJECT ){ 420 int typeSize = GetTypeSize( VarType, -1 ); 421 422 //整数変数へraxの値を格納する 423 SetWholeVariable( typeSize, CalcType, pRelativeVar ); 424 } 425 else{ 426 SetError(300,NULL,cp); 427 } 366 428 } 367 429 … … 485 547 } 486 548 549 550 if( lstrcmpi( variable, "This" ) == 0 ){ 551 SetError(133,NULL,cp); 552 return; 553 } 554 555 487 556 //////////////////////////////////////// 488 557 // 変数のタイプ型を識別して、演算を行う … … 511 580 else ProcPtr_BaseIndex=-1; 512 581 513 if(VarType==DEF_ OBJECT){514 //代入 演算のオーバーロード オペレータに備える582 if(VarType==DEF_STRUCT){ 583 //代入コピーに備える 515 584 516 585 //変数アドレスを取得 … … 544 613 } 545 614 546 if(VarType==DEF_ OBJECT){615 if(VarType==DEF_STRUCT){ 547 616 //オブジェクトインスタンスへの代入 548 Set ObjectVariable(lpVarIndex,CalcType,lpCalcIndex,bCalcUseHeap);617 SetStructVariable(lpVarIndex,CalcType,lpCalcIndex,bCalcUseHeap); 549 618 return; 550 619 } 551 620 552 if(CalcType==DEF_OBJECT ){621 if(CalcType==DEF_OBJECT && (CalcType!=VarType || lpCalcIndex!=lpVarIndex) ){ 553 622 //キャスト演算子のオーバーロードに対応する 554 623 CallCastOperatorProc(CalcType,lpCalcIndex,bCalcUseHeap,VarType,lpVarIndex); … … 568 637 ///////////////////////////////////////////////// 569 638 639 //eax、edx:eax、またはst(0)にスタック上のデータを取り出す 640 RestoreDefaultRegisterFromStackMemory( CalcType ); 641 642 SetVariableFromEax( VarType, CalcType, &VarRelativeVar ); 643 /* 644 TODO: 消す 570 645 if(VarType==DEF_BOOLEAN){ 571 646 //bool … … 598 673 //Single型変数へスタックの内容を格納する 599 674 SetSingleVariable(CalcType,VarRelativeVar.dwKind,VarRelativeVar.offset,VarRelativeVar.bOffsetOffset); 600 } 601 } 602 675 }*/ 676 } 677 678 679 // TODO: 消す 680 /* 603 681 void SetRefVariable( const char *varname, const char *expression ){ 604 682 //////////////////////////////////////// … … 721 799 } 722 800 } 801 */ -
BasicCompiler32/Compile_CallProc.cpp
r63 r64 94 94 } 95 95 96 void Opcode_CallProc(c har *Parameter,SUBINFO *psi,DWORD dwFlags,char *ObjectName,int RefType){96 void Opcode_CallProc(const char *Parameter,SUBINFO *psi,DWORD dwFlags,char *ObjectName,int RefType){ 97 97 int i2; 98 98 … … 206 206 207 207 /////////////////////////////////////////////////////////////// 208 // _System_LocalThis 、_System_ReturnObjectのダミーをセット208 // _System_LocalThisのダミーをセット 209 209 /////////////////////////////////////////////////////////////// 210 210 … … 215 215 } 216 216 217 if(psi->ReturnType==DEF_OBJECT && psi->isReturnRef == false ){218 //_System_ReturnObject(第一または第二パラメータのダミーを作成)219 sprintf(temporary+lstrlen(temporary),"%c%c0,",1,ESC_BYVAL);220 }221 222 217 if(Parameter[0]=='\0'&&temporary[0]) 223 218 temporary[lstrlen(temporary)-1]=0; … … 246 241 247 242 //一時オブジェクトを生成 248 pobj_parameter->NewTempParameters( psi->name,psi->pRealParmInfo,psi->RealParmNum,psi->RealSecondParmNum );243 int tempSize = pobj_parameter->NewTempParameters( psi->name,psi->pRealParmInfo,psi->RealParmNum,psi->RealSecondParmNum ); 249 244 250 245 //レジスタ、スタックフレームにセット … … 252 247 ParmSize=pobj_parameter->SetParameter(psi->name,psi->pRealParmInfo,psi->RealParmNum,psi->RealSecondParmNum); 253 248 254 255 if(psi->ReturnType==DEF_OBJECT && psi->isReturnRef == false){ 249 if(psi->ReturnType==DEF_STRUCT && psi->isReturnRef == false){ 256 250 ////////////////////////////////////////////////////// 257 // 戻り値に オブジェクトインスタンスを持つ場合258 // ※ByRef _System_Return Objectパラメータをセット251 // 戻り値に構造体インスタンスを持つ場合 252 // ※ByRef _System_ReturnValue パラメータをセット 259 253 ////////////////////////////////////////////////////// 260 254 … … 294 288 SetVarPtrToEax(&RelativeVar); 295 289 296 //参照タイプが "->" の場合 297 if(RefType==DEF_PTR_OBJECT){ 298 //mov eax,dword ptr[eax] 299 OpBuffer[obp++]=(char)0x8B; 300 OpBuffer[obp++]=(char)0x00; 301 } 302 303 //mov ecx,eax 304 OpBuffer[obp++]=(char)0x8B; 305 OpBuffer[obp++]=(char)0xC8; 290 // 参照を実体ポインタにする 291 op_mov_RM( sizeof(long), REG_ECX, REG_EAX, 0, MOD_BASE ); 306 292 } 307 293 } … … 310 296 if(dwFlags&PROCFLAG_NEW){ 311 297 //New演算子によるコンストラクタ呼び出しの場合 298 312 299 //mov ecx,dword ptr[esp+ParmSize] 313 OpBuffer[obp++]=(char)0x8B; 314 OpBuffer[obp++]=(char)0x8C; 315 OpBuffer[obp++]=(char)0x24; 316 *((long *)(OpBuffer+obp))=ParmSize; 317 obp+=sizeof(long); 300 op_mov_RM( sizeof(long), REG_ECX, REG_ESP, ParmSize + tempSize, MOD_BASE_DISP32 ); 318 301 } 319 302 else{ -
BasicCompiler32/Compile_Func.cpp
r51 r64 208 208 209 209 TYPEINFO TypeInfo={type,lpIndex}; 210 if(IsStringObjectType( &TypeInfo)){210 if(IsStringObjectType(TypeInfo)){ 211 211 //Stringオブジェクトの場合 212 212 char temporary[VN_SIZE]; … … 346 346 } 347 347 void Opcode_Func_SizeOf(const char *Parameter){ 348 int type,size;349 348 LONG_PTR lpIndex; 350 351 type=GetTypeFixed(Parameter,&lpIndex); 352 if(type==-1){ 353 extern int cp; 354 SetError(3,Parameter,cp); 355 return; 356 } 357 size=GetTypeSize(type,lpIndex); 349 int type = GetTypeFixed(Parameter,&lpIndex); 350 351 int size; 352 if( type == DEF_OBJECT ){ 353 CClass *pClass = (CClass *)lpIndex; 354 size = pClass->GetSize(); 355 } 356 else{ 357 size=GetTypeSize(type,lpIndex); 358 } 358 359 359 360 //mov eax,size 360 OpBuffer[obp++]=(char)0xB8; 361 *((long *)(OpBuffer+obp))=size; 362 obp+=sizeof(long); 361 op_mov_RV( REG_EAX, size ); 363 362 } 364 363 void Opcode_Func_VarPtr( const char *Parameter, TYPEINFO &ReturnTypeInfo ){ … … 368 367 if(!GetVarOffsetReadOnly( Parameter, &ReturnTypeInfo.type, &RelativeVar, &ReturnTypeInfo.u.lpIndex )) return; 369 368 369 int beforeType = ReturnTypeInfo.type; 370 370 371 PTR_LEVEL_UP( ReturnTypeInfo.type ); 371 372 372 373 SetVarPtrToEax(&RelativeVar); 374 375 if( beforeType == DEF_OBJECT && lstrcmpi( Parameter, "This" ) != 0 ){ 376 //参照をオブジェクトポインタに変更 377 378 //mov eax,dword ptr[eax] 379 op_mov_RM( sizeof(long), REG_EAX, REG_EAX, 0, MOD_BASE ); 380 } 373 381 } 374 382 void Opcode_Func_GetPtrData(const char *Parameter,const int type){ -
BasicCompiler32/Compile_Object.cpp
r51 r64 2 2 #include "opcode.h" 3 3 4 void _call_constructor(CClass *pobj_c, char *CreateParameter,int ObjectSize,BOOL bSomeObjects){4 void _call_constructor(CClass *pobj_c, const char *CreateParameter,int ObjectSize,BOOL bSomeObjects){ 5 5 //////////////////////////// 6 6 // コンストラクタの呼び出し … … 74 74 } 75 75 } 76 int Operator_New(const char *Parameter,LONG_PTR *plpIndex){ 77 char TypeName[VN_SIZE],CreateParameter[VN_SIZE],ObjectSize[VN_SIZE]; 76 void Operator_New( CClass &classObj, const char *objectSizeStr, const char *parameter, const TYPEINFO &baseTypeInfo ){ 77 int typeSize = classObj.GetSize(); 78 79 if(classObj.IsAbstract()){ 80 //抽象クラスだったとき 81 SetError(125,classObj.name,cp); 82 } 83 84 if(objectSizeStr[0]){ 85 int type = NumOpe(objectSizeStr,0,0,0); 86 ChangeTypeToLong(type); 87 88 //pop eax 89 op_pop(REG_EAX); 90 91 //※添え字上限値であることを考慮 92 //add eax,1 93 OpBuffer[obp++]=(char)0x83; 94 OpBuffer[obp++]=(char)0xC0; 95 OpBuffer[obp++]=(char)0x01; 96 97 //オブジェクトの個数をebxに一時保持 98 //※ebxは関数が呼ばれても不変 99 //mov ebx,eax 100 OpBuffer[obp++]=(char)0x8B; 101 OpBuffer[obp++]=(char)0xD8; 102 103 //imul eax,size 104 OpBuffer[obp++]=(char)0x69; 105 OpBuffer[obp++]=(char)0xC0; 106 *((long *)(OpBuffer+obp))=typeSize; 107 obp+=sizeof(long); 108 109 //add eax,sizeof(DWORD)*2 110 OpBuffer[obp++]=(char)0x05; 111 *((long *)(OpBuffer+obp))=sizeof(DWORD)*3; 112 obp+=sizeof(long); 113 114 //push eax 115 op_push(REG_EAX); 116 } 117 else{ 118 //オブジェクトの個数をebxに一時保持 119 //※ebxは関数が呼ばれても不変 120 //mov ebx,1 121 OpBuffer[obp++]=(char)0xBB; 122 *((long *)(OpBuffer+obp))=1; 123 obp+=sizeof(long); 124 125 //push size 126 OpBuffer[obp++]=(char)0x68; 127 *((long *)(OpBuffer+obp))=typeSize+sizeof(DWORD)*3; 128 obp+=sizeof(long); 129 } 130 131 if( baseTypeInfo.type == DEF_OBJECT ){ 132 //DeleteはGCで処理 133 134 //call _System_GC_malloc_ForObject 135 extern SUBINFO *pSub_System_GC_malloc_ForObject; 136 op_call(pSub_System_GC_malloc_ForObject); 137 } 138 else{ 139 //明示的なDeleteが必要 140 141 //call _System_GC_malloc_ForObjectPtr 142 extern SUBINFO *pSub_System_GC_malloc_ForObjectPtr; 143 op_call(pSub_System_GC_malloc_ForObjectPtr); 144 } 145 146 147 /* 148 確保されたヒープ領域のポインタ(callocの戻り値eax)をpPtrとすると、 149 pPtr-=sizeof(DWORD)*3 150 pPtr[0]=オブジェクトの個数 151 pPtr[1]=オブジェクトのサイズ 152 pPtr[2]=デストラクタの関数ポインタ 153 */ 154 155 156 //mov dword ptr[eax],ebx(オブジェクトの個数) 157 OpBuffer[obp++]=(char)0x89; 158 OpBuffer[obp++]=(char)0x18; 159 160 //add eax,sizeof(DWORD) 161 OpBuffer[obp++]=(char)0x05; 162 *((long *)(OpBuffer+obp))=sizeof(DWORD); 163 obp+=sizeof(long); 164 165 166 //mov ecx,TypeSize 167 OpBuffer[obp++]=(char)0xB9; 168 *((long *)(OpBuffer+obp))=typeSize; 169 obp+=sizeof(long); 170 171 //mov dword ptr[eax],ecx 172 OpBuffer[obp++]=(char)0x89; 173 OpBuffer[obp++]=(char)0x08; 174 175 //add eax,sizeof(DWORD) 176 OpBuffer[obp++]=(char)0x05; 177 *((long *)(OpBuffer+obp))=sizeof(DWORD); 178 obp+=sizeof(long); 179 180 181 CMethod *method = classObj.GetDestructorMethod(); 182 if( method == NULL ) return; 183 184 //mov ecx,DestructorProcAddr 185 OpBuffer[obp++]=(char)0xB9; 186 pobj_SubAddrSchedule->add(method->psi,0); 187 method->psi->bUse=1; 188 obp+=sizeof(long); 189 190 //mov dword ptr[eax],ecx 191 OpBuffer[obp++]=(char)0x89; 192 OpBuffer[obp++]=(char)0x08; 193 194 //add eax,sizeof(DWORD) 195 OpBuffer[obp++]=(char)0x05; 196 *((long *)(OpBuffer+obp))=sizeof(DWORD); 197 obp+=sizeof(long); 198 199 200 // ※ここでプッシュされた値はNew演算子の戻り値となる 201 //push eax 202 op_push(REG_EAX); 203 204 205 ///////////////////////////////////////////////////////////////////// 206 207 //////////////////////////// 208 // コンストラクタの呼び出し 209 //////////////////////////// 210 211 BOOL bSomeObjects; 212 if(objectSizeStr[0]) bSomeObjects=1; 213 else bSomeObjects=0; 214 _call_constructor(&classObj,parameter,typeSize,bSomeObjects); 215 } 216 int Operator_New(const char *Parameter,LONG_PTR *plpIndex,const TYPEINFO &baseTypeInfo ){ 217 char TypeName[VN_SIZE],CreateParameter[VN_SIZE],objectSizeStr[VN_SIZE]; 78 218 int i,i2; 79 219 … … 81 221 82 222 if(Parameter[0]=='['){ 83 i=GetStringInBracket( ObjectSize,Parameter);84 85 SlideString( ObjectSize+1,-1);86 ObjectSize[i-2]=0;87 } 88 else ObjectSize[0]=0;223 i=GetStringInBracket(objectSizeStr,Parameter); 224 225 SlideString(objectSizeStr+1,-1); 226 objectSizeStr[i-2]=0; 227 } 228 else objectSizeStr[0]=0; 89 229 90 230 for(i2=0;;i++,i2++){ … … 129 269 pobj_c=(CClass *)*plpIndex; 130 270 131 if(pobj_c->IsAbstract()){ 132 //抽象クラスだったとき 133 SetError(125,pobj_c->name,cp); 134 } 135 136 if(ObjectSize[0]){ 137 i2=NumOpe(ObjectSize,0,0,0); 138 ChangeTypeToLong(i2); 139 140 //pop eax 141 op_pop(REG_EAX); 142 143 //※添え字上限値であることを考慮 144 //add eax,1 145 OpBuffer[obp++]=(char)0x83; 146 OpBuffer[obp++]=(char)0xC0; 147 OpBuffer[obp++]=(char)0x01; 148 149 //オブジェクトの個数をebxに一時保持 150 //※ebxは関数が呼ばれても不変 151 //mov ebx,eax 152 OpBuffer[obp++]=(char)0x8B; 153 OpBuffer[obp++]=(char)0xD8; 154 155 //imul eax,size 156 OpBuffer[obp++]=(char)0x69; 157 OpBuffer[obp++]=(char)0xC0; 158 *((long *)(OpBuffer+obp))=TypeSize; 159 obp+=sizeof(long); 160 161 //add eax,sizeof(DWORD)*2 162 OpBuffer[obp++]=(char)0x05; 163 *((long *)(OpBuffer+obp))=sizeof(DWORD)*3; 164 obp+=sizeof(long); 165 166 //push eax 167 op_push(REG_EAX); 168 } 169 else{ 170 //オブジェクトの個数をebxに一時保持 171 //※ebxは関数が呼ばれても不変 172 //mov ebx,1 173 OpBuffer[obp++]=(char)0xBB; 174 *((long *)(OpBuffer+obp))=1; 175 obp+=sizeof(long); 176 177 //push size 178 OpBuffer[obp++]=(char)0x68; 179 *((long *)(OpBuffer+obp))=TypeSize+sizeof(DWORD)*3; 180 obp+=sizeof(long); 181 } 182 183 //call calloc 184 extern SUBINFO *pSub_calloc; 185 op_call(pSub_calloc); 186 187 188 /* 189 確保されたヒープ領域のポインタ(callocの戻り値eax)をpPtrとすると、 190 pPtr-=sizeof(DWORD)*3 191 pPtr[0]=オブジェクトの個数 192 pPtr[1]=オブジェクトのサイズ 193 pPtr[2]=デストラクタの関数ポインタ 194 */ 195 196 197 //mov dword ptr[eax],ebx(オブジェクトの個数) 198 OpBuffer[obp++]=(char)0x89; 199 OpBuffer[obp++]=(char)0x18; 200 201 //add eax,sizeof(DWORD) 202 OpBuffer[obp++]=(char)0x05; 203 *((long *)(OpBuffer+obp))=sizeof(DWORD); 204 obp+=sizeof(long); 205 206 207 //mov ecx,TypeSize 208 OpBuffer[obp++]=(char)0xB9; 209 *((long *)(OpBuffer+obp))=TypeSize; 210 obp+=sizeof(long); 211 212 //mov dword ptr[eax],ecx 213 OpBuffer[obp++]=(char)0x89; 214 OpBuffer[obp++]=(char)0x08; 215 216 //add eax,sizeof(DWORD) 217 OpBuffer[obp++]=(char)0x05; 218 *((long *)(OpBuffer+obp))=sizeof(DWORD); 219 obp+=sizeof(long); 220 221 222 CMethod *method = pobj_c->GetDestructorMethod(); 223 if( method == NULL ) return 0; 224 225 //mov ecx,DestructorProcAddr 226 OpBuffer[obp++]=(char)0xB9; 227 pobj_SubAddrSchedule->add(method->psi,0); 228 method->psi->bUse=1; 229 obp+=sizeof(long); 230 231 //mov dword ptr[eax],ecx 232 OpBuffer[obp++]=(char)0x89; 233 OpBuffer[obp++]=(char)0x08; 234 235 //add eax,sizeof(DWORD) 236 OpBuffer[obp++]=(char)0x05; 237 *((long *)(OpBuffer+obp))=sizeof(DWORD); 238 obp+=sizeof(long); 239 240 241 // ※ここでプッシュされた値はNew演算子の戻り値となる 242 //push eax 243 op_push(REG_EAX); 244 245 246 ///////////////////////////////////////////////////////////////////// 247 248 //////////////////////////// 249 // コンストラクタの呼び出し 250 //////////////////////////// 251 252 BOOL bSomeObjects; 253 if(ObjectSize[0]) bSomeObjects=1; 254 else bSomeObjects=0; 255 _call_constructor(pobj_c,CreateParameter,TypeSize,bSomeObjects); 256 271 Operator_New( *pobj_c, objectSizeStr, CreateParameter, baseTypeInfo ); 272 273 if( baseTypeInfo.type == DEF_OBJECT ){ 274 return DEF_OBJECT; 275 } 257 276 return DEF_PTR_OBJECT; 258 277 } 259 278 260 void OpcodeDelete(c har *Parameter){279 void OpcodeDelete(const char *Parameter, bool isSweeping){ 261 280 int type; 262 281 … … 355 374 ////////////////////////////////////////// 356 375 357 //call free 358 extern SUBINFO *pSub_free; 359 op_call(pSub_free); 376 if( isSweeping ){ 377 //call _System_GC_free_for_SweepingDelete 378 extern SUBINFO *pSub_System_GC_free_for_SweepingDelete; 379 op_call(pSub_System_GC_free_for_SweepingDelete); 380 } 381 else{ 382 //call free 383 extern SUBINFO *pSub_free; 384 op_call(pSub_free); 385 } 360 386 } -
BasicCompiler32/Compile_ProcOp.cpp
r63 r64 293 293 294 294 LocalVar[MaxLocalVarNum].type=psi->pRealParmInfo[i3].type; 295 if(LocalVar[MaxLocalVarNum].type==DEF_OBJECT){ 296 if(psi->bExport) 297 SetError(24,NULL,cp); 295 if(LocalVar[MaxLocalVarNum].type==DEF_OBJECT 296 ||LocalVar[MaxLocalVarNum].type==DEF_STRUCT){ 297 if(psi->bExport) 298 SetError(24,NULL,cp); 298 299 } 299 300 300 301 LocalVar[MaxLocalVarNum].u.index=psi->pRealParmInfo[i3].u.index; 301 302 302 if(psi->pRealParmInfo[i3].bByVal&&psi->pRealParmInfo[i3].type==DEF_ OBJECT){303 // 実態オブジェクトのByValパラメータ303 if(psi->pRealParmInfo[i3].bByVal&&psi->pRealParmInfo[i3].type==DEF_STRUCT){ 304 //構造体のByValパラメータ 304 305 LocalVar[MaxLocalVarNum].fRef=REF_PARAMETER | OBJECT_PARAMETER; 305 306 VarSize=PTR_SIZE; … … 370 371 OpBuffer[obp++]=(char)0x57; 371 372 372 if(psi->ReturnType!= -1){373 if(psi->ReturnType!=DEF_NON){ 373 374 //戻り値が存在するとき 374 375 … … 377 378 else temp=psi->name; 378 379 379 if(psi->ReturnType==DEF_OBJECT && psi->isReturnRef == false){ 380 //戻り値用オブジェクトのコンストラクタを呼び出す 381 if( psi->u.Return_pobj_c->GetConstructorMethod() ){ 382 sprintf(temporary,"%s.%s()",temp,psi->u.Return_pobj_c->name); 383 OpcodeOthers(temporary); 384 } 380 if(psi->ReturnType==DEF_STRUCT && psi->isReturnRef == false){ 381 //戻り値用の構造体(値型)はパラメータで引き渡される 385 382 } 386 383 else{ … … 517 514 for(i3=0;i3<pobj_CompilingClass->iMemberNum;i3++){ 518 515 CMember *pMember = pobj_CompilingClass->ppobj_Member[i3]; 519 int MemberTypeSize= 520 GetTypeSize(pMember->TypeInfo.type, 521 pMember->TypeInfo.u.lpIndex); 522 523 int MemberObjectNum= 524 JumpSubScripts(pMember->SubScripts); 525 526 int offset = pobj_CompilingClass->GetMemberOffset( pMember->name, NULL ); 527 528 if(pMember->TypeInfo.type==DEF_OBJECT && pMember->IsRef() == false){ 529 CMethod *method = pMember->TypeInfo.u.pobj_Class->GetConstructorMethod(); 530 if( method ){ 531 if( method->psi->RealParmNum == 1 ){ //Thisポインタを第一引数に持ち合わせるため、引数なしの場合はこの値が1になる 532 for(i4=0;i4<MemberObjectNum;i4++){ 533 //Thisポインタをecxにコピー 534 SetThisPtrToReg(REG_ECX); 535 536 //add ecx,offset 537 OpBuffer[obp++]=(char)0x81; 538 OpBuffer[obp++]=(char)0xC1; 539 *((long *)(OpBuffer+obp))=offset+i4*MemberTypeSize; 540 obp+=sizeof(long); 541 542 //push ecx 543 op_push(REG_ECX); 544 545 //call constructor 546 op_call( method->psi ); 547 } 548 } 549 } 516 if(pMember->TypeInfo.type==DEF_OBJECT){ 517 // オブジェクトメンバを発見したとき 518 519 sprintf(temporary, "This.%s=%c%c%s()", 520 pMember->name, 521 1, ESC_NEW, 522 pMember->TypeInfo.u.pobj_Class->name ); 523 OpcodeCalc( temporary ); 550 524 } 551 525 } … … 619 593 } 620 594 621 //実体クラスを持つメンバのデストラクタを呼び出す 595 //実体クラスを持つメンバのデストラクタ呼び出しはGCに任せる 596 /* 622 597 //※コンストラクタと逆順序で呼び出す 623 598 int offset; … … 658 633 } 659 634 } 660 } 635 }*/ 661 636 } 662 637 } … … 706 681 707 682 if(bDebugCompile&&bDebugSupportProc==0){ 708 *((long *)(OpBuffer+EspOffsetSchedule))=AllLocalVarSize-BaseOffset ;683 *((long *)(OpBuffer+EspOffsetSchedule))=AllLocalVarSize-BaseOffset-sizeof(long); 709 684 710 685 //call _DebugSys_EndProc … … 713 688 } 714 689 715 if(psi->ReturnType!= -1){690 if(psi->ReturnType!=DEF_NON){ 716 691 //戻り値をeax、edxに設定 717 692 RELATIVE_VAR RelativeVar; … … 726 701 i3=psi->ReturnType; 727 702 728 if(i3==DEF_OBJECT ){703 if(i3==DEF_OBJECT || i3==DEF_STRUCT){ 729 704 SetVarPtrToEax(&RelativeVar); 705 if( i3==DEF_OBJECT ){ 706 //mov eax,dword ptr[eax] 707 op_mov_RM( sizeof(long), REG_EAX, REG_EAX, 0, MOD_BASE ); 708 } 730 709 } 731 710 else if(i3==DEF_DOUBLE){ … … 818 797 op_pop(REG_EBX); 819 798 799 if(bDebugCompile){ 800 //cmp esp,ebp 801 op_cmp_RR( REG_ESP, REG_EBP ); 802 803 //jz 6(次のcallとbreakpointを飛び越す) 804 OpBuffer[obp++]=(char)0x74; 805 OpBuffer[obp++]=(char)0x06; 806 807 //call _esp_error 808 extern SUBINFO *pSub_esp_error; 809 op_call( pSub_esp_error ); 810 811 breakpoint; 812 } 813 820 814 //mov esp,ebp 821 815 OpBuffer[obp++]=(char)0x8B; -
BasicCompiler32/Compile_Set_Var.cpp
r63 r64 7 7 } 8 8 9 void SetObjectVariable(LONG_PTR lpVarIndex,int CalcType,LONG_PTR lpCalcIndex,BOOL bUseHeap){ 9 void SetStructVariable(LONG_PTR lpVarIndex,int CalcType,LONG_PTR lpCalcIndex,BOOL bUseHeap){ 10 /* 11 TODO: 消す 10 12 /////////////////////////////////////////////////////////////////// 11 13 // オペレータ '=' のオーバーロード関数を呼ぶ … … 32 34 //成功したとき、またはエラーが発行されたとき 33 35 return; 34 } 35 36 37 if( CalcType == DEF_ OBJECT ){36 }*/ 37 38 39 if( CalcType == DEF_STRUCT ){ 38 40 CClass *pVarClass = (CClass *)lpVarIndex; 39 41 CClass *pCalcClass = (CClass *)lpCalcIndex; 40 42 41 43 42 if( pVarClass->IsEquals( pCalcClass ) //等しい 43 || pVarClass->IsSubClass( pCalcClass ) ){ //派生・継承関係 44 if( pVarClass->IsEquals( pCalcClass ) ){ //等しい 44 45 45 46 //双方のオブジェクト型が一致、または派生・継承関係にあるとき … … 81 82 } 82 83 84 85 void SetRealVariable(int VarType,int CalcType,RELATIVE_VAR *pRelativeVar){ 86 if( !IsRealNumberType( CalcType ) ){ 87 // 実数へ変換 88 // 64bit edx:eax -> st(0) 89 // 32bit eax -> st(0) 90 91 if( Is64Type( CalcType ) ){ 92 //64ビット整数型 93 94 //push edx 95 op_push( REG_EDX ); 96 97 //push eax 98 op_push( REG_EAX ); 99 100 //fild qword ptr[esp] 101 op_fld_ptr_esp(DEF_INT64); 102 103 //pop 104 op_pop( REG_NON ); 105 106 //pop 107 op_pop( REG_NON ); 108 } 109 else{ 110 //push eax 111 op_push( REG_EAX ); 112 113 //fild qword ptr[esp] 114 op_fld_ptr_esp(DEF_LONG); 115 116 //pop 117 op_pop( REG_NON ); 118 } 119 } 120 121 if(pRelativeVar->dwKind==VAR_GLOBAL){ 122 if(pRelativeVar->bOffsetOffset){ 123 //fstp ptr[ecx+offset] 124 op_fstp_base_offset(VarType,REG_ECX,(int)pRelativeVar->offset); 125 obp-=sizeof(long); 126 pobj_GlobalVarSchedule->add(); 127 obp+=sizeof(long); 128 } 129 else{ 130 //mov ecx,offset 131 op_mov_RV(REG_ECX,(int)pRelativeVar->offset); 132 obp-=sizeof(long); 133 pobj_GlobalVarSchedule->add(); 134 obp+=sizeof(long); 135 136 //fstp ptr[ecx] 137 op_fstp_basereg(VarType,REG_ECX); 138 } 139 } 140 else if(pRelativeVar->dwKind==VAR_REFGLOBAL){ 141 if(pRelativeVar->bOffsetOffset){ 142 //add ecx,qword ptr[offset] 143 op_add_RM(sizeof(long),REG_ECX,REG_NON,(int)pRelativeVar->offset,MOD_DISP32); 144 } 145 else{ 146 //mov ecx,qword ptr[offset] 147 op_mov_RM(sizeof(long),REG_ECX,REG_NON,(int)pRelativeVar->offset,MOD_DISP32); 148 } 149 obp-=sizeof(long); 150 pobj_GlobalVarSchedule->add(); 151 obp+=sizeof(long); 152 153 goto directmem; 154 } 155 else if(pRelativeVar->dwKind==VAR_LOCAL){ 156 if(pRelativeVar->bOffsetOffset){ 157 //fstp ptr[ebp+ecx+offset] 158 op_fstp_base_offset_ex(VarType,REG_EBP,REG_ECX,(int)pRelativeVar->offset,USE_OFFSET); 159 } 160 else{ 161 //fstp ptr[ebp+offset] 162 op_fstp_base_offset(VarType,REG_EBP,(int)pRelativeVar->offset); 163 } 164 obp-=sizeof(long); 165 AddLocalVarAddrSchedule(); 166 obp+=sizeof(long); 167 } 168 else if(pRelativeVar->dwKind==VAR_REFLOCAL){ 169 if(pRelativeVar->bOffsetOffset){ 170 //add ecx,qword ptr[ebp+offset] 171 op_add_RM(sizeof(long),REG_ECX,REG_EBP,(int)pRelativeVar->offset,MOD_BASE_DISP32); 172 } 173 else{ 174 //mov ecx,qword ptr[ebp+offset] 175 op_mov_RM(sizeof(long),REG_ECX,REG_EBP,(int)pRelativeVar->offset,MOD_BASE_DISP32); 176 } 177 obp-=sizeof(long); 178 AddLocalVarAddrSchedule(); 179 obp+=sizeof(long); 180 181 goto directmem; 182 } 183 else if(pRelativeVar->dwKind==VAR_DIRECTMEM){ 184 directmem: 185 //fstp ptr[ecx] 186 op_fstp_basereg(VarType,REG_ECX); 187 } 188 } 189 190 void SetBooleanVariable(int type,RELATIVE_VAR *pRelative){ 191 if(type==DEF_DOUBLE){ 192 // TODO: 実装 193 SetError(); 194 } 195 else if(type==DEF_SINGLE){ 196 // TODO: 実装 197 SetError(); 198 } 199 else if(type==DEF_INT64||type==DEF_QWORD){ 200 //cmp eax,0 201 op_cmp_value(GetTypeSize(type,-1),REG_EAX,0); 202 203 //setne al 204 op_setne( REG_EAX ); 205 206 //cmp edx,0 207 op_cmp_value(GetTypeSize(type,-1),REG_EDX,0); 208 209 //setne cl 210 op_setne( REG_ECX ); 211 212 //or al,cl 213 op_or_RR( sizeof( _int8 ), REG_EAX, REG_ECX ); 214 } 215 else{ 216 if(!IsWholeNumberType(type)){ 217 //不正な型の場合 218 SetError(9,NULL,cp); 219 return; 220 } 221 } 222 223 //cmp eax,0 224 op_cmp_value(GetTypeSize(type,-1),REG_EAX,0); 225 226 //setne al 227 op_setne( REG_EAX ); 228 229 SetWholeVariable( sizeof(char), DEF_BYTE, pRelative ); 230 } 231 232 void ExtendTypeTo32(int type,int reg); 233 void ExtendTypeTo64(int type){ 234 if(Is64Type(type)) return; 235 236 ExtendTypeTo32(type,REG_EAX); 237 238 if(IsSignedType(type)){ 239 //cdq 240 op_cdq(); 241 } 242 else{ 243 //xor edx,edx 244 op_zero_reg(REG_EDX); 245 } 246 } 247 void ExtendTypeTo32(int type,int reg){ 248 if(type==DEF_INTEGER || (isUnicode&&type==DEF_CHAR)){ 249 //movsx reg32,reg16 250 op_movsx_R32R16(reg,reg); 251 } 252 else if(type==DEF_WORD){ 253 //and reg,0000FFFFh 254 op_and_RV(reg,(int)0x0000FFFF); 255 } 256 else if(type==DEF_SBYTE || (isUnicode==false&&type==DEF_CHAR)){ 257 //movsx reg32,reg8 258 op_movsx_R32R8(reg,reg); 259 } 260 else if(type==DEF_BYTE||type==DEF_BOOLEAN){ 261 //and reg,000000FFh 262 op_and_RV(reg,(int)0xFF); 263 } 264 } 265 void ExtendTypeTo16(int type,int reg){ 266 if(type==DEF_SBYTE || (isUnicode==false&&type==DEF_CHAR)){ 267 //movsx reg16,reg8 268 op_movsx_R16R8(reg,reg); 269 } 270 else if(type==DEF_BYTE||type==DEF_BOOLEAN){ 271 //and reg,000000FFh 272 op_and_RV(reg,(int)0xFF); 273 } 274 } 275 276 void SetWholeVariable(int var_size,int type,RELATIVE_VAR *pRelative){ 277 if(type==DEF_DOUBLE){ 278 //Double型 279 // st(0)の内容をedx:eaxに変換 280 281 //TODO: 実装 282 SetError(); 283 } 284 else if(type==DEF_SINGLE){ 285 //Single型 286 // st(0)の内容をeaxに変換 287 288 //TODO: 実装 289 SetError(); 290 } 291 else{ 292 //その他の整数 293 294 if(var_size==sizeof(_int64)){ 295 //eaxの値を64ビット(edx:eax)に拡張する 296 ExtendTypeTo64(type); 297 } 298 else if(var_size==sizeof(long)){ 299 //レジスタの値を32ビット(eax)に拡張する 300 ExtendTypeTo32(type,REG_EAX); 301 } 302 else if(var_size==sizeof(short)){ 303 //レジスタの値を16ビット(ax)に拡張する 304 ExtendTypeTo16(type,REG_EAX); 305 } 306 //8ビットは拡張なし 307 } 308 309 if(var_size==sizeof(_int64)){ 310 //下位32ビット 311 SetWholeVariable(sizeof(long),DEF_LONG,pRelative); 312 313 //mov eax,edx 314 op_mov_RR( REG_EAX, REG_EDX ); 315 316 //上位32ビット 317 if( pRelative->dwKind == VAR_DIRECTMEM ){ 318 //add ecx,sizeof(long) 319 op_add_RV8( REG_ECX, sizeof(long) ); 320 } 321 pRelative->offset+=sizeof(long); 322 SetWholeVariable(sizeof(long),DEF_LONG,pRelative); 323 pRelative->offset-=sizeof(long); 324 325 return; 326 } 327 328 if(pRelative->dwKind==VAR_GLOBAL){ 329 if(pRelative->bOffsetOffset){ 330 //mov ptr[ecx+offset],eax/ax/al 331 op_mov_MR(var_size,REG_EAX,REG_ECX,(int)pRelative->offset,MOD_BASE_DISP32); 332 } 333 else{ 334 //mov ptr[offset],eax/ax/al 335 op_mov_MR(var_size,REG_EAX,0,(int)pRelative->offset,MOD_DISP32); 336 } 337 obp-=sizeof(long); 338 pobj_GlobalVarSchedule->add(); 339 obp+=sizeof(long); 340 } 341 else if(pRelative->dwKind==VAR_REFGLOBAL){ 342 if(pRelative->bOffsetOffset){ 343 //add ecx,qword ptr[offset] 344 op_add_RM(var_size,REG_ECX,REG_NON,(int)pRelative->offset,MOD_DISP32); 345 } 346 else{ 347 //mov ecx,qword ptr[offset] 348 op_mov_RM(var_size,REG_ECX,REG_NON,(int)pRelative->offset,MOD_DISP32); 349 } 350 obp-=sizeof(long); 351 pobj_GlobalVarSchedule->add(); 352 obp+=sizeof(long); 353 354 goto directmem; 355 } 356 else if(pRelative->dwKind==VAR_LOCAL){ 357 if(pRelative->bOffsetOffset){ 358 //mov ptr[ebp+ecx+offset],eax/ax/al 359 op_mov_MR_ex(var_size,REG_EAX,REG_EBP,REG_ECX,(int)pRelative->offset,USE_OFFSET); 360 } 361 else{ 362 //mov ptr[ebp+offset],eax/ax/al 363 op_mov_MR(var_size,REG_EAX,REG_EBP,(int)pRelative->offset,MOD_BASE_DISP32); 364 } 365 obp-=sizeof(long); 366 AddLocalVarAddrSchedule(); 367 obp+=sizeof(long); 368 } 369 else if(pRelative->dwKind==VAR_REFLOCAL){ 370 if(pRelative->bOffsetOffset){ 371 //add ecx,qword ptr[ebp+offset] 372 op_add_RM(var_size,REG_ECX,REG_EBP,(int)pRelative->offset,MOD_BASE_DISP32); 373 } 374 else{ 375 //mov ecx,qword ptr[ebp+offset] 376 op_mov_RM(var_size,REG_ECX,REG_EBP,(int)pRelative->offset,MOD_BASE_DISP32); 377 } 378 obp-=sizeof(long); 379 AddLocalVarAddrSchedule(); 380 obp+=sizeof(long); 381 382 goto directmem; 383 } 384 else if(pRelative->dwKind==VAR_DIRECTMEM){ 385 directmem: 386 387 //mov ptr[ecx],eax/ax/al 388 op_mov_MR(var_size,REG_EAX,REG_ECX,0,MOD_BASE); 389 } 390 } 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 /* 417 TODO: 消す 83 418 void SetDoubleVariable(int type,DWORD VarKind,DWORD offset,BOOL bOffsetOffset){ 84 419 ChangeTypeToDouble(type); … … 972 1307 } 973 1308 } 974 void SetBooleanVariable(int type,RELATIVE_VAR *pRelative){ 975 if(type==DEF_DOUBLE){ 976 // TODO: 実装 977 } 978 else if(type==DEF_SINGLE){ 979 // TODO: 実装 980 } 981 else if(type==DEF_INT64||type==DEF_QWORD){ 982 // TODO: 実装 983 984 //pop eax 985 op_pop(REG_EAX); 986 987 //cmp eax,0 988 op_cmp_value(GetTypeSize(type,-1),REG_EAX,0); 989 990 //setne al 991 op_setne( REG_EAX ); 992 993 //pop ecx 994 op_pop(REG_ECX); 995 996 //cmp ecx,0 997 op_cmp_value(GetTypeSize(type,-1),REG_ECX,0); 998 999 //setne cl 1000 op_setne( REG_ECX ); 1001 1002 //or al,cl 1003 op_or_RR( sizeof( _int8 ), REG_EAX, REG_ECX ); 1004 } 1005 else{ 1006 if(!IsWholeNumberType(type)){ 1007 //不正な型の場合 1008 SetError(9,NULL,cp); 1009 return; 1010 } 1011 1012 //pop eax 1013 op_pop(REG_EAX); 1014 } 1015 1016 //cmp eax,0 1017 op_cmp_value(GetTypeSize(type,-1),REG_EAX,0); 1018 1019 //setne al 1020 op_setne( REG_EAX ); 1021 1022 //push eax 1023 op_push(REG_EAX); 1024 1025 Set8Variable(DEF_BYTE,pRelative->dwKind,pRelative->offset,pRelative->bOffsetOffset); 1026 } 1309 */ -
BasicCompiler32/Compile_Statement.cpp
r55 r64 105 105 OpBuffer[obp++]=(char)0xD8; 106 106 } 107 if(i2==DEF_ OBJECT){107 if(i2==DEF_STRUCT){ 108 108 //mov ebx,eax 109 109 op_mov_RR(REG_EBX,REG_EAX); … … 1336 1336 else temp=pCompilingSubInfo->name; 1337 1337 1338 /* 1339 TODO: 消す 1338 1340 if( pCompilingSubInfo->isReturnRef ){ 1339 1341 //参照型 … … 1341 1343 } 1342 1344 else{ 1343 //値型 1345 //値型*/ 1344 1346 char temporary[VN_SIZE]; 1345 1347 sprintf(temporary,"%s=%s",temp,Parameter); 1346 1348 OpcodeCalc(temporary); 1347 }1349 //} 1348 1350 } 1349 1351 … … 1353 1355 } 1354 1356 1355 void Opcode_Input(c har *Parameter){1357 void Opcode_Input(const char *Parameter){ 1356 1358 extern int cp; 1357 1359 int i2,i3,i4,i5,type; 1358 1360 BOOL bFile; 1359 1361 char temporary[VN_SIZE],temp2[VN_SIZE],buffer[VN_SIZE]; 1360 1361 KillStringSpaces(Parameter);1362 1362 1363 1363 if(Parameter[0]=='#'){ … … 1469 1469 Opcode_CallProc(buffer,psi,0,"",0); 1470 1470 } 1471 void Opcode_PrintUsing(c har *Parameter,char *buffer,BOOL bFile){1471 void Opcode_PrintUsing(const char *Parameter,char *buffer,BOOL bFile){ 1472 1472 extern int cp; 1473 1473 int i2,i3,i4,i5; … … 1475 1475 BOOL bReturnLine; 1476 1476 1477 i2=lstrlen(Parameter); 1478 if(Parameter[i2-1]==';'){ 1477 char parms[8192]; 1478 lstrcpy( parms, Parameter ); 1479 1480 i2=lstrlen(parms); 1481 if(parms[i2-1]==';'){ 1479 1482 bReturnLine=0; 1480 Parameter[i2-1]=0;1483 parms[i2-1]=0; 1481 1484 } 1482 1485 else bReturnLine=1; … … 1484 1487 i3=lstrlen(buffer); 1485 1488 for(i2=0;;i2++,i3++){ 1486 if( Parameter[i2]==';'){1489 if(parms[i2]==';'){ 1487 1490 buffer[i3]=0; 1488 1491 break; 1489 1492 } 1490 buffer[i3]= Parameter[i2];1491 if( Parameter[i2]=='\0') break;1492 } 1493 if( Parameter[i2]==';') i2++;1493 buffer[i3]=parms[i2]; 1494 if(parms[i2]=='\0') break; 1495 } 1496 if(parms[i2]==';') i2++; 1494 1497 1495 1498 if(bReturnLine) lstrcat(buffer,"+Ex\"\\r\\n\""); … … 1499 1502 while(1){ 1500 1503 for(i3=0;;i2++,i3++){ 1501 if( Parameter[i2]=='\"'){1502 temporary[i3]= Parameter[i2];1504 if(parms[i2]=='\"'){ 1505 temporary[i3]=parms[i2]; 1503 1506 for(i2++,i3++;;i2++,i3++){ 1504 temporary[i3]= Parameter[i2];1505 if( Parameter[i2]=='\"') break;1507 temporary[i3]=parms[i2]; 1508 if(parms[i2]=='\"') break; 1506 1509 } 1507 1510 continue; 1508 1511 } 1509 if( Parameter[i2]=='('){1510 i5=GetStringInPare(temporary+i3, Parameter+i2);1512 if(parms[i2]=='('){ 1513 i5=GetStringInPare(temporary+i3,parms+i2); 1511 1514 i2+=i5-1; 1512 1515 i3+=i5-1; 1513 1516 continue; 1514 1517 } 1515 if( Parameter[i2]=='['){1516 i5=GetStringInBracket(temporary+i3, Parameter+i2);1518 if(parms[i2]=='['){ 1519 i5=GetStringInBracket(temporary+i3,parms+i2); 1517 1520 i2+=i5-1; 1518 1521 i3+=i5-1; 1519 1522 continue; 1520 1523 } 1521 if( Parameter[i2]==','){1524 if(parms[i2]==','){ 1522 1525 temporary[i3]=0; 1523 1526 i2++; 1524 1527 break; 1525 1528 } 1526 temporary[i3]= Parameter[i2];1527 if( Parameter[i2]=='\0') break;1529 temporary[i3]=parms[i2]; 1530 if(parms[i2]=='\0') break; 1528 1531 } 1529 1532 if(temporary[0]=='\0'){ … … 1554 1557 1555 1558 i4++; 1556 if( Parameter[i2]=='\0') break;1559 if(parms[i2]=='\0') break; 1557 1560 } 1558 1561 sprintf(temp2,"_System_UsingDataType[%d]=-1",i4); … … 1568 1571 Opcode_CallProc(buffer,psi,0,"",0); 1569 1572 } 1570 void Opcode_Print(c har *Parameter,BOOL bWrite){1573 void Opcode_Print(const char *Parameter,BOOL bWrite){ 1571 1574 int i2,i3,i4,sw; 1572 1575 char temporary[VN_SIZE],buffer[VN_SIZE]; 1573 1576 BOOL bFile; 1574 1575 KillStringSpaces(Parameter);1576 1577 1577 1578 if(Parameter[0]=='#'){ -
BasicCompiler32/Compile_Var.cpp
r63 r64 23 23 24 24 if(PTR_LEVEL(*pType)){ 25 *pType=MAKE_PTR_TYPE(NATURAL_TYPE(*pType),PTR_LEVEL(*pType)-1); 26 if((*pType)==DEF_OBJECT){ 27 CClass *pClass = (CClass *)lpIndex; 28 int objsize = pClass->GetSize(); 29 30 //imul ebx,objsize 31 OpBuffer[obp++]=(char)0x69; 32 OpBuffer[obp++]=(char)0xDB; 33 *((long *)(OpBuffer+obp))=objsize; 34 obp+=sizeof(long); 35 } 36 else{ 37 i2=GetTypeSize(*pType,-1); 38 if(i2>=2){ 39 //imul ebx,i2 40 OpBuffer[obp++]=(char)0x6B; 41 OpBuffer[obp++]=(char)0xDB; 42 OpBuffer[obp++]=(char)i2; 43 } 25 *pType = PTR_LEVEL_DOWN( *pType ); 26 27 i2=GetTypeSize(*pType,-1); 28 if(i2>=2){ 29 //imul ebx,i2 30 op_imul_RV( REG_EBX, i2 ); 44 31 } 45 32 } … … 56 43 OpBuffer[obp++]=(char)0x03; 57 44 OpBuffer[obp++]=(char)0xCB; 45 } 46 void SetRelativeOffset( RELATIVE_VAR &relativeVar ){ 47 if(relativeVar.dwKind==VAR_DIRECTMEM){ 48 //mov ecx,dword ptr[ecx] 49 op_mov_RM( sizeof(long), REG_ECX, REG_ECX, 0, MOD_BASE ); 50 } 51 else{ 52 //直接参照に切り替え 53 SetVarPtrToEax(&relativeVar); 54 relativeVar.dwKind=VAR_DIRECTMEM; 55 56 //mov ecx,dword ptr[eax] 57 op_mov_RM( sizeof(long), REG_ECX, REG_EAX, 0, MOD_BASE ); 58 } 58 59 } 59 60 BOOL GetArrayOffset(int *SubScripts,char *array,int type,LONG_PTR lpIndex){ … … 168 169 char lpPtrOffset[VN_SIZE]; //第2次配列 169 170 char NestMember[VN_SIZE]; //入れ子メンバ 170 int RefType; //"."参照のときは0、"->"参照のときは1171 CClass::RefType refType; 171 172 lstrcpy(VarName,member); 172 if(!GetVarFormatString(VarName,array,lpPtrOffset,NestMember, &RefType)) return 0;173 if(!GetVarFormatString(VarName,array,lpPtrOffset,NestMember,refType)) return 0; 173 174 174 175 //////////////////////////// … … 251 252 //入れ子構造の場合 252 253 253 if(*pType==DEF_OBJECT ){254 if( RefType!=DEF_OBJECT){254 if(*pType==DEF_OBJECT || *pType==DEF_STRUCT){ 255 if( refType != CClass::Dot ){ 255 256 if(isErrorEnabled) SetError(104,member,cp); 256 257 return 0; 257 258 } 258 } 259 else if(*pType==DEF_PTR_OBJECT){ 259 260 if( *pType==DEF_OBJECT ){ 261 // 参照内容へのポインタを抽出 262 SetRelativeOffset( *pRelativeVar ); 263 } 264 } 265 else if(*pType==DEF_PTR_OBJECT||*pType==DEF_PTR_STRUCT){ 260 266 //構造体ポインタ型メンバ変数 261 267 262 268 if(lpPtrOffset[0]){ 263 269 //pObj[n].member 264 if( RefType!=DEF_OBJECT){270 if( ( *pType==DEF_PTR_OBJECT||*pType==DEF_PTR_STRUCT )&& refType != CClass::Dot ){ 265 271 if(isErrorEnabled) SetError(104,member,cp); 266 272 return 0; … … 275 281 else{ 276 282 //pObj->member 277 if( RefType!=DEF_PTR_OBJECT){283 if( ( *pType==DEF_PTR_OBJECT||*pType==DEF_PTR_STRUCT )&& refType != CClass::Pointer ){ 278 284 if(isErrorEnabled) SetError(104,member,cp); 279 285 return 0; 280 286 } 281 287 282 if(pRelativeVar->dwKind==VAR_DIRECTMEM){ 283 //mov ecx,dword ptr[ecx] 284 OpBuffer[obp++]=(char)0x8B; 285 OpBuffer[obp++]=(char)0x09; 286 } 287 else{ 288 //直接参照に切り替え 289 SetVarPtrToEax(pRelativeVar); 290 pRelativeVar->dwKind=VAR_DIRECTMEM; 291 292 //mov ecx,dword ptr[eax] 293 OpBuffer[obp++]=(char)0x8B; 294 OpBuffer[obp++]=(char)0x08; 295 } 296 } 297 } 298 else if(*pType==MAKE_PTR_TYPE(DEF_OBJECT,2)){ 288 SetRelativeOffset( *pRelativeVar ); 289 } 290 } 291 else if(*pType==MAKE_PTR_TYPE(DEF_OBJECT,2) || *pType==MAKE_PTR_TYPE(DEF_STRUCT,2)){ 299 292 //構造体ポインタのポインタ型メンバ変数 300 293 301 294 if(lpPtrOffset[0]){ 302 295 //ppObj[n]->member 303 if( RefType!=DEF_PTR_OBJECT){296 if( refType != CClass::Pointer ){ 304 297 if(isErrorEnabled) SetError(104,member,cp); 305 298 return 0; … … 364 357 BOOL GetVarOffset(bool isErrorEnabled, bool isWriteAccess, const char *NameBuffer, int *pType, RELATIVE_VAR *pRelativeVar, LONG_PTR *plpIndex, int *pss){ 365 358 extern BOOL bCompilingGlobal; 366 int i ,RefType;359 int i; 367 360 LONG_PTR lpIndex; 368 361 char variable[VN_SIZE],member[VN_SIZE],VarName[VN_SIZE],array[VN_SIZE],lpPtrOffset[VN_SIZE]; … … 374 367 else lstrcpy(variable,NameBuffer); 375 368 376 377 if( FormatUseProcReturnObject( variable, VarName, array, RefType, member ) ){369 CClass::RefType refType; 370 if( FormatUseProcReturnObject( variable, VarName, array, refType, member ) ){ 378 371 // 戻り値オブジェクトのメンバを直接参照しているとき 379 372 //例: func().member … … 410 403 411 404 lstrcpy(VarName,variable); 412 GetVarFormatString(VarName,array,lpPtrOffset,member, &RefType);405 GetVarFormatString(VarName,array,lpPtrOffset,member,refType); 413 406 414 407 int *pSubScripts; … … 546 539 if(member[0]){ 547 540 lstrcpy(temporary,member); 541 548 542 char tempMember[VN_SIZE]; 549 543 char tempArray[VN_SIZE]; 550 GetVarFormatString(temporary,tempArray,lpPtrOffset,tempMember,&i); 544 { 545 CClass::RefType refType; 546 GetVarFormatString(temporary,tempArray,lpPtrOffset,tempMember, refType ); 547 } 551 548 552 549 char temp2[VN_SIZE]; … … 665 662 } 666 663 if(member[0]){ 667 if(*pType==DEF_OBJECT ){664 if(*pType==DEF_OBJECT || *pType==DEF_STRUCT){ 668 665 //実態オブジェクトのメンバを参照(obj.member) 669 if( RefType!=DEF_OBJECT){666 if( refType != CClass::Dot ){ 670 667 SetError(104,VarName,cp); 671 668 pRelativeVar->dwKind=NON_VAR; 672 669 return 0; 673 670 } 674 } 675 else if(*pType==DEF_PTR_OBJECT){ 671 672 if( *pType==DEF_OBJECT ){ 673 // 参照内容へのポインタを抽出 674 SetRelativeOffset( *pRelativeVar ); 675 } 676 } 677 else if(*pType==DEF_PTR_OBJECT || *pType==DEF_PTR_STRUCT){ 676 678 //ポインタオブジェクトが示すメンバを参照 677 679 if(lpPtrOffset[0]){ 678 680 //pObj[n].member 679 if( RefType!=DEF_OBJECT){681 if( refType != CClass::Dot ){ 680 682 SetError(104,VarName,cp); 681 683 pRelativeVar->dwKind=NON_VAR; … … 687 689 else{ 688 690 //pObj->member 689 if( RefType!=DEF_PTR_OBJECT){691 if( refType != CClass::Pointer ){ 690 692 SetError(104,VarName,cp); 691 693 pRelativeVar->dwKind=NON_VAR; … … 701 703 } 702 704 } 703 else if(*pType==MAKE_PTR_TYPE(DEF_OBJECT,2) ){705 else if(*pType==MAKE_PTR_TYPE(DEF_OBJECT,2) || *pType==MAKE_PTR_TYPE(DEF_STRUCT,2)){ 704 706 //ポインタオブジェクトが示すメンバを参照 705 707 if(lpPtrOffset[0]){ 706 708 //ppObj[n]->member 707 if( RefType!=DEF_PTR_OBJECT){709 if( refType != CClass::Pointer ){ 708 710 SetError(104,VarName,cp); 709 711 pRelativeVar->dwKind=NON_VAR; … … 785 787 } 786 788 787 if(type==DEF_ OBJECT){789 if(type==DEF_STRUCT){ 788 790 CClass *pobj_c; 789 791 pobj_c=(CClass *)lpIndex; … … 818 820 /////////////////////////////////////// 819 821 820 if( type == DEF_OBJECT ){821 //オブジェクト の場合はありえない822 if( type == DEF_OBJECT || type == DEF_STRUCT ){ 823 //オブジェクトまたは構造体の場合はありえない 822 824 SetError(300,NULL,cp); 823 825 return 0; … … 855 857 *(_int64 *)(initGlobalBuf+offset)=i64data; 856 858 else if(type==DEF_LONG||type==DEF_DWORD||IsPtrType(type)){ 857 if(type==DEF_PTR_ BYTE&&lpCalcIndex==LITERAL_STRING){859 if(type==DEF_PTR_CHAR&&lpCalcIndex==LITERAL_STRING){ 858 860 //文字列定数のとき 859 861 … … 918 920 } 919 921 920 if(type==DEF_ OBJECT){922 if(type==DEF_STRUCT){ 921 923 CClass *pobj_c; 922 924 pobj_c=(CClass *)lpIndex; … … 1045 1047 } 1046 1048 else if(type==DEF_LONG||type==DEF_DWORD||IsPtrType(type)){ 1047 if(type==DEF_PTR_ BYTE&&lpCalcIndex==LITERAL_STRING){1049 if(type==DEF_PTR_CHAR&&lpCalcIndex==LITERAL_STRING){ 1048 1050 //文字列定数のとき 1049 1051 … … 1102 1104 } 1103 1105 1106 void dim(bool isRef, char *VarName,int *SubScripts,TYPEINFO &TypeInfo,int TypeSize,char *InitBuf,char *ConstractParameter,DWORD dwFlags){ 1107 extern BOOL bCompilingGlobal; 1108 if(bCompilingGlobal){ 1109 ///////////////////////// 1110 // グローバル変数 1111 ///////////////////////// 1112 1113 AddGlobalVariable(isRef,VarName,SubScripts,&TypeInfo,TypeSize,InitBuf,ConstractParameter,dwFlags); 1114 } 1115 else{ 1116 ///////////////// 1117 // ローカル変数 1118 ///////////////// 1119 1120 int i2,i3; 1121 1122 for(i2=0;i2<MaxLocalVarNum;i2++){ 1123 if(LocalVar[i2].bLiving&&obj_LexScopes.GetNowLevel()==LocalVar[i2].ScopeLevel){ 1124 if(lstrcmp(LocalVar[i2].name,VarName)==0){ 1125 //2重定義のエラー 1126 SetError(15,VarName,cp); 1127 return; 1128 } 1129 } 1130 } 1131 1132 LocalVar=(VARIABLE *)HeapReAlloc(hHeap,0,LocalVar,(MaxLocalVarNum+1)*sizeof(VARIABLE)); 1133 VARIABLE *pVar = &LocalVar[MaxLocalVarNum]; 1134 MaxLocalVarNum++; 1135 1136 if( isRef ){ 1137 //参照型 1138 pVar->fRef = REF_VARIABLE; 1139 TypeSize = PTR_SIZE; 1140 } 1141 else pVar->fRef=0; 1142 1143 for(i2=1,i3=0;i3<255;i3++){ 1144 //配列要素数 1145 pVar->SubScripts[i3]=SubScripts[i3]; 1146 1147 if(SubScripts[i3]==-1) break; 1148 i2*=SubScripts[i3]+1; 1149 } 1150 int VarSize=TypeSize*i2; 1151 if(VarSize%4) VarSize+=4-(VarSize%4); 1152 1153 //変数データを追加 1154 lstrcpy(pVar->name,VarName); 1155 if(dwFlags & DIMFLAG_CONST) pVar->bConst = true; 1156 else pVar->bConst = false; 1157 if(SubScripts[0]==-1) pVar->bArray=0; 1158 else pVar->bArray=1; 1159 pVar->type=TypeInfo.type; 1160 pVar->u.index=TypeInfo.u.lpIndex; 1161 AllLocalVarSize+=VarSize; 1162 pVar->offset=AllLocalVarSize; 1163 1164 //レキシカルスコープ 1165 pVar->ScopeLevel=obj_LexScopes.GetNowLevel(); 1166 pVar->ScopeStartAddress=obj_LexScopes.GetStartAddress(); 1167 pVar->bLiving=TRUE; 1168 1169 if(InitBuf[0]){ 1170 //初期代入時のみ、書き込みアクセスを許可する 1171 bool bConstBack = pVar->bConst; 1172 pVar->bConst = false; 1173 1174 int result = 0; 1175 if( pVar->type != DEF_OBJECT ){ 1176 result = InitLocalVar(-pVar->offset, 1177 pVar->type, 1178 pVar->u.index, 1179 pVar->SubScripts, 1180 InitBuf); 1181 } 1182 1183 if(!result){ 1184 //動的な式だった場合は代入演算を行う 1185 char temporary[8192]; 1186 sprintf(temporary,"%s=%s",VarName,InitBuf); 1187 OpcodeCalc(temporary); 1188 } 1189 1190 pVar->bConst = bConstBack; 1191 } 1192 else{ 1193 //push 0 1194 op_push_value(0); 1195 1196 //push VarSize 1197 op_push_value(VarSize); 1198 1199 //mov eax,ebp 1200 OpBuffer[obp++]=(char)0x8B; 1201 OpBuffer[obp++]=(char)0xC5; 1202 1203 //add eax,offset 1204 OpBuffer[obp++]=(char)0x05; 1205 *((long *)(OpBuffer+obp))=-pVar->offset; 1206 AddLocalVarAddrSchedule(); 1207 obp+=sizeof(long); 1208 1209 //push eax 1210 op_push(REG_EAX); 1211 1212 //call FillMemory 1213 OpBuffer[obp++]=(char)0xFF; 1214 OpBuffer[obp++]=(char)0x15; 1215 DECLAREINFO *pdi; 1216 pdi=GetDeclareHash("FillMemory"); 1217 pdi->bUse=1; 1218 pobj_ImportAddrSchedule->add(pdi); 1219 obp+=sizeof(long); 1220 } 1221 } 1222 1223 //New呼び出し 1224 if(TypeInfo.type==DEF_OBJECT&&(dwFlags&DIMFLAG_NONCALL_CONSTRACTOR)==0&&InitBuf[0]=='\0'){ 1225 char objectSize[255]; 1226 if( SubScripts[0] == -1 ){ 1227 objectSize[0] = 0; 1228 } 1229 else{ 1230 if( SubScripts[1] != -1 ){ 1231 SetError(300,NULL,cp); 1232 } 1233 sprintf( objectSize, "%d", SubScripts[0] ); 1234 } 1235 Operator_New( *TypeInfo.u.pobj_Class, objectSize, ConstractParameter, TypeInfo ); 1236 1237 //pop eax 1238 op_pop( REG_EAX ); 1239 1240 int type; 1241 LONG_PTR lpIndex; 1242 RELATIVE_VAR RelativeVar; 1243 GetVarOffset( true, false, VarName, &type, &RelativeVar, &lpIndex ); 1244 if( RelativeVar.dwKind == VAR_DIRECTMEM ){ 1245 SetError(); 1246 } 1247 SetVariableFromEax( DEF_OBJECT, DEF_OBJECT, &RelativeVar ); 1248 } 1249 1250 if(TypeInfo.type==DEF_OBJECT){ 1251 if(TypeInfo.u.pobj_Class->IsAbstract()){ 1252 //抽象クラスだったとき 1253 SetError(125,TypeInfo.u.pobj_Class->name,cp); 1254 } 1255 } 1256 } 1104 1257 void dim(char *Parameter,DWORD dwFlags){ 1105 1258 extern BOOL bCompilingGlobal; 1106 1259 extern HANDLE hHeap; 1107 int i2 ,i3,VarSize;1260 int i2; 1108 1261 char VarName[VN_SIZE]; 1109 1262 … … 1187 1340 GetNowStaticVarFullName(VarName,temporary); 1188 1341 1189 AddGlobalVariable(isRef, temporary,SubScripts,&TypeInfo,TypeSize,InitBuf,ConstractParameter,dwFlags);1342 dim( isRef,temporary,SubScripts,TypeInfo,TypeSize,InitBuf,ConstractParameter,dwFlags ); 1190 1343 1191 1344 /* … … 1195 1348 } 1196 1349 else{ 1197 if(bCompilingGlobal){ 1198 ///////////////////////// 1199 // グローバル変数 1200 ///////////////////////// 1201 1202 AddGlobalVariable(isRef, VarName,SubScripts,&TypeInfo,TypeSize,InitBuf,ConstractParameter,dwFlags); 1203 } 1204 else{ 1205 ///////////////// 1206 // ローカル変数 1207 ///////////////// 1208 1209 for(i2=0;i2<MaxLocalVarNum;i2++){ 1210 if(LocalVar[i2].bLiving&&obj_LexScopes.GetNowLevel()==LocalVar[i2].ScopeLevel){ 1211 if(lstrcmp(LocalVar[i2].name,VarName)==0){ 1212 //2重定義のエラー 1213 SetError(15,VarName,cp); 1214 return; 1215 } 1216 } 1217 } 1218 1219 LocalVar=(VARIABLE *)HeapReAlloc(hHeap,0,LocalVar,(MaxLocalVarNum+1)*sizeof(VARIABLE)); 1220 VARIABLE *pVar = &LocalVar[MaxLocalVarNum]; 1221 MaxLocalVarNum++; 1222 1223 if( isRef ){ 1224 //参照型 1225 pVar->fRef = REF_VARIABLE; 1226 TypeSize = PTR_SIZE; 1227 } 1228 else pVar->fRef=0; 1229 1230 for(i2=1,i3=0;i3<255;i3++){ 1231 //配列要素数 1232 pVar->SubScripts[i3]=SubScripts[i3]; 1233 1234 if(SubScripts[i3]==-1) break; 1235 i2*=SubScripts[i3]+1; 1236 } 1237 VarSize=TypeSize*i2; 1238 if(VarSize%4) VarSize+=4-(VarSize%4); 1239 1240 //変数データを追加 1241 lstrcpy(pVar->name,VarName); 1242 if(dwFlags & DIMFLAG_CONST) pVar->bConst = true; 1243 else pVar->bConst = false; 1244 if(SubScripts[0]==-1) pVar->bArray=0; 1245 else pVar->bArray=1; 1246 pVar->type=TypeInfo.type; 1247 pVar->u.index=TypeInfo.u.lpIndex; 1248 AllLocalVarSize+=VarSize; 1249 pVar->offset=AllLocalVarSize; 1250 1251 //レキシカルスコープ 1252 pVar->ScopeLevel=obj_LexScopes.GetNowLevel(); 1253 pVar->ScopeStartAddress=obj_LexScopes.GetStartAddress(); 1254 pVar->bLiving=TRUE; 1255 1256 if(InitBuf[0]){ 1257 //初期代入時のみ、書き込みアクセスを許可する 1258 bool bConstBack = pVar->bConst; 1259 pVar->bConst = false; 1260 1261 int result = InitLocalVar(-pVar->offset, 1262 pVar->type, 1263 pVar->u.index, 1264 pVar->SubScripts, 1265 InitBuf); 1266 1267 if(!result){ 1268 if( isRef ){ 1269 SetRefVariable( VarName, InitBuf ); 1270 } 1271 else{ 1272 char temporary[8192]; 1273 sprintf(temporary,"%s=%s",VarName,InitBuf); 1274 OpcodeCalc(temporary); 1275 } 1276 } 1277 1278 pVar->bConst = bConstBack; 1279 } 1280 else{ 1281 //push 0 1282 op_push_value(0); 1283 1284 //push VarSize 1285 op_push_value(VarSize); 1286 1287 //mov eax,ebp 1288 OpBuffer[obp++]=(char)0x8B; 1289 OpBuffer[obp++]=(char)0xC5; 1290 1291 //add eax,offset 1292 OpBuffer[obp++]=(char)0x05; 1293 *((long *)(OpBuffer+obp))=-pVar->offset; 1294 AddLocalVarAddrSchedule(); 1295 obp+=sizeof(long); 1296 1297 //push eax 1298 op_push(REG_EAX); 1299 1300 //call FillMemory 1301 OpBuffer[obp++]=(char)0xFF; 1302 OpBuffer[obp++]=(char)0x15; 1303 DECLAREINFO *pdi; 1304 pdi=GetDeclareHash("FillMemory"); 1305 pdi->bUse=1; 1306 pobj_ImportAddrSchedule->add(pdi); 1307 obp+=sizeof(long); 1308 } 1309 } 1310 1311 //コンストラクタ呼び出し 1312 if(TypeInfo.type==DEF_OBJECT&&(dwFlags&DIMFLAG_NONCALL_CONSTRACTOR)==0&& isRef == false ){ 1313 CallConstructor(VarName,SubScripts,TypeInfo,ConstractParameter); 1314 } 1315 } 1316 1317 if(TypeInfo.type==DEF_OBJECT){ 1318 if(TypeInfo.u.pobj_Class->IsAbstract()){ 1319 //抽象クラスだったとき 1320 SetError(125,TypeInfo.u.pobj_Class->name,cp); 1321 } 1350 dim( isRef,VarName,SubScripts,TypeInfo,TypeSize,InitBuf,ConstractParameter,dwFlags ); 1322 1351 } 1323 1352 } -
BasicCompiler32/MakePeHdr.cpp
r56 r64 22 22 *pSub_realloc, 23 23 *pSub_free, 24 *pSub_System_GC_malloc_ForObject, 25 *pSub_System_GC_malloc_ForObjectPtr, 26 *pSub_System_GC_free_for_SweepingDelete, 24 27 25 28 *pSub_allrem, … … 30 33 *pSub_allshl, 31 34 *pSub_allshr, 32 *pSub_aullshr; 35 *pSub_aullshr, 36 37 *pSub_esp_error; 33 38 34 39 … … 227 232 pSub_free->bUse=1; 228 233 234 if( pSub_System_GC_malloc_ForObject = GetSubHash( "_System_GC_malloc_ForObject",1 ) ) 235 pSub_System_GC_malloc_ForObject->bUse = 1; 236 237 if( pSub_System_GC_malloc_ForObjectPtr = GetSubHash( "_System_GC_malloc_ForObjectPtr",1 ) ) 238 pSub_System_GC_malloc_ForObjectPtr->bUse = 1; 239 240 if( pSub_System_GC_free_for_SweepingDelete = GetSubHash( "_System_GC_free_for_SweepingDelete",1 ) ) 241 pSub_System_GC_free_for_SweepingDelete->bUse = 1; 242 229 243 pSub_allrem=GetSubHash("_allrem"); 230 244 pSub_allrem->bUse=1; … … 258 272 pSub_aullshr->bUse=1; 259 273 pSub_aullshr->bSystem=1; 274 275 pSub_esp_error=GetSubHash("_esp_error"); 276 pSub_esp_error->bUse=1; 277 278 260 279 261 280 -
BasicCompiler32/NumOpe.cpp
r63 r64 6 6 //※この処理内では、esi、ediは使用不可 7 7 8 if(type==DEF_OBJECT ){8 if(type==DEF_OBJECT || type==DEF_STRUCT){ 9 9 //push eax 10 10 op_push(REG_EAX); … … 62 62 op_push(REG_EAX); 63 63 } 64 else if(type==DEF_PTR_BYTE){ 65 //push eax 66 op_push(REG_EAX); 64 else{ 65 SetError(); 67 66 } 68 67 } … … 71 70 /////////////////////////////////////////////////////// 72 71 // lpszTextを元にStringオブジェクトを生成し、 73 // オブジェクトポインタを スタックに格納する72 // オブジェクトポインタをregに格納する 74 73 /////////////////////////////////////////////////////// 75 74 75 char *parameter = (char *)malloc( lstrlen( lpszText ) + 3 ); 76 lstrcpy( parameter, lpszText ); 77 SetStringQuotes( parameter ); 78 76 79 extern CClass *pobj_StringClass; 77 int object_size = pobj_StringClass->GetSize(); 78 79 //push object_size 80 op_push_value(object_size); 81 82 //call calloc 83 extern SUBINFO *pSub_calloc; 84 op_call(pSub_calloc); 85 86 //push eax 87 op_push(REG_EAX); 88 89 //push eax 90 op_push(REG_EAX); 91 92 { 93 //push eax 94 op_push(REG_EAX); 95 96 //call constructor 97 op_call(pobj_StringClass->GetConstructorMethod()->psi); 98 } 99 100 // TODO: Ex表記による文字列長に対応する 101 int i2 = dataTable.AddString( lpszText ); 102 103 //push lpszPtr 104 OpBuffer[obp++]=(char)0x68; 105 *((long *)(OpBuffer+obp))=i2; 106 pobj_DataTableSchedule->add(); 107 obp+=sizeof(long); 108 109 110 SetObjectVariable((LONG_PTR)pobj_StringClass,DEF_PTR_BYTE,-1,0); 80 TYPEINFO baseTypeInfo = { DEF_OBJECT, (LONG_PTR)pobj_StringClass }; 81 Operator_New( *pobj_StringClass, "", parameter, baseTypeInfo ); 82 83 free( parameter ); 111 84 } 112 85 … … 122 95 } 123 96 124 if(Command[0]==1&& Command[1]==ESC_NEW){97 if(Command[0]==1&& Command[1]==ESC_NEW ){ 125 98 //New演算子(オブジェクト生成) 126 return Operator_New(Command+2,plpIndex); 99 TYPEINFO baseTypeInfo = { BaseType, lpBaseIndex }; 100 int resultType = Operator_New(Command+2,plpIndex, baseTypeInfo ); 101 102 return resultType; 127 103 } 128 104 … … 221 197 TYPEINFO BaseTypeInfo = {BaseType,lpBaseIndex}; 222 198 if(IsStringSubsituation(pobj_Class) 223 || IsStringObjectType( &BaseTypeInfo)){199 || IsStringObjectType(BaseTypeInfo)){ 224 200 //要求タイプがオブジェクトであり、Stringの受け入れが可能な場合 225 201 … … 239 215 240 216 241 type[sp]=DEF_PTR_ BYTE;217 type[sp]=DEF_PTR_CHAR; 242 218 index_stack[sp]=LITERAL_STRING; 243 219 bLiteralCalculation=0; … … 329 305 } 330 306 331 if(i2==DEF_ OBJECT){332 // Object型が戻ったときはヒープ領域にインスタンスが格納されている307 if(i2==DEF_STRUCT){ 308 //構造体が戻ったときはヒープ領域にインスタンスが格納されている 333 309 //※後にfreeする必要あり 334 310 bUseHeap[sp]=1; … … 413 389 } 414 390 else if(i2==DEF_LONG||i2==DEF_DWORD||i2==DEF_SINGLE|| 415 IsPtrType(i2) ){391 IsPtrType(i2) || i2==DEF_OBJECT){ 416 392 //32ビット型 417 393 PushLongVariable(&RelativeVar); … … 429 405 PushByteVariable(&RelativeVar); 430 406 } 431 else if(i2==DEF_ OBJECT){432 // オブジェクト ポインタをeaxへ格納407 else if(i2==DEF_STRUCT){ 408 //構造体ポインタをeaxへ格納(構造体は値型) 433 409 SetVarPtrToEax(&RelativeVar); 434 410 … … 436 412 op_push(REG_EAX); 437 413 } 414 else SetError(11,term,cp); 438 415 439 416 if(Is64Type(type[sp])&&IsWholeNumberType(i2)&&GetTypeSize(i2,-1)<=sizeof(long)){ … … 517 494 PushReturnValue(RetTypeInfo.type); 518 495 519 if(type[sp]==DEF_ OBJECT){520 // Object型が戻ったときはヒープ領域にインスタンスが格納されている496 if(type[sp]==DEF_STRUCT){ 497 //構造体が戻ったときはヒープ領域にインスタンスが格納されている 521 498 //※後にfreeする必要あり 522 499 bUseHeap[sp]=1; -
BasicCompiler32/NumOpe_Relation.cpp
r36 r64 1313 1313 OpBuffer[obp++]=(char)0xC3; 1314 1314 1315 //j nz 4(次のxorとjmpを飛び越す)1315 //jz 4(次のxorとjmpを飛び越す) 1316 1316 OpBuffer[obp++]=(char)0x74; 1317 1317 OpBuffer[obp++]=(char)0x04; -
BasicCompiler32/Opcode.h
r62 r64 97 97 void ChangeTypeToInteger(int OldType); 98 98 void ChangeTypeToByte(int OldType); 99 void SetVariableFromEax(int VarType,int CalcType,RELATIVE_VAR *pRelativeVar); 99 100 void OpcodeCalc(char *Command); 100 void SetRefVariable( const char *varname, const char *expression );101 101 102 102 //NumOpe.cpp … … 136 136 //Compile_Set_Var.cpp 137 137 BOOL IsUse_ecx(RELATIVE_VAR *pRelativeVar); 138 void SetObjectVariable(LONG_PTR lpVarIndex,int CalcType,LONG_PTR lpCalcIndex,BOOL bUseHeap); 138 void SetStructVariable(LONG_PTR lpVarIndex,int CalcType,LONG_PTR lpCalcIndex,BOOL bUseHeap); 139 void SetRealVariable(int VarType, int CalcType, RELATIVE_VAR *pRelativeVar); 140 void SetWholeVariable(int var_size,int type,RELATIVE_VAR *pRelative); 141 139 142 void SetDoubleVariable(int type,DWORD VarKind,DWORD offset,BOOL bOffsetOffset); 140 143 void SetSingleVariable(int type,DWORD VarKind,DWORD offset,BOOL bOffsetOffset); … … 171 174 172 175 //Compile_Object.cpp 173 int Operator_New(const char *Parameter,LONG_PTR *plpIndex); 174 void OpcodeDelete(char *Parameter); 176 void Operator_New( CClass &classObj, const char *objectSizeStr, const char *parameter, const TYPEINFO &baseTypeInfo ); 177 int Operator_New(const char *Parameter,LONG_PTR *plpIndex,const TYPEINFO &baseTypeInfo ); 178 void OpcodeDelete(const char *Parameter, bool isSweeping); 175 179 176 180 //Compile_Var.cpp … … 183 187 #define DIMFLAG_STATIC 4 184 188 #define DIMFLAG_CONST 8 189 void dim(bool isRef, char *VarName,int *SubScripts,TYPEINFO &TypeInfo,int TypeSize,char *InitBuf,char *ConstractParameter,DWORD dwFlags); 185 190 void OpcodeDim(char *Parameter,DWORD dwFlag); 186 191 void SetVarPtrToEax(RELATIVE_VAR *pRelativeVar); 187 192 188 193 //CParameter.cpp 194 #define OVERLOAD_MIN_LEVEL 0 195 #define OVERLOAD_MAX_LEVEL 3 196 #define OVERLOAD_LEVEL0 0 189 197 #define OVERLOAD_LEVEL1 1 190 198 #define OVERLOAD_LEVEL2 2 … … 216 224 BOOL ErrorCheck(const char *FuncName,PARAMETER_INFO *ppi,int pi_num,int SecondParmNum); 217 225 void MacroParameterSupport(PARAMETER_INFO *ppi); 218 void Set ObjectParameter(CClass *pobj_Class,LPSTR Parameter);226 void SetStructParameter(CClass *pobj_Class,LPSTR Parameter); 219 227 int SetParameter(const char *FuncName,PARAMETER_INFO *ppi,int pi_num,int SecondParmNum); 220 228 221 229 //一時オブジェクトパラメータの生成と破棄 222 voidNewTempParameters( const char *FuncName,PARAMETER_INFO *ppi,int pi_num,int SecondParmNum );230 int NewTempParameters( const char *FuncName,PARAMETER_INFO *ppi,int pi_num,int SecondParmNum ); 223 231 void DeleteTempParameters(); 224 232 }; … … 228 236 #define PROCFLAG_NEW 1 229 237 int Opcode_CallProcPtr(char *variable,char *Parameter,PROCPTRINFO *pi,LONG_PTR *plpIndex); 230 void Opcode_CallProc(c har *Parameter,SUBINFO *psi,DWORD dwFlags,char *ObjectName,int RefType);238 void Opcode_CallProc(const char *Parameter,SUBINFO *psi,DWORD dwFlags,char *ObjectName,int RefType); 231 239 int Opcode_CallDllProc(char *Parameter,DECLAREINFO *pdi,LONG_PTR *plpIndex); 232 240 … … 258 266 void OpcodeGosub(char *Parameter); 259 267 void OpcodeReturn(char *Parameter); 260 void Opcode_Input(c har *Parameter);261 void Opcode_Print(c har *Parameter,BOOL bWrite);268 void Opcode_Input(const char *Parameter); 269 void Opcode_Print(const char *Parameter,BOOL bWrite); 262 270 void OpcodeCallPtr(char *Parameter); 263 271 void OpcodeSetPtrData(char *Parameter,int type); … … 300 308 void op_sbb_RV8 (int reg,char cValue); 301 309 void op_sbb_RR ( int reg1, int reg2 ); 310 void op_imul_RR (int reg1,int reg2); 311 void op_imul_RV (int reg,int i32data); 302 312 void op_and_RV (int reg,int value); 303 313 void op_or_RR ( int op_size, int reg1, int reg2 ); … … 312 322 void op_add_esp(int num); 313 323 void op_sub_esp(int num); 324 void op_cmp_RR( int reg1, int reg2 ); 314 325 void op_cmp_value(int op_size,int reg,char byte_data); 315 326 void op_setne( int reg ); -
BasicCompiler32/OperatorProc.cpp
r63 r64 50 50 if(pBaseTypeInfo){ 51 51 if(pBaseTypeInfo->type==DEF_OBJECT){ 52 bReturnTypeIsObject=1;53 52 ReturnType.u.lpIndex=pBaseTypeInfo->u.lpIndex; 54 53 } … … 107 106 HeapDefaultFree(ppi); 108 107 109 int right_side_size; 110 if(type[sp-1]==DEF_OBJECT) right_side_size=PTR_SIZE; 111 else right_side_size=GetTypeSize(type[sp-1],index_stack[sp-1]); 112 113 if(bTwoTerm){ 114 if(psi->pParmInfo[1].type==DEF_OBJECT&&psi->pParmInfo[1].bByVal){ 108 int right_side_size = GetTypeSize(type[sp-1],index_stack[sp-1]); 109 110 if(bTwoTerm){ 111 if(psi->pRealParmInfo[1].type==DEF_STRUCT&&psi->pRealParmInfo[1].bByVal){ 115 112 //一時オブジェクトはメソッド内で破棄される 116 113 bUseHeap[sp-1]=0; … … 119 116 120 117 121 if(psi->ReturnType==DEF_ OBJECT){118 if(psi->ReturnType==DEF_STRUCT){ 122 119 ////////////////////////////////////////////////////// 123 // 戻り値に オブジェクトインスタンスを持つ場合124 // ※ByRef _System_Return Objectパラメータ用領域を取得120 // 戻り値に構造体インスタンスを持つ場合 121 // ※ByRef _System_ReturnValue パラメータ用領域を取得 125 122 ////////////////////////////////////////////////////// 126 123 … … 182 179 op_push(REG_EAX); 183 180 } 184 } 185 186 if(psi->ReturnType==DEF_OBJECT){ 181 182 if( !psi->pRealParmInfo[1].bByVal ){ 183 //一時参照を作成 184 185 //mov eax,esp 186 op_mov_RR( REG_EAX, REG_ESP ); 187 188 //push eax 189 op_push( REG_EAX ); 190 } 191 } 192 193 if(psi->ReturnType==DEF_STRUCT){ 187 194 //push ebx 188 195 op_push(REG_EBX); … … 195 202 op_call(psi); 196 203 197 if(psi->ReturnType!=-1){ 204 if(bTwoTerm){ 205 if( !psi->pRealParmInfo[1].bByVal ){ 206 //一時参照を破棄 207 op_pop( REG_NON ); 208 } 209 } 210 211 if(psi->ReturnType!=DEF_NON){ 198 212 //スタックへプッシュ 199 213 PushReturnValue(psi->ReturnType); … … 211 225 index_stack[sp-1]=psi->u.ReturnIndex; 212 226 213 if(psi->ReturnType==DEF_ OBJECT){214 // Object型が戻ったときはヒープ領域にインスタンスが格納されている227 if(psi->ReturnType==DEF_STRUCT){ 228 //構造体が戻ったときはヒープ領域にインスタンスが格納されている 215 229 //※後にfreeする必要あり 216 230 bUseHeap[sp-1]=1; -
BasicCompiler32/VarList.cpp
r63 r64 20 20 HTREEITEM hParent; 21 21 22 if(type==DEF_OBJECT){ 22 if(type==DEF_OBJECT||type==DEF_STRUCT){ 23 if( type==DEF_OBJECT ){ 24 // 参照型ということを考慮する 25 ReadProcessMemory(hDebugProcess,(void *)offset,&dwData,sizeof(void *),&dwAccessByte); 26 offset = dwData; 27 } 28 23 29 sprintf(lptv->item.pszText,"%s %s(&H%X)",VarName,STRING_OBJECT,offset); 24 30 lptv->item.iImage=1; … … 29 35 return; 30 36 } 31 if(type==DEF_PTR_OBJECT ){37 if(type==DEF_PTR_OBJECT||type==DEF_PTR_STRUCT){ 32 38 i2=ReadProcessMemory(hDebugProcess,(void *)offset,&dwData,sizeof(DWORD),&dwAccessByte); 33 39 … … 41 47 } 42 48 else{ 43 if(type==DEF_PTR_ BYTE){49 if(type==DEF_PTR_CHAR||type==MAKE_PTR_TYPE(DEF_BYTE,1)){ 44 50 if(ReadProcessMemory(hDebugProcess,(void *)offset,&dwData,sizeof(DWORD),&dwAccessByte)){ 45 51 for(i2=0;;i2++){ -
BasicCompiler32/WatchList.cpp
r63 r64 78 78 if(PTR_LEVEL(*pType)){ 79 79 *pType=MAKE_PTR_TYPE(NATURAL_TYPE(*pType),PTR_LEVEL(*pType)-1); 80 if((*pType)==DEF_OBJECT){ 81 CClass *pClass = (CClass *)lpIndex; 82 array_num *= pClass->GetSize(); 83 } 84 else{ 85 array_num *= GetTypeSize(*pType,-1); 86 } 80 array_num *= GetTypeSize(*pType,-1); 87 81 } 88 82 else{ … … 114 108 char lpPtrOffset[VN_SIZE]; //第2次配列 115 109 char NestMember[VN_SIZE]; //入れ子メンバ 116 int RefType; //"."参照のときは0、"->"参照のときは1110 CClass::RefType refType; 117 111 lstrcpy(VarName,member); 118 if(!GetVarFormatString(VarName,array,lpPtrOffset,NestMember, &RefType)) return 0;112 if(!GetVarFormatString(VarName,array,lpPtrOffset,NestMember,refType)) return 0; 119 113 120 114 … … 175 169 //入れ子構造の場合 176 170 177 if(*pType==DEF_OBJECT){ 178 if(RefType!=DEF_OBJECT) return 0; 179 } 180 else if(*pType==DEF_PTR_OBJECT){ 171 if(*pType==DEF_OBJECT || *pType==DEF_STRUCT){ 172 if( refType != CClass::Dot ) return 0; 173 174 if( *pType==DEF_OBJECT ){ 175 extern HANDLE hDebugProcess; 176 LONG_PTR lpData; 177 SIZE_T stAccBytes; 178 lpData=Debugging_GetVarPtr(pRelativeVar); 179 if(!ReadProcessMemory(hDebugProcess,(void *)lpData,&pRelativeVar->offset,sizeof(LONG_PTR),&stAccBytes)) return -1; 180 pRelativeVar->dwKind=VAR_DIRECTMEM; 181 } 182 } 183 else if(*pType==DEF_PTR_OBJECT || *pType==DEF_PTR_STRUCT){ 181 184 //構造体ポインタ型メンバ変数 182 185 183 186 if(lpPtrOffset[0]){ 184 if( RefType!=DEF_OBJECT) return 0;187 if( refType != CClass::Dot ) return 0; 185 188 186 189 //直接参照に切り替え … … 190 193 } 191 194 else{ 192 if( RefType!=DEF_PTR_OBJECT) return 0;195 if( refType != CClass::Pointer ) return 0; 193 196 194 197 extern HANDLE hDebugProcess; … … 319 322 int Debugging_GetVarOffset(char *variable,int *pType,RELATIVE_VAR *pRelativeVar,LONG_PTR *plpIndex,int *pss){ 320 323 extern HANDLE hDebugProcess; 321 int i,i2,i3 ,RefType;324 int i,i2,i3; 322 325 char member[VN_SIZE],VarName[VN_SIZE],array[VN_SIZE],lpPtrOffset[VN_SIZE]; 323 326 ULONG_PTR lpData; … … 325 328 326 329 lstrcpy(VarName,variable); 327 GetVarFormatString(VarName,array,lpPtrOffset,member,&RefType); 330 CClass::RefType refType; 331 GetVarFormatString(VarName,array,lpPtrOffset,member,refType); 328 332 329 333 LONG_PTR lpIndex; … … 470 474 } 471 475 if(member[0]){ 472 if(*pType==DEF_OBJECT ){476 if(*pType==DEF_OBJECT || *pType==DEF_STRUCT){ 473 477 //実態オブジェクトのメンバを参照(obj.member) 474 if( RefType!=DEF_OBJECT){478 if( refType != CClass::Dot ){ 475 479 return 0; 476 480 } … … 489 493 *plpIndex=lp2; 490 494 } 491 else if(*pType==DEF_PTR_OBJECT ){495 else if(*pType==DEF_PTR_OBJECT || *pType==DEF_PTR_STRUCT){ 492 496 //ポインタオブジェクトが示すメンバを参照 493 497 if(lpPtrOffset[0]){ 494 498 //pObj[n].member 495 if( RefType!=DEF_OBJECT) return 0;499 if( refType != CClass::Dot ) return 0; 496 500 Debugging_SetRelativeOffset(pType,lpIndex,pRelativeVar,lpPtrOffset); 497 501 … … 511 515 else{ 512 516 //pObj->member 513 if( RefType!=DEF_PTR_OBJECT) return 0;517 if( refType != CClass::Pointer ) return 0; 514 518 515 519 pRelativeVar->offset=Debugging_GetVarPtr(pRelativeVar); -
BasicCompiler32/commandvalue.h
r3 r64 19 19 #define COM_LET 0x1066 20 20 #define COM_DELETE 0x1068 21 #define COM_SWEEPINGDELETE 0x1069 21 22 22 23 //その他 -
BasicCompiler32/increment.cpp
r62 r64 1 1 #include "../BasicCompiler_Common/common.h" 2 2 #include "Opcode.h" 3 4 5 void SetRealVariable(int type,RELATIVE_VAR *pRelativeVar){6 if(pRelativeVar->dwKind==VAR_GLOBAL){7 if(pRelativeVar->bOffsetOffset){8 //fstp ptr[ecx+offset]9 op_fstp_base_offset(type,REG_ECX,(int)pRelativeVar->offset);10 obp-=sizeof(long);11 pobj_GlobalVarSchedule->add();12 obp+=sizeof(long);13 }14 else{15 //mov ecx,offset16 op_mov_RV(REG_ECX,(int)pRelativeVar->offset);17 obp-=sizeof(long);18 pobj_GlobalVarSchedule->add();19 obp+=sizeof(long);20 21 //fstp ptr[ecx]22 op_fstp_basereg(type,REG_ECX);23 }24 }25 else if(pRelativeVar->dwKind==VAR_REFGLOBAL){26 if(pRelativeVar->bOffsetOffset){27 //add ecx,qword ptr[offset]28 op_add_RM(sizeof(long),REG_ECX,REG_NON,(int)pRelativeVar->offset,MOD_DISP32);29 }30 else{31 //mov ecx,qword ptr[offset]32 op_mov_RM(sizeof(long),REG_ECX,REG_NON,(int)pRelativeVar->offset,MOD_DISP32);33 }34 obp-=sizeof(long);35 pobj_GlobalVarSchedule->add();36 obp+=sizeof(long);37 38 goto directmem;39 }40 else if(pRelativeVar->dwKind==VAR_LOCAL){41 if(pRelativeVar->bOffsetOffset){42 //fstp ptr[ebp+ecx+offset]43 op_fstp_base_offset_ex(type,REG_EBP,REG_ECX,(int)pRelativeVar->offset,USE_OFFSET);44 }45 else{46 //fstp ptr[ebp+offset]47 op_fstp_base_offset(type,REG_EBP,(int)pRelativeVar->offset);48 }49 obp-=sizeof(long);50 AddLocalVarAddrSchedule();51 obp+=sizeof(long);52 }53 else if(pRelativeVar->dwKind==VAR_REFLOCAL){54 if(pRelativeVar->bOffsetOffset){55 //add ecx,qword ptr[ebp+offset]56 op_add_RM(sizeof(long),REG_ECX,REG_EBP,(int)pRelativeVar->offset,MOD_BASE_DISP32);57 }58 else{59 //mov ecx,qword ptr[ebp+offset]60 op_mov_RM(sizeof(long),REG_ECX,REG_EBP,(int)pRelativeVar->offset,MOD_BASE_DISP32);61 }62 obp-=sizeof(long);63 AddLocalVarAddrSchedule();64 obp+=sizeof(long);65 66 goto directmem;67 }68 else if(pRelativeVar->dwKind==VAR_DIRECTMEM){69 directmem:70 //fstp ptr[ecx]71 op_fstp_basereg(type,REG_ECX);72 }73 }74 75 void ExtendTypeTo32(int type,int reg);76 void ExtendTypeTo64(int type){77 if(Is64Type(type)) return;78 79 ExtendTypeTo32(type,REG_EAX);80 81 if(IsSignedType(type)){82 //cdq83 op_cdq();84 }85 else{86 //xor edx,edx87 op_zero_reg(REG_EDX);88 }89 }90 void ExtendTypeTo32(int type,int reg){91 if(type==DEF_INTEGER || (isUnicode&&type==DEF_CHAR)){92 //movsx reg32,reg1693 op_movsx_R32R16(reg,reg);94 }95 else if(type==DEF_WORD){96 //and reg,0000FFFFh97 op_and_RV(reg,(int)0x0000FFFF);98 }99 else if(type==DEF_SBYTE || (isUnicode==false&&type==DEF_CHAR)){100 //movsx reg32,reg8101 op_movsx_R32R8(reg,reg);102 }103 else if(type==DEF_BYTE||type==DEF_BOOLEAN){104 //and reg,000000FFh105 op_and_RV(reg,(int)0xFF);106 }107 }108 void ExtendTypeTo16(int type,int reg){109 if(type==DEF_SBYTE || (isUnicode==false&&type==DEF_CHAR)){110 //movsx reg16,reg8111 op_movsx_R16R8(reg,reg);112 }113 else if(type==DEF_BYTE||type==DEF_BOOLEAN){114 //and reg,000000FFh115 op_and_RV(reg,(int)0xFF);116 }117 }118 119 void SetWholeVariable(int var_size,int type,RELATIVE_VAR *pRelative,int reg){120 if(type==DEF_DOUBLE){121 //Double型122 123 }124 else if(type==DEF_SINGLE){125 //Single型126 127 }128 else{129 //その他の整数130 131 if(var_size==sizeof(_int64)){132 //eaxの値を64ビット(edx:eax)に拡張する133 ExtendTypeTo64(type);134 }135 else if(var_size==sizeof(long)){136 //レジスタの値を32ビット(eax)に拡張する137 ExtendTypeTo32(type,reg);138 }139 else if(var_size==sizeof(short)){140 //レジスタの値を16ビット(ax)に拡張する141 ExtendTypeTo16(type,reg);142 }143 //8ビットは拡張なし144 }145 146 if(var_size==sizeof(_int64)){147 //下位32ビット148 SetWholeVariable(sizeof(long),DEF_LONG,pRelative,REG_EAX);149 150 //上位32ビット151 pRelative->offset+=sizeof(long);152 SetWholeVariable(sizeof(long),DEF_LONG,pRelative,REG_EDX);153 pRelative->offset-=sizeof(long);154 155 return;156 }157 158 if(pRelative->dwKind==VAR_GLOBAL){159 if(pRelative->bOffsetOffset){160 //mov ptr[ecx+offset],eax/ax/al161 op_mov_MR(var_size,reg,REG_ECX,(int)pRelative->offset,MOD_BASE_DISP32);162 }163 else{164 //mov ptr[offset],eax/ax/al165 op_mov_MR(var_size,reg,0,(int)pRelative->offset,MOD_DISP32);166 }167 obp-=sizeof(long);168 pobj_GlobalVarSchedule->add();169 obp+=sizeof(long);170 }171 else if(pRelative->dwKind==VAR_REFGLOBAL){172 if(pRelative->bOffsetOffset){173 //add ecx,qword ptr[offset]174 op_add_RM(var_size,REG_ECX,REG_NON,(int)pRelative->offset,MOD_DISP32);175 }176 else{177 //mov ecx,qword ptr[offset]178 op_mov_RM(var_size,REG_ECX,REG_NON,(int)pRelative->offset,MOD_DISP32);179 }180 obp-=sizeof(long);181 pobj_GlobalVarSchedule->add();182 obp+=sizeof(long);183 184 goto directmem;185 }186 else if(pRelative->dwKind==VAR_LOCAL){187 if(pRelative->bOffsetOffset){188 //mov ptr[ebp+ecx+offset],eax/ax/al189 op_mov_MR_ex(var_size,reg,REG_EBP,REG_ECX,(int)pRelative->offset,USE_OFFSET);190 }191 else{192 //mov ptr[ebp+offset],eax/ax/al193 op_mov_MR(var_size,reg,REG_EBP,(int)pRelative->offset,MOD_BASE_DISP32);194 }195 obp-=sizeof(long);196 AddLocalVarAddrSchedule();197 obp+=sizeof(long);198 }199 else if(pRelative->dwKind==VAR_REFLOCAL){200 if(pRelative->bOffsetOffset){201 //add ecx,qword ptr[ebp+offset]202 op_add_RM(var_size,REG_ECX,REG_EBP,(int)pRelative->offset,MOD_BASE_DISP32);203 }204 else{205 //mov ecx,qword ptr[ebp+offset]206 op_mov_RM(var_size,REG_ECX,REG_EBP,(int)pRelative->offset,MOD_BASE_DISP32);207 }208 obp-=sizeof(long);209 AddLocalVarAddrSchedule();210 obp+=sizeof(long);211 212 goto directmem;213 }214 else if(pRelative->dwKind==VAR_DIRECTMEM){215 directmem:216 217 //mov ptr[ecx],eax/ax/al218 op_mov_MR(var_size,reg,REG_ECX,0,MOD_BASE);219 }220 }221 222 void SetVariableFromReg(int VarType,int CalcType,RELATIVE_VAR *pRelativeVar){223 /////////////////////////////////////////////////224 // raxの内容を変数にコピーするコードを抽出225 /////////////////////////////////////////////////226 227 if(VarType==DEF_DOUBLE){228 //Double型変数へスタックの内容を格納する229 SetRealVariable(VarType,pRelativeVar);230 }231 else if(VarType==DEF_SINGLE){232 //Single型変数へスタックの内容を格納する233 SetRealVariable(VarType,pRelativeVar);234 }235 else{236 //整数型237 SetWholeVariable(GetTypeSize(VarType,-1),CalcType,pRelativeVar,REG_EAX);238 }239 }240 241 3 242 4 void IncDec(int idCalc, char *lpszLeft, char *lpszRight){ … … 438 200 } 439 201 440 SetVariableFrom Reg(VarType,VarType,&VarRelativeVar);202 SetVariableFromEax(VarType,VarType,&VarRelativeVar); 441 203 } -
BasicCompiler32/op32_main.cpp
r36 r64 372 372 373 373 374 //////////////////////// 375 // imul関連 376 //////////////////////// 377 378 void op_imul_RR(int reg1,int reg2){ 379 //imul reg1,reg2 380 381 //オペコード 382 OpBuffer[obp++]=(char)0x0F; 383 OpBuffer[obp++]=(char)0xAF; 384 385 //レジスタ 386 OpBuffer[obp++]=(char)(0xC0| REGISTER_OPERAND(reg1)<<3 | REGISTER_OPERAND(reg2)); 387 } 388 389 void op_imul_RV(int reg,int i32data){ 390 //imul reg,i32data 391 392 if(-128<=i32data&&i32data<=127){ 393 //オペコード 394 OpBuffer[obp++]=(char)0x6B; 395 396 //レジスタ 397 OpBuffer[obp++]=(char)(0xC0| REGISTER_OPERAND(reg)<<3 | REGISTER_OPERAND(reg)); 398 399 //値 400 OpBuffer[obp++]=(char)i32data; 401 } 402 else{ 403 //オペコード 404 OpBuffer[obp++]=(char)0x69; 405 406 //レジスタ 407 OpBuffer[obp++]=(char)(0xC0| REGISTER_OPERAND(reg)<<3 | REGISTER_OPERAND(reg)); 408 409 //値 410 *((long *)(OpBuffer+obp))=i32data; 411 obp+=sizeof(long); 412 } 413 } 414 415 374 416 375 417 ////////////////////// … … 468 510 void op_push(int reg){ 469 511 //push reg 512 513 if( reg == REG_NON ){ 514 op_sub_esp( PTR_SIZE ); 515 return; 516 } 470 517 471 518 //オペコード、レジスタ … … 489 536 //pop reg 490 537 538 if( reg == REG_NON ){ 539 op_add_esp( PTR_SIZE ); 540 return; 541 } 542 491 543 //オペコード、レジスタ 492 544 __op_format(0,(char)0x58,reg); … … 532 584 // cmp関連 533 585 ///////////////////// 586 void op_cmp_RR( int reg1, int reg2 ){ 587 //オペコード 588 OpBuffer[obp++]=(char)0x3B; 589 590 //レジスタ 591 OpBuffer[obp++]=(char)(0xC0| REGISTER_OPERAND(reg1)<<3 | REGISTER_OPERAND(reg2)); 592 } 534 593 void op_cmp_value(int op_size,int reg,char byte_data){ 535 594 //cmp reg,byte_data -
BasicCompiler64/CParameter.cpp
r63 r64 2 2 #include "opcode.h" 3 3 4 voidCParameter::NewTempParameters( const char *FuncName,PARAMETER_INFO *ppi,int pi_num,int SecondParmNum ){4 int CParameter::NewTempParameters( const char *FuncName,PARAMETER_INFO *ppi,int pi_num,int SecondParmNum ){ 5 5 /////////////////////////////////////////////////////// 6 6 // 一時オブジェクトをあらかじめスタックに積んでおく 7 7 /////////////////////////////////////////////////////// 8 9 int stackItemNum = 0; 8 10 9 11 useTempObject = false; … … 60 62 int type = NumOpe( ®, Parms[i2], DummyTypeInfo.type, DummyTypeInfo.u.lpIndex, &lpVarIndex ); 61 63 64 if( type == DEF_OBJECT ){ 65 //一時参照を作成 66 pobj_sf->push( reg ); 67 pobj_sf->mov_sp( reg ); 68 69 stackItemNum++; 70 } 71 62 72 //スタックフレームへコピー 63 73 StackOffsetOfTempObject[i2] = pobj_sf->push(reg); 74 75 stackItemNum++; 64 76 65 77 bool result = CheckDifferentType( … … 81 93 } 82 94 } 95 96 return stackItemNum * PTR_SIZE; 83 97 } 84 98 void CParameter::DeleteTempParameters(){ … … 90 104 for(int i2=ParmsNum-1;i2>=0;i2--){ 91 105 if( useTempParameters[i2] ){ 92 //スタックフレームから取得93 pobj_sf->ref(REG_RCX);94 95 //デストラクタを呼び出す96 97 //call destructor98 CMethod *method = types[i2].u.pobj_Class->GetDestructorMethod(); 99 if( method ){100 op_call( method->psi );101 }102 103 //メモリを解放する104 105 pobj_sf->pop(REG_RCX);106 107 //call free108 extern SUBINFO *pSub_free;109 op_call(pSub_free);106 if( types[i2].type == DEF_STRUCT ){ 107 // 構造体の一時メモリ 108 109 //メモリを解放する 110 111 pobj_sf->pop( REG_RCX ); 112 113 //call free 114 extern SUBINFO *pSub_free; 115 op_call(pSub_free); 116 } 117 else if( types[i2].type == DEF_OBJECT ){ 118 pobj_sf->pop(); 119 pobj_sf->pop(); 120 } 121 else{ 122 SetError(300,NULL,cp); 123 } 110 124 } 111 125 } 112 126 } 113 127 114 void CParameter::Set ObjectParameter(int reg,CClass *pobj_Class,LPSTR Parameter){128 void CParameter::SetStructParameter(int reg,CClass *pobj_Class,LPSTR Parameter){ 115 129 ////////////////////////////////////////////////////// 116 130 ///// レジスタ資源のバックアップ … … 133 147 pobj_sf->push(REG_R11); 134 148 135 TYPEINFO BaseType={DEF_ OBJECT,(LONG_PTR)pobj_Class};149 TYPEINFO BaseType={DEF_STRUCT,(LONG_PTR)pobj_Class}; 136 150 TYPEINFO CalcType; 137 151 CalcType.type=NumOpe_GetType(Parameter,&BaseType,&CalcType.u.lpIndex); 138 152 153 /* 154 TODO: 消す 139 155 if( pobj_Class->GetCopyConstructorMethod() 140 156 && CalcType.type==DEF_OBJECT&&CalcType.u.pobj_Class==pobj_Class){ … … 178 194 op_call(pobj_Class->GetConstructorMethod()->psi); 179 195 } 196 */ 180 197 181 198 182 199 BOOL bUseHeap; 183 200 int temp_reg=REG_RAX; 184 CalcType.type=NumOpe(&temp_reg,Parameter,DEF_ OBJECT,(LONG_PTR)pobj_Class,&CalcType.u.lpIndex,&bUseHeap);201 CalcType.type=NumOpe(&temp_reg,Parameter,DEF_STRUCT,(LONG_PTR)pobj_Class,&CalcType.u.lpIndex,&bUseHeap); 185 202 186 203 … … 194 211 RelativeVar.dwKind=VAR_DIRECTMEM; 195 212 196 Set ObjectVariableFromRax((LONG_PTR)pobj_Class,CalcType.type,CalcType.u.lpIndex,&RelativeVar,bUseHeap);197 198 }213 SetStructVariableFromRax((LONG_PTR)pobj_Class,CalcType.type,CalcType.u.lpIndex,&RelativeVar,bUseHeap); 214 215 //} 199 216 200 217 //mov r11,qword ptr[rsp+offset] ※スタックフレームを利用 … … 209 226 op_mov_RR(reg,REG_R11); 210 227 } 228 211 229 212 230 void CParameter::SetParameter(const char *FuncName,PARAMETER_INFO *ppi,int pi_num,int SecondParmNum){ … … 298 316 } 299 317 300 if(DummyTypeInfo.type==DEF_ OBJECT){301 Set ObjectParameter(reg,DummyTypeInfo.u.pobj_Class,Parms[i2]);318 if(DummyTypeInfo.type==DEF_STRUCT){ 319 SetStructParameter(reg,DummyTypeInfo.u.pobj_Class,Parms[i2]); 302 320 goto next; 303 321 } … … 318 336 319 337 if(CalcType==DEF_OBJECT){ 320 //キャスト演算子のオーバーロードに対応する 321 CallCastOperatorProc(reg,CalcType,lpCalcIndex,bCalcUseHeap,DummyTypeInfo.type,DummyTypeInfo.u.lpIndex); 338 if( DummyTypeInfo.type != DEF_OBJECT 339 || 340 DummyTypeInfo.type == DEF_OBJECT && 341 !DummyTypeInfo.u.pobj_Class->IsEqualsOrSubClass( (CClass *)lpCalcIndex ) ){ 342 //キャスト演算子のオーバーロードに対応する 343 CallCastOperatorProc(reg,CalcType,lpCalcIndex,bCalcUseHeap,DummyTypeInfo.type,DummyTypeInfo.u.lpIndex); 344 } 322 345 } 323 346 … … 419 442 } 420 443 } 444 else if(DummyTypeInfo.type==DEF_STRUCT){ 445 if( !DummyTypeInfo.u.pobj_Class->IsEquals( (CClass *)lpVarIndex ) ){ 446 SetError(11,Parms[i2],cp); 447 } 448 } 421 449 } 422 450 else if((VarType&FLAG_PTR)&&((VarType^FLAG_PTR)==DummyTypeInfo.type)){ … … 442 470 } 443 471 } 472 444 473 next: 474 445 475 if(reg==REG_RAX){ 446 476 //スタックフレームへコピー -
BasicCompiler64/CommandValue.h
r3 r64 19 19 #define COM_LET 0x1066 20 20 #define COM_DELETE 0x1068 21 #define COM_SWEEPINGDELETE 0x1069 21 22 22 23 //その他 -
BasicCompiler64/Compile_Calc.cpp
r62 r64 11 11 SetBooleanVariable(CalcType,pRelativeVar); 12 12 } 13 else if(VarType==DEF_SBYTE||VarType==DEF_BYTE || (isUnicode==false&&VarType==DEF_CHAR)){ 14 //8ビット変数へalレジスタの内容を格納する 15 SetWholeVariable(sizeof(char),CalcType,pRelativeVar); 16 } 17 else if(VarType==DEF_INTEGER||VarType==DEF_WORD || (isUnicode&&VarType==DEF_CHAR)){ 18 //16ビット変数へaxレジスタの内容を格納する 19 SetWholeVariable(sizeof(short),CalcType,pRelativeVar); 20 } 21 else if(VarType==DEF_LONG||VarType==DEF_DWORD){ 22 //32ビット変数へeaxレジスタの内容を格納する 23 SetWholeVariable(sizeof(long),CalcType,pRelativeVar); 24 } 25 else if(VarType==DEF_INT64||VarType==DEF_QWORD||IsPtrType(VarType)){ 26 //64ビット変数へraxレジスタの内容を格納する 27 SetWholeVariable(sizeof(_int64),CalcType,pRelativeVar); 28 } 29 else if(VarType==DEF_DOUBLE){ 30 //Double型変数へスタックの内容を格納する 31 SetDoubleVariable(CalcType,pRelativeVar); 32 } 33 else if(VarType==DEF_SINGLE){ 34 //Single型変数へスタックの内容を格納する 35 SetSingleVariable(CalcType,pRelativeVar); 13 else if( IsRealNumberType( VarType ) ){ 14 // Double/Single型変数へレジスタの値を代入 15 SetRealVariable(VarType, CalcType, pRelativeVar); 16 } 17 else if( IsWholeNumberType( VarType ) || VarType == DEF_OBJECT ){ 18 int typeSize = GetTypeSize( VarType, -1 ); 19 20 //整数変数へraxの値を格納する 21 SetWholeVariable( typeSize, CalcType, pRelativeVar ); 36 22 } 37 23 else{ … … 165 151 166 152 153 if( lstrcmpi( variable, "This" ) == 0 ){ 154 SetError(133,NULL,cp); 155 return; 156 } 157 167 158 168 159 //////////////////////////////////////// … … 195 186 CalcType=NumOpe(®,Command+i+1,VarType,lpVarIndex,&lpCalcIndex,&bCalcUseHeap); 196 187 188 if(reg!=REG_RAX&&IsWholeNumberType(CalcType)){ 189 SetError(300,NULL,cp); 190 } 191 192 if(VarType==-1||CalcType==-1) return; 193 197 194 //結果を格納しているレジスタをブロッキング 198 195 pobj_BlockReg->lock(reg); 199 200 if(VarType==-1||CalcType==-1) return;201 196 202 197 //変数アドレスを取得 … … 206 201 &VarType, 207 202 &VarRelativeVar, 208 &lpVarIndex)) return; 203 &lpVarIndex, 204 NULL)) return; 209 205 210 206 //レジスタのブロッキングを解除 … … 216 212 } 217 213 218 if(VarType==DEF_ OBJECT){219 // オブジェクトインスタンスへの代入220 Set ObjectVariableFromRax(lpVarIndex,CalcType,lpCalcIndex,&VarRelativeVar,bCalcUseHeap);221 return; 222 } 223 224 if(CalcType==DEF_OBJECT ){214 if(VarType==DEF_STRUCT ){ 215 //構造体インスタンスへの代入 216 SetStructVariableFromRax(lpVarIndex,CalcType,lpCalcIndex,&VarRelativeVar,bCalcUseHeap); 217 return; 218 } 219 220 if(CalcType==DEF_OBJECT && (CalcType!=VarType || lpCalcIndex!=lpVarIndex) ){ 225 221 //キャスト演算子のオーバーロードに対応する 226 222 CallCastOperatorProc(REG_RAX,CalcType,lpCalcIndex,bCalcUseHeap,VarType,lpVarIndex); … … 241 237 } 242 238 239 // TODO: 消す 240 /* 243 241 void SetRefVariable( const char *varname, const char *expression ){ 244 242 //////////////////////////////////////// … … 320 318 SetVariableFromRax(VarType,CalcType,&VarRelativeVar); 321 319 } 320 */ -
BasicCompiler64/Compile_CallProc.cpp
r63 r64 12 12 13 13 //mov rdx,rax 14 op_mov 64_ToReg_FromReg(REG_RDX,REG_RAX);14 op_mov_RR(REG_RDX,REG_RAX); 15 15 16 16 //mov rcx,rsp 17 op_mov 64_ToReg_FromReg(REG_RCX,REG_RSP);17 op_mov_RR(REG_RCX,REG_RSP); 18 18 19 19 //call _DebugSys_SaveContext … … 96 96 } 97 97 98 void Opcode_CallProc(c har *Parameter,SUBINFO *psi,DWORD dwFlags,char *ObjectName,int RefType){98 void Opcode_CallProc(const char *Parameter,SUBINFO *psi,DWORD dwFlags,char *ObjectName,int RefType){ 99 99 int i2; 100 100 … … 207 207 208 208 /////////////////////////////////////////////////////////////// 209 // _System_LocalThis 、_System_ReturnObjectのダミーをセット209 // _System_LocalThisのダミーをセット 210 210 /////////////////////////////////////////////////////////////// 211 211 … … 216 216 } 217 217 218 if(psi->ReturnType==DEF_OBJECT && psi->isReturnRef == false ){219 //_System_ReturnObject(第一または第二パラメータのダミーを作成)220 sprintf(temporary+lstrlen(temporary),"%c%c0,",1,ESC_BYVAL);221 }222 223 218 if(Parameter[0]=='\0'&&temporary[0]) 224 219 temporary[lstrlen(temporary)-1]=0; 225 220 else lstrcat(temporary,Parameter); 221 222 223 //パラメータセット前のspオフセットを取得(Newの場合はここにThisポインタが格納されている) 224 int this_sp_offset = pobj_sf->GetNowSp(); 226 225 227 226 … … 254 253 pobj_parameter->SetParameter(psi->name,psi->pRealParmInfo,psi->RealParmNum,psi->RealSecondParmNum); 255 254 256 257 if(psi->ReturnType==DEF_OBJECT && psi->isReturnRef == false){ 255 if(psi->ReturnType==DEF_STRUCT && psi->isReturnRef == false){ 258 256 ////////////////////////////////////////////////////// 259 // 戻り値に オブジェクトインスタンスを持つ場合260 // ※ByRef _System_Return Objectパラメータをセット257 // 戻り値に構造体インスタンスを持つ場合 258 // ※ByRef _System_ReturnValue パラメータをセット 261 259 ////////////////////////////////////////////////////// 262 260 … … 316 314 SetVarPtrToReg(REG_RCX,&RelativeVar); 317 315 318 //参照タイプが "->" の場合 319 if(RefType==DEF_PTR_OBJECT){ 320 //mov rcx,qword ptr[rcx] 321 op_mov_RM(sizeof(_int64),REG_RCX,REG_RCX,0,MOD_BASE); 322 } 316 // 参照を実体ポインタにする 317 //mov rcx,qword ptr[rcx] 318 op_mov_RM(sizeof(_int64),REG_RCX,REG_RCX,0,MOD_BASE); 323 319 } 324 320 } … … 329 325 330 326 //mov rcx,qword ptr[rsp+offset] ※スタックフレームを利用 331 pobj_sf->ref (REG_RCX);327 pobj_sf->ref_offset_data(REG_RCX, this_sp_offset); 332 328 } 333 329 else{ -
BasicCompiler64/Compile_Func.cpp
r51 r64 62 62 63 63 TYPEINFO TypeInfo={type,lpIndex}; 64 if(IsStringObjectType( &TypeInfo)){64 if(IsStringObjectType(TypeInfo)){ 65 65 //Stringオブジェクトの場合 66 66 sprintf(temporary,"%s.Length",tempParm); … … 195 195 } 196 196 void Opcode_Func_SizeOf( const char *Parameter ){ 197 int type,size;198 197 LONG_PTR lpIndex; 199 200 type=GetTypeFixed(Parameter,&lpIndex); 201 size=GetTypeSize(type,lpIndex); 198 int type = GetTypeFixed(Parameter,&lpIndex); 199 200 int size; 201 if( type == DEF_OBJECT ){ 202 CClass *pClass = (CClass *)lpIndex; 203 size = pClass->GetSize(); 204 } 205 else{ 206 size=GetTypeSize(type,lpIndex); 207 } 202 208 203 209 //mov rax,size … … 210 216 if(!GetVarOffsetReadOnly( Parameter, &ReturnTypeInfo.type, &RelativeVar, &ReturnTypeInfo.u.lpIndex )) return; 211 217 218 int beforeType = ReturnTypeInfo.type; 219 212 220 PTR_LEVEL_UP( ReturnTypeInfo.type ); 213 221 214 222 SetVarPtrToReg(REG_RAX,&RelativeVar); 223 224 if( beforeType == DEF_OBJECT && lstrcmpi( Parameter, "This" ) != 0 ){ 225 //参照をオブジェクトポインタに変更 226 227 //mov rax,qword ptr[rax] 228 op_mov_RM( sizeof(_int64), REG_RAX, REG_RAX, 0, MOD_BASE ); 229 } 215 230 } 216 231 void Opcode_Func_GetPtrData( const char *Parameter, const int type ){ -
BasicCompiler64/Compile_Object.cpp
r51 r64 2 2 #include "opcode.h" 3 3 4 void _call_constructor(CClass *pobj_c,c har *CreateParameter,int ObjectSize,BOOL bSomeObjects){4 void _call_constructor(CClass *pobj_c,const char *CreateParameter,int ObjectSize,BOOL bSomeObjects){ 5 5 //////////////////////////// 6 6 // コンストラクタの呼び出し … … 73 73 } 74 74 } 75 int Operator_New(const char *Parameter,LONG_PTR *plpIndex){ 76 char TypeName[VN_SIZE],CreateParameter[VN_SIZE],ObjectSize[VN_SIZE]; 75 void Operator_New( CClass &classObj, const char *objectSizeStr, const char *parameter, const TYPEINFO &baseTypeInfo ){ 76 int typeSize = classObj.GetSize(); 77 78 if(classObj.IsAbstract()){ 79 //抽象クラスだったとき 80 SetError(125,classObj.name,cp); 81 } 82 83 BOOL bSomeObjects=0; 84 if(objectSizeStr[0]){ 85 bSomeObjects=1; 86 87 int reg=REG_RAX; 88 int type = NumOpe(®,objectSizeStr,0,0,0); 89 if(!IsWholeNumberType(type)) SetError(49,NULL,cp); 90 91 //※添え字上限値であることを考慮 92 //add rax,1 93 op_add_RV(REG_RAX,1); 94 95 //オブジェクトの個数をrbxに一時保持 96 //※rbxは関数が呼ばれても不変 97 //mov rbx,rax 98 op_mov_RR(REG_RBX,REG_RAX); 99 100 //imul rax,size 101 op_imul_RV(sizeof(_int64),REG_RAX,typeSize); 102 103 //add rax,PTR_SIZE*3 104 op_add_RV(REG_RAX,PTR_SIZE*3); 105 106 //mov rcx,rax 107 op_mov_RR(REG_RCX,REG_RAX); 108 } 109 else{ 110 //オブジェクトの個数をrbxに一時保持 111 //※rbxは関数が呼ばれても不変 112 //mov rbx,1 113 op_mov_RV(sizeof(_int64),REG_RBX,1); 114 115 //mov rcx,typeSize+PTR_SIZE*3 116 op_mov_RV(sizeof(_int64),REG_RCX,typeSize+PTR_SIZE*3); 117 } 118 119 if( baseTypeInfo.type == DEF_OBJECT ){ 120 //DeleteはGCで処理 121 122 //call _System_GC_malloc_ForObject 123 extern SUBINFO *pSub_System_GC_malloc_ForObject; 124 op_call(pSub_System_GC_malloc_ForObject); 125 } 126 else{ 127 //明示的なDeleteが必要 128 129 //call _System_GC_malloc_ForObjectPtr 130 extern SUBINFO *pSub_System_GC_malloc_ForObjectPtr; 131 op_call(pSub_System_GC_malloc_ForObjectPtr); 132 } 133 134 135 /* 136 確保されたヒープ領域のポインタ(callocの戻り値eax)をpPtrとすると、 137 pPtr-=sizeof(DWORD)*3 138 pPtr[0]=オブジェクトの個数 139 pPtr[1]=オブジェクトのサイズ 140 pPtr[2]=デストラクタの関数ポインタ 141 */ 142 143 144 //mov qword ptr[rax],rbx(オブジェクトの個数) 145 op_mov_MR(sizeof(_int64),REG_RBX,REG_RAX,0,MOD_BASE); 146 147 //add rax,PTR_SIZE 148 op_add_RV(REG_RAX,PTR_SIZE); 149 150 151 //mov qword ptr[rax],typeSize(オブジェクトのサイズ) 152 op_mov_MV(sizeof(_int64),REG_RAX,0,NON_OFFSET,typeSize); 153 154 //add rax,PTR_SIZE 155 op_add_RV(REG_RAX,PTR_SIZE); 156 157 158 CMethod *method = classObj.GetDestructorMethod(); 159 if( method == NULL ) return; 160 161 //mov rcx,DestructorProcAddr 162 op_mov_RV(sizeof(_int64),REG_RCX,0); 163 obp-=sizeof(long); 164 pobj_SubAddrSchedule->add(method->psi,0); 165 method->psi->bUse=1; 166 obp+=sizeof(long); 167 168 //mov qword ptr[rax],rcx 169 op_mov_MR(sizeof(_int64),REG_RCX,REG_RAX,0,MOD_BASE); 170 171 //add rax,PTR_SIZE 172 op_add_RV(REG_RAX,PTR_SIZE); 173 174 175 // ※ここでプッシュされた値はNew演算子の戻り値となる 176 //mov qword ptr[rsp+offset],rax ※スタックフレームを利用 177 pobj_sf->push(REG_RAX); 178 179 180 ///////////////////////////////////////////////////////////////////// 181 182 //////////////////////////// 183 // コンストラクタの呼び出し 184 //////////////////////////// 185 186 _call_constructor(&classObj,parameter,typeSize,bSomeObjects); 187 188 189 //mov rax,qword ptr[rsp+offset] ※スタックフレームを利用 190 pobj_sf->pop(REG_RAX); 191 } 192 int Operator_New(const char *Parameter,LONG_PTR *plpIndex,const TYPEINFO &baseTypeInfo ){ 193 char TypeName[VN_SIZE],CreateParameter[VN_SIZE],objectSizeStr[VN_SIZE]; 77 194 int i,i2; 78 int reg;79 195 80 196 i=0; 81 197 82 198 if(Parameter[0]=='['){ 83 i=GetStringInBracket( ObjectSize,Parameter);84 85 SlideString( ObjectSize+1,-1);86 ObjectSize[i-2]=0;87 } 88 else ObjectSize[0]=0;199 i=GetStringInBracket(objectSizeStr,Parameter); 200 201 SlideString(objectSizeStr+1,-1); 202 objectSizeStr[i-2]=0; 203 } 204 else objectSizeStr[0]=0; 89 205 90 206 for(i2=0;;i++,i2++){ … … 109 225 } 110 226 111 int type ,TypeSize;227 int type; 112 228 type=GetTypeFixed(TypeName,plpIndex); 113 229 if(type==-1){ … … 115 231 return 0; 116 232 } 117 TypeSize=GetTypeSize(type,*plpIndex);118 233 119 234 if(type!=DEF_OBJECT){ … … 129 244 pobj_c=(CClass *)*plpIndex; 130 245 131 if(pobj_c->IsAbstract()){ 132 //抽象クラスだったとき 133 SetError(125,pobj_c->name,cp); 134 } 135 136 BOOL bSomeObjects=0; 137 if(ObjectSize[0]){ 138 bSomeObjects=1; 139 140 reg=REG_RAX; 141 i2=NumOpe(®,ObjectSize,0,0,0); 142 if(!IsWholeNumberType(i2)) SetError(49,NULL,cp); 143 144 //※添え字上限値であることを考慮 145 //add rax,1 146 op_add64_value(REG_RAX,1); 147 148 //オブジェクトの個数をrbxに一時保持 149 //※rbxは関数が呼ばれても不変 150 //mov rbx,rax 151 op_mov64_ToReg_FromReg(REG_RBX,REG_RAX); 152 153 //imul rax,size 154 op_imul_value(sizeof(_int64),REG_RAX,TypeSize); 155 156 //add rax,PTR_SIZE*3 157 op_add64_value(REG_RAX,PTR_SIZE*3); 158 159 //mov rcx,rax 160 op_mov64_ToReg_FromReg(REG_RCX,REG_RAX); 161 } 162 else{ 163 //オブジェクトの個数をrbxに一時保持 164 //※rbxは関数が呼ばれても不変 165 //mov rbx,1 166 op_mov_RV(sizeof(_int64),REG_RBX,1); 167 168 //mov rcx,TypeSize+PTR_SIZE*3 169 op_mov_RV(sizeof(_int64),REG_RCX,TypeSize+PTR_SIZE*3); 170 } 171 172 //call calloc 173 extern SUBINFO *pSub_calloc; 174 op_call(pSub_calloc); 175 176 177 /* 178 確保されたヒープ領域のポインタ(callocの戻り値eax)をpPtrとすると、 179 pPtr-=sizeof(DWORD)*3 180 pPtr[0]=オブジェクトの個数 181 pPtr[1]=オブジェクトのサイズ 182 pPtr[2]=デストラクタの関数ポインタ 183 */ 184 185 186 //mov qword ptr[rax],rbx(オブジェクトの個数) 187 op_mov_MR(sizeof(_int64),REG_RBX,REG_RAX,0,MOD_BASE); 188 189 //add rax,PTR_SIZE 190 op_add64_value(REG_RAX,PTR_SIZE); 191 192 193 //mov qword ptr[rax],TypeSize(オブジェクトのサイズ) 194 op_mov_MV(sizeof(_int64),REG_RAX,0,NON_OFFSET,TypeSize); 195 196 //add rax,PTR_SIZE 197 op_add64_value(REG_RAX,PTR_SIZE); 198 199 200 CMethod *method = pobj_c->GetDestructorMethod(); 201 if( method == NULL ) return 0; 202 203 //mov rcx,DestructorProcAddr 204 op_mov_RV(sizeof(_int64),REG_RCX,0); 205 obp-=sizeof(long); 206 pobj_SubAddrSchedule->add(method->psi,0); 207 method->psi->bUse=1; 208 obp+=sizeof(long); 209 210 //mov qword ptr[rax],rcx 211 op_mov_MR(sizeof(_int64),REG_RCX,REG_RAX,0,MOD_BASE); 212 213 //add rax,PTR_SIZE 214 op_add64_value(REG_RAX,PTR_SIZE); 215 216 217 // ※ここでプッシュされた値はNew演算子の戻り値となる 218 //mov qword ptr[rsp+offset],rax ※スタックフレームを利用 219 pobj_sf->push(REG_RAX); 220 221 222 ///////////////////////////////////////////////////////////////////// 223 224 //////////////////////////// 225 // コンストラクタの呼び出し 226 //////////////////////////// 227 228 _call_constructor(pobj_c,CreateParameter,TypeSize,bSomeObjects); 229 230 231 //mov rax,qword ptr[rsp+offset] ※スタックフレームを利用 232 pobj_sf->pop(REG_RAX); 233 246 Operator_New( *pobj_c, objectSizeStr, CreateParameter, baseTypeInfo ); 247 248 if( baseTypeInfo.type == DEF_OBJECT ){ 249 return DEF_OBJECT; 250 } 234 251 return DEF_PTR_OBJECT; 235 252 } 236 253 237 void OpcodeDelete(const char *Parameter ){254 void OpcodeDelete(const char *Parameter, bool isSweeping){ 238 255 int type; 239 256 … … 254 271 255 272 //add rax,PTR_SIZE 256 op_add 64_value(REG_RAX,PTR_SIZE);273 op_add_RV(REG_RAX,PTR_SIZE); 257 274 258 275 … … 261 278 262 279 //add rax,PTR_SIZE 263 op_add 64_value(REG_RAX,PTR_SIZE);280 op_add_RV(REG_RAX,PTR_SIZE); 264 281 265 282 … … 268 285 269 286 //add rax,PTR_SIZE 270 op_add 64_value(REG_RAX,PTR_SIZE);287 op_add_RV(REG_RAX,PTR_SIZE); 271 288 272 289 273 290 //mov rcx,rax 274 op_mov 64_ToReg_FromReg(REG_RCX,REG_RAX);291 op_mov_RR(REG_RCX,REG_RAX); 275 292 276 293 … … 279 296 jnz_back=obp; 280 297 281 //mov qword ptr[rsp+offset],r ax ※スタックフレームを利用282 pobj_sf->push(REG_R AX);298 //mov qword ptr[rsp+offset],rcx ※スタックフレームを利用 299 pobj_sf->push(REG_RCX); 283 300 284 301 //call rdi … … 309 326 pobj_sf->pop(REG_RCX); 310 327 311 //call free 312 extern SUBINFO *pSub_free; 313 op_call(pSub_free); 328 if( isSweeping ){ 329 //call _System_GC_free_for_SweepingDelete 330 extern SUBINFO *pSub_System_GC_free_for_SweepingDelete; 331 op_call(pSub_System_GC_free_for_SweepingDelete); 332 } 333 else{ 334 //call free 335 extern SUBINFO *pSub_free; 336 op_call(pSub_free); 337 } 314 338 } -
BasicCompiler64/Compile_ProcOp.cpp
r63 r64 51 51 52 52 //add rsp,スタックフレームサイズ 53 op_add 64_value(REG_RSP,pobj_sf->GetFrameSize());53 op_add_RV(REG_RSP,pobj_sf->GetFrameSize()); 54 54 55 55 //スタックフレームスケジュール(subコマンドに渡す値) … … 94 94 95 95 //add rsp,スタックフレームサイズ 96 op_add 64_value(REG_RSP,pobj_sf->GetFrameSize());96 op_add_RV(REG_RSP,pobj_sf->GetFrameSize()); 97 97 98 98 //スタックフレームスケジュール(subコマンドに渡す値) … … 118 118 119 119 //add rsp,8 120 op_add 64_value(REG_RSP,0x8);120 op_add_RV(REG_RSP,0x8); 121 121 122 122 //ret … … 128 128 129 129 //add rax,PTR_SIZE 130 op_add 64_value(REG_RAX,PTR_SIZE);130 op_add_RV(REG_RAX,PTR_SIZE); 131 131 132 132 //ret … … 337 337 338 338 LocalVar[MaxLocalVarNum].type=psi->pRealParmInfo[i3].type; 339 if(LocalVar[MaxLocalVarNum].type==DEF_OBJECT){ 340 if(psi->bExport) 341 SetError(24,NULL,cp); 339 if(LocalVar[MaxLocalVarNum].type==DEF_OBJECT 340 ||LocalVar[MaxLocalVarNum].type==DEF_STRUCT){ 341 if(psi->bExport) 342 SetError(24,NULL,cp); 342 343 } 343 344 344 345 LocalVar[MaxLocalVarNum].u.index=psi->pRealParmInfo[i3].u.index; 345 346 346 if(psi->pRealParmInfo[i3].bByVal&&psi->pRealParmInfo[i3].type==DEF_ OBJECT){347 // 実態オブジェクトのByValパラメータ347 if(psi->pRealParmInfo[i3].bByVal&&psi->pRealParmInfo[i3].type==DEF_STRUCT){ 348 //構造体のByValパラメータ 348 349 LocalVar[MaxLocalVarNum].fRef=REF_PARAMETER | OBJECT_PARAMETER; 349 350 VarSize=PTR_SIZE; … … 457 458 BaseLocalVar=AllLocalVarSize; 458 459 459 if(psi->ReturnType!= -1){460 if(psi->ReturnType!=DEF_NON){ 460 461 //戻り値が存在するとき 461 462 … … 464 465 else temp=psi->name; 465 466 466 if(psi->ReturnType==DEF_OBJECT && psi->isReturnRef == false){ 467 //戻り値用オブジェクトのコンストラクタを呼び出す 468 if( psi->u.Return_pobj_c->GetConstructorMethod() ){ 469 sprintf(temporary,"%s.%s()",temp,psi->u.Return_pobj_c->name); 470 OpcodeOthers(temporary); 471 } 467 if(psi->ReturnType==DEF_STRUCT && psi->isReturnRef == false){ 468 //戻り値用の構造体(値型)はパラメータで引き渡される 472 469 } 473 470 else{ … … 493 490 494 491 //mov rcx,rsp 495 op_mov 64_ToReg_FromReg(REG_RCX,REG_RSP);492 op_mov_RR(REG_RCX,REG_RSP); 496 493 497 494 //add rcx,スタックフレームサイズ+sizeof(_int64) ※ret用のサイズを考慮 498 op_add 64_value(REG_RCX,0);495 op_add_RV(REG_RCX,0); 499 496 RspOffsetSchedule2=obp-sizeof(long); 500 497 … … 571 568 for(i3=0;i3<pobj_CompilingClass->iMemberNum;i3++){ 572 569 CMember *pMember = pobj_CompilingClass->ppobj_Member[i3]; 573 int MemberTypeSize= 574 GetTypeSize(pMember->TypeInfo.type, 575 pMember->TypeInfo.u.lpIndex); 576 577 int MemberObjectNum= 578 JumpSubScripts(pMember->SubScripts); 579 580 int offset = pobj_CompilingClass->GetMemberOffset( pMember->name, NULL ); 581 582 if(pMember->TypeInfo.type==DEF_OBJECT && pMember->IsRef() == false){ 583 CMethod *method = pMember->TypeInfo.u.pobj_Class->GetConstructorMethod(); 584 if( method ){ 585 if( method->psi->RealParmNum == 1 ){ //Thisポインタを第一引数に持ち合わせるため、引数なしの場合はこの値が1になる 586 for(i4=0;i4<MemberObjectNum;i4++){ 587 //Thisポインタをrcxにコピー 588 SetThisPtrToReg(REG_RCX); 589 590 //add rcx,offset 591 op_add64_value(REG_RCX,offset+i4*MemberTypeSize); 592 593 //call constructor 594 op_call( method->psi ); 595 } 596 } 597 } 570 if(pMember->TypeInfo.type==DEF_OBJECT){ 571 // オブジェクトメンバを発見したとき 572 573 sprintf(temporary, "This.%s=%c%c%s()", 574 pMember->name, 575 1, ESC_NEW, 576 pMember->TypeInfo.u.pobj_Class->name ); 577 OpcodeCalc( temporary ); 598 578 } 599 579 } … … 665 645 } 666 646 667 //実体クラスを持つメンバのデストラクタを呼び出す 647 //実体クラスを持つメンバのデストラクタ呼び出しはGCに任せる 648 /* 668 649 //※コンストラクタと逆順序で呼び出す 669 650 for(i3=pobj_CompilingClass->iMemberNum-1;i3>=0;i3--){ … … 678 659 int offset = pobj_CompilingClass->GetMemberOffset( pMember->name, NULL ); 679 660 680 if(pMember->TypeInfo.type==DEF_OBJECT && pMember->IsRef() == false){661 if(pMember->TypeInfo.type==DEF_OBJECT){ 681 662 CMethod *method = pMember->TypeInfo.u.pobj_Class->GetDestructorMethod(); 682 663 if( method ){ … … 686 667 687 668 //add rcx,offset 688 op_add 64_value(REG_RCX,offset+i4*MemberTypeSize);669 op_add_RV(REG_RCX,offset+i4*MemberTypeSize); 689 670 690 671 //call destructor … … 693 674 } 694 675 } 695 } 676 }*/ 696 677 } 697 678 } … … 743 724 } 744 725 745 if(psi->ReturnType!= -1){726 if(psi->ReturnType!=DEF_NON){ 746 727 ////////////////////////////////// 747 728 // 戻り値をraxまたはxmm0に設定 … … 759 740 i3=psi->ReturnType; 760 741 761 if(i3==DEF_OBJECT ){742 if(i3==DEF_OBJECT || i3==DEF_STRUCT){ 762 743 SetVarPtrToReg(REG_RAX,&RelativeVar); 744 if( i3==DEF_OBJECT ){ 745 //mov rax,qword ptr[rax] 746 op_mov_RM( sizeof(_int64), REG_RAX, REG_RAX, 0, MOD_BASE ); 747 } 763 748 } 764 749 else if(i3==DEF_DOUBLE){ -
BasicCompiler64/Compile_Set_Var.cpp
r63 r64 7 7 } 8 8 9 void Set ObjectVariableFromRax(LONG_PTR lpVarIndex,int CalcType,LONG_PTR lpCalcIndex,RELATIVE_VAR *pRelativeVar,BOOL bUseHeap){9 void SetStructVariableFromRax(LONG_PTR lpVarIndex,int CalcType,LONG_PTR lpCalcIndex,RELATIVE_VAR *pRelativeVar,BOOL bUseHeap){ 10 10 int RightTermReg; 11 11 pobj_reg=new CRegister(REG_RCX); … … 36 36 } 37 37 38 38 /* 39 TODO: 消す 39 40 /////////////////////////////////////////////////////////////////// 40 41 // オペレータ '=' のオーバーロード関数を呼ぶ … … 59 60 int iRet; 60 61 iRet=CallOperatorProc(CALC_SUBSITUATION,NULL,type,index_stack,array_bUseHeap,sp); 61 62 */ 62 63 //右辺用レジスタを解除 63 64 if(IsRealNumberType(CalcType)) pobj_reg->UnlockXmmReg(); … … 71 72 pobj_reg=0; 72 73 73 if(iRet==-1||iRet==1){ 74 //成功したとき、またはエラーが発行されたとき 75 return; 76 } 77 78 79 if( CalcType == DEF_OBJECT ){ 74 75 if( CalcType == DEF_STRUCT ){ 80 76 CClass *pVarClass = (CClass *)lpVarIndex; 81 77 CClass *pCalcClass = (CClass *)lpCalcIndex; 82 78 83 if( pVarClass->IsEquals( pCalcClass ) //等しい 84 || pVarClass->IsSubClass( pCalcClass ) ){ //派生・継承関係 79 if( pVarClass->IsEquals( pCalcClass ) ){ //等しい 85 80 86 81 //双方のオブジェクト型が一致、または派生・継承関係にあるとき … … 122 117 SetError(1,NULL,cp); 123 118 } 119 124 120 125 121 void SetDoubleVariable(int type,RELATIVE_VAR *pRelative){ … … 305 301 } 306 302 } 303 void SetRealVariable(int VarType, int CalcType, RELATIVE_VAR *pRelativeVar){ 304 if(VarType==DEF_DOUBLE){ 305 //Double型変数へスタックの内容を格納する 306 SetDoubleVariable(CalcType,pRelativeVar); 307 } 308 else if(VarType==DEF_SINGLE){ 309 //Single型変数へスタックの内容を格納する 310 SetSingleVariable(CalcType,pRelativeVar); 311 } 312 } 307 313 void SetBooleanVariable(int type,RELATIVE_VAR *pRelative){ 308 314 if(type==DEF_DOUBLE){ -
BasicCompiler64/Compile_Statement.cpp
r56 r64 99 99 ///////////////////// 100 100 101 if(i2==DEF_ OBJECT){101 if(i2==DEF_STRUCT){ 102 102 //mov r14,rax 103 103 op_mov_RR(REG_R14,REG_RAX); … … 888 888 //add rax,offset(Gosubステートメントの最終ポイント) 889 889 int schedule=obp,schedule2; 890 op_add 64_value(REG_RAX,0);890 op_add_RV(REG_RAX,0); 891 891 schedule2=obp-sizeof(long); 892 892 … … 951 951 else temp=pCompilingSubInfo->name; 952 952 953 /* 954 TODO: 消す 953 955 if( pCompilingSubInfo->isReturnRef ){ 954 956 //参照型 … … 956 958 } 957 959 else{ 958 //値型 960 //値型*/ 959 961 char temporary[VN_SIZE]; 960 962 sprintf(temporary,"%s=%s",temp,Parameter); 961 963 OpcodeCalc(temporary); 962 }964 //} 963 965 } 964 966 … … 968 970 } 969 971 970 void Opcode_Input(c har *Parameter){972 void Opcode_Input(const char *Parameter){ 971 973 extern int cp; 972 974 int i2,i3,i4,i5,type; 973 975 BOOL bFile; 974 976 char temporary[VN_SIZE],temp2[VN_SIZE],buffer[VN_SIZE]; 975 976 KillStringSpaces(Parameter);977 977 978 978 if(Parameter[0]=='#'){ … … 1084 1084 Opcode_CallProc(buffer,psi,0,"",0); 1085 1085 } 1086 void Opcode_PrintUsing(c har *Parameter,char *buffer,BOOL bFile){1086 void Opcode_PrintUsing(const char *Parameter,char *buffer,BOOL bFile){ 1087 1087 extern int cp; 1088 1088 int i2,i3,i4,i5; … … 1090 1090 BOOL bReturnLine; 1091 1091 1092 i2=lstrlen(Parameter); 1093 if(Parameter[i2-1]==';'){ 1092 char parms[8192]; 1093 lstrcpy( parms, Parameter ); 1094 1095 i2=lstrlen(parms); 1096 if(parms[i2-1]==';'){ 1094 1097 bReturnLine=0; 1095 Parameter[i2-1]=0;1098 parms[i2-1]=0; 1096 1099 } 1097 1100 else bReturnLine=1; … … 1099 1102 i3=lstrlen(buffer); 1100 1103 for(i2=0;;i2++,i3++){ 1101 if( Parameter[i2]==';'){1104 if(parms[i2]==';'){ 1102 1105 buffer[i3]=0; 1103 1106 break; 1104 1107 } 1105 buffer[i3]= Parameter[i2];1106 if( Parameter[i2]=='\0') break;1107 } 1108 if( Parameter[i2]==';') i2++;1108 buffer[i3]=parms[i2]; 1109 if(parms[i2]=='\0') break; 1110 } 1111 if(parms[i2]==';') i2++; 1109 1112 1110 1113 if(bReturnLine) lstrcat(buffer,"+Ex\"\\r\\n\""); … … 1114 1117 while(1){ 1115 1118 for(i3=0;;i2++,i3++){ 1116 if( Parameter[i2]=='\"'){1117 temporary[i3]= Parameter[i2];1119 if(parms[i2]=='\"'){ 1120 temporary[i3]=parms[i2]; 1118 1121 for(i2++,i3++;;i2++,i3++){ 1119 temporary[i3]= Parameter[i2];1120 if( Parameter[i2]=='\"') break;1122 temporary[i3]=parms[i2]; 1123 if(parms[i2]=='\"') break; 1121 1124 } 1122 1125 continue; 1123 1126 } 1124 if( Parameter[i2]=='('){1125 i5=GetStringInPare(temporary+i3, Parameter+i2);1127 if(parms[i2]=='('){ 1128 i5=GetStringInPare(temporary+i3,parms+i2); 1126 1129 i2+=i5-1; 1127 1130 i3+=i5-1; 1128 1131 continue; 1129 1132 } 1130 if( Parameter[i2]=='['){1131 i5=GetStringInBracket(temporary+i3, Parameter+i2);1133 if(parms[i2]=='['){ 1134 i5=GetStringInBracket(temporary+i3,parms+i2); 1132 1135 i2+=i5-1; 1133 1136 i3+=i5-1; 1134 1137 continue; 1135 1138 } 1136 if( Parameter[i2]==','){1139 if(parms[i2]==','){ 1137 1140 temporary[i3]=0; 1138 1141 i2++; 1139 1142 break; 1140 1143 } 1141 temporary[i3]= Parameter[i2];1142 if( Parameter[i2]=='\0') break;1144 temporary[i3]=parms[i2]; 1145 if(parms[i2]=='\0') break; 1143 1146 } 1144 1147 if(temporary[0]=='\0'){ … … 1169 1172 1170 1173 i4++; 1171 if( Parameter[i2]=='\0') break;1174 if(parms[i2]=='\0') break; 1172 1175 } 1173 1176 sprintf(temp2,"_System_UsingDataType[%d]=-1",i4); … … 1183 1186 Opcode_CallProc(buffer,psi,0,"",0); 1184 1187 } 1185 void Opcode_Print(c har *Parameter,BOOL bWrite){1188 void Opcode_Print(const char *Parameter,BOOL bWrite){ 1186 1189 int i2,i3,i4,sw; 1187 1190 char temporary[VN_SIZE],buffer[VN_SIZE]; 1188 1191 BOOL bFile; 1189 1190 KillStringSpaces(Parameter);1191 1192 1192 1193 if(Parameter[0]=='#'){ -
BasicCompiler64/Compile_Var.cpp
r63 r64 41 41 42 42 if(PTR_LEVEL(*pType)){ 43 *pType=MAKE_PTR_TYPE(NATURAL_TYPE(*pType),PTR_LEVEL(*pType)-1); 44 if((*pType)==DEF_OBJECT){ 45 CClass *pClass = (CClass *)lpIndex; 46 //imul reg,objsize 47 op_imul_value( sizeof(_int64), reg, pClass->GetSize() ); 48 } 49 else{ 50 i2=GetTypeSize(*pType,-1); 51 if(i2>=2){ 52 //imul reg,i2 53 op_imul_value(sizeof(_int64),reg,i2); 54 } 43 *pType = PTR_LEVEL_DOWN( *pType ); 44 45 i2=GetTypeSize(*pType,-1); 46 if(i2>=2){ 47 //imul reg,i2 48 op_imul_RV(sizeof(_int64),reg,i2); 55 49 } 56 50 } … … 71 65 //add r11,reg 72 66 op_add64_reg(REG_R11,reg); 67 } 68 void SetRelativeOffset( RELATIVE_VAR &relativeVar ){ 69 if(relativeVar.dwKind==VAR_DIRECTMEM){ 70 //mov r11,qword ptr[r11] 71 op_mov_RM(sizeof(_int64),REG_R11,REG_R11,0,MOD_BASE); 72 } 73 else{ 74 //直接参照に切り替え 75 SetVarPtrToReg(REG_R12,&relativeVar); 76 relativeVar.dwKind=VAR_DIRECTMEM; 77 78 //mov r11,qword ptr[r12] 79 op_mov_RM(sizeof(_int64),REG_R11,REG_R12,0,MOD_BASE); 80 } 73 81 } 74 82 BOOL GetArrayOffset(int *SubScripts,char *array,int type,LONG_PTR lpIndex){ … … 153 161 154 162 //imul reg,i4 155 op_imul_ value(sizeof(_int64),reg,i4);163 op_imul_RV(sizeof(_int64),reg,i4); 156 164 157 165 //add r12,reg … … 192 200 char lpPtrOffset[VN_SIZE]; //第2次配列 193 201 char NestMember[VN_SIZE]; //入れ子メンバ 194 int RefType; //"."参照のときは0、"->"参照のときは1202 CClass::RefType refType; 195 203 lstrcpy(VarName,member); 196 if(!GetVarFormatString(VarName,array,lpPtrOffset,NestMember, &RefType)) return 0;204 if(!GetVarFormatString(VarName,array,lpPtrOffset,NestMember,refType)) return 0; 197 205 198 206 … … 279 287 //入れ子構造の場合 280 288 281 if(*pType==DEF_OBJECT && pMember->IsRef() == false){282 if( RefType!=DEF_OBJECT){289 if(*pType==DEF_OBJECT || *pType==DEF_STRUCT){ 290 if( refType != CClass::Dot ){ 283 291 if(isErrorEnabled) SetError(104,member,cp); 284 292 return 0; 285 293 } 286 } 287 else if(*pType==DEF_PTR_OBJECT || ( *pType==DEF_OBJECT && pMember->IsRef() )){ 294 295 if( *pType==DEF_OBJECT ){ 296 // 参照内容へのポインタを抽出 297 SetRelativeOffset( *pRelativeVar ); 298 } 299 } 300 else if(*pType==DEF_PTR_OBJECT||*pType==DEF_PTR_STRUCT){ 288 301 //構造体ポインタ型メンバ変数 289 302 290 303 if(lpPtrOffset[0]){ 291 304 //pObj[n].member 292 if( *pType==DEF_PTR_OBJECT&&RefType!=DEF_OBJECT){305 if( ( *pType==DEF_PTR_OBJECT||*pType==DEF_PTR_STRUCT )&& refType != CClass::Dot ){ 293 306 if(isErrorEnabled) SetError(104,member,cp); 294 307 return 0; … … 303 316 else{ 304 317 //pObj->member 305 if( *pType==DEF_PTR_OBJECT&&RefType!=DEF_PTR_OBJECT){318 if( ( *pType==DEF_PTR_OBJECT||*pType==DEF_PTR_STRUCT )&& refType != CClass::Pointer ){ 306 319 if(isErrorEnabled) SetError(104,member,cp); 307 320 return 0; 308 321 } 309 322 310 if(pRelativeVar->dwKind==VAR_DIRECTMEM){ 311 //mov r11,qword ptr[r11] 312 op_mov_RM(sizeof(_int64),REG_R11,REG_R11,0,MOD_BASE); 313 } 314 else{ 315 //直接参照に切り替え 316 SetVarPtrToReg(REG_R12,pRelativeVar); 317 pRelativeVar->dwKind=VAR_DIRECTMEM; 318 319 //mov r11,qword ptr[r12] 320 op_mov_RM(sizeof(_int64),REG_R11,REG_R12,0,MOD_BASE); 321 } 322 } 323 } 324 else if(*pType==MAKE_PTR_TYPE(DEF_OBJECT,2)){ 323 SetRelativeOffset( *pRelativeVar ); 324 } 325 } 326 else if(*pType==MAKE_PTR_TYPE(DEF_OBJECT,2) || *pType==MAKE_PTR_TYPE(DEF_STRUCT,2)){ 325 327 //構造体ポインタのポインタ型メンバ変数 326 328 327 329 if(lpPtrOffset[0]){ 328 330 //ppObj[n]->member 329 if( RefType!=DEF_PTR_OBJECT){331 if( refType != CClass::Pointer ){ 330 332 if(isErrorEnabled) SetError(104,member,cp); 331 333 return 0; … … 388 390 BOOL GetVarOffset(bool isErrorEnabled,bool isWriteAccess,const char *NameBuffer,int *pType,RELATIVE_VAR *pRelativeVar,LONG_PTR *plpIndex,int *pss){ 389 391 extern BOOL bCompilingGlobal; 390 int i ,RefType;392 int i; 391 393 LONG_PTR lpIndex; 392 394 char variable[VN_SIZE],member[VN_SIZE],VarName[VN_SIZE],array[VN_SIZE],lpPtrOffset[VN_SIZE]; … … 398 400 else lstrcpy(variable,NameBuffer); 399 401 400 if( FormatUseProcReturnObject( variable, VarName, array, RefType, member ) ){ 402 CClass::RefType refType; 403 if( FormatUseProcReturnObject( variable, VarName, array, refType, member ) ){ 401 404 // 戻り値オブジェクトのメンバを直接参照しているとき 402 405 //例: func().member … … 442 445 443 446 lstrcpy(VarName,variable); 444 GetVarFormatString(VarName,array,lpPtrOffset,member, &RefType);447 GetVarFormatString(VarName,array,lpPtrOffset,member,refType); 445 448 446 449 int *pSubScripts; … … 581 584 char tempMember[VN_SIZE]; 582 585 char tempArray[VN_SIZE]; 583 GetVarFormatString(temporary,tempArray,lpPtrOffset,tempMember,&i); 586 { 587 CClass::RefType refType; 588 GetVarFormatString(temporary,tempArray,lpPtrOffset,tempMember, refType ); 589 } 584 590 585 591 char temp2[VN_SIZE]; … … 697 703 } 698 704 if(member[0]){ 699 if(*pType==DEF_OBJECT ){705 if(*pType==DEF_OBJECT || *pType==DEF_STRUCT){ 700 706 //実態オブジェクトのメンバを参照(obj.member) 701 if( RefType!=DEF_OBJECT){707 if( refType != CClass::Dot ){ 702 708 SetError(104,VarName,cp); 703 709 pRelativeVar->dwKind=NON_VAR; 704 710 return 0; 705 711 } 706 } 707 else if(*pType==DEF_PTR_OBJECT){ 712 713 if( *pType==DEF_OBJECT ){ 714 // 参照内容へのポインタを抽出 715 SetRelativeOffset( *pRelativeVar ); 716 } 717 } 718 else if(*pType==DEF_PTR_OBJECT || *pType==DEF_PTR_STRUCT){ 708 719 //ポインタオブジェクトが示すメンバを参照 709 720 if(lpPtrOffset[0]){ 710 721 //pObj[n].member 711 if( RefType!=DEF_OBJECT){722 if( refType != CClass::Dot ){ 712 723 SetError(104,VarName,cp); 713 724 pRelativeVar->dwKind=NON_VAR; … … 719 730 else{ 720 731 //pObj->member 721 if( RefType!=DEF_PTR_OBJECT){732 if( refType != CClass::Pointer ){ 722 733 SetError(104,VarName,cp); 723 734 pRelativeVar->dwKind=NON_VAR; … … 732 743 } 733 744 } 734 else if(*pType==MAKE_PTR_TYPE(DEF_OBJECT,2) ){745 else if(*pType==MAKE_PTR_TYPE(DEF_OBJECT,2) || *pType==MAKE_PTR_TYPE(DEF_STRUCT,2)){ 735 746 //ポインタオブジェクトが示すメンバを参照 736 747 if(lpPtrOffset[0]){ 737 748 //ppObj[n]->member 738 if( RefType!=DEF_PTR_OBJECT){749 if( refType != CClass::Pointer ){ 739 750 SetError(104,VarName,cp); 740 751 pRelativeVar->dwKind=NON_VAR; … … 815 826 } 816 827 817 if(type==DEF_ OBJECT){828 if(type==DEF_STRUCT){ 818 829 CClass *pobj_c; 819 830 pobj_c=(CClass *)lpIndex; … … 848 859 /////////////////////////////////////// 849 860 850 if( type == DEF_OBJECT ){851 //オブジェクト の場合はありえない861 if( type == DEF_OBJECT || type == DEF_STRUCT ){ 862 //オブジェクトまたは構造体の場合はありえない 852 863 SetError(300,NULL,cp); 853 864 return 0; … … 888 899 *(float *)(initGlobalBuf+offset)=(float)dbl; 889 900 else if(type==DEF_INT64||type==DEF_QWORD||IsPtrType(type)){ 890 if(type==DEF_PTR_ BYTE&&lpCalcIndex==LITERAL_STRING){901 if(type==DEF_PTR_CHAR&&lpCalcIndex==LITERAL_STRING){ 891 902 //文字列定数のとき 892 903 … … 953 964 } 954 965 955 if(type==DEF_ OBJECT){966 if(type==DEF_STRUCT){ 956 967 CClass *pobj_c; 957 968 pobj_c=(CClass *)lpIndex; … … 1037 1048 } 1038 1049 else if(type==DEF_INT64||type==DEF_QWORD||IsPtrType(type)){ 1039 if(type==DEF_PTR_ BYTE&&lpCalcIndex==LITERAL_STRING){1050 if(type==DEF_PTR_CHAR&&lpCalcIndex==LITERAL_STRING){ 1040 1051 //文字列定数のとき 1041 1052 … … 1101 1112 } 1102 1113 1103 1114 void dim(bool isRef, char *VarName,int *SubScripts,TYPEINFO &TypeInfo,int TypeSize,char *InitBuf,char *ConstractParameter,DWORD dwFlags){ 1115 extern BOOL bCompilingGlobal; 1116 if(bCompilingGlobal){ 1117 ///////////////////////// 1118 // グローバル変数 1119 ///////////////////////// 1120 1121 AddGlobalVariable(isRef,VarName,SubScripts,&TypeInfo,TypeSize,InitBuf,ConstractParameter,dwFlags); 1122 } 1123 else{ 1124 ///////////////// 1125 // ローカル変数 1126 ///////////////// 1127 1128 int i2,i3; 1129 1130 for(i2=0;i2<MaxLocalVarNum;i2++){ 1131 if(LocalVar[i2].bLiving&&obj_LexScopes.GetNowLevel()==LocalVar[i2].ScopeLevel){ 1132 if(lstrcmp(LocalVar[i2].name,VarName)==0){ 1133 //2重定義のエラー 1134 SetError(15,VarName,cp); 1135 return; 1136 } 1137 } 1138 } 1139 1140 LocalVar=(VARIABLE *)HeapReAlloc(hHeap,0,LocalVar,(MaxLocalVarNum+1)*sizeof(VARIABLE)); 1141 VARIABLE *pVar = &LocalVar[MaxLocalVarNum]; 1142 MaxLocalVarNum++; 1143 1144 if( isRef ){ 1145 //参照型 1146 pVar->fRef = REF_VARIABLE; 1147 TypeSize = PTR_SIZE; 1148 } 1149 else pVar->fRef=0; 1150 1151 for(i2=1,i3=0;i3<255;i3++){ 1152 //配列要素数 1153 pVar->SubScripts[i3]=SubScripts[i3]; 1154 1155 if(SubScripts[i3]==-1) break; 1156 i2*=SubScripts[i3]+1; 1157 } 1158 int VarSize=TypeSize*i2; 1159 if(VarSize%8) VarSize+=8-(VarSize%8); 1160 1161 //変数データを追加 1162 lstrcpy(pVar->name,VarName); 1163 if(dwFlags & DIMFLAG_CONST) pVar->bConst = true; 1164 else pVar->bConst = false; 1165 if(SubScripts[0]==-1) pVar->bArray=0; 1166 else pVar->bArray=1; 1167 pVar->type=TypeInfo.type; 1168 pVar->u.index=TypeInfo.u.lpIndex; 1169 1170 //アラインメントを考慮 1171 if( pVar->type==DEF_STRUCT ){ 1172 int alignment = pVar->u.pobj_c->iAlign; 1173 if( alignment ){ 1174 if( AllLocalVarSize % alignment ){ 1175 AllLocalVarSize += alignment - (AllLocalVarSize % alignment); 1176 } 1177 } 1178 } 1179 1180 AllLocalVarSize+=VarSize; 1181 pVar->offset=AllLocalVarSize; 1182 1183 //レキシカルスコープ 1184 pVar->ScopeLevel=obj_LexScopes.GetNowLevel(); 1185 pVar->ScopeStartAddress=obj_LexScopes.GetStartAddress(); 1186 pVar->bLiving=TRUE; 1187 1188 if(InitBuf[0]){ 1189 //初期代入時のみ、書き込みアクセスを許可する 1190 bool bConstBack = pVar->bConst; 1191 pVar->bConst = false; 1192 1193 int result = 0; 1194 if( pVar->type != DEF_OBJECT ){ 1195 result = InitLocalVar(-pVar->offset, 1196 pVar->type, 1197 pVar->u.index, 1198 pVar->SubScripts, 1199 InitBuf); 1200 } 1201 1202 if(!result){ 1203 //動的な式だった場合は代入演算を行う 1204 char temporary[8192]; 1205 sprintf(temporary,"%s=%s",VarName,InitBuf); 1206 OpcodeCalc(temporary); 1207 } 1208 1209 pVar->bConst = bConstBack; 1210 } 1211 else{ 1212 //0初期化 1213 1214 //mov r8, 0 1215 op_zero_reg( REG_R8 ); 1216 1217 //mov rdx, VarSize 1218 op_mov_RV( sizeof(_int64), REG_RDX, VarSize ); 1219 1220 //mov rcx, rsp 1221 op_mov_RR( REG_RCX, REG_RSP ); 1222 1223 //add rcx, offset 1224 op_add_RV( REG_RCX, -pVar->offset ); 1225 obp-=sizeof(long); 1226 AddLocalVarAddrSchedule(); 1227 obp+=sizeof(long); 1228 1229 //call FillMemory 1230 DECLAREINFO *pdi; 1231 pdi=GetDeclareHash("FillMemory"); 1232 op_call( pdi ); 1233 } 1234 } 1235 1236 //コンストラクタ呼び出し 1237 if(TypeInfo.type==DEF_OBJECT&&(dwFlags&DIMFLAG_NONCALL_CONSTRACTOR)==0&&InitBuf[0]=='\0'){ 1238 char objectSize[255]; 1239 if( SubScripts[0] == -1 ){ 1240 objectSize[0] = 0; 1241 } 1242 else{ 1243 if( SubScripts[1] != -1 ){ 1244 SetError(300,NULL,cp); 1245 } 1246 sprintf( objectSize, "%d", SubScripts[0] ); 1247 } 1248 Operator_New( *TypeInfo.u.pobj_Class, objectSize, ConstractParameter, TypeInfo ); 1249 1250 int type; 1251 LONG_PTR lpIndex; 1252 RELATIVE_VAR RelativeVar; 1253 GetVarOffset( true, false, VarName, &type, &RelativeVar, &lpIndex ); 1254 if( RelativeVar.dwKind == VAR_DIRECTMEM ){ 1255 SetError(); 1256 } 1257 SetVariableFromRax( DEF_OBJECT, DEF_OBJECT, &RelativeVar ); 1258 } 1259 1260 if(TypeInfo.type==DEF_OBJECT){ 1261 if(TypeInfo.u.pobj_Class->IsAbstract()){ 1262 //抽象クラスだったとき 1263 SetError(125,TypeInfo.u.pobj_Class->name,cp); 1264 } 1265 } 1266 } 1104 1267 void dim(char *Parameter,DWORD dwFlags){ 1105 1268 extern BOOL bCompilingGlobal; 1106 1269 extern HANDLE hHeap; 1107 int i2 ,i3,VarSize;1270 int i2; 1108 1271 char VarName[VN_SIZE]; 1109 1272 … … 1172 1335 TypeSize=GetTypeSize(TypeInfo.type,TypeInfo.u.lpIndex); 1173 1336 1337 extern BOOL bCompilingGlobal; 1174 1338 if(dwFlags&DIMFLAG_STATIC){ 1175 1339 if(bCompilingGlobal){ … … 1186 1350 GetNowStaticVarFullName(VarName,temporary); 1187 1351 1188 AddGlobalVariable(isRef,temporary,SubScripts,&TypeInfo,TypeSize,InitBuf,ConstractParameter,dwFlags);1352 dim( isRef,temporary,SubScripts,TypeInfo,TypeSize,InitBuf,ConstractParameter,dwFlags ); 1189 1353 1190 1354 /* … … 1194 1358 } 1195 1359 else{ 1196 if(bCompilingGlobal){ 1197 ///////////////////////// 1198 // グローバル変数 1199 ///////////////////////// 1200 1201 AddGlobalVariable(isRef,VarName,SubScripts,&TypeInfo,TypeSize,InitBuf,ConstractParameter,dwFlags); 1202 } 1203 else{ 1204 ///////////////// 1205 // ローカル変数 1206 ///////////////// 1207 1208 for(i2=0;i2<MaxLocalVarNum;i2++){ 1209 if(LocalVar[i2].bLiving&&obj_LexScopes.GetNowLevel()==LocalVar[i2].ScopeLevel){ 1210 if(lstrcmp(LocalVar[i2].name,VarName)==0){ 1211 //2重定義のエラー 1212 SetError(15,VarName,cp); 1213 return; 1214 } 1215 } 1216 } 1217 1218 LocalVar=(VARIABLE *)HeapReAlloc(hHeap,0,LocalVar,(MaxLocalVarNum+1)*sizeof(VARIABLE)); 1219 VARIABLE *pVar = &LocalVar[MaxLocalVarNum]; 1220 MaxLocalVarNum++; 1221 1222 if( isRef ){ 1223 //参照型 1224 pVar->fRef = REF_VARIABLE; 1225 TypeSize = PTR_SIZE; 1226 } 1227 else pVar->fRef=0; 1228 1229 for(i2=1,i3=0;i3<255;i3++){ 1230 //配列要素数 1231 pVar->SubScripts[i3]=SubScripts[i3]; 1232 1233 if(SubScripts[i3]==-1) break; 1234 i2*=SubScripts[i3]+1; 1235 } 1236 VarSize=TypeSize*i2; 1237 if(VarSize%8) VarSize+=8-(VarSize%8); 1238 1239 //変数データを追加 1240 lstrcpy(pVar->name,VarName); 1241 if(dwFlags & DIMFLAG_CONST) pVar->bConst = true; 1242 else pVar->bConst = false; 1243 if(SubScripts[0]==-1) pVar->bArray=0; 1244 else pVar->bArray=1; 1245 pVar->type=TypeInfo.type; 1246 pVar->u.index=TypeInfo.u.lpIndex; 1247 AllLocalVarSize+=VarSize; 1248 pVar->offset=AllLocalVarSize; 1249 1250 //レキシカルスコープ 1251 pVar->ScopeLevel=obj_LexScopes.GetNowLevel(); 1252 pVar->ScopeStartAddress=obj_LexScopes.GetStartAddress(); 1253 pVar->bLiving=TRUE; 1254 1255 if(InitBuf[0]){ 1256 //初期代入時のみ、書き込みアクセスを許可する 1257 bool bConstBack = pVar->bConst; 1258 pVar->bConst = false; 1259 1260 int result = InitLocalVar(-pVar->offset, 1261 pVar->type, 1262 pVar->u.index, 1263 pVar->SubScripts, 1264 InitBuf); 1265 1266 if(!result){ 1267 //動的な式だった場合は代入演算を行う 1268 if( isRef ){ 1269 SetRefVariable( VarName, InitBuf ); 1270 } 1271 else{ 1272 char temporary[8192]; 1273 sprintf(temporary,"%s=%s",VarName,InitBuf); 1274 OpcodeCalc(temporary); 1275 } 1276 } 1277 1278 pVar->bConst = bConstBack; 1279 } 1280 else{ 1281 //0初期化 1282 1283 //mov r8, 0 1284 op_zero_reg( REG_R8 ); 1285 1286 //mov rdx, VarSize 1287 op_mov_RV( sizeof(_int64), REG_RDX, VarSize ); 1288 1289 //mov rcx, rsp 1290 op_mov_RR( REG_RCX, REG_RSP ); 1291 1292 //add rcx, offset 1293 op_add64_value( REG_RCX, -pVar->offset ); 1294 obp-=sizeof(long); 1295 AddLocalVarAddrSchedule(); 1296 obp+=sizeof(long); 1297 1298 //call FillMemory 1299 DECLAREINFO *pdi; 1300 pdi=GetDeclareHash("FillMemory"); 1301 op_call( pdi ); 1302 } 1303 } 1304 1305 //コンストラクタ呼び出し 1306 if(TypeInfo.type==DEF_OBJECT&&(dwFlags&DIMFLAG_NONCALL_CONSTRACTOR)==0&& isRef == false ){ 1307 CallConstructor(VarName,SubScripts,TypeInfo,ConstractParameter); 1308 } 1309 } 1310 1311 if(TypeInfo.type==DEF_OBJECT){ 1312 if(TypeInfo.u.pobj_Class->IsAbstract()){ 1313 //抽象クラスだったとき 1314 SetError(125,TypeInfo.u.pobj_Class->name,cp); 1315 } 1360 dim( isRef,VarName,SubScripts,TypeInfo,TypeSize,InitBuf,ConstractParameter,dwFlags ); 1316 1361 } 1317 1362 } … … 1362 1407 1363 1408 //mov reg,r11 1364 op_mov 64_ToReg_FromReg(reg,REG_R11);1409 op_mov_RR(reg,REG_R11); 1365 1410 } 1366 1411 else{ … … 1404 1449 1405 1450 //mov reg,r11 1406 op_mov 64_ToReg_FromReg(reg,REG_R11);1451 op_mov_RR(reg,REG_R11); 1407 1452 } 1408 1453 else{ 1409 1454 //mov reg,rsp 1410 op_mov 64_ToReg_FromReg(reg,REG_RSP);1455 op_mov_RR(reg,REG_RSP); 1411 1456 1412 1457 //add reg,offset 1413 op_add 64_value(reg,(int)pRelativeVar->offset);1458 op_add_RV(reg,(int)pRelativeVar->offset); 1414 1459 obp-=sizeof(long); 1415 1460 AddLocalVarAddrSchedule(); … … 1441 1486 directmem: 1442 1487 //mov reg,r11 1443 op_mov 64_ToReg_FromReg(reg,REG_R11);1488 op_mov_RR(reg,REG_R11); 1444 1489 } 1445 1490 } -
BasicCompiler64/MakePeHdr.cpp
r56 r64 19 19 *pSub_calloc, 20 20 *pSub_realloc, 21 *pSub_free; 21 *pSub_free, 22 *pSub_System_GC_malloc_ForObject, 23 *pSub_System_GC_malloc_ForObjectPtr, 24 *pSub_System_GC_free_for_SweepingDelete; 22 25 23 26 … … 215 218 pSub_free->bUse=1; 216 219 220 if( pSub_System_GC_malloc_ForObject = GetSubHash( "_System_GC_malloc_ForObject",1 ) ) 221 pSub_System_GC_malloc_ForObject->bUse = 1; 222 223 if( pSub_System_GC_malloc_ForObjectPtr = GetSubHash( "_System_GC_malloc_ForObjectPtr",1 ) ) 224 pSub_System_GC_malloc_ForObjectPtr->bUse = 1; 225 226 if( pSub_System_GC_free_for_SweepingDelete = GetSubHash( "_System_GC_free_for_SweepingDelete",1 ) ) 227 pSub_System_GC_free_for_SweepingDelete->bUse = 1; 228 217 229 218 230 … … 345 357 346 358 //add rsp,スタックフレームサイズ 347 op_add 64_value(REG_RSP,pobj_sf->GetFrameSize());359 op_add_RV(REG_RSP,pobj_sf->GetFrameSize()); 348 360 349 361 //xor rax,rax(raxを0に初期化する) -
BasicCompiler64/NumOpe.cpp
r63 r64 14 14 ////////////////////////////////////////////////////// 15 15 16 char *parameter = (char *)malloc( lstrlen( lpszText ) + 3 ); 17 lstrcpy( parameter, lpszText ); 18 SetStringQuotes( parameter ); 19 16 20 extern CClass *pobj_StringClass; 17 int object_size = pobj_StringClass->GetSize(); 18 19 //mov rcx,object_size 20 op_mov_RV(sizeof(_int64),REG_RCX,object_size); 21 22 //call calloc 23 extern SUBINFO *pSub_calloc; 24 op_call(pSub_calloc); 25 26 //mov r11,rax 27 op_mov_RR(REG_R11,REG_RAX); 28 29 //mov qword ptr[rsp+offset],r11 ※スタックフレームを利用 30 pobj_sf->push(REG_R11); 31 32 //mov rcx,rax 33 op_mov_RR(REG_RCX,REG_RAX); 34 35 //call constructor 36 op_call(pobj_StringClass->GetConstructorMethod()->psi); 37 38 // TODO: Ex表記による文字列長に対応する 39 int i2 = dataTable.AddString( lpszText ); 40 41 //mov rax,i2 42 op_mov_RV(sizeof(_int64),REG_RAX,i2); 43 obp-=sizeof(long); 44 pobj_DataTableSchedule->add(); 45 obp+=sizeof(long); 46 47 48 //mov r11,qword ptr[rsp+offset] ※スタックフレームを利用 49 pobj_sf->ref(REG_R11); 50 51 52 RELATIVE_VAR RelativeVar; 53 RelativeVar.bOffsetOffset=0; 54 RelativeVar.offset=0; 55 RelativeVar.dwKind=VAR_DIRECTMEM; 56 57 SetObjectVariableFromRax((LONG_PTR)pobj_StringClass,DEF_PTR_BYTE,-1,&RelativeVar,0); 58 59 //mov r11,qword ptr[rsp+offset] ※スタックフレームを利用 60 pobj_sf->pop(REG_R11); 61 21 TYPEINFO baseTypeInfo = { DEF_OBJECT, (LONG_PTR)pobj_StringClass }; 22 Operator_New( *pobj_StringClass, "", parameter, baseTypeInfo ); 23 24 free( parameter ); 25 26 //mov reg,rax 27 op_mov_RR( reg, REG_RAX ); 62 28 63 29 ///////////////////////////////////////////// … … 65 31 RESTORE_REGISTER_RESOURCE 66 32 }//////////////////////////////////////////// 67 68 //mov reg,r1169 op_mov_RR(reg,REG_R11);70 33 } 71 34 … … 102 65 else{ 103 66 //mov reg,rax 104 op_mov 64_ToReg_FromReg(UseReg,REG_RAX);67 op_mov_RR(UseReg,REG_RAX); 105 68 } 106 69 } … … 117 80 } 118 81 119 if(Command[0]==1&& Command[1]==ESC_NEW){82 if(Command[0]==1&& Command[1]==ESC_NEW ){ 120 83 //New演算子(オブジェクト生成) 121 return Operator_New(Command+2,plpIndex); 84 TYPEINFO baseTypeInfo = { BaseType, lpBaseIndex }; 85 int resultType = Operator_New(Command+2,plpIndex, baseTypeInfo ); 86 87 //mov reg,rax 88 op_mov_RR( *pReg, REG_RAX ); 89 90 return resultType; 122 91 } 123 92 … … 245 214 TYPEINFO BaseTypeInfo = {BaseType,lpBaseIndex}; 246 215 if(IsStringSubsituation(pobj_Class) 247 || IsStringObjectType( &BaseTypeInfo)){216 || IsStringObjectType(BaseTypeInfo)){ 248 217 //要求タイプがオブジェクトであり、Stringの受け入れが可能な場合 249 218 … … 265 234 } 266 235 267 type[sp]=DEF_PTR_ BYTE;236 type[sp]=DEF_PTR_CHAR; 268 237 bLiteralCalculation=0; 269 238 … … 375 344 else pobj_reg->LockReg(); 376 345 377 if(i2==DEF_ OBJECT){378 // Object型が戻ったときはヒープ領域にインスタンスが格納されている346 if(i2==DEF_STRUCT){ 347 //構造体が戻ったときはヒープ領域にインスタンスが格納されている 379 348 //※後にfreeする必要あり 380 349 bUseHeap[sp]=1; … … 469 438 SetXmmReg_SingleVariable(&RelativeVar,XmmReg); 470 439 } 471 else if(IsWholeNumberType(i2) ){440 else if(IsWholeNumberType(i2) || i2==DEF_OBJECT){ 472 441 //整数型 473 442 SetReg_WholeVariable(i2,&RelativeVar,UseReg); 474 443 } 475 else if(i2==DEF_ OBJECT){476 // オブジェクト ポインタをUseRegへ格納444 else if(i2==DEF_STRUCT){ 445 //構造体ポインタをUseRegへ格納(構造体は値型) 477 446 SetVarPtrToReg(UseReg,&RelativeVar); 478 447 } … … 585 554 }//////////////////////////////////////////// 586 555 587 if(type[sp]==DEF_ OBJECT){588 // Object型が戻ったときはヒープ領域にインスタンスが格納されている556 if(type[sp]==DEF_STRUCT){ 557 //構造体が戻ったときはヒープ領域にインスタンスが格納されている 589 558 //※後にfreeする必要あり 590 559 bUseHeap[sp]=1; -
BasicCompiler64/NumOpe_Arithmetic.cpp
r56 r64 108 108 else if(idCalc==CALC_PRODUCT){ 109 109 //mul reg1,reg2 110 op_imul_ reg(sizeof(_int64),reg1,reg2);110 op_imul_RR(sizeof(_int64),reg1,reg2); 111 111 } 112 112 … … 131 131 else if(idCalc==CALC_PRODUCT){ 132 132 //mul reg1,reg2 133 op_imul_ reg(sizeof(long),reg1,reg2);133 op_imul_RR(sizeof(long),reg1,reg2); 134 134 } 135 135 … … 177 177 if(reg2==REG_RAX||reg2==REG_RDX){ 178 178 //mov r15,reg2 179 op_mov 64_ToReg_FromReg(REG_R15,reg2);179 op_mov_RR(REG_R15,reg2); 180 180 181 181 reg2=REG_R15; … … 203 203 204 204 //mov rax,reg1 205 op_mov 64_ToReg_FromReg(REG_RAX,reg1);205 op_mov_RR(REG_RAX,reg1); 206 206 207 207 if(IsSignedType(type[sp-2])){ … … 231 231 232 232 //mov reg1,rdx 233 op_mov 64_ToReg_FromReg(reg1,REG_RDX);233 op_mov_RR(reg1,REG_RDX); 234 234 235 235 } … … 353 353 if(reg2==REG_RAX||reg2==REG_RDX){ 354 354 //mov r15,reg2 355 op_mov 64_ToReg_FromReg(REG_R15,reg2);355 op_mov_RR(REG_R15,reg2); 356 356 357 357 reg2=REG_R15; … … 379 379 380 380 //mov rax,reg1 381 op_mov 64_ToReg_FromReg(REG_RAX,reg1);381 op_mov_RR(REG_RAX,reg1); 382 382 383 383 if(IsSignedType(type[sp-2])){ … … 407 407 408 408 //mov reg1,rax 409 op_mov 64_ToReg_FromReg(reg1,REG_RAX);409 op_mov_RR(reg1,REG_RAX); 410 410 411 411 } … … 495 495 496 496 //imul reg,-1 497 op_imul_ value(sizeof(_int64),reg,-1);497 op_imul_RV(sizeof(_int64),reg,-1); 498 498 499 499 if(reg==REG_R14){ … … 508 508 509 509 //imul reg,-1 510 op_imul_ value(sizeof(long),reg,-1);510 op_imul_RV(sizeof(long),reg,-1); 511 511 512 512 if(reg==REG_R14){ … … 617 617 if(reg1==REG_RCX){ 618 618 //mov r15,rcx 619 op_mov 64_ToReg_FromReg(REG_R15,REG_RCX);619 op_mov_RR(REG_R15,REG_RCX); 620 620 621 621 reg1=REG_R15; … … 629 629 630 630 //mov rcx,reg2 631 op_mov 64_ToReg_FromReg(REG_RCX,reg2);631 op_mov_RR(REG_RCX,reg2); 632 632 633 633 if(idCalc==CALC_SHL){ … … 662 662 if(sw==0){ 663 663 //mov rcx,r15 664 op_mov 64_ToReg_FromReg(REG_RCX,REG_R15);664 op_mov_RR(REG_RCX,REG_R15); 665 665 } 666 666 else{ -
BasicCompiler64/NumOpe_Logical.cpp
r36 r64 112 112 113 113 //add rax, 1 114 op_add 64_value( REG_RAX, 1 );114 op_add_RV( REG_RAX, 1 ); 115 115 116 116 if( reg != REG_RAX ){ -
BasicCompiler64/Opcode.h
r62 r64 125 125 void SetLocalParmSize(int size); 126 126 int GetFrameSize(); 127 int GetNowSp(); 128 void mov_sp( int reg ); 127 129 int push(int reg); 128 130 void push(int xmm_reg,int var_size); … … 130 132 void ref(int reg); 131 133 void ref(int xmm_reg,int var_size); 132 void pop(int reg );134 void pop(int reg = REG_NON); 133 135 void pop(int xmm_reg,int var_size); 134 136 void parameter_allocate(int size); … … 247 249 void SetVariableFromRax(int VarType,int CalcType,RELATIVE_VAR *pRelativeVar); 248 250 void OpcodeCalc(char *Command); 249 void SetRefVariable( const char *varname, const char *expression );250 251 251 252 //NumOpe.cpp … … 285 286 //Compile_Set_Var.cpp 286 287 BOOL IsUse_r11(RELATIVE_VAR *pRelativeVar); 287 void SetObjectVariableFromRax(LONG_PTR lpVarIndex,int CalcType,LONG_PTR lpCalcIndex,RELATIVE_VAR *pRelativeVar,BOOL bUseHeap); 288 void SetDoubleVariable(int type,RELATIVE_VAR *pRelative); 289 void SetSingleVariable(int type,RELATIVE_VAR *pRelative); 288 void SetStructVariableFromRax(LONG_PTR lpVarIndex,int CalcType,LONG_PTR lpCalcIndex,RELATIVE_VAR *pRelativeVar,BOOL bUseHeap); 289 void SetRealVariable(int VarType, int CalcType, RELATIVE_VAR *pRelativeVar); 290 290 void SetBooleanVariable(int type,RELATIVE_VAR *pRelative); 291 291 void SetWholeVariable(int var_size,int type,RELATIVE_VAR *pRelative); … … 307 307 308 308 //Compile_Object.cpp 309 int Operator_New(const char *Parameter,LONG_PTR *plpIndex); 310 void OpcodeDelete(const char *Parameter); 309 void Operator_New( CClass &classObj, const char *objectSizeStr, const char *parameter,const TYPEINFO &baseTypeInfo ); 310 int Operator_New(const char *Parameter,LONG_PTR *plpIndex,const TYPEINFO &baseTypeInfo ); 311 void OpcodeDelete(const char *Parameter, bool isSweeping); 311 312 312 313 //Compile_Var.cpp … … 319 320 #define DIMFLAG_STATIC 0x04 320 321 #define DIMFLAG_CONST 0x08 322 void dim(bool isRef, char *VarName,int *SubScripts,TYPEINFO &TypeInfo,int TypeSize,char *InitBuf,char *ConstractParameter,DWORD dwFlags); 321 323 void OpcodeDim(char *Parameter,DWORD dwFlag); 322 324 void SetVarPtrToReg(int reg,RELATIVE_VAR *pRelativeVar); 323 325 324 326 //CParameter.cpp 327 #define OVERLOAD_MIN_LEVEL 0 328 #define OVERLOAD_MAX_LEVEL 3 329 #define OVERLOAD_LEVEL0 0 325 330 #define OVERLOAD_LEVEL1 1 326 331 #define OVERLOAD_LEVEL2 2 … … 352 357 BOOL ErrorCheck(const char *FuncName,PARAMETER_INFO *ppi,int pi_num,int SecondParmNum); 353 358 void MacroParameterSupport(PARAMETER_INFO *ppi); 354 void Set ObjectParameter(int reg,CClass *pobj_Class,LPSTR Parameter);359 void SetStructParameter(int reg,CClass *pobj_Class,LPSTR Parameter); 355 360 356 361 //一時オブジェクトパラメータの生成と破棄 357 voidNewTempParameters( const char *FuncName,PARAMETER_INFO *ppi,int pi_num,int SecondParmNum );362 int NewTempParameters( const char *FuncName,PARAMETER_INFO *ppi,int pi_num,int SecondParmNum ); 358 363 void DeleteTempParameters(); 359 364 … … 380 385 #define PROCFLAG_NEW 1 381 386 int Opcode_CallProcPtr(char *variable,char *Parameter,PROCPTRINFO *pi,LONG_PTR *plpIndex); 382 void Opcode_CallProc(c har *Parameter,SUBINFO *psi,DWORD dwFlags,char *ObjectName,int RefType);387 void Opcode_CallProc(const char *Parameter,SUBINFO *psi,DWORD dwFlags,char *ObjectName,int RefType); 383 388 int Opcode_CallDllProc(char *Parameter,DECLAREINFO *pdi,LONG_PTR *plpIndex); 384 389 … … 410 415 void OpcodeGosub(char *Parameter); 411 416 void OpcodeReturn(char *Parameter); 412 void Opcode_Input(c har *Parameter);413 void Opcode_Print(c har *Parameter,BOOL bWrite);417 void Opcode_Input(const char *Parameter); 418 void Opcode_Print(const char *Parameter,BOOL bWrite); 414 419 void OpcodeCallPtr(char *Parameter); 415 420 void OpcodeSetPtrData(char *Parameter,int type); … … 450 455 void op_mov64_ToReg (int reg,_int64 i64data); 451 456 void op_mov64_ToReg (int reg,int i32data); 452 void op_mov64_ToReg_FromReg (int reg1,int reg2);453 457 void op_movsxd (int reg64,int reg32); 454 458 void op_movsx64_FromReg16 (int reg64,int reg16); … … 460 464 void op_dec (int reg); 461 465 void op_add_RM (int op_size,int reg,int base_reg,int offset,char mod); 462 void op_add 64_value(int reg,int offset);466 void op_add_RV (int reg,int offset); 463 467 void op_add64_reg (int reg1,int reg2); 464 468 void op_add32_reg (int reg1,int reg2); … … 467 471 void op_sub32_reg (int reg1,int reg2); 468 472 void op_sbb_RR ( int op_size, int reg1, int reg2 ); 469 void op_imul_ reg(int op_size,int reg1,int reg2);470 void op_imul_ value(int op_size,int reg,int i32data);473 void op_imul_RR (int op_size,int reg1,int reg2); 474 void op_imul_RV (int op_size,int reg,int i32data); 471 475 void op_div64_reg (int reg); 472 476 void op_idiv64_reg (int reg); -
BasicCompiler64/OperatorProc.cpp
r63 r64 55 55 if(pBaseTypeInfo){ 56 56 if(pBaseTypeInfo->type==DEF_OBJECT){ 57 bReturnTypeIsObject=1;58 57 ReturnType.u.lpIndex=pBaseTypeInfo->u.lpIndex; 59 58 } … … 113 112 HeapDefaultFree(ppi); 114 113 115 int right_side_size;116 if(type[sp-1]==DEF_OBJECT) right_side_size=PTR_SIZE;117 else right_side_size=GetTypeSize(type[sp-1],index_stack[sp-1]);118 119 114 if(bTwoTerm){ 120 if(psi->p ParmInfo[1].type==DEF_OBJECT&&psi->pParmInfo[1].bByVal){115 if(psi->pRealParmInfo[1].type==DEF_STRUCT&&psi->pRealParmInfo[1].bByVal){ 121 116 //一時オブジェクトはメソッド内で破棄される 122 117 bUseHeap[sp-1]=0; … … 124 119 } 125 120 126 127 if(psi->ReturnType==DEF_OBJECT){ 128 ////////////////////////////////////////////////////// 129 // 戻り値にオブジェクト インスタンスを持つ場合 130 // ※ByRef _System_ReturnObject パラメータ用領域を取得 121 if(psi->ReturnType==DEF_STRUCT){ 122 ////////////////////////////////////////////////////// 123 // 戻り値に構造体インスタンスを持つ場合 124 // ※ByRef _System_ReturnValue パラメータ用領域を取得 131 125 ////////////////////////////////////////////////////// 132 126 … … 154 148 }//////////////////////////////////////////// 155 149 } 156 157 150 158 151 int reg1,reg2; … … 161 154 SetOneTermToReg_Whole64Calc(type[sp-1],®2); 162 155 pobj_reg->UnlockReg(); 156 if( !psi->pRealParmInfo[1].bByVal ){ 157 //一時参照を作成 158 pobj_sf->push( reg2 ); 159 pobj_sf->mov_sp( reg2 ); 160 } 163 161 } 164 162 … … 192 190 193 191 if(bTwoTerm){ 194 if(psi->ReturnType==DEF_ OBJECT){192 if(psi->ReturnType==DEF_STRUCT){ 195 193 //mov r8,reg2 196 194 op_mov_RR(REG_R8,reg2); … … 202 200 } 203 201 204 if(psi->ReturnType==DEF_ OBJECT){202 if(psi->ReturnType==DEF_STRUCT){ 205 203 //mov rdx,r13 206 204 op_mov_RR(REG_RDX,REG_R13); … … 213 211 op_call(psi); 214 212 215 if(psi->ReturnType!= -1){213 if(psi->ReturnType!=DEF_NON){ 216 214 //戻り値を一時的に退避 217 215 … … 254 252 } 255 253 256 if(psi->ReturnType!=-1){ 254 if(bTwoTerm){ 255 if( !psi->pRealParmInfo[1].bByVal ){ 256 //一時参照を破棄 257 pobj_sf->pop(); 258 } 259 } 260 261 if(psi->ReturnType!=DEF_NON){ 257 262 //戻り値をreg1にセット 258 263 reg1=pobj_reg->LockReg(); … … 266 271 index_stack[sp-1]=psi->u.ReturnIndex; 267 272 268 if(psi->ReturnType==DEF_ OBJECT){269 // Object型が戻ったときはヒープ領域にインスタンスが格納されている273 if(psi->ReturnType==DEF_STRUCT){ 274 //構造体が戻ったときはヒープ領域にインスタンスが格納されている 270 275 //※後にfreeする必要あり 271 276 bUseHeap[sp-1]=1; -
BasicCompiler64/WatchList.cpp
r63 r64 78 78 if(PTR_LEVEL(*pType)){ 79 79 *pType=MAKE_PTR_TYPE(NATURAL_TYPE(*pType),PTR_LEVEL(*pType)-1); 80 if((*pType)==DEF_OBJECT){ 81 CClass *pClass = (CClass *)lpIndex; 82 array_num *= pClass->GetSize(); 83 } 84 else{ 85 array_num *= GetTypeSize(*pType,-1); 86 } 80 array_num *= GetTypeSize(*pType,-1); 87 81 } 88 82 else{ … … 114 108 char lpPtrOffset[VN_SIZE]; //第2次配列 115 109 char NestMember[VN_SIZE]; //入れ子メンバ 116 int RefType; //"."参照のときは0、"->"参照のときは1110 CClass::RefType refType; 117 111 lstrcpy(VarName,member); 118 if(!GetVarFormatString(VarName,array,lpPtrOffset,NestMember, &RefType)) return 0;112 if(!GetVarFormatString(VarName,array,lpPtrOffset,NestMember, refType ) ) return 0; 119 113 120 114 … … 175 169 //入れ子構造の場合 176 170 177 if(*pType==DEF_OBJECT){ 178 if(RefType!=DEF_OBJECT) return 0; 179 } 180 else if(*pType==DEF_PTR_OBJECT){ 171 if(*pType==DEF_OBJECT || *pType==DEF_STRUCT){ 172 if( refType != CClass::Dot ) return 0; 173 174 if( *pType==DEF_OBJECT ){ 175 extern HANDLE hDebugProcess; 176 LONG_PTR lpData; 177 SIZE_T stAccBytes; 178 lpData=Debugging_GetVarPtr(pRelativeVar); 179 if(!ReadProcessMemory(hDebugProcess,(void *)lpData,&pRelativeVar->offset,sizeof(LONG_PTR),&stAccBytes)) return -1; 180 pRelativeVar->dwKind=VAR_DIRECTMEM; 181 } 182 } 183 else if(*pType==DEF_PTR_OBJECT || *pType==DEF_PTR_STRUCT){ 181 184 //構造体ポインタ型メンバ変数 182 185 183 186 if(lpPtrOffset[0]){ 184 if( RefType!=DEF_OBJECT) return 0;187 if( refType != CClass::Dot ) return 0; 185 188 186 189 //直接参照に切り替え … … 190 193 } 191 194 else{ 192 if( RefType!=DEF_PTR_OBJECT) return 0;195 if( refType != CClass::Pointer ) return 0; 193 196 194 197 extern HANDLE hDebugProcess; … … 320 323 int Debugging_GetVarOffset(char *variable,int *pType,RELATIVE_VAR *pRelativeVar,LONG_PTR *plpIndex,int *pss){ 321 324 extern HANDLE hDebugProcess; 322 int i,i2,i3 ,RefType;325 int i,i2,i3; 323 326 char member[VN_SIZE],VarName[VN_SIZE],array[VN_SIZE],lpPtrOffset[VN_SIZE]; 324 327 LONG_PTR lpData; … … 326 329 327 330 lstrcpy(VarName,variable); 328 GetVarFormatString(VarName,array,lpPtrOffset,member,&RefType); 331 CClass::RefType refType; 332 GetVarFormatString(VarName,array,lpPtrOffset,member,refType); 329 333 330 334 LONG_PTR lpIndex; … … 474 478 } 475 479 if(member[0]){ 476 if(*pType==DEF_OBJECT ){480 if(*pType==DEF_OBJECT || *pType==DEF_STRUCT){ 477 481 //実態オブジェクトのメンバを参照(obj.member) 478 if( RefType!=DEF_OBJECT){482 if( refType != CClass::Dot ){ 479 483 return 0; 480 484 } … … 493 497 *plpIndex=lp2; 494 498 } 495 else if(*pType==DEF_PTR_OBJECT ){499 else if(*pType==DEF_PTR_OBJECT || *pType==DEF_PTR_STRUCT){ 496 500 //ポインタオブジェクトが示すメンバを参照 497 501 if(lpPtrOffset[0]){ 498 502 //pObj[n].member 499 if( RefType!=DEF_OBJECT) return 0;503 if( refType != CClass::Dot ) return 0; 500 504 Debugging_SetRelativeOffset(pType,lpIndex,pRelativeVar,lpPtrOffset); 501 505 … … 515 519 else{ 516 520 //pObj->member 517 if( RefType!=DEF_PTR_OBJECT) return 0;521 if( refType != CClass::Pointer ) return 0; 518 522 519 523 pRelativeVar->offset=Debugging_GetVarPtr(pRelativeVar); -
BasicCompiler64/amd64_main.cpp
r36 r64 424 424 425 425 void op_mov_RR(int reg1,int reg2){ 426 op_mov64_ToReg_FromReg(reg1,reg2); 426 //mov reg1,reg2 427 char RexByte=-1; 428 429 if(reg1==reg2) return; 430 431 if(REG_RAX<=reg1&®1<=REG_RDI){ 432 if(REG_RAX<=reg2&®2<=REG_RDI) RexByte=(char)0x48; 433 if(REG_R8<=reg2&®2<=REG_R15) RexByte=(char)0x49; 434 } 435 if(REG_R8<=reg1&®1<=REG_R15){ 436 if(REG_RAX<=reg2&®2<=REG_RDI) RexByte=(char)0x4C; 437 if(REG_R8<=reg2&®2<=REG_R15) RexByte=(char)0x4D; 438 } 439 440 if(RexByte==-1) SetError(300,NULL,cp); 441 442 // [8bit rex] 1000 1011 11xx xbbb 443 OpBuffer[obp++]=RexByte; 444 OpBuffer[obp++]=(char)0x8B; 445 OpBuffer[obp++]=(char)(0xC0| REGISTER_OPERAND(reg1)<<3 | REGISTER_OPERAND(reg2)); 427 446 } 428 447 … … 475 494 } 476 495 } 477 void op_mov64_ToReg_FromReg(int reg1,int reg2){478 //mov reg1,reg2479 char RexByte=-1;480 481 if(reg1==reg2) return;482 483 if(REG_RAX<=reg1&®1<=REG_RDI){484 if(REG_RAX<=reg2&®2<=REG_RDI) RexByte=(char)0x48;485 if(REG_R8<=reg2&®2<=REG_R15) RexByte=(char)0x49;486 }487 if(REG_R8<=reg1&®1<=REG_R15){488 if(REG_RAX<=reg2&®2<=REG_RDI) RexByte=(char)0x4C;489 if(REG_R8<=reg2&®2<=REG_R15) RexByte=(char)0x4D;490 }491 492 if(RexByte==-1) SetError(300,NULL,cp);493 494 // [8bit rex] 1000 1011 11xx xbbb495 OpBuffer[obp++]=RexByte;496 OpBuffer[obp++]=(char)0x8B;497 OpBuffer[obp++]=(char)(0xC0| REGISTER_OPERAND(reg1)<<3 | REGISTER_OPERAND(reg2));498 }499 496 void op_movsxd(int reg64,int reg32){ 500 497 //movsxd reg64,reg32 … … 686 683 } 687 684 688 void op_add 64_value(int reg,int offset){685 void op_add_RV(int reg,int offset){ 689 686 //add reg,offset 690 687 char RexByte=-1; … … 843 840 //////////////////////// 844 841 845 void op_imul_ reg(int op_size,int reg1,int reg2){842 void op_imul_RR(int op_size,int reg1,int reg2){ 846 843 //imul reg1,reg2 847 844 char RexByte=-1; … … 881 878 OpBuffer[obp++]=(char)(0xC0| REGISTER_OPERAND(reg1)<<3 | REGISTER_OPERAND(reg2)); 882 879 } 883 void op_imul_ value(int op_size,int reg,int i32data){880 void op_imul_RV(int op_size,int reg,int i32data){ 884 881 //imul reg,i32data 885 882 char RexByte=-1; -
BasicCompiler64/stack_frame.cpp
r20 r64 38 38 } 39 39 return -(answer_sp-0x08); 40 } 41 int CStackFrame::GetNowSp(){ 42 return now_sp; 43 } 44 void CStackFrame::mov_sp( int reg ){ 45 //mov reg,rsp 46 op_mov_RR( reg, REG_RSP ); 47 48 //add reg,now_sp 49 op_add_RV( reg, now_sp ); 50 51 //スケジュールをセット 52 obp-=sizeof(long); 53 add(); 54 obp+=sizeof(long); 40 55 } 41 56 int CStackFrame::push(int reg){ -
BasicCompiler64/varlist.cpp
r63 r64 22 22 _int64 i64data; 23 23 24 if(type==DEF_OBJECT){ 24 if(type==DEF_OBJECT||type==DEF_STRUCT){ 25 if( type==DEF_OBJECT ){ 26 // 参照型ということを考慮する 27 ReadProcessMemory(hDebugProcess,(void *)offset,&pData,sizeof(void *),&stAccBytes); 28 offset = pData; 29 } 30 25 31 sprintf(lptv->item.pszText,"%s %s(&H%X)",VarName,STRING_OBJECT,(DWORD64)offset); 26 32 lptv->item.iImage=1; … … 31 37 return; 32 38 } 33 if(type==DEF_PTR_OBJECT ){39 if(type==DEF_PTR_OBJECT||type==DEF_PTR_STRUCT){ 34 40 i2=ReadProcessMemory(hDebugProcess,(void *)offset,&pData,sizeof(void *),&stAccBytes); 35 41 … … 43 49 } 44 50 else{ 45 if(type==DEF_PTR_ BYTE){51 if(type==DEF_PTR_CHAR||type==MAKE_PTR_TYPE(DEF_BYTE,1)){ 46 52 if(ReadProcessMemory(hDebugProcess,(void *)offset,&pData,sizeof(void *),&stAccBytes)){ 47 53 for(i2=0;;i2++){ -
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){ -
ProjectEditor/WindowControl.cpp
r3 r64 943 943 } 944 944 else if(pMenuInfo[i2].type==MFT_SEPARATOR){ 945 sprintf(Command+i,"InsMenu %s,0,MF_BYPOSITION \r\n",945 sprintf(Command+i,"InsMenu %s,0,MF_BYPOSITION,\"\"\r\n", 946 946 MenuHandle); 947 947 i+=lstrlen(Command+i);
Note:
See TracChangeset
for help on using the changeset viewer.