Changeset 370 in dev for trunk/abdev/BasicCompiler64
- Timestamp:
- Nov 15, 2007, 3:18:41 AM (17 years ago)
- Location:
- trunk/abdev/BasicCompiler64
- Files:
-
- 9 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/abdev/BasicCompiler64/CodeGenerator.cpp
r357 r370 1733 1733 pNativeCode->PutUserProcSchedule( pUserProc, false ); 1734 1734 } 1735 void CodeGenerator::op_mov_RV_com_vtbl( int reg, const CClass *pClass ) 1736 { 1737 // mov reg,com_vtblAddress 1738 1739 //オペコード、レジスタ 1740 pNativeCode->Put( (char)(0xB8|REGISTER_OPERAND(reg)) ); 1741 1742 //DISP32 1743 pNativeCode->PutComVtblSchedule( pClass ); 1744 } 1735 1745 void CodeGenerator::op_mov_RV_vtbl( int reg, const CClass *pClass ) 1736 1746 { -
trunk/abdev/BasicCompiler64/Compile_Calc.cpp
r331 r370 208 208 //変数アドレスを取得 209 209 RELATIVE_VAR VarRelativeVar; 210 if(!GetVarOffsetReadWrite(210 bool result = GetVarOffsetReadWrite( 211 211 variable, 212 212 &VarRelativeVar, 213 varType) ) return;213 varType); 214 214 215 215 //レジスタのブロッキングを解除 216 216 pobj_BlockReg->clear(); 217 218 if( !result ) 219 { 220 return; 221 } 217 222 218 223 if(varType.GetBasicType()&FLAG_PTR){ -
trunk/abdev/BasicCompiler64/Compile_CallProc.cpp
r350 r370 359 359 if( pobj_c->IsInterface() ) 360 360 { 361 // インターフェイス メソッド呼び出し361 // インターフェイス メソッド呼び出し 362 362 363 363 int offset_vtbl = compiler.GetObjectModule().meta.GetClasses().GetInterfaceInfoClassPtr()->GetMemberOffset( "__vtbl" ); … … 380 380 } 381 381 } 382 else if( pobj_c->IsComInterface() ) 383 { 384 // COMインターフェイス メソッド呼び出し 385 386 //仮想関数(オブジェクトメソッド)呼び出し 387 // pObj -> vtbl1 -> func1 388 // -> func2 389 // -> func3 390 391 int vtblMasterListIndex; 392 pobj_c->GetVtblMasterListIndexAndVtblIndex( pUserProc, vtblMasterListIndex, vtblIndex ); 393 394 // vtblのポインタを取得 395 //mov r11,qword ptr[rcx] 396 compiler.codeGenerator.op_mov_RM(sizeof(_int64),REG_R11,REG_RCX,0,MOD_BASE); } 382 397 else 383 398 { … … 394 409 395 410 // vtblマスターリストのポインタを取得 396 //mov r11,qword ptr[rcx ]397 compiler.codeGenerator.op_mov_RM(sizeof(_int64),REG_R11,REG_RCX, 0,MOD_BASE);411 //mov r11,qword ptr[rcx+sizeof(com_vtbl)] 412 compiler.codeGenerator.op_mov_RM(sizeof(_int64),REG_R11,REG_RCX,PTR_SIZE,MOD_BASE_DISP8); 398 413 399 414 // vtblのポインタを取得 -
trunk/abdev/BasicCompiler64/Compile_Func.cpp
r359 r370 144 144 } 145 145 } 146 else if( pobj_c->IsComInterface() ) 147 { 148 //仮想関数(オブジェクトメソッド) 149 // pObj -> vtbl1 -> func1 150 // -> func2 151 // -> func3 152 153 int vtblMasterListIndex; 154 pobj_c->GetVtblMasterListIndexAndVtblIndex( &userProc, vtblMasterListIndex, vtblIndex ); 155 156 // vtblのポインタを取得 157 //mov r11,qword ptr[rcx] 158 compiler.codeGenerator.op_mov_RM(sizeof(_int64),REG_R11,REG_RCX,0,MOD_BASE); 159 } 146 160 else 147 161 { … … 158 172 159 173 // vtblマスターリストのポインタを取得 160 //mov r11,qword ptr[rcx ]161 compiler.codeGenerator.op_mov_RM(sizeof(_int64),REG_R11,REG_RCX, 0,MOD_BASE);174 //mov r11,qword ptr[rcx+sizeof(com_vtbl)] 175 compiler.codeGenerator.op_mov_RM(sizeof(_int64),REG_R11,REG_RCX,PTR_SIZE,MOD_BASE_DISP8); 162 176 163 177 // vtblのポインタを取得 -
trunk/abdev/BasicCompiler64/Compile_Object.cpp
r355 r370 212 212 && !pClass->IsAbstract() ) 213 213 { 214 // mov rcx,com_vtbl 215 compiler.codeGenerator.op_mov_RV_com_vtbl( REG_RCX, pClass ); 216 217 //mov qword ptr[rax],rcx 218 compiler.codeGenerator.op_mov_MR(sizeof(_int64),REG_RCX,REG_RAX,0,MOD_BASE); 219 214 220 // mov rcx,vtblAddress 215 221 compiler.codeGenerator.op_mov_RV_vtbl( REG_RCX, pClass ); 216 222 217 //mov qword ptr[rax ],rcx218 compiler.codeGenerator.op_mov_MR(sizeof(_int64),REG_RCX,REG_RAX, 0,MOD_BASE);223 //mov qword ptr[rax+sizeof(com_vtbl)],rcx 224 compiler.codeGenerator.op_mov_MR(sizeof(_int64),REG_RCX,REG_RAX,PTR_SIZE,MOD_BASE_DISP8); 219 225 220 226 -
trunk/abdev/BasicCompiler64/Compile_ProcOp.cpp
r366 r370 189 189 char temporary[1024]; 190 190 sprintf( temporary, 191 "Return New %s(ObjPtr( This ),Get_LONG_PTR( (Get_LONG_PTR( ObjPtr(This) ) + SizeOf(LONG_PTR)*%d) As VoidPtr ) As VoidPtr )",191 "Return New %s(ObjPtr( This ),Get_LONG_PTR( (Get_LONG_PTR( ObjPtr(This)+SizeOf(VoidPtr) ) + SizeOf(LONG_PTR)*%d) As VoidPtr ) As VoidPtr )", 192 192 userProc.ReturnType().GetClass().GetName().c_str(), 193 193 vtblMasterListIndex -
trunk/abdev/BasicCompiler64/Compile_Statement.cpp
r345 r370 96 96 pobj_reg=new CRegister(REG_RAX); 97 97 98 if( strstr(leftTerm,"赤")) 99 { 100 int test=0; 101 } 102 98 103 Type resultType; 99 104 bool isLiteral; … … 116 121 FreeTempObject(REG_R14,&resultType.GetClass()); 117 122 } 118 119 //成功 120 return; 121 } 122 123 // 失敗 124 SetError(1, NULL,cp); 123 } 125 124 } 126 125 -
trunk/abdev/BasicCompiler64/Compile_Var.cpp
r350 r370 1228 1228 //New呼び出し 1229 1229 if( type.IsObject() 1230 && !type.IsInterface() 1230 && !type.IsInterface() && !type.IsComInterface() 1231 1231 &&(dwFlags&DIMFLAG_NONCALL_CONSTRACTOR)==0 1232 1232 &&InitBuf[0]=='\0') -
trunk/abdev/BasicCompiler64/NumOpe.cpp
r368 r370 291 291 } 292 292 293 SetError(); 294 293 295 return false; 294 296 } … … 344 346 if( !leftType.HasMember() ){ 345 347 // メンバを持たない型の場合 348 if( isProcedureCallOnly ) 349 { 350 SetError(1,NULL,cp); 351 } 346 352 return false; 347 353 } … … 580 586 } 581 587 588 if( isProcedureCallOnly ) 589 { 590 SetError(3, termLeft, cp ); 591 } 582 592 583 593 return false;
Note:
See TracChangeset
for help on using the changeset viewer.