Changeset 64 in dev for BasicCompiler64/NumOpe.cpp
- Timestamp:
- Mar 8, 2007, 2:49:34 AM (18 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
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;
Note:
See TracChangeset
for help on using the changeset viewer.