Changeset 355 in dev for trunk/abdev/BasicCompiler32
- Timestamp:
- Nov 2, 2007, 2:53:56 AM (17 years ago)
- Location:
- trunk/abdev/BasicCompiler32
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/abdev/BasicCompiler32/Compile_Calc.cpp
r331 r355 573 573 } 574 574 575 576 575 //NumOpe...(スタックに答えが格納される) 577 576 BOOL bCalcUseHeap; -
trunk/abdev/BasicCompiler32/Compile_Object.cpp
r354 r355 57 57 { 58 58 // 動的型情報をセットする 59 // obj._System_SetType( _System_TypeBase .Search( strNamespace, name ) )59 // obj._System_SetType( _System_TypeBase_Search( fullName ) ) 60 60 subs.clear(); 61 61 pobj_c->GetDynamicMethods().Enum( "_System_SetType", subs ); 62 62 if( subs.size() == 1 ){ 63 63 char temporary[VN_SIZE]; 64 sprintf( temporary, "_System_TypeBase_Search(\" \",\"%s\"))", pobj_c->GetName().c_str() );64 sprintf( temporary, "_System_TypeBase_Search(\"%s\"))", pobj_c->GetFullName().c_str() ); 65 65 66 66 Opcode_CallProc(temporary, -
trunk/abdev/BasicCompiler32/Compile_ProcOp.cpp
r350 r355 219 219 220 220 compiler.GetObjectModule().meta.GetClasses().Compile_System_InitializeUserTypes(); 221 } 222 else if( userProc.GetName() == "InitializeUserTypesForBaseType" 223 && userProc.HasParentClass() 224 && userProc.GetParentClass().GetName() == "_System_TypeBase" ) 225 { 226 compiler.GetObjectModule().meta.GetClasses().Compile_System_InitializeUserTypesForBaseType(); 221 227 } 222 228 else if( userProc.GetName() == "RegisterGlobalRoots" -
trunk/abdev/BasicCompiler32/MakePeHdr.cpp
r342 r355 42 42 *pSub_System_GC_free_for_SweepingDelete, 43 43 *pSubStaticMethod_System_TypeBase_InitializeUserTypes, 44 *pSubStaticMethod_System_TypeBase_InitializeUserTypesForBaseType, 44 45 45 46 *pSub_allrem, … … 282 283 pSubStaticMethod_System_TypeBase_InitializeUserTypes->Using(); 283 284 pSubStaticMethod_System_TypeBase_InitializeUserTypes->ThisIsAutoGenerationProc(); 285 } 286 287 if( pSubStaticMethod_System_TypeBase_InitializeUserTypesForBaseType = GetSubHash( "ActiveBasic.Core._System_TypeBase.InitializeUserTypesForBaseType",1 ) ){ 288 pSubStaticMethod_System_TypeBase_InitializeUserTypesForBaseType->Using(); 289 pSubStaticMethod_System_TypeBase_InitializeUserTypesForBaseType->ThisIsAutoGenerationProc(); 284 290 } 285 291 … … 1069 1075 } 1070 1076 1077 compiler.linker.SetDataTable( compiler.GetObjectModule().dataTable ); 1071 1078 1072 1079 compiler.linker.SetImageBase( ImageBase ); … … 1076 1083 compiler.linker.ResolveGlobalVarSchedules( MemPos_RWSection ); 1077 1084 compiler.linker.ResolveVtblSchedule( MemPos_DataSection ); 1085 compiler.linker.ResolveTypeInfoSchedule( MemPos_DataSection ); 1078 1086 1079 1087 … … 1543 1551 if(bUse_DataSection){ 1544 1552 //データ テーブル 1545 WriteFile(hFile,compiler.GetObjectModule().dataTable.GetPtr(),compiler.GetObjectModule().dataTable.GetSize(),(DWORD *)&i2,NULL); 1553 WriteFile( 1554 hFile, 1555 compiler.linker.GetDataTable().GetPtr(), 1556 compiler.linker.GetDataTable().GetSize(), 1557 (DWORD *)&i2, 1558 NULL 1559 ); 1546 1560 i+=i2; 1547 1561 } -
trunk/abdev/BasicCompiler32/NumOpe.cpp
r350 r355 604 604 // リテラル配列の場合 605 605 606 if( !baseType.IsPointer() ){ 607 SetError(1,NULL,cp); 606 int dataTableOffset; 607 if( !compiler.GetObjectModule().dataTable.MakeLiteralArrayBuffer( expression, baseType, dataTableOffset ) ) 608 { 608 609 return false; 609 610 } 610 Type tempBaseType( baseType );611 tempBaseType.PtrLevelDown();612 613 char *buffer = (char *)malloc( lstrlen( expression ) + 1 );614 lstrcpy( buffer, expression );615 RemoveStringBracket( buffer );616 617 void *binary = malloc( 1 );618 int num = 0;619 620 i = 0;621 while( buffer[i] ){622 i = GetOneParameter( buffer, i, temporary );623 if( buffer[i] == ',' ){624 i++;625 }626 627 Type resultType;628 _int64 i64data;629 if( !StaticCalculation( true, temporary, tempBaseType.GetBasicType(), &i64data, resultType ) ){630 return false;631 }632 if( !resultType.IsWhole() ){633 // TODO: 実数に未対応634 SetError();635 return false;636 }637 638 binary = realloc( binary, ( num + 1 ) * tempBaseType.GetSize() );639 memcpy( (char *)binary + (num * tempBaseType.GetSize()), &i64data, tempBaseType.GetSize() );640 num++;641 }642 643 i2 = compiler.GetObjectModule().dataTable.AddBinary( binary, num * tempBaseType.GetSize() );644 611 645 612 //mov eax,i2 646 compiler.codeGenerator.op_mov_RV(REG_EAX,i2, Schedule::DataTable ); 647 648 free( buffer ); 613 compiler.codeGenerator.op_mov_RV(REG_EAX,dataTableOffset, Schedule::DataTable ); 649 614 650 615 resultType = baseType; … … 657 622 658 623 bool isLiteralCalculation; 659 if( !NumOpe_GetType( expression, baseType, resultType, &isLiteralCalculation ) )624 if( NumOpe_GetType( expression, baseType, resultType, &isLiteralCalculation ) ) 660 625 { 661 return false; 662 } 663 if( isLiteralCalculation ) 626 if( isLiteralCalculation ) 627 { 628 //右辺値が数値の定数式の場合 629 _int64 i64data; 630 StaticCalculation(true, expression,baseType.GetBasicType(),&i64data,resultType); 631 632 if( resultType.GetBasicSize() == sizeof(_int64) ){ 633 //64ビット(符号有り整数/実数) 634 635 //push HILONG(i64data) 636 compiler.codeGenerator.op_push_V((long)*(long *)(((char *)(&i64data))+4)); 637 638 //push LOLONG(i64data) 639 compiler.codeGenerator.op_push_V(*(long *)(&i64data)); 640 } 641 else if( resultType.IsSingle() ){ 642 //single実数 643 644 double dbl; 645 memcpy(&dbl,&i64data,sizeof(_int64)); 646 647 float flt; 648 flt=(float)dbl; 649 long l; 650 memcpy(&l,&flt,sizeof(long)); 651 652 //push flt 653 compiler.codeGenerator.op_push_V(l); 654 } 655 else{ 656 //整数(符号有り/無し) 657 658 long l = (long)i64data; 659 660 if(resultType.GetBasicSize()==sizeof(char)) l = l & 0x000000FF; 661 if(resultType.GetBasicSize()==sizeof(short)) l = l & 0x0000FFFF; 662 663 //push term 664 compiler.codeGenerator.op_push_V(l); 665 } 666 return true; 667 } 668 } 669 670 if(expression[0]==1 ) 664 671 { 665 //右辺値が数値の定数式の場合 666 _int64 i64data; 667 StaticCalculation(true, expression,baseType.GetBasicType(),&i64data,resultType); 668 669 if( resultType.GetBasicSize() == sizeof(_int64) ){ 670 //64ビット(符号有り整数/実数) 671 672 //push HILONG(i64data) 673 compiler.codeGenerator.op_push_V((long)*(long *)(((char *)(&i64data))+4)); 674 675 //push LOLONG(i64data) 676 compiler.codeGenerator.op_push_V(*(long *)(&i64data)); 677 } 678 else if( resultType.IsSingle() ){ 679 //single実数 680 681 double dbl; 682 memcpy(&dbl,&i64data,sizeof(_int64)); 683 684 float flt; 685 flt=(float)dbl; 686 long l; 687 memcpy(&l,&flt,sizeof(long)); 688 689 //push flt 690 compiler.codeGenerator.op_push_V(l); 691 } 692 else{ 693 //整数(符号有り/無し) 694 695 long l = (long)i64data; 696 697 if(resultType.GetBasicSize()==sizeof(char)) l = l & 0x000000FF; 698 if(resultType.GetBasicSize()==sizeof(short)) l = l & 0x0000FFFF; 699 700 //push term 701 compiler.codeGenerator.op_push_V(l); 702 } 703 return true; 704 } 705 706 if(expression[0]==1&& expression[1]==ESC_NEW ){ 707 //New演算子(オブジェクト生成) 708 709 if( !Operator_New( expression+2, baseType, resultType ) ){ 710 return false; 711 } 712 713 return true; 672 if( expression[1]==ESC_NEW ){ 673 //New演算子(オブジェクト生成) 674 675 if( !Operator_New( expression+2, baseType, resultType ) ){ 676 return false; 677 } 678 679 return true; 680 } 681 else if( expression[1] == ESC_SYSTEM_STATIC_NEW ) 682 { 683 // 静的領域にオブジェクトを作る 684 685 // 静的領域にオブジェクトを生成 686 int dataTableOffset; 687 if( !compiler.GetObjectModule().dataTable.MakeConstObjectToProcessStaticBuffer( expression + 2, resultType, dataTableOffset ) ) 688 { 689 return false; 690 } 691 692 // push value 693 compiler.codeGenerator.op_push_V( dataTableOffset, Schedule::DataTable ); 694 695 return true; 696 } 714 697 } 715 698 … … 736 719 //リテラル値のみの計算かどうかを判別するためのフラグ 737 720 BOOL bLiteralCalculation=1; 738 739 //リテラル演算の場合を考慮した演算前の再配置スケジュール740 CReloc *pobj_BackReloc;741 pobj_BackReloc=new CReloc();742 pobj_BackReloc->copy(pobj_Reloc);743 721 744 722 double dbl; … … 819 797 || term[0] == '\"' ) 820 798 { 821 if( !baseType.IsPointer() )822 {823 //要求タイプがオブジェクト、または未定のとき824 825 //String型オブジェクトを生成826 NewStringObject(term);827 828 type_stack[sp]=DEF_OBJECT;829 index_stack[sp]=(LONG_PTR)compiler.GetObjectModule().meta.GetClasses().GetStringClassPtr();830 bLiteralCalculation=0;831 832 sp++;833 break;834 }835 836 799 bool isEx = true; 837 800 if( term[0] == '\"' ) … … 858 821 } 859 822 i3=lstrlen(term); 823 } 824 825 if( !baseType.IsPointer() ) 826 { 827 //要求タイプがオブジェクト、または未定のとき 828 829 //String型オブジェクトを生成 830 i2 = compiler.GetObjectModule().dataTable.MakeConstStringObjectToProcessStaticBuffer( term ); 831 832 // push value 833 compiler.codeGenerator.op_push_V( i2, Schedule::DataTable ); 834 835 type_stack[sp]=DEF_OBJECT; 836 index_stack[sp]=(LONG_PTR)compiler.GetObjectModule().meta.GetClasses().GetStringClassPtr(); 837 bLiteralCalculation=0; 838 839 sp++; 840 break; 860 841 } 861 842 StrLiteral: … … 1200 1181 } 1201 1182 1202 //再配置スケジュールバックアップ情報を解放1203 delete pobj_BackReloc;1204 1205 1183 return isSuccessful; 1206 1184 }
Note:
See TracChangeset
for help on using the changeset viewer.