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