Changeset 332 in dev for trunk/abdev/BasicCompiler32/Compile_Func.cpp
- Timestamp:
- Sep 27, 2007, 3:37:06 AM (17 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/abdev/BasicCompiler32/Compile_Func.cpp
r331 r332 221 221 compiler.codeGenerator.op_mov_RV( REG_EAX, typeSize ); 222 222 } 223 void Opcode_Func_AddressOf( const char *name, const Type &baseType ){ 224 extern int cp; 225 const UserProc *pUserProc; 226 227 if( baseType.IsProcPtr() ) 228 { 229 //左辺の型にのっとり、オーバーロードを解決 230 231 std::vector<const UserProc *> subs; 232 GetOverloadSubHash( name, subs ); 233 if( subs.size() == 0 ){ 234 SetError(27,name,cp); 235 return; 236 } 237 238 //オーバーロードを解決 239 pUserProc=OverloadSolution(name,subs,compiler.GetObjectModule().meta.GetProcPointers()[baseType.GetIndex()]->Params(), Type() ); 240 241 if(!pUserProc){ 242 SetError(27,name,cp); 243 return; 244 } 245 } 246 else{ 247 pUserProc=GetSubHash(name); 248 if(!pUserProc){ 249 SetError(27,name,cp); 250 return; 251 } 252 } 253 254 if( pUserProc->IsVirtual() ){ 223 224 void _Opcode_Func_AddressOf( const char *methodInstanceName, const UserProc &userProc ) 225 { 226 if( userProc.IsVirtual() ){ 255 227 /////////////////////////////// 256 228 // 仮想関数の場合 … … 262 234 char ObjectName[VN_SIZE]; 263 235 ReferenceKind referenceKind; 264 SplitObjectName( name,ObjectName, referenceKind );236 SplitObjectName( methodInstanceName, ObjectName, referenceKind ); 265 237 266 238 if(ObjectName[0]){ … … 305 277 compiler.codeGenerator.op_mov_RM( sizeof(long), REG_EDX, REG_ECX, 0, MOD_BASE ); 306 278 307 int i2 = pobj_c->GetFuncNumInVtbl( pUserProc );279 int i2 = pobj_c->GetFuncNumInVtbl( &userProc ); 308 280 309 281 //mov eax,dword ptr[edx+func_index] … … 319 291 320 292 //mov eax,ProcAddr 321 compiler.codeGenerator.op_addressof( REG_EAX, pUserProc ); 322 } 323 324 pUserProc->Using(); 293 compiler.codeGenerator.op_addressof( REG_EAX, &userProc ); 294 } 295 296 userProc.Using(); 297 } 298 void Opcode_CreateSimpleDelegate( const char *methodInstanceName, const UserProc &userProc ) 299 { 300 ///////////////////////////////////////////////////////////////// 301 // 関数ポインタをpush 302 ///////////////////////////////////////////////////////////////// 303 304 //push AddressOf(userProc) 305 _Opcode_Func_AddressOf( methodInstanceName, userProc ); 306 compiler.codeGenerator.op_push( REG_EAX ); 307 308 309 ///////////////////////////////////////////////////////////////// 310 // オブジェクト ポインタをpush 311 ///////////////////////////////////////////////////////////////// 312 313 // オブジェクト名を取得 314 char objectName[VN_SIZE]; 315 char memberName[VN_SIZE]; 316 char *thisPtrName = "This"; 317 Type type; 318 if( SplitMemberName( methodInstanceName, objectName, memberName ) ) 319 { 320 if( GetVarType( objectName, type, false ) ) 321 { 322 thisPtrName = objectName; 323 } 324 } 325 326 // オブジェクト ポインタを取得 327 RELATIVE_VAR relativeVar; 328 GetVarOffsetReadOnly( thisPtrName, &relativeVar, type ); 329 if( !type.IsObject() ) 330 { 331 extern int cp; 332 SetError(1,NULL,cp); 333 return; 334 } 335 336 SetVarPtrToEax( &relativeVar ); 337 338 //mov eax,dword ptr[eax] 339 compiler.codeGenerator.op_mov_RM( sizeof(long), REG_EAX, REG_EAX, 0, MOD_BASE ); 340 341 //push this 342 compiler.codeGenerator.op_push( REG_EAX ); 343 344 345 ///////////////////////////////////////////////////////////////// 346 // call _System_CreateSimpleDynamicDelegate 347 ///////////////////////////////////////////////////////////////// 348 349 // call _System_CreateSimpleDynamicDelegate 350 extern const UserProc *pSub_System_CreateSimpleDynamicDelegate; 351 compiler.codeGenerator.op_call( pSub_System_CreateSimpleDynamicDelegate ); 352 } 353 void Opcode_Func_AddressOf( const char *name, const Type &baseType, bool isCallOn, Type &resultType ){ 354 extern int cp; 355 const UserProc *pUserProc; 356 357 const Parameters *pBaseParams = NULL; 358 bool isDelegate = false; 359 if( baseType.IsProcPtr() ) 360 { 361 // 左辺で関数ポインタを要求されているとき 362 pBaseParams = &compiler.GetObjectModule().meta.GetProcPointers()[baseType.GetIndex()]->Params(); 363 } 364 else if( baseType.IsObject() && baseType.GetClass().GetName() == "_SimpleDelegate" ) 365 { 366 extern const Delegate *pConstructingDelegate; 367 if( !pConstructingDelegate ) 368 { 369 SetError(); 370 } 371 // 左辺でデリゲートを要求されているとき 372 pBaseParams = &pConstructingDelegate->Params(); 373 374 isDelegate = true; 375 } 376 377 if( pBaseParams ) 378 { 379 //左辺の型にのっとり、オーバーロードを解決 380 381 std::vector<const UserProc *> subs; 382 GetOverloadSubHash( name, subs ); 383 if( subs.size() == 0 ){ 384 SetError(27,name,cp); 385 return; 386 } 387 388 //オーバーロードを解決 389 pUserProc=OverloadSolution( name, subs, *pBaseParams, Type() ); 390 391 if(!pUserProc){ 392 SetError(27,name,cp); 393 return; 394 } 395 } 396 else{ 397 pUserProc=GetSubHash(name); 398 if(!pUserProc){ 399 SetError(27,name,cp); 400 return; 401 } 402 } 403 404 if( isDelegate ) 405 { 406 if( isCallOn ) 407 { 408 // デリゲートのとき 409 Opcode_CreateSimpleDelegate( name, *pUserProc ); 410 } 411 resultType = baseType; 412 } 413 else 414 { 415 if( isCallOn ) 416 { 417 // 関数ポインタのとき 418 _Opcode_Func_AddressOf( name, *pUserProc ); 419 } 420 resultType.SetBasicType( DEF_PTR_VOID ); 421 } 325 422 } 326 423 void Opcode_Func_SizeOf( const string &typeName ){ … … 493 590 break; 494 591 case FUNC_ADDRESSOF: 495 if( isCallOn ) Opcode_Func_AddressOf( Parameter, baseType ); 496 resultType.SetBasicType( DEF_PTR_VOID ); 592 Opcode_Func_AddressOf( Parameter, baseType, isCallOn, resultType ); 497 593 break; 498 594 case FUNC_SIZEOF:
Note:
See TracChangeset
for help on using the changeset viewer.