Changeset 64 in dev for BasicCompiler64
- Timestamp:
- Mar 8, 2007, 2:49:34 AM (18 years ago)
- Location:
- BasicCompiler64
- Files:
-
- 20 edited
Legend:
- Unmodified
- Added
- Removed
-
BasicCompiler64/CParameter.cpp
r63 r64 2 2 #include "opcode.h" 3 3 4 voidCParameter::NewTempParameters( const char *FuncName,PARAMETER_INFO *ppi,int pi_num,int SecondParmNum ){4 int CParameter::NewTempParameters( const char *FuncName,PARAMETER_INFO *ppi,int pi_num,int SecondParmNum ){ 5 5 /////////////////////////////////////////////////////// 6 6 // 一時オブジェクトをあらかじめスタックに積んでおく 7 7 /////////////////////////////////////////////////////// 8 9 int stackItemNum = 0; 8 10 9 11 useTempObject = false; … … 60 62 int type = NumOpe( ®, Parms[i2], DummyTypeInfo.type, DummyTypeInfo.u.lpIndex, &lpVarIndex ); 61 63 64 if( type == DEF_OBJECT ){ 65 //一時参照を作成 66 pobj_sf->push( reg ); 67 pobj_sf->mov_sp( reg ); 68 69 stackItemNum++; 70 } 71 62 72 //スタックフレームへコピー 63 73 StackOffsetOfTempObject[i2] = pobj_sf->push(reg); 74 75 stackItemNum++; 64 76 65 77 bool result = CheckDifferentType( … … 81 93 } 82 94 } 95 96 return stackItemNum * PTR_SIZE; 83 97 } 84 98 void CParameter::DeleteTempParameters(){ … … 90 104 for(int i2=ParmsNum-1;i2>=0;i2--){ 91 105 if( useTempParameters[i2] ){ 92 //スタックフレームから取得93 pobj_sf->ref(REG_RCX);94 95 //デストラクタを呼び出す96 97 //call destructor98 CMethod *method = types[i2].u.pobj_Class->GetDestructorMethod(); 99 if( method ){100 op_call( method->psi );101 }102 103 //メモリを解放する104 105 pobj_sf->pop(REG_RCX);106 107 //call free108 extern SUBINFO *pSub_free;109 op_call(pSub_free);106 if( types[i2].type == DEF_STRUCT ){ 107 // 構造体の一時メモリ 108 109 //メモリを解放する 110 111 pobj_sf->pop( REG_RCX ); 112 113 //call free 114 extern SUBINFO *pSub_free; 115 op_call(pSub_free); 116 } 117 else if( types[i2].type == DEF_OBJECT ){ 118 pobj_sf->pop(); 119 pobj_sf->pop(); 120 } 121 else{ 122 SetError(300,NULL,cp); 123 } 110 124 } 111 125 } 112 126 } 113 127 114 void CParameter::Set ObjectParameter(int reg,CClass *pobj_Class,LPSTR Parameter){128 void CParameter::SetStructParameter(int reg,CClass *pobj_Class,LPSTR Parameter){ 115 129 ////////////////////////////////////////////////////// 116 130 ///// レジスタ資源のバックアップ … … 133 147 pobj_sf->push(REG_R11); 134 148 135 TYPEINFO BaseType={DEF_ OBJECT,(LONG_PTR)pobj_Class};149 TYPEINFO BaseType={DEF_STRUCT,(LONG_PTR)pobj_Class}; 136 150 TYPEINFO CalcType; 137 151 CalcType.type=NumOpe_GetType(Parameter,&BaseType,&CalcType.u.lpIndex); 138 152 153 /* 154 TODO: 消す 139 155 if( pobj_Class->GetCopyConstructorMethod() 140 156 && CalcType.type==DEF_OBJECT&&CalcType.u.pobj_Class==pobj_Class){ … … 178 194 op_call(pobj_Class->GetConstructorMethod()->psi); 179 195 } 196 */ 180 197 181 198 182 199 BOOL bUseHeap; 183 200 int temp_reg=REG_RAX; 184 CalcType.type=NumOpe(&temp_reg,Parameter,DEF_ OBJECT,(LONG_PTR)pobj_Class,&CalcType.u.lpIndex,&bUseHeap);201 CalcType.type=NumOpe(&temp_reg,Parameter,DEF_STRUCT,(LONG_PTR)pobj_Class,&CalcType.u.lpIndex,&bUseHeap); 185 202 186 203 … … 194 211 RelativeVar.dwKind=VAR_DIRECTMEM; 195 212 196 Set ObjectVariableFromRax((LONG_PTR)pobj_Class,CalcType.type,CalcType.u.lpIndex,&RelativeVar,bUseHeap);197 198 }213 SetStructVariableFromRax((LONG_PTR)pobj_Class,CalcType.type,CalcType.u.lpIndex,&RelativeVar,bUseHeap); 214 215 //} 199 216 200 217 //mov r11,qword ptr[rsp+offset] ※スタックフレームを利用 … … 209 226 op_mov_RR(reg,REG_R11); 210 227 } 228 211 229 212 230 void CParameter::SetParameter(const char *FuncName,PARAMETER_INFO *ppi,int pi_num,int SecondParmNum){ … … 298 316 } 299 317 300 if(DummyTypeInfo.type==DEF_ OBJECT){301 Set ObjectParameter(reg,DummyTypeInfo.u.pobj_Class,Parms[i2]);318 if(DummyTypeInfo.type==DEF_STRUCT){ 319 SetStructParameter(reg,DummyTypeInfo.u.pobj_Class,Parms[i2]); 302 320 goto next; 303 321 } … … 318 336 319 337 if(CalcType==DEF_OBJECT){ 320 //キャスト演算子のオーバーロードに対応する 321 CallCastOperatorProc(reg,CalcType,lpCalcIndex,bCalcUseHeap,DummyTypeInfo.type,DummyTypeInfo.u.lpIndex); 338 if( DummyTypeInfo.type != DEF_OBJECT 339 || 340 DummyTypeInfo.type == DEF_OBJECT && 341 !DummyTypeInfo.u.pobj_Class->IsEqualsOrSubClass( (CClass *)lpCalcIndex ) ){ 342 //キャスト演算子のオーバーロードに対応する 343 CallCastOperatorProc(reg,CalcType,lpCalcIndex,bCalcUseHeap,DummyTypeInfo.type,DummyTypeInfo.u.lpIndex); 344 } 322 345 } 323 346 … … 419 442 } 420 443 } 444 else if(DummyTypeInfo.type==DEF_STRUCT){ 445 if( !DummyTypeInfo.u.pobj_Class->IsEquals( (CClass *)lpVarIndex ) ){ 446 SetError(11,Parms[i2],cp); 447 } 448 } 421 449 } 422 450 else if((VarType&FLAG_PTR)&&((VarType^FLAG_PTR)==DummyTypeInfo.type)){ … … 442 470 } 443 471 } 472 444 473 next: 474 445 475 if(reg==REG_RAX){ 446 476 //スタックフレームへコピー -
BasicCompiler64/CommandValue.h
r3 r64 19 19 #define COM_LET 0x1066 20 20 #define COM_DELETE 0x1068 21 #define COM_SWEEPINGDELETE 0x1069 21 22 22 23 //その他 -
BasicCompiler64/Compile_Calc.cpp
r62 r64 11 11 SetBooleanVariable(CalcType,pRelativeVar); 12 12 } 13 else if(VarType==DEF_SBYTE||VarType==DEF_BYTE || (isUnicode==false&&VarType==DEF_CHAR)){ 14 //8ビット変数へalレジスタの内容を格納する 15 SetWholeVariable(sizeof(char),CalcType,pRelativeVar); 16 } 17 else if(VarType==DEF_INTEGER||VarType==DEF_WORD || (isUnicode&&VarType==DEF_CHAR)){ 18 //16ビット変数へaxレジスタの内容を格納する 19 SetWholeVariable(sizeof(short),CalcType,pRelativeVar); 20 } 21 else if(VarType==DEF_LONG||VarType==DEF_DWORD){ 22 //32ビット変数へeaxレジスタの内容を格納する 23 SetWholeVariable(sizeof(long),CalcType,pRelativeVar); 24 } 25 else if(VarType==DEF_INT64||VarType==DEF_QWORD||IsPtrType(VarType)){ 26 //64ビット変数へraxレジスタの内容を格納する 27 SetWholeVariable(sizeof(_int64),CalcType,pRelativeVar); 28 } 29 else if(VarType==DEF_DOUBLE){ 30 //Double型変数へスタックの内容を格納する 31 SetDoubleVariable(CalcType,pRelativeVar); 32 } 33 else if(VarType==DEF_SINGLE){ 34 //Single型変数へスタックの内容を格納する 35 SetSingleVariable(CalcType,pRelativeVar); 13 else if( IsRealNumberType( VarType ) ){ 14 // Double/Single型変数へレジスタの値を代入 15 SetRealVariable(VarType, CalcType, pRelativeVar); 16 } 17 else if( IsWholeNumberType( VarType ) || VarType == DEF_OBJECT ){ 18 int typeSize = GetTypeSize( VarType, -1 ); 19 20 //整数変数へraxの値を格納する 21 SetWholeVariable( typeSize, CalcType, pRelativeVar ); 36 22 } 37 23 else{ … … 165 151 166 152 153 if( lstrcmpi( variable, "This" ) == 0 ){ 154 SetError(133,NULL,cp); 155 return; 156 } 157 167 158 168 159 //////////////////////////////////////// … … 195 186 CalcType=NumOpe(®,Command+i+1,VarType,lpVarIndex,&lpCalcIndex,&bCalcUseHeap); 196 187 188 if(reg!=REG_RAX&&IsWholeNumberType(CalcType)){ 189 SetError(300,NULL,cp); 190 } 191 192 if(VarType==-1||CalcType==-1) return; 193 197 194 //結果を格納しているレジスタをブロッキング 198 195 pobj_BlockReg->lock(reg); 199 200 if(VarType==-1||CalcType==-1) return;201 196 202 197 //変数アドレスを取得 … … 206 201 &VarType, 207 202 &VarRelativeVar, 208 &lpVarIndex)) return; 203 &lpVarIndex, 204 NULL)) return; 209 205 210 206 //レジスタのブロッキングを解除 … … 216 212 } 217 213 218 if(VarType==DEF_ OBJECT){219 // オブジェクトインスタンスへの代入220 Set ObjectVariableFromRax(lpVarIndex,CalcType,lpCalcIndex,&VarRelativeVar,bCalcUseHeap);221 return; 222 } 223 224 if(CalcType==DEF_OBJECT ){214 if(VarType==DEF_STRUCT ){ 215 //構造体インスタンスへの代入 216 SetStructVariableFromRax(lpVarIndex,CalcType,lpCalcIndex,&VarRelativeVar,bCalcUseHeap); 217 return; 218 } 219 220 if(CalcType==DEF_OBJECT && (CalcType!=VarType || lpCalcIndex!=lpVarIndex) ){ 225 221 //キャスト演算子のオーバーロードに対応する 226 222 CallCastOperatorProc(REG_RAX,CalcType,lpCalcIndex,bCalcUseHeap,VarType,lpVarIndex); … … 241 237 } 242 238 239 // TODO: 消す 240 /* 243 241 void SetRefVariable( const char *varname, const char *expression ){ 244 242 //////////////////////////////////////// … … 320 318 SetVariableFromRax(VarType,CalcType,&VarRelativeVar); 321 319 } 320 */ -
BasicCompiler64/Compile_CallProc.cpp
r63 r64 12 12 13 13 //mov rdx,rax 14 op_mov 64_ToReg_FromReg(REG_RDX,REG_RAX);14 op_mov_RR(REG_RDX,REG_RAX); 15 15 16 16 //mov rcx,rsp 17 op_mov 64_ToReg_FromReg(REG_RCX,REG_RSP);17 op_mov_RR(REG_RCX,REG_RSP); 18 18 19 19 //call _DebugSys_SaveContext … … 96 96 } 97 97 98 void Opcode_CallProc(c har *Parameter,SUBINFO *psi,DWORD dwFlags,char *ObjectName,int RefType){98 void Opcode_CallProc(const char *Parameter,SUBINFO *psi,DWORD dwFlags,char *ObjectName,int RefType){ 99 99 int i2; 100 100 … … 207 207 208 208 /////////////////////////////////////////////////////////////// 209 // _System_LocalThis 、_System_ReturnObjectのダミーをセット209 // _System_LocalThisのダミーをセット 210 210 /////////////////////////////////////////////////////////////// 211 211 … … 216 216 } 217 217 218 if(psi->ReturnType==DEF_OBJECT && psi->isReturnRef == false ){219 //_System_ReturnObject(第一または第二パラメータのダミーを作成)220 sprintf(temporary+lstrlen(temporary),"%c%c0,",1,ESC_BYVAL);221 }222 223 218 if(Parameter[0]=='\0'&&temporary[0]) 224 219 temporary[lstrlen(temporary)-1]=0; 225 220 else lstrcat(temporary,Parameter); 221 222 223 //パラメータセット前のspオフセットを取得(Newの場合はここにThisポインタが格納されている) 224 int this_sp_offset = pobj_sf->GetNowSp(); 226 225 227 226 … … 254 253 pobj_parameter->SetParameter(psi->name,psi->pRealParmInfo,psi->RealParmNum,psi->RealSecondParmNum); 255 254 256 257 if(psi->ReturnType==DEF_OBJECT && psi->isReturnRef == false){ 255 if(psi->ReturnType==DEF_STRUCT && psi->isReturnRef == false){ 258 256 ////////////////////////////////////////////////////// 259 // 戻り値に オブジェクトインスタンスを持つ場合260 // ※ByRef _System_Return Objectパラメータをセット257 // 戻り値に構造体インスタンスを持つ場合 258 // ※ByRef _System_ReturnValue パラメータをセット 261 259 ////////////////////////////////////////////////////// 262 260 … … 316 314 SetVarPtrToReg(REG_RCX,&RelativeVar); 317 315 318 //参照タイプが "->" の場合 319 if(RefType==DEF_PTR_OBJECT){ 320 //mov rcx,qword ptr[rcx] 321 op_mov_RM(sizeof(_int64),REG_RCX,REG_RCX,0,MOD_BASE); 322 } 316 // 参照を実体ポインタにする 317 //mov rcx,qword ptr[rcx] 318 op_mov_RM(sizeof(_int64),REG_RCX,REG_RCX,0,MOD_BASE); 323 319 } 324 320 } … … 329 325 330 326 //mov rcx,qword ptr[rsp+offset] ※スタックフレームを利用 331 pobj_sf->ref (REG_RCX);327 pobj_sf->ref_offset_data(REG_RCX, this_sp_offset); 332 328 } 333 329 else{ -
BasicCompiler64/Compile_Func.cpp
r51 r64 62 62 63 63 TYPEINFO TypeInfo={type,lpIndex}; 64 if(IsStringObjectType( &TypeInfo)){64 if(IsStringObjectType(TypeInfo)){ 65 65 //Stringオブジェクトの場合 66 66 sprintf(temporary,"%s.Length",tempParm); … … 195 195 } 196 196 void Opcode_Func_SizeOf( const char *Parameter ){ 197 int type,size;198 197 LONG_PTR lpIndex; 199 200 type=GetTypeFixed(Parameter,&lpIndex); 201 size=GetTypeSize(type,lpIndex); 198 int type = GetTypeFixed(Parameter,&lpIndex); 199 200 int size; 201 if( type == DEF_OBJECT ){ 202 CClass *pClass = (CClass *)lpIndex; 203 size = pClass->GetSize(); 204 } 205 else{ 206 size=GetTypeSize(type,lpIndex); 207 } 202 208 203 209 //mov rax,size … … 210 216 if(!GetVarOffsetReadOnly( Parameter, &ReturnTypeInfo.type, &RelativeVar, &ReturnTypeInfo.u.lpIndex )) return; 211 217 218 int beforeType = ReturnTypeInfo.type; 219 212 220 PTR_LEVEL_UP( ReturnTypeInfo.type ); 213 221 214 222 SetVarPtrToReg(REG_RAX,&RelativeVar); 223 224 if( beforeType == DEF_OBJECT && lstrcmpi( Parameter, "This" ) != 0 ){ 225 //参照をオブジェクトポインタに変更 226 227 //mov rax,qword ptr[rax] 228 op_mov_RM( sizeof(_int64), REG_RAX, REG_RAX, 0, MOD_BASE ); 229 } 215 230 } 216 231 void Opcode_Func_GetPtrData( const char *Parameter, const int type ){ -
BasicCompiler64/Compile_Object.cpp
r51 r64 2 2 #include "opcode.h" 3 3 4 void _call_constructor(CClass *pobj_c,c har *CreateParameter,int ObjectSize,BOOL bSomeObjects){4 void _call_constructor(CClass *pobj_c,const char *CreateParameter,int ObjectSize,BOOL bSomeObjects){ 5 5 //////////////////////////// 6 6 // コンストラクタの呼び出し … … 73 73 } 74 74 } 75 int Operator_New(const char *Parameter,LONG_PTR *plpIndex){ 76 char TypeName[VN_SIZE],CreateParameter[VN_SIZE],ObjectSize[VN_SIZE]; 75 void Operator_New( CClass &classObj, const char *objectSizeStr, const char *parameter, const TYPEINFO &baseTypeInfo ){ 76 int typeSize = classObj.GetSize(); 77 78 if(classObj.IsAbstract()){ 79 //抽象クラスだったとき 80 SetError(125,classObj.name,cp); 81 } 82 83 BOOL bSomeObjects=0; 84 if(objectSizeStr[0]){ 85 bSomeObjects=1; 86 87 int reg=REG_RAX; 88 int type = NumOpe(®,objectSizeStr,0,0,0); 89 if(!IsWholeNumberType(type)) SetError(49,NULL,cp); 90 91 //※添え字上限値であることを考慮 92 //add rax,1 93 op_add_RV(REG_RAX,1); 94 95 //オブジェクトの個数をrbxに一時保持 96 //※rbxは関数が呼ばれても不変 97 //mov rbx,rax 98 op_mov_RR(REG_RBX,REG_RAX); 99 100 //imul rax,size 101 op_imul_RV(sizeof(_int64),REG_RAX,typeSize); 102 103 //add rax,PTR_SIZE*3 104 op_add_RV(REG_RAX,PTR_SIZE*3); 105 106 //mov rcx,rax 107 op_mov_RR(REG_RCX,REG_RAX); 108 } 109 else{ 110 //オブジェクトの個数をrbxに一時保持 111 //※rbxは関数が呼ばれても不変 112 //mov rbx,1 113 op_mov_RV(sizeof(_int64),REG_RBX,1); 114 115 //mov rcx,typeSize+PTR_SIZE*3 116 op_mov_RV(sizeof(_int64),REG_RCX,typeSize+PTR_SIZE*3); 117 } 118 119 if( baseTypeInfo.type == DEF_OBJECT ){ 120 //DeleteはGCで処理 121 122 //call _System_GC_malloc_ForObject 123 extern SUBINFO *pSub_System_GC_malloc_ForObject; 124 op_call(pSub_System_GC_malloc_ForObject); 125 } 126 else{ 127 //明示的なDeleteが必要 128 129 //call _System_GC_malloc_ForObjectPtr 130 extern SUBINFO *pSub_System_GC_malloc_ForObjectPtr; 131 op_call(pSub_System_GC_malloc_ForObjectPtr); 132 } 133 134 135 /* 136 確保されたヒープ領域のポインタ(callocの戻り値eax)をpPtrとすると、 137 pPtr-=sizeof(DWORD)*3 138 pPtr[0]=オブジェクトの個数 139 pPtr[1]=オブジェクトのサイズ 140 pPtr[2]=デストラクタの関数ポインタ 141 */ 142 143 144 //mov qword ptr[rax],rbx(オブジェクトの個数) 145 op_mov_MR(sizeof(_int64),REG_RBX,REG_RAX,0,MOD_BASE); 146 147 //add rax,PTR_SIZE 148 op_add_RV(REG_RAX,PTR_SIZE); 149 150 151 //mov qword ptr[rax],typeSize(オブジェクトのサイズ) 152 op_mov_MV(sizeof(_int64),REG_RAX,0,NON_OFFSET,typeSize); 153 154 //add rax,PTR_SIZE 155 op_add_RV(REG_RAX,PTR_SIZE); 156 157 158 CMethod *method = classObj.GetDestructorMethod(); 159 if( method == NULL ) return; 160 161 //mov rcx,DestructorProcAddr 162 op_mov_RV(sizeof(_int64),REG_RCX,0); 163 obp-=sizeof(long); 164 pobj_SubAddrSchedule->add(method->psi,0); 165 method->psi->bUse=1; 166 obp+=sizeof(long); 167 168 //mov qword ptr[rax],rcx 169 op_mov_MR(sizeof(_int64),REG_RCX,REG_RAX,0,MOD_BASE); 170 171 //add rax,PTR_SIZE 172 op_add_RV(REG_RAX,PTR_SIZE); 173 174 175 // ※ここでプッシュされた値はNew演算子の戻り値となる 176 //mov qword ptr[rsp+offset],rax ※スタックフレームを利用 177 pobj_sf->push(REG_RAX); 178 179 180 ///////////////////////////////////////////////////////////////////// 181 182 //////////////////////////// 183 // コンストラクタの呼び出し 184 //////////////////////////// 185 186 _call_constructor(&classObj,parameter,typeSize,bSomeObjects); 187 188 189 //mov rax,qword ptr[rsp+offset] ※スタックフレームを利用 190 pobj_sf->pop(REG_RAX); 191 } 192 int Operator_New(const char *Parameter,LONG_PTR *plpIndex,const TYPEINFO &baseTypeInfo ){ 193 char TypeName[VN_SIZE],CreateParameter[VN_SIZE],objectSizeStr[VN_SIZE]; 77 194 int i,i2; 78 int reg;79 195 80 196 i=0; 81 197 82 198 if(Parameter[0]=='['){ 83 i=GetStringInBracket( ObjectSize,Parameter);84 85 SlideString( ObjectSize+1,-1);86 ObjectSize[i-2]=0;87 } 88 else ObjectSize[0]=0;199 i=GetStringInBracket(objectSizeStr,Parameter); 200 201 SlideString(objectSizeStr+1,-1); 202 objectSizeStr[i-2]=0; 203 } 204 else objectSizeStr[0]=0; 89 205 90 206 for(i2=0;;i++,i2++){ … … 109 225 } 110 226 111 int type ,TypeSize;227 int type; 112 228 type=GetTypeFixed(TypeName,plpIndex); 113 229 if(type==-1){ … … 115 231 return 0; 116 232 } 117 TypeSize=GetTypeSize(type,*plpIndex);118 233 119 234 if(type!=DEF_OBJECT){ … … 129 244 pobj_c=(CClass *)*plpIndex; 130 245 131 if(pobj_c->IsAbstract()){ 132 //抽象クラスだったとき 133 SetError(125,pobj_c->name,cp); 134 } 135 136 BOOL bSomeObjects=0; 137 if(ObjectSize[0]){ 138 bSomeObjects=1; 139 140 reg=REG_RAX; 141 i2=NumOpe(®,ObjectSize,0,0,0); 142 if(!IsWholeNumberType(i2)) SetError(49,NULL,cp); 143 144 //※添え字上限値であることを考慮 145 //add rax,1 146 op_add64_value(REG_RAX,1); 147 148 //オブジェクトの個数をrbxに一時保持 149 //※rbxは関数が呼ばれても不変 150 //mov rbx,rax 151 op_mov64_ToReg_FromReg(REG_RBX,REG_RAX); 152 153 //imul rax,size 154 op_imul_value(sizeof(_int64),REG_RAX,TypeSize); 155 156 //add rax,PTR_SIZE*3 157 op_add64_value(REG_RAX,PTR_SIZE*3); 158 159 //mov rcx,rax 160 op_mov64_ToReg_FromReg(REG_RCX,REG_RAX); 161 } 162 else{ 163 //オブジェクトの個数をrbxに一時保持 164 //※rbxは関数が呼ばれても不変 165 //mov rbx,1 166 op_mov_RV(sizeof(_int64),REG_RBX,1); 167 168 //mov rcx,TypeSize+PTR_SIZE*3 169 op_mov_RV(sizeof(_int64),REG_RCX,TypeSize+PTR_SIZE*3); 170 } 171 172 //call calloc 173 extern SUBINFO *pSub_calloc; 174 op_call(pSub_calloc); 175 176 177 /* 178 確保されたヒープ領域のポインタ(callocの戻り値eax)をpPtrとすると、 179 pPtr-=sizeof(DWORD)*3 180 pPtr[0]=オブジェクトの個数 181 pPtr[1]=オブジェクトのサイズ 182 pPtr[2]=デストラクタの関数ポインタ 183 */ 184 185 186 //mov qword ptr[rax],rbx(オブジェクトの個数) 187 op_mov_MR(sizeof(_int64),REG_RBX,REG_RAX,0,MOD_BASE); 188 189 //add rax,PTR_SIZE 190 op_add64_value(REG_RAX,PTR_SIZE); 191 192 193 //mov qword ptr[rax],TypeSize(オブジェクトのサイズ) 194 op_mov_MV(sizeof(_int64),REG_RAX,0,NON_OFFSET,TypeSize); 195 196 //add rax,PTR_SIZE 197 op_add64_value(REG_RAX,PTR_SIZE); 198 199 200 CMethod *method = pobj_c->GetDestructorMethod(); 201 if( method == NULL ) return 0; 202 203 //mov rcx,DestructorProcAddr 204 op_mov_RV(sizeof(_int64),REG_RCX,0); 205 obp-=sizeof(long); 206 pobj_SubAddrSchedule->add(method->psi,0); 207 method->psi->bUse=1; 208 obp+=sizeof(long); 209 210 //mov qword ptr[rax],rcx 211 op_mov_MR(sizeof(_int64),REG_RCX,REG_RAX,0,MOD_BASE); 212 213 //add rax,PTR_SIZE 214 op_add64_value(REG_RAX,PTR_SIZE); 215 216 217 // ※ここでプッシュされた値はNew演算子の戻り値となる 218 //mov qword ptr[rsp+offset],rax ※スタックフレームを利用 219 pobj_sf->push(REG_RAX); 220 221 222 ///////////////////////////////////////////////////////////////////// 223 224 //////////////////////////// 225 // コンストラクタの呼び出し 226 //////////////////////////// 227 228 _call_constructor(pobj_c,CreateParameter,TypeSize,bSomeObjects); 229 230 231 //mov rax,qword ptr[rsp+offset] ※スタックフレームを利用 232 pobj_sf->pop(REG_RAX); 233 246 Operator_New( *pobj_c, objectSizeStr, CreateParameter, baseTypeInfo ); 247 248 if( baseTypeInfo.type == DEF_OBJECT ){ 249 return DEF_OBJECT; 250 } 234 251 return DEF_PTR_OBJECT; 235 252 } 236 253 237 void OpcodeDelete(const char *Parameter ){254 void OpcodeDelete(const char *Parameter, bool isSweeping){ 238 255 int type; 239 256 … … 254 271 255 272 //add rax,PTR_SIZE 256 op_add 64_value(REG_RAX,PTR_SIZE);273 op_add_RV(REG_RAX,PTR_SIZE); 257 274 258 275 … … 261 278 262 279 //add rax,PTR_SIZE 263 op_add 64_value(REG_RAX,PTR_SIZE);280 op_add_RV(REG_RAX,PTR_SIZE); 264 281 265 282 … … 268 285 269 286 //add rax,PTR_SIZE 270 op_add 64_value(REG_RAX,PTR_SIZE);287 op_add_RV(REG_RAX,PTR_SIZE); 271 288 272 289 273 290 //mov rcx,rax 274 op_mov 64_ToReg_FromReg(REG_RCX,REG_RAX);291 op_mov_RR(REG_RCX,REG_RAX); 275 292 276 293 … … 279 296 jnz_back=obp; 280 297 281 //mov qword ptr[rsp+offset],r ax ※スタックフレームを利用282 pobj_sf->push(REG_R AX);298 //mov qword ptr[rsp+offset],rcx ※スタックフレームを利用 299 pobj_sf->push(REG_RCX); 283 300 284 301 //call rdi … … 309 326 pobj_sf->pop(REG_RCX); 310 327 311 //call free 312 extern SUBINFO *pSub_free; 313 op_call(pSub_free); 328 if( isSweeping ){ 329 //call _System_GC_free_for_SweepingDelete 330 extern SUBINFO *pSub_System_GC_free_for_SweepingDelete; 331 op_call(pSub_System_GC_free_for_SweepingDelete); 332 } 333 else{ 334 //call free 335 extern SUBINFO *pSub_free; 336 op_call(pSub_free); 337 } 314 338 } -
BasicCompiler64/Compile_ProcOp.cpp
r63 r64 51 51 52 52 //add rsp,スタックフレームサイズ 53 op_add 64_value(REG_RSP,pobj_sf->GetFrameSize());53 op_add_RV(REG_RSP,pobj_sf->GetFrameSize()); 54 54 55 55 //スタックフレームスケジュール(subコマンドに渡す値) … … 94 94 95 95 //add rsp,スタックフレームサイズ 96 op_add 64_value(REG_RSP,pobj_sf->GetFrameSize());96 op_add_RV(REG_RSP,pobj_sf->GetFrameSize()); 97 97 98 98 //スタックフレームスケジュール(subコマンドに渡す値) … … 118 118 119 119 //add rsp,8 120 op_add 64_value(REG_RSP,0x8);120 op_add_RV(REG_RSP,0x8); 121 121 122 122 //ret … … 128 128 129 129 //add rax,PTR_SIZE 130 op_add 64_value(REG_RAX,PTR_SIZE);130 op_add_RV(REG_RAX,PTR_SIZE); 131 131 132 132 //ret … … 337 337 338 338 LocalVar[MaxLocalVarNum].type=psi->pRealParmInfo[i3].type; 339 if(LocalVar[MaxLocalVarNum].type==DEF_OBJECT){ 340 if(psi->bExport) 341 SetError(24,NULL,cp); 339 if(LocalVar[MaxLocalVarNum].type==DEF_OBJECT 340 ||LocalVar[MaxLocalVarNum].type==DEF_STRUCT){ 341 if(psi->bExport) 342 SetError(24,NULL,cp); 342 343 } 343 344 344 345 LocalVar[MaxLocalVarNum].u.index=psi->pRealParmInfo[i3].u.index; 345 346 346 if(psi->pRealParmInfo[i3].bByVal&&psi->pRealParmInfo[i3].type==DEF_ OBJECT){347 // 実態オブジェクトのByValパラメータ347 if(psi->pRealParmInfo[i3].bByVal&&psi->pRealParmInfo[i3].type==DEF_STRUCT){ 348 //構造体のByValパラメータ 348 349 LocalVar[MaxLocalVarNum].fRef=REF_PARAMETER | OBJECT_PARAMETER; 349 350 VarSize=PTR_SIZE; … … 457 458 BaseLocalVar=AllLocalVarSize; 458 459 459 if(psi->ReturnType!= -1){460 if(psi->ReturnType!=DEF_NON){ 460 461 //戻り値が存在するとき 461 462 … … 464 465 else temp=psi->name; 465 466 466 if(psi->ReturnType==DEF_OBJECT && psi->isReturnRef == false){ 467 //戻り値用オブジェクトのコンストラクタを呼び出す 468 if( psi->u.Return_pobj_c->GetConstructorMethod() ){ 469 sprintf(temporary,"%s.%s()",temp,psi->u.Return_pobj_c->name); 470 OpcodeOthers(temporary); 471 } 467 if(psi->ReturnType==DEF_STRUCT && psi->isReturnRef == false){ 468 //戻り値用の構造体(値型)はパラメータで引き渡される 472 469 } 473 470 else{ … … 493 490 494 491 //mov rcx,rsp 495 op_mov 64_ToReg_FromReg(REG_RCX,REG_RSP);492 op_mov_RR(REG_RCX,REG_RSP); 496 493 497 494 //add rcx,スタックフレームサイズ+sizeof(_int64) ※ret用のサイズを考慮 498 op_add 64_value(REG_RCX,0);495 op_add_RV(REG_RCX,0); 499 496 RspOffsetSchedule2=obp-sizeof(long); 500 497 … … 571 568 for(i3=0;i3<pobj_CompilingClass->iMemberNum;i3++){ 572 569 CMember *pMember = pobj_CompilingClass->ppobj_Member[i3]; 573 int MemberTypeSize= 574 GetTypeSize(pMember->TypeInfo.type, 575 pMember->TypeInfo.u.lpIndex); 576 577 int MemberObjectNum= 578 JumpSubScripts(pMember->SubScripts); 579 580 int offset = pobj_CompilingClass->GetMemberOffset( pMember->name, NULL ); 581 582 if(pMember->TypeInfo.type==DEF_OBJECT && pMember->IsRef() == false){ 583 CMethod *method = pMember->TypeInfo.u.pobj_Class->GetConstructorMethod(); 584 if( method ){ 585 if( method->psi->RealParmNum == 1 ){ //Thisポインタを第一引数に持ち合わせるため、引数なしの場合はこの値が1になる 586 for(i4=0;i4<MemberObjectNum;i4++){ 587 //Thisポインタをrcxにコピー 588 SetThisPtrToReg(REG_RCX); 589 590 //add rcx,offset 591 op_add64_value(REG_RCX,offset+i4*MemberTypeSize); 592 593 //call constructor 594 op_call( method->psi ); 595 } 596 } 597 } 570 if(pMember->TypeInfo.type==DEF_OBJECT){ 571 // オブジェクトメンバを発見したとき 572 573 sprintf(temporary, "This.%s=%c%c%s()", 574 pMember->name, 575 1, ESC_NEW, 576 pMember->TypeInfo.u.pobj_Class->name ); 577 OpcodeCalc( temporary ); 598 578 } 599 579 } … … 665 645 } 666 646 667 //実体クラスを持つメンバのデストラクタを呼び出す 647 //実体クラスを持つメンバのデストラクタ呼び出しはGCに任せる 648 /* 668 649 //※コンストラクタと逆順序で呼び出す 669 650 for(i3=pobj_CompilingClass->iMemberNum-1;i3>=0;i3--){ … … 678 659 int offset = pobj_CompilingClass->GetMemberOffset( pMember->name, NULL ); 679 660 680 if(pMember->TypeInfo.type==DEF_OBJECT && pMember->IsRef() == false){661 if(pMember->TypeInfo.type==DEF_OBJECT){ 681 662 CMethod *method = pMember->TypeInfo.u.pobj_Class->GetDestructorMethod(); 682 663 if( method ){ … … 686 667 687 668 //add rcx,offset 688 op_add 64_value(REG_RCX,offset+i4*MemberTypeSize);669 op_add_RV(REG_RCX,offset+i4*MemberTypeSize); 689 670 690 671 //call destructor … … 693 674 } 694 675 } 695 } 676 }*/ 696 677 } 697 678 } … … 743 724 } 744 725 745 if(psi->ReturnType!= -1){726 if(psi->ReturnType!=DEF_NON){ 746 727 ////////////////////////////////// 747 728 // 戻り値をraxまたはxmm0に設定 … … 759 740 i3=psi->ReturnType; 760 741 761 if(i3==DEF_OBJECT ){742 if(i3==DEF_OBJECT || i3==DEF_STRUCT){ 762 743 SetVarPtrToReg(REG_RAX,&RelativeVar); 744 if( i3==DEF_OBJECT ){ 745 //mov rax,qword ptr[rax] 746 op_mov_RM( sizeof(_int64), REG_RAX, REG_RAX, 0, MOD_BASE ); 747 } 763 748 } 764 749 else if(i3==DEF_DOUBLE){ -
BasicCompiler64/Compile_Set_Var.cpp
r63 r64 7 7 } 8 8 9 void Set ObjectVariableFromRax(LONG_PTR lpVarIndex,int CalcType,LONG_PTR lpCalcIndex,RELATIVE_VAR *pRelativeVar,BOOL bUseHeap){9 void SetStructVariableFromRax(LONG_PTR lpVarIndex,int CalcType,LONG_PTR lpCalcIndex,RELATIVE_VAR *pRelativeVar,BOOL bUseHeap){ 10 10 int RightTermReg; 11 11 pobj_reg=new CRegister(REG_RCX); … … 36 36 } 37 37 38 38 /* 39 TODO: 消す 39 40 /////////////////////////////////////////////////////////////////// 40 41 // オペレータ '=' のオーバーロード関数を呼ぶ … … 59 60 int iRet; 60 61 iRet=CallOperatorProc(CALC_SUBSITUATION,NULL,type,index_stack,array_bUseHeap,sp); 61 62 */ 62 63 //右辺用レジスタを解除 63 64 if(IsRealNumberType(CalcType)) pobj_reg->UnlockXmmReg(); … … 71 72 pobj_reg=0; 72 73 73 if(iRet==-1||iRet==1){ 74 //成功したとき、またはエラーが発行されたとき 75 return; 76 } 77 78 79 if( CalcType == DEF_OBJECT ){ 74 75 if( CalcType == DEF_STRUCT ){ 80 76 CClass *pVarClass = (CClass *)lpVarIndex; 81 77 CClass *pCalcClass = (CClass *)lpCalcIndex; 82 78 83 if( pVarClass->IsEquals( pCalcClass ) //等しい 84 || pVarClass->IsSubClass( pCalcClass ) ){ //派生・継承関係 79 if( pVarClass->IsEquals( pCalcClass ) ){ //等しい 85 80 86 81 //双方のオブジェクト型が一致、または派生・継承関係にあるとき … … 122 117 SetError(1,NULL,cp); 123 118 } 119 124 120 125 121 void SetDoubleVariable(int type,RELATIVE_VAR *pRelative){ … … 305 301 } 306 302 } 303 void SetRealVariable(int VarType, int CalcType, RELATIVE_VAR *pRelativeVar){ 304 if(VarType==DEF_DOUBLE){ 305 //Double型変数へスタックの内容を格納する 306 SetDoubleVariable(CalcType,pRelativeVar); 307 } 308 else if(VarType==DEF_SINGLE){ 309 //Single型変数へスタックの内容を格納する 310 SetSingleVariable(CalcType,pRelativeVar); 311 } 312 } 307 313 void SetBooleanVariable(int type,RELATIVE_VAR *pRelative){ 308 314 if(type==DEF_DOUBLE){ -
BasicCompiler64/Compile_Statement.cpp
r56 r64 99 99 ///////////////////// 100 100 101 if(i2==DEF_ OBJECT){101 if(i2==DEF_STRUCT){ 102 102 //mov r14,rax 103 103 op_mov_RR(REG_R14,REG_RAX); … … 888 888 //add rax,offset(Gosubステートメントの最終ポイント) 889 889 int schedule=obp,schedule2; 890 op_add 64_value(REG_RAX,0);890 op_add_RV(REG_RAX,0); 891 891 schedule2=obp-sizeof(long); 892 892 … … 951 951 else temp=pCompilingSubInfo->name; 952 952 953 /* 954 TODO: 消す 953 955 if( pCompilingSubInfo->isReturnRef ){ 954 956 //参照型 … … 956 958 } 957 959 else{ 958 //値型 960 //値型*/ 959 961 char temporary[VN_SIZE]; 960 962 sprintf(temporary,"%s=%s",temp,Parameter); 961 963 OpcodeCalc(temporary); 962 }964 //} 963 965 } 964 966 … … 968 970 } 969 971 970 void Opcode_Input(c har *Parameter){972 void Opcode_Input(const char *Parameter){ 971 973 extern int cp; 972 974 int i2,i3,i4,i5,type; 973 975 BOOL bFile; 974 976 char temporary[VN_SIZE],temp2[VN_SIZE],buffer[VN_SIZE]; 975 976 KillStringSpaces(Parameter);977 977 978 978 if(Parameter[0]=='#'){ … … 1084 1084 Opcode_CallProc(buffer,psi,0,"",0); 1085 1085 } 1086 void Opcode_PrintUsing(c har *Parameter,char *buffer,BOOL bFile){1086 void Opcode_PrintUsing(const char *Parameter,char *buffer,BOOL bFile){ 1087 1087 extern int cp; 1088 1088 int i2,i3,i4,i5; … … 1090 1090 BOOL bReturnLine; 1091 1091 1092 i2=lstrlen(Parameter); 1093 if(Parameter[i2-1]==';'){ 1092 char parms[8192]; 1093 lstrcpy( parms, Parameter ); 1094 1095 i2=lstrlen(parms); 1096 if(parms[i2-1]==';'){ 1094 1097 bReturnLine=0; 1095 Parameter[i2-1]=0;1098 parms[i2-1]=0; 1096 1099 } 1097 1100 else bReturnLine=1; … … 1099 1102 i3=lstrlen(buffer); 1100 1103 for(i2=0;;i2++,i3++){ 1101 if( Parameter[i2]==';'){1104 if(parms[i2]==';'){ 1102 1105 buffer[i3]=0; 1103 1106 break; 1104 1107 } 1105 buffer[i3]= Parameter[i2];1106 if( Parameter[i2]=='\0') break;1107 } 1108 if( Parameter[i2]==';') i2++;1108 buffer[i3]=parms[i2]; 1109 if(parms[i2]=='\0') break; 1110 } 1111 if(parms[i2]==';') i2++; 1109 1112 1110 1113 if(bReturnLine) lstrcat(buffer,"+Ex\"\\r\\n\""); … … 1114 1117 while(1){ 1115 1118 for(i3=0;;i2++,i3++){ 1116 if( Parameter[i2]=='\"'){1117 temporary[i3]= Parameter[i2];1119 if(parms[i2]=='\"'){ 1120 temporary[i3]=parms[i2]; 1118 1121 for(i2++,i3++;;i2++,i3++){ 1119 temporary[i3]= Parameter[i2];1120 if( Parameter[i2]=='\"') break;1122 temporary[i3]=parms[i2]; 1123 if(parms[i2]=='\"') break; 1121 1124 } 1122 1125 continue; 1123 1126 } 1124 if( Parameter[i2]=='('){1125 i5=GetStringInPare(temporary+i3, Parameter+i2);1127 if(parms[i2]=='('){ 1128 i5=GetStringInPare(temporary+i3,parms+i2); 1126 1129 i2+=i5-1; 1127 1130 i3+=i5-1; 1128 1131 continue; 1129 1132 } 1130 if( Parameter[i2]=='['){1131 i5=GetStringInBracket(temporary+i3, Parameter+i2);1133 if(parms[i2]=='['){ 1134 i5=GetStringInBracket(temporary+i3,parms+i2); 1132 1135 i2+=i5-1; 1133 1136 i3+=i5-1; 1134 1137 continue; 1135 1138 } 1136 if( Parameter[i2]==','){1139 if(parms[i2]==','){ 1137 1140 temporary[i3]=0; 1138 1141 i2++; 1139 1142 break; 1140 1143 } 1141 temporary[i3]= Parameter[i2];1142 if( Parameter[i2]=='\0') break;1144 temporary[i3]=parms[i2]; 1145 if(parms[i2]=='\0') break; 1143 1146 } 1144 1147 if(temporary[0]=='\0'){ … … 1169 1172 1170 1173 i4++; 1171 if( Parameter[i2]=='\0') break;1174 if(parms[i2]=='\0') break; 1172 1175 } 1173 1176 sprintf(temp2,"_System_UsingDataType[%d]=-1",i4); … … 1183 1186 Opcode_CallProc(buffer,psi,0,"",0); 1184 1187 } 1185 void Opcode_Print(c har *Parameter,BOOL bWrite){1188 void Opcode_Print(const char *Parameter,BOOL bWrite){ 1186 1189 int i2,i3,i4,sw; 1187 1190 char temporary[VN_SIZE],buffer[VN_SIZE]; 1188 1191 BOOL bFile; 1189 1190 KillStringSpaces(Parameter);1191 1192 1192 1193 if(Parameter[0]=='#'){ -
BasicCompiler64/Compile_Var.cpp
r63 r64 41 41 42 42 if(PTR_LEVEL(*pType)){ 43 *pType=MAKE_PTR_TYPE(NATURAL_TYPE(*pType),PTR_LEVEL(*pType)-1); 44 if((*pType)==DEF_OBJECT){ 45 CClass *pClass = (CClass *)lpIndex; 46 //imul reg,objsize 47 op_imul_value( sizeof(_int64), reg, pClass->GetSize() ); 48 } 49 else{ 50 i2=GetTypeSize(*pType,-1); 51 if(i2>=2){ 52 //imul reg,i2 53 op_imul_value(sizeof(_int64),reg,i2); 54 } 43 *pType = PTR_LEVEL_DOWN( *pType ); 44 45 i2=GetTypeSize(*pType,-1); 46 if(i2>=2){ 47 //imul reg,i2 48 op_imul_RV(sizeof(_int64),reg,i2); 55 49 } 56 50 } … … 71 65 //add r11,reg 72 66 op_add64_reg(REG_R11,reg); 67 } 68 void SetRelativeOffset( RELATIVE_VAR &relativeVar ){ 69 if(relativeVar.dwKind==VAR_DIRECTMEM){ 70 //mov r11,qword ptr[r11] 71 op_mov_RM(sizeof(_int64),REG_R11,REG_R11,0,MOD_BASE); 72 } 73 else{ 74 //直接参照に切り替え 75 SetVarPtrToReg(REG_R12,&relativeVar); 76 relativeVar.dwKind=VAR_DIRECTMEM; 77 78 //mov r11,qword ptr[r12] 79 op_mov_RM(sizeof(_int64),REG_R11,REG_R12,0,MOD_BASE); 80 } 73 81 } 74 82 BOOL GetArrayOffset(int *SubScripts,char *array,int type,LONG_PTR lpIndex){ … … 153 161 154 162 //imul reg,i4 155 op_imul_ value(sizeof(_int64),reg,i4);163 op_imul_RV(sizeof(_int64),reg,i4); 156 164 157 165 //add r12,reg … … 192 200 char lpPtrOffset[VN_SIZE]; //第2次配列 193 201 char NestMember[VN_SIZE]; //入れ子メンバ 194 int RefType; //"."参照のときは0、"->"参照のときは1202 CClass::RefType refType; 195 203 lstrcpy(VarName,member); 196 if(!GetVarFormatString(VarName,array,lpPtrOffset,NestMember, &RefType)) return 0;204 if(!GetVarFormatString(VarName,array,lpPtrOffset,NestMember,refType)) return 0; 197 205 198 206 … … 279 287 //入れ子構造の場合 280 288 281 if(*pType==DEF_OBJECT && pMember->IsRef() == false){282 if( RefType!=DEF_OBJECT){289 if(*pType==DEF_OBJECT || *pType==DEF_STRUCT){ 290 if( refType != CClass::Dot ){ 283 291 if(isErrorEnabled) SetError(104,member,cp); 284 292 return 0; 285 293 } 286 } 287 else if(*pType==DEF_PTR_OBJECT || ( *pType==DEF_OBJECT && pMember->IsRef() )){ 294 295 if( *pType==DEF_OBJECT ){ 296 // 参照内容へのポインタを抽出 297 SetRelativeOffset( *pRelativeVar ); 298 } 299 } 300 else if(*pType==DEF_PTR_OBJECT||*pType==DEF_PTR_STRUCT){ 288 301 //構造体ポインタ型メンバ変数 289 302 290 303 if(lpPtrOffset[0]){ 291 304 //pObj[n].member 292 if( *pType==DEF_PTR_OBJECT&&RefType!=DEF_OBJECT){305 if( ( *pType==DEF_PTR_OBJECT||*pType==DEF_PTR_STRUCT )&& refType != CClass::Dot ){ 293 306 if(isErrorEnabled) SetError(104,member,cp); 294 307 return 0; … … 303 316 else{ 304 317 //pObj->member 305 if( *pType==DEF_PTR_OBJECT&&RefType!=DEF_PTR_OBJECT){318 if( ( *pType==DEF_PTR_OBJECT||*pType==DEF_PTR_STRUCT )&& refType != CClass::Pointer ){ 306 319 if(isErrorEnabled) SetError(104,member,cp); 307 320 return 0; 308 321 } 309 322 310 if(pRelativeVar->dwKind==VAR_DIRECTMEM){ 311 //mov r11,qword ptr[r11] 312 op_mov_RM(sizeof(_int64),REG_R11,REG_R11,0,MOD_BASE); 313 } 314 else{ 315 //直接参照に切り替え 316 SetVarPtrToReg(REG_R12,pRelativeVar); 317 pRelativeVar->dwKind=VAR_DIRECTMEM; 318 319 //mov r11,qword ptr[r12] 320 op_mov_RM(sizeof(_int64),REG_R11,REG_R12,0,MOD_BASE); 321 } 322 } 323 } 324 else if(*pType==MAKE_PTR_TYPE(DEF_OBJECT,2)){ 323 SetRelativeOffset( *pRelativeVar ); 324 } 325 } 326 else if(*pType==MAKE_PTR_TYPE(DEF_OBJECT,2) || *pType==MAKE_PTR_TYPE(DEF_STRUCT,2)){ 325 327 //構造体ポインタのポインタ型メンバ変数 326 328 327 329 if(lpPtrOffset[0]){ 328 330 //ppObj[n]->member 329 if( RefType!=DEF_PTR_OBJECT){331 if( refType != CClass::Pointer ){ 330 332 if(isErrorEnabled) SetError(104,member,cp); 331 333 return 0; … … 388 390 BOOL GetVarOffset(bool isErrorEnabled,bool isWriteAccess,const char *NameBuffer,int *pType,RELATIVE_VAR *pRelativeVar,LONG_PTR *plpIndex,int *pss){ 389 391 extern BOOL bCompilingGlobal; 390 int i ,RefType;392 int i; 391 393 LONG_PTR lpIndex; 392 394 char variable[VN_SIZE],member[VN_SIZE],VarName[VN_SIZE],array[VN_SIZE],lpPtrOffset[VN_SIZE]; … … 398 400 else lstrcpy(variable,NameBuffer); 399 401 400 if( FormatUseProcReturnObject( variable, VarName, array, RefType, member ) ){ 402 CClass::RefType refType; 403 if( FormatUseProcReturnObject( variable, VarName, array, refType, member ) ){ 401 404 // 戻り値オブジェクトのメンバを直接参照しているとき 402 405 //例: func().member … … 442 445 443 446 lstrcpy(VarName,variable); 444 GetVarFormatString(VarName,array,lpPtrOffset,member, &RefType);447 GetVarFormatString(VarName,array,lpPtrOffset,member,refType); 445 448 446 449 int *pSubScripts; … … 581 584 char tempMember[VN_SIZE]; 582 585 char tempArray[VN_SIZE]; 583 GetVarFormatString(temporary,tempArray,lpPtrOffset,tempMember,&i); 586 { 587 CClass::RefType refType; 588 GetVarFormatString(temporary,tempArray,lpPtrOffset,tempMember, refType ); 589 } 584 590 585 591 char temp2[VN_SIZE]; … … 697 703 } 698 704 if(member[0]){ 699 if(*pType==DEF_OBJECT ){705 if(*pType==DEF_OBJECT || *pType==DEF_STRUCT){ 700 706 //実態オブジェクトのメンバを参照(obj.member) 701 if( RefType!=DEF_OBJECT){707 if( refType != CClass::Dot ){ 702 708 SetError(104,VarName,cp); 703 709 pRelativeVar->dwKind=NON_VAR; 704 710 return 0; 705 711 } 706 } 707 else if(*pType==DEF_PTR_OBJECT){ 712 713 if( *pType==DEF_OBJECT ){ 714 // 参照内容へのポインタを抽出 715 SetRelativeOffset( *pRelativeVar ); 716 } 717 } 718 else if(*pType==DEF_PTR_OBJECT || *pType==DEF_PTR_STRUCT){ 708 719 //ポインタオブジェクトが示すメンバを参照 709 720 if(lpPtrOffset[0]){ 710 721 //pObj[n].member 711 if( RefType!=DEF_OBJECT){722 if( refType != CClass::Dot ){ 712 723 SetError(104,VarName,cp); 713 724 pRelativeVar->dwKind=NON_VAR; … … 719 730 else{ 720 731 //pObj->member 721 if( RefType!=DEF_PTR_OBJECT){732 if( refType != CClass::Pointer ){ 722 733 SetError(104,VarName,cp); 723 734 pRelativeVar->dwKind=NON_VAR; … … 732 743 } 733 744 } 734 else if(*pType==MAKE_PTR_TYPE(DEF_OBJECT,2) ){745 else if(*pType==MAKE_PTR_TYPE(DEF_OBJECT,2) || *pType==MAKE_PTR_TYPE(DEF_STRUCT,2)){ 735 746 //ポインタオブジェクトが示すメンバを参照 736 747 if(lpPtrOffset[0]){ 737 748 //ppObj[n]->member 738 if( RefType!=DEF_PTR_OBJECT){749 if( refType != CClass::Pointer ){ 739 750 SetError(104,VarName,cp); 740 751 pRelativeVar->dwKind=NON_VAR; … … 815 826 } 816 827 817 if(type==DEF_ OBJECT){828 if(type==DEF_STRUCT){ 818 829 CClass *pobj_c; 819 830 pobj_c=(CClass *)lpIndex; … … 848 859 /////////////////////////////////////// 849 860 850 if( type == DEF_OBJECT ){851 //オブジェクト の場合はありえない861 if( type == DEF_OBJECT || type == DEF_STRUCT ){ 862 //オブジェクトまたは構造体の場合はありえない 852 863 SetError(300,NULL,cp); 853 864 return 0; … … 888 899 *(float *)(initGlobalBuf+offset)=(float)dbl; 889 900 else if(type==DEF_INT64||type==DEF_QWORD||IsPtrType(type)){ 890 if(type==DEF_PTR_ BYTE&&lpCalcIndex==LITERAL_STRING){901 if(type==DEF_PTR_CHAR&&lpCalcIndex==LITERAL_STRING){ 891 902 //文字列定数のとき 892 903 … … 953 964 } 954 965 955 if(type==DEF_ OBJECT){966 if(type==DEF_STRUCT){ 956 967 CClass *pobj_c; 957 968 pobj_c=(CClass *)lpIndex; … … 1037 1048 } 1038 1049 else if(type==DEF_INT64||type==DEF_QWORD||IsPtrType(type)){ 1039 if(type==DEF_PTR_ BYTE&&lpCalcIndex==LITERAL_STRING){1050 if(type==DEF_PTR_CHAR&&lpCalcIndex==LITERAL_STRING){ 1040 1051 //文字列定数のとき 1041 1052 … … 1101 1112 } 1102 1113 1103 1114 void dim(bool isRef, char *VarName,int *SubScripts,TYPEINFO &TypeInfo,int TypeSize,char *InitBuf,char *ConstractParameter,DWORD dwFlags){ 1115 extern BOOL bCompilingGlobal; 1116 if(bCompilingGlobal){ 1117 ///////////////////////// 1118 // グローバル変数 1119 ///////////////////////// 1120 1121 AddGlobalVariable(isRef,VarName,SubScripts,&TypeInfo,TypeSize,InitBuf,ConstractParameter,dwFlags); 1122 } 1123 else{ 1124 ///////////////// 1125 // ローカル変数 1126 ///////////////// 1127 1128 int i2,i3; 1129 1130 for(i2=0;i2<MaxLocalVarNum;i2++){ 1131 if(LocalVar[i2].bLiving&&obj_LexScopes.GetNowLevel()==LocalVar[i2].ScopeLevel){ 1132 if(lstrcmp(LocalVar[i2].name,VarName)==0){ 1133 //2重定義のエラー 1134 SetError(15,VarName,cp); 1135 return; 1136 } 1137 } 1138 } 1139 1140 LocalVar=(VARIABLE *)HeapReAlloc(hHeap,0,LocalVar,(MaxLocalVarNum+1)*sizeof(VARIABLE)); 1141 VARIABLE *pVar = &LocalVar[MaxLocalVarNum]; 1142 MaxLocalVarNum++; 1143 1144 if( isRef ){ 1145 //参照型 1146 pVar->fRef = REF_VARIABLE; 1147 TypeSize = PTR_SIZE; 1148 } 1149 else pVar->fRef=0; 1150 1151 for(i2=1,i3=0;i3<255;i3++){ 1152 //配列要素数 1153 pVar->SubScripts[i3]=SubScripts[i3]; 1154 1155 if(SubScripts[i3]==-1) break; 1156 i2*=SubScripts[i3]+1; 1157 } 1158 int VarSize=TypeSize*i2; 1159 if(VarSize%8) VarSize+=8-(VarSize%8); 1160 1161 //変数データを追加 1162 lstrcpy(pVar->name,VarName); 1163 if(dwFlags & DIMFLAG_CONST) pVar->bConst = true; 1164 else pVar->bConst = false; 1165 if(SubScripts[0]==-1) pVar->bArray=0; 1166 else pVar->bArray=1; 1167 pVar->type=TypeInfo.type; 1168 pVar->u.index=TypeInfo.u.lpIndex; 1169 1170 //アラインメントを考慮 1171 if( pVar->type==DEF_STRUCT ){ 1172 int alignment = pVar->u.pobj_c->iAlign; 1173 if( alignment ){ 1174 if( AllLocalVarSize % alignment ){ 1175 AllLocalVarSize += alignment - (AllLocalVarSize % alignment); 1176 } 1177 } 1178 } 1179 1180 AllLocalVarSize+=VarSize; 1181 pVar->offset=AllLocalVarSize; 1182 1183 //レキシカルスコープ 1184 pVar->ScopeLevel=obj_LexScopes.GetNowLevel(); 1185 pVar->ScopeStartAddress=obj_LexScopes.GetStartAddress(); 1186 pVar->bLiving=TRUE; 1187 1188 if(InitBuf[0]){ 1189 //初期代入時のみ、書き込みアクセスを許可する 1190 bool bConstBack = pVar->bConst; 1191 pVar->bConst = false; 1192 1193 int result = 0; 1194 if( pVar->type != DEF_OBJECT ){ 1195 result = InitLocalVar(-pVar->offset, 1196 pVar->type, 1197 pVar->u.index, 1198 pVar->SubScripts, 1199 InitBuf); 1200 } 1201 1202 if(!result){ 1203 //動的な式だった場合は代入演算を行う 1204 char temporary[8192]; 1205 sprintf(temporary,"%s=%s",VarName,InitBuf); 1206 OpcodeCalc(temporary); 1207 } 1208 1209 pVar->bConst = bConstBack; 1210 } 1211 else{ 1212 //0初期化 1213 1214 //mov r8, 0 1215 op_zero_reg( REG_R8 ); 1216 1217 //mov rdx, VarSize 1218 op_mov_RV( sizeof(_int64), REG_RDX, VarSize ); 1219 1220 //mov rcx, rsp 1221 op_mov_RR( REG_RCX, REG_RSP ); 1222 1223 //add rcx, offset 1224 op_add_RV( REG_RCX, -pVar->offset ); 1225 obp-=sizeof(long); 1226 AddLocalVarAddrSchedule(); 1227 obp+=sizeof(long); 1228 1229 //call FillMemory 1230 DECLAREINFO *pdi; 1231 pdi=GetDeclareHash("FillMemory"); 1232 op_call( pdi ); 1233 } 1234 } 1235 1236 //コンストラクタ呼び出し 1237 if(TypeInfo.type==DEF_OBJECT&&(dwFlags&DIMFLAG_NONCALL_CONSTRACTOR)==0&&InitBuf[0]=='\0'){ 1238 char objectSize[255]; 1239 if( SubScripts[0] == -1 ){ 1240 objectSize[0] = 0; 1241 } 1242 else{ 1243 if( SubScripts[1] != -1 ){ 1244 SetError(300,NULL,cp); 1245 } 1246 sprintf( objectSize, "%d", SubScripts[0] ); 1247 } 1248 Operator_New( *TypeInfo.u.pobj_Class, objectSize, ConstractParameter, TypeInfo ); 1249 1250 int type; 1251 LONG_PTR lpIndex; 1252 RELATIVE_VAR RelativeVar; 1253 GetVarOffset( true, false, VarName, &type, &RelativeVar, &lpIndex ); 1254 if( RelativeVar.dwKind == VAR_DIRECTMEM ){ 1255 SetError(); 1256 } 1257 SetVariableFromRax( DEF_OBJECT, DEF_OBJECT, &RelativeVar ); 1258 } 1259 1260 if(TypeInfo.type==DEF_OBJECT){ 1261 if(TypeInfo.u.pobj_Class->IsAbstract()){ 1262 //抽象クラスだったとき 1263 SetError(125,TypeInfo.u.pobj_Class->name,cp); 1264 } 1265 } 1266 } 1104 1267 void dim(char *Parameter,DWORD dwFlags){ 1105 1268 extern BOOL bCompilingGlobal; 1106 1269 extern HANDLE hHeap; 1107 int i2 ,i3,VarSize;1270 int i2; 1108 1271 char VarName[VN_SIZE]; 1109 1272 … … 1172 1335 TypeSize=GetTypeSize(TypeInfo.type,TypeInfo.u.lpIndex); 1173 1336 1337 extern BOOL bCompilingGlobal; 1174 1338 if(dwFlags&DIMFLAG_STATIC){ 1175 1339 if(bCompilingGlobal){ … … 1186 1350 GetNowStaticVarFullName(VarName,temporary); 1187 1351 1188 AddGlobalVariable(isRef,temporary,SubScripts,&TypeInfo,TypeSize,InitBuf,ConstractParameter,dwFlags);1352 dim( isRef,temporary,SubScripts,TypeInfo,TypeSize,InitBuf,ConstractParameter,dwFlags ); 1189 1353 1190 1354 /* … … 1194 1358 } 1195 1359 else{ 1196 if(bCompilingGlobal){ 1197 ///////////////////////// 1198 // グローバル変数 1199 ///////////////////////// 1200 1201 AddGlobalVariable(isRef,VarName,SubScripts,&TypeInfo,TypeSize,InitBuf,ConstractParameter,dwFlags); 1202 } 1203 else{ 1204 ///////////////// 1205 // ローカル変数 1206 ///////////////// 1207 1208 for(i2=0;i2<MaxLocalVarNum;i2++){ 1209 if(LocalVar[i2].bLiving&&obj_LexScopes.GetNowLevel()==LocalVar[i2].ScopeLevel){ 1210 if(lstrcmp(LocalVar[i2].name,VarName)==0){ 1211 //2重定義のエラー 1212 SetError(15,VarName,cp); 1213 return; 1214 } 1215 } 1216 } 1217 1218 LocalVar=(VARIABLE *)HeapReAlloc(hHeap,0,LocalVar,(MaxLocalVarNum+1)*sizeof(VARIABLE)); 1219 VARIABLE *pVar = &LocalVar[MaxLocalVarNum]; 1220 MaxLocalVarNum++; 1221 1222 if( isRef ){ 1223 //参照型 1224 pVar->fRef = REF_VARIABLE; 1225 TypeSize = PTR_SIZE; 1226 } 1227 else pVar->fRef=0; 1228 1229 for(i2=1,i3=0;i3<255;i3++){ 1230 //配列要素数 1231 pVar->SubScripts[i3]=SubScripts[i3]; 1232 1233 if(SubScripts[i3]==-1) break; 1234 i2*=SubScripts[i3]+1; 1235 } 1236 VarSize=TypeSize*i2; 1237 if(VarSize%8) VarSize+=8-(VarSize%8); 1238 1239 //変数データを追加 1240 lstrcpy(pVar->name,VarName); 1241 if(dwFlags & DIMFLAG_CONST) pVar->bConst = true; 1242 else pVar->bConst = false; 1243 if(SubScripts[0]==-1) pVar->bArray=0; 1244 else pVar->bArray=1; 1245 pVar->type=TypeInfo.type; 1246 pVar->u.index=TypeInfo.u.lpIndex; 1247 AllLocalVarSize+=VarSize; 1248 pVar->offset=AllLocalVarSize; 1249 1250 //レキシカルスコープ 1251 pVar->ScopeLevel=obj_LexScopes.GetNowLevel(); 1252 pVar->ScopeStartAddress=obj_LexScopes.GetStartAddress(); 1253 pVar->bLiving=TRUE; 1254 1255 if(InitBuf[0]){ 1256 //初期代入時のみ、書き込みアクセスを許可する 1257 bool bConstBack = pVar->bConst; 1258 pVar->bConst = false; 1259 1260 int result = InitLocalVar(-pVar->offset, 1261 pVar->type, 1262 pVar->u.index, 1263 pVar->SubScripts, 1264 InitBuf); 1265 1266 if(!result){ 1267 //動的な式だった場合は代入演算を行う 1268 if( isRef ){ 1269 SetRefVariable( VarName, InitBuf ); 1270 } 1271 else{ 1272 char temporary[8192]; 1273 sprintf(temporary,"%s=%s",VarName,InitBuf); 1274 OpcodeCalc(temporary); 1275 } 1276 } 1277 1278 pVar->bConst = bConstBack; 1279 } 1280 else{ 1281 //0初期化 1282 1283 //mov r8, 0 1284 op_zero_reg( REG_R8 ); 1285 1286 //mov rdx, VarSize 1287 op_mov_RV( sizeof(_int64), REG_RDX, VarSize ); 1288 1289 //mov rcx, rsp 1290 op_mov_RR( REG_RCX, REG_RSP ); 1291 1292 //add rcx, offset 1293 op_add64_value( REG_RCX, -pVar->offset ); 1294 obp-=sizeof(long); 1295 AddLocalVarAddrSchedule(); 1296 obp+=sizeof(long); 1297 1298 //call FillMemory 1299 DECLAREINFO *pdi; 1300 pdi=GetDeclareHash("FillMemory"); 1301 op_call( pdi ); 1302 } 1303 } 1304 1305 //コンストラクタ呼び出し 1306 if(TypeInfo.type==DEF_OBJECT&&(dwFlags&DIMFLAG_NONCALL_CONSTRACTOR)==0&& isRef == false ){ 1307 CallConstructor(VarName,SubScripts,TypeInfo,ConstractParameter); 1308 } 1309 } 1310 1311 if(TypeInfo.type==DEF_OBJECT){ 1312 if(TypeInfo.u.pobj_Class->IsAbstract()){ 1313 //抽象クラスだったとき 1314 SetError(125,TypeInfo.u.pobj_Class->name,cp); 1315 } 1360 dim( isRef,VarName,SubScripts,TypeInfo,TypeSize,InitBuf,ConstractParameter,dwFlags ); 1316 1361 } 1317 1362 } … … 1362 1407 1363 1408 //mov reg,r11 1364 op_mov 64_ToReg_FromReg(reg,REG_R11);1409 op_mov_RR(reg,REG_R11); 1365 1410 } 1366 1411 else{ … … 1404 1449 1405 1450 //mov reg,r11 1406 op_mov 64_ToReg_FromReg(reg,REG_R11);1451 op_mov_RR(reg,REG_R11); 1407 1452 } 1408 1453 else{ 1409 1454 //mov reg,rsp 1410 op_mov 64_ToReg_FromReg(reg,REG_RSP);1455 op_mov_RR(reg,REG_RSP); 1411 1456 1412 1457 //add reg,offset 1413 op_add 64_value(reg,(int)pRelativeVar->offset);1458 op_add_RV(reg,(int)pRelativeVar->offset); 1414 1459 obp-=sizeof(long); 1415 1460 AddLocalVarAddrSchedule(); … … 1441 1486 directmem: 1442 1487 //mov reg,r11 1443 op_mov 64_ToReg_FromReg(reg,REG_R11);1488 op_mov_RR(reg,REG_R11); 1444 1489 } 1445 1490 } -
BasicCompiler64/MakePeHdr.cpp
r56 r64 19 19 *pSub_calloc, 20 20 *pSub_realloc, 21 *pSub_free; 21 *pSub_free, 22 *pSub_System_GC_malloc_ForObject, 23 *pSub_System_GC_malloc_ForObjectPtr, 24 *pSub_System_GC_free_for_SweepingDelete; 22 25 23 26 … … 215 218 pSub_free->bUse=1; 216 219 220 if( pSub_System_GC_malloc_ForObject = GetSubHash( "_System_GC_malloc_ForObject",1 ) ) 221 pSub_System_GC_malloc_ForObject->bUse = 1; 222 223 if( pSub_System_GC_malloc_ForObjectPtr = GetSubHash( "_System_GC_malloc_ForObjectPtr",1 ) ) 224 pSub_System_GC_malloc_ForObjectPtr->bUse = 1; 225 226 if( pSub_System_GC_free_for_SweepingDelete = GetSubHash( "_System_GC_free_for_SweepingDelete",1 ) ) 227 pSub_System_GC_free_for_SweepingDelete->bUse = 1; 228 217 229 218 230 … … 345 357 346 358 //add rsp,スタックフレームサイズ 347 op_add 64_value(REG_RSP,pobj_sf->GetFrameSize());359 op_add_RV(REG_RSP,pobj_sf->GetFrameSize()); 348 360 349 361 //xor rax,rax(raxを0に初期化する) -
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; -
BasicCompiler64/NumOpe_Arithmetic.cpp
r56 r64 108 108 else if(idCalc==CALC_PRODUCT){ 109 109 //mul reg1,reg2 110 op_imul_ reg(sizeof(_int64),reg1,reg2);110 op_imul_RR(sizeof(_int64),reg1,reg2); 111 111 } 112 112 … … 131 131 else if(idCalc==CALC_PRODUCT){ 132 132 //mul reg1,reg2 133 op_imul_ reg(sizeof(long),reg1,reg2);133 op_imul_RR(sizeof(long),reg1,reg2); 134 134 } 135 135 … … 177 177 if(reg2==REG_RAX||reg2==REG_RDX){ 178 178 //mov r15,reg2 179 op_mov 64_ToReg_FromReg(REG_R15,reg2);179 op_mov_RR(REG_R15,reg2); 180 180 181 181 reg2=REG_R15; … … 203 203 204 204 //mov rax,reg1 205 op_mov 64_ToReg_FromReg(REG_RAX,reg1);205 op_mov_RR(REG_RAX,reg1); 206 206 207 207 if(IsSignedType(type[sp-2])){ … … 231 231 232 232 //mov reg1,rdx 233 op_mov 64_ToReg_FromReg(reg1,REG_RDX);233 op_mov_RR(reg1,REG_RDX); 234 234 235 235 } … … 353 353 if(reg2==REG_RAX||reg2==REG_RDX){ 354 354 //mov r15,reg2 355 op_mov 64_ToReg_FromReg(REG_R15,reg2);355 op_mov_RR(REG_R15,reg2); 356 356 357 357 reg2=REG_R15; … … 379 379 380 380 //mov rax,reg1 381 op_mov 64_ToReg_FromReg(REG_RAX,reg1);381 op_mov_RR(REG_RAX,reg1); 382 382 383 383 if(IsSignedType(type[sp-2])){ … … 407 407 408 408 //mov reg1,rax 409 op_mov 64_ToReg_FromReg(reg1,REG_RAX);409 op_mov_RR(reg1,REG_RAX); 410 410 411 411 } … … 495 495 496 496 //imul reg,-1 497 op_imul_ value(sizeof(_int64),reg,-1);497 op_imul_RV(sizeof(_int64),reg,-1); 498 498 499 499 if(reg==REG_R14){ … … 508 508 509 509 //imul reg,-1 510 op_imul_ value(sizeof(long),reg,-1);510 op_imul_RV(sizeof(long),reg,-1); 511 511 512 512 if(reg==REG_R14){ … … 617 617 if(reg1==REG_RCX){ 618 618 //mov r15,rcx 619 op_mov 64_ToReg_FromReg(REG_R15,REG_RCX);619 op_mov_RR(REG_R15,REG_RCX); 620 620 621 621 reg1=REG_R15; … … 629 629 630 630 //mov rcx,reg2 631 op_mov 64_ToReg_FromReg(REG_RCX,reg2);631 op_mov_RR(REG_RCX,reg2); 632 632 633 633 if(idCalc==CALC_SHL){ … … 662 662 if(sw==0){ 663 663 //mov rcx,r15 664 op_mov 64_ToReg_FromReg(REG_RCX,REG_R15);664 op_mov_RR(REG_RCX,REG_R15); 665 665 } 666 666 else{ -
BasicCompiler64/NumOpe_Logical.cpp
r36 r64 112 112 113 113 //add rax, 1 114 op_add 64_value( REG_RAX, 1 );114 op_add_RV( REG_RAX, 1 ); 115 115 116 116 if( reg != REG_RAX ){ -
BasicCompiler64/Opcode.h
r62 r64 125 125 void SetLocalParmSize(int size); 126 126 int GetFrameSize(); 127 int GetNowSp(); 128 void mov_sp( int reg ); 127 129 int push(int reg); 128 130 void push(int xmm_reg,int var_size); … … 130 132 void ref(int reg); 131 133 void ref(int xmm_reg,int var_size); 132 void pop(int reg );134 void pop(int reg = REG_NON); 133 135 void pop(int xmm_reg,int var_size); 134 136 void parameter_allocate(int size); … … 247 249 void SetVariableFromRax(int VarType,int CalcType,RELATIVE_VAR *pRelativeVar); 248 250 void OpcodeCalc(char *Command); 249 void SetRefVariable( const char *varname, const char *expression );250 251 251 252 //NumOpe.cpp … … 285 286 //Compile_Set_Var.cpp 286 287 BOOL IsUse_r11(RELATIVE_VAR *pRelativeVar); 287 void SetObjectVariableFromRax(LONG_PTR lpVarIndex,int CalcType,LONG_PTR lpCalcIndex,RELATIVE_VAR *pRelativeVar,BOOL bUseHeap); 288 void SetDoubleVariable(int type,RELATIVE_VAR *pRelative); 289 void SetSingleVariable(int type,RELATIVE_VAR *pRelative); 288 void SetStructVariableFromRax(LONG_PTR lpVarIndex,int CalcType,LONG_PTR lpCalcIndex,RELATIVE_VAR *pRelativeVar,BOOL bUseHeap); 289 void SetRealVariable(int VarType, int CalcType, RELATIVE_VAR *pRelativeVar); 290 290 void SetBooleanVariable(int type,RELATIVE_VAR *pRelative); 291 291 void SetWholeVariable(int var_size,int type,RELATIVE_VAR *pRelative); … … 307 307 308 308 //Compile_Object.cpp 309 int Operator_New(const char *Parameter,LONG_PTR *plpIndex); 310 void OpcodeDelete(const char *Parameter); 309 void Operator_New( CClass &classObj, const char *objectSizeStr, const char *parameter,const TYPEINFO &baseTypeInfo ); 310 int Operator_New(const char *Parameter,LONG_PTR *plpIndex,const TYPEINFO &baseTypeInfo ); 311 void OpcodeDelete(const char *Parameter, bool isSweeping); 311 312 312 313 //Compile_Var.cpp … … 319 320 #define DIMFLAG_STATIC 0x04 320 321 #define DIMFLAG_CONST 0x08 322 void dim(bool isRef, char *VarName,int *SubScripts,TYPEINFO &TypeInfo,int TypeSize,char *InitBuf,char *ConstractParameter,DWORD dwFlags); 321 323 void OpcodeDim(char *Parameter,DWORD dwFlag); 322 324 void SetVarPtrToReg(int reg,RELATIVE_VAR *pRelativeVar); 323 325 324 326 //CParameter.cpp 327 #define OVERLOAD_MIN_LEVEL 0 328 #define OVERLOAD_MAX_LEVEL 3 329 #define OVERLOAD_LEVEL0 0 325 330 #define OVERLOAD_LEVEL1 1 326 331 #define OVERLOAD_LEVEL2 2 … … 352 357 BOOL ErrorCheck(const char *FuncName,PARAMETER_INFO *ppi,int pi_num,int SecondParmNum); 353 358 void MacroParameterSupport(PARAMETER_INFO *ppi); 354 void Set ObjectParameter(int reg,CClass *pobj_Class,LPSTR Parameter);359 void SetStructParameter(int reg,CClass *pobj_Class,LPSTR Parameter); 355 360 356 361 //一時オブジェクトパラメータの生成と破棄 357 voidNewTempParameters( const char *FuncName,PARAMETER_INFO *ppi,int pi_num,int SecondParmNum );362 int NewTempParameters( const char *FuncName,PARAMETER_INFO *ppi,int pi_num,int SecondParmNum ); 358 363 void DeleteTempParameters(); 359 364 … … 380 385 #define PROCFLAG_NEW 1 381 386 int Opcode_CallProcPtr(char *variable,char *Parameter,PROCPTRINFO *pi,LONG_PTR *plpIndex); 382 void Opcode_CallProc(c har *Parameter,SUBINFO *psi,DWORD dwFlags,char *ObjectName,int RefType);387 void Opcode_CallProc(const char *Parameter,SUBINFO *psi,DWORD dwFlags,char *ObjectName,int RefType); 383 388 int Opcode_CallDllProc(char *Parameter,DECLAREINFO *pdi,LONG_PTR *plpIndex); 384 389 … … 410 415 void OpcodeGosub(char *Parameter); 411 416 void OpcodeReturn(char *Parameter); 412 void Opcode_Input(c har *Parameter);413 void Opcode_Print(c har *Parameter,BOOL bWrite);417 void Opcode_Input(const char *Parameter); 418 void Opcode_Print(const char *Parameter,BOOL bWrite); 414 419 void OpcodeCallPtr(char *Parameter); 415 420 void OpcodeSetPtrData(char *Parameter,int type); … … 450 455 void op_mov64_ToReg (int reg,_int64 i64data); 451 456 void op_mov64_ToReg (int reg,int i32data); 452 void op_mov64_ToReg_FromReg (int reg1,int reg2);453 457 void op_movsxd (int reg64,int reg32); 454 458 void op_movsx64_FromReg16 (int reg64,int reg16); … … 460 464 void op_dec (int reg); 461 465 void op_add_RM (int op_size,int reg,int base_reg,int offset,char mod); 462 void op_add 64_value(int reg,int offset);466 void op_add_RV (int reg,int offset); 463 467 void op_add64_reg (int reg1,int reg2); 464 468 void op_add32_reg (int reg1,int reg2); … … 467 471 void op_sub32_reg (int reg1,int reg2); 468 472 void op_sbb_RR ( int op_size, int reg1, int reg2 ); 469 void op_imul_ reg(int op_size,int reg1,int reg2);470 void op_imul_ value(int op_size,int reg,int i32data);473 void op_imul_RR (int op_size,int reg1,int reg2); 474 void op_imul_RV (int op_size,int reg,int i32data); 471 475 void op_div64_reg (int reg); 472 476 void op_idiv64_reg (int reg); -
BasicCompiler64/OperatorProc.cpp
r63 r64 55 55 if(pBaseTypeInfo){ 56 56 if(pBaseTypeInfo->type==DEF_OBJECT){ 57 bReturnTypeIsObject=1;58 57 ReturnType.u.lpIndex=pBaseTypeInfo->u.lpIndex; 59 58 } … … 113 112 HeapDefaultFree(ppi); 114 113 115 int right_side_size;116 if(type[sp-1]==DEF_OBJECT) right_side_size=PTR_SIZE;117 else right_side_size=GetTypeSize(type[sp-1],index_stack[sp-1]);118 119 114 if(bTwoTerm){ 120 if(psi->p ParmInfo[1].type==DEF_OBJECT&&psi->pParmInfo[1].bByVal){115 if(psi->pRealParmInfo[1].type==DEF_STRUCT&&psi->pRealParmInfo[1].bByVal){ 121 116 //一時オブジェクトはメソッド内で破棄される 122 117 bUseHeap[sp-1]=0; … … 124 119 } 125 120 126 127 if(psi->ReturnType==DEF_OBJECT){ 128 ////////////////////////////////////////////////////// 129 // 戻り値にオブジェクト インスタンスを持つ場合 130 // ※ByRef _System_ReturnObject パラメータ用領域を取得 121 if(psi->ReturnType==DEF_STRUCT){ 122 ////////////////////////////////////////////////////// 123 // 戻り値に構造体インスタンスを持つ場合 124 // ※ByRef _System_ReturnValue パラメータ用領域を取得 131 125 ////////////////////////////////////////////////////// 132 126 … … 154 148 }//////////////////////////////////////////// 155 149 } 156 157 150 158 151 int reg1,reg2; … … 161 154 SetOneTermToReg_Whole64Calc(type[sp-1],®2); 162 155 pobj_reg->UnlockReg(); 156 if( !psi->pRealParmInfo[1].bByVal ){ 157 //一時参照を作成 158 pobj_sf->push( reg2 ); 159 pobj_sf->mov_sp( reg2 ); 160 } 163 161 } 164 162 … … 192 190 193 191 if(bTwoTerm){ 194 if(psi->ReturnType==DEF_ OBJECT){192 if(psi->ReturnType==DEF_STRUCT){ 195 193 //mov r8,reg2 196 194 op_mov_RR(REG_R8,reg2); … … 202 200 } 203 201 204 if(psi->ReturnType==DEF_ OBJECT){202 if(psi->ReturnType==DEF_STRUCT){ 205 203 //mov rdx,r13 206 204 op_mov_RR(REG_RDX,REG_R13); … … 213 211 op_call(psi); 214 212 215 if(psi->ReturnType!= -1){213 if(psi->ReturnType!=DEF_NON){ 216 214 //戻り値を一時的に退避 217 215 … … 254 252 } 255 253 256 if(psi->ReturnType!=-1){ 254 if(bTwoTerm){ 255 if( !psi->pRealParmInfo[1].bByVal ){ 256 //一時参照を破棄 257 pobj_sf->pop(); 258 } 259 } 260 261 if(psi->ReturnType!=DEF_NON){ 257 262 //戻り値をreg1にセット 258 263 reg1=pobj_reg->LockReg(); … … 266 271 index_stack[sp-1]=psi->u.ReturnIndex; 267 272 268 if(psi->ReturnType==DEF_ OBJECT){269 // Object型が戻ったときはヒープ領域にインスタンスが格納されている273 if(psi->ReturnType==DEF_STRUCT){ 274 //構造体が戻ったときはヒープ領域にインスタンスが格納されている 270 275 //※後にfreeする必要あり 271 276 bUseHeap[sp-1]=1; -
BasicCompiler64/WatchList.cpp
r63 r64 78 78 if(PTR_LEVEL(*pType)){ 79 79 *pType=MAKE_PTR_TYPE(NATURAL_TYPE(*pType),PTR_LEVEL(*pType)-1); 80 if((*pType)==DEF_OBJECT){ 81 CClass *pClass = (CClass *)lpIndex; 82 array_num *= pClass->GetSize(); 83 } 84 else{ 85 array_num *= GetTypeSize(*pType,-1); 86 } 80 array_num *= GetTypeSize(*pType,-1); 87 81 } 88 82 else{ … … 114 108 char lpPtrOffset[VN_SIZE]; //第2次配列 115 109 char NestMember[VN_SIZE]; //入れ子メンバ 116 int RefType; //"."参照のときは0、"->"参照のときは1110 CClass::RefType refType; 117 111 lstrcpy(VarName,member); 118 if(!GetVarFormatString(VarName,array,lpPtrOffset,NestMember, &RefType)) return 0;112 if(!GetVarFormatString(VarName,array,lpPtrOffset,NestMember, refType ) ) return 0; 119 113 120 114 … … 175 169 //入れ子構造の場合 176 170 177 if(*pType==DEF_OBJECT){ 178 if(RefType!=DEF_OBJECT) return 0; 179 } 180 else if(*pType==DEF_PTR_OBJECT){ 171 if(*pType==DEF_OBJECT || *pType==DEF_STRUCT){ 172 if( refType != CClass::Dot ) return 0; 173 174 if( *pType==DEF_OBJECT ){ 175 extern HANDLE hDebugProcess; 176 LONG_PTR lpData; 177 SIZE_T stAccBytes; 178 lpData=Debugging_GetVarPtr(pRelativeVar); 179 if(!ReadProcessMemory(hDebugProcess,(void *)lpData,&pRelativeVar->offset,sizeof(LONG_PTR),&stAccBytes)) return -1; 180 pRelativeVar->dwKind=VAR_DIRECTMEM; 181 } 182 } 183 else if(*pType==DEF_PTR_OBJECT || *pType==DEF_PTR_STRUCT){ 181 184 //構造体ポインタ型メンバ変数 182 185 183 186 if(lpPtrOffset[0]){ 184 if( RefType!=DEF_OBJECT) return 0;187 if( refType != CClass::Dot ) return 0; 185 188 186 189 //直接参照に切り替え … … 190 193 } 191 194 else{ 192 if( RefType!=DEF_PTR_OBJECT) return 0;195 if( refType != CClass::Pointer ) return 0; 193 196 194 197 extern HANDLE hDebugProcess; … … 320 323 int Debugging_GetVarOffset(char *variable,int *pType,RELATIVE_VAR *pRelativeVar,LONG_PTR *plpIndex,int *pss){ 321 324 extern HANDLE hDebugProcess; 322 int i,i2,i3 ,RefType;325 int i,i2,i3; 323 326 char member[VN_SIZE],VarName[VN_SIZE],array[VN_SIZE],lpPtrOffset[VN_SIZE]; 324 327 LONG_PTR lpData; … … 326 329 327 330 lstrcpy(VarName,variable); 328 GetVarFormatString(VarName,array,lpPtrOffset,member,&RefType); 331 CClass::RefType refType; 332 GetVarFormatString(VarName,array,lpPtrOffset,member,refType); 329 333 330 334 LONG_PTR lpIndex; … … 474 478 } 475 479 if(member[0]){ 476 if(*pType==DEF_OBJECT ){480 if(*pType==DEF_OBJECT || *pType==DEF_STRUCT){ 477 481 //実態オブジェクトのメンバを参照(obj.member) 478 if( RefType!=DEF_OBJECT){482 if( refType != CClass::Dot ){ 479 483 return 0; 480 484 } … … 493 497 *plpIndex=lp2; 494 498 } 495 else if(*pType==DEF_PTR_OBJECT ){499 else if(*pType==DEF_PTR_OBJECT || *pType==DEF_PTR_STRUCT){ 496 500 //ポインタオブジェクトが示すメンバを参照 497 501 if(lpPtrOffset[0]){ 498 502 //pObj[n].member 499 if( RefType!=DEF_OBJECT) return 0;503 if( refType != CClass::Dot ) return 0; 500 504 Debugging_SetRelativeOffset(pType,lpIndex,pRelativeVar,lpPtrOffset); 501 505 … … 515 519 else{ 516 520 //pObj->member 517 if( RefType!=DEF_PTR_OBJECT) return 0;521 if( refType != CClass::Pointer ) return 0; 518 522 519 523 pRelativeVar->offset=Debugging_GetVarPtr(pRelativeVar); -
BasicCompiler64/amd64_main.cpp
r36 r64 424 424 425 425 void op_mov_RR(int reg1,int reg2){ 426 op_mov64_ToReg_FromReg(reg1,reg2); 426 //mov reg1,reg2 427 char RexByte=-1; 428 429 if(reg1==reg2) return; 430 431 if(REG_RAX<=reg1&®1<=REG_RDI){ 432 if(REG_RAX<=reg2&®2<=REG_RDI) RexByte=(char)0x48; 433 if(REG_R8<=reg2&®2<=REG_R15) RexByte=(char)0x49; 434 } 435 if(REG_R8<=reg1&®1<=REG_R15){ 436 if(REG_RAX<=reg2&®2<=REG_RDI) RexByte=(char)0x4C; 437 if(REG_R8<=reg2&®2<=REG_R15) RexByte=(char)0x4D; 438 } 439 440 if(RexByte==-1) SetError(300,NULL,cp); 441 442 // [8bit rex] 1000 1011 11xx xbbb 443 OpBuffer[obp++]=RexByte; 444 OpBuffer[obp++]=(char)0x8B; 445 OpBuffer[obp++]=(char)(0xC0| REGISTER_OPERAND(reg1)<<3 | REGISTER_OPERAND(reg2)); 427 446 } 428 447 … … 475 494 } 476 495 } 477 void op_mov64_ToReg_FromReg(int reg1,int reg2){478 //mov reg1,reg2479 char RexByte=-1;480 481 if(reg1==reg2) return;482 483 if(REG_RAX<=reg1&®1<=REG_RDI){484 if(REG_RAX<=reg2&®2<=REG_RDI) RexByte=(char)0x48;485 if(REG_R8<=reg2&®2<=REG_R15) RexByte=(char)0x49;486 }487 if(REG_R8<=reg1&®1<=REG_R15){488 if(REG_RAX<=reg2&®2<=REG_RDI) RexByte=(char)0x4C;489 if(REG_R8<=reg2&®2<=REG_R15) RexByte=(char)0x4D;490 }491 492 if(RexByte==-1) SetError(300,NULL,cp);493 494 // [8bit rex] 1000 1011 11xx xbbb495 OpBuffer[obp++]=RexByte;496 OpBuffer[obp++]=(char)0x8B;497 OpBuffer[obp++]=(char)(0xC0| REGISTER_OPERAND(reg1)<<3 | REGISTER_OPERAND(reg2));498 }499 496 void op_movsxd(int reg64,int reg32){ 500 497 //movsxd reg64,reg32 … … 686 683 } 687 684 688 void op_add 64_value(int reg,int offset){685 void op_add_RV(int reg,int offset){ 689 686 //add reg,offset 690 687 char RexByte=-1; … … 843 840 //////////////////////// 844 841 845 void op_imul_ reg(int op_size,int reg1,int reg2){842 void op_imul_RR(int op_size,int reg1,int reg2){ 846 843 //imul reg1,reg2 847 844 char RexByte=-1; … … 881 878 OpBuffer[obp++]=(char)(0xC0| REGISTER_OPERAND(reg1)<<3 | REGISTER_OPERAND(reg2)); 882 879 } 883 void op_imul_ value(int op_size,int reg,int i32data){880 void op_imul_RV(int op_size,int reg,int i32data){ 884 881 //imul reg,i32data 885 882 char RexByte=-1; -
BasicCompiler64/stack_frame.cpp
r20 r64 38 38 } 39 39 return -(answer_sp-0x08); 40 } 41 int CStackFrame::GetNowSp(){ 42 return now_sp; 43 } 44 void CStackFrame::mov_sp( int reg ){ 45 //mov reg,rsp 46 op_mov_RR( reg, REG_RSP ); 47 48 //add reg,now_sp 49 op_add_RV( reg, now_sp ); 50 51 //スケジュールをセット 52 obp-=sizeof(long); 53 add(); 54 obp+=sizeof(long); 40 55 } 41 56 int CStackFrame::push(int reg){ -
BasicCompiler64/varlist.cpp
r63 r64 22 22 _int64 i64data; 23 23 24 if(type==DEF_OBJECT){ 24 if(type==DEF_OBJECT||type==DEF_STRUCT){ 25 if( type==DEF_OBJECT ){ 26 // 参照型ということを考慮する 27 ReadProcessMemory(hDebugProcess,(void *)offset,&pData,sizeof(void *),&stAccBytes); 28 offset = pData; 29 } 30 25 31 sprintf(lptv->item.pszText,"%s %s(&H%X)",VarName,STRING_OBJECT,(DWORD64)offset); 26 32 lptv->item.iImage=1; … … 31 37 return; 32 38 } 33 if(type==DEF_PTR_OBJECT ){39 if(type==DEF_PTR_OBJECT||type==DEF_PTR_STRUCT){ 34 40 i2=ReadProcessMemory(hDebugProcess,(void *)offset,&pData,sizeof(void *),&stAccBytes); 35 41 … … 43 49 } 44 50 else{ 45 if(type==DEF_PTR_ BYTE){51 if(type==DEF_PTR_CHAR||type==MAKE_PTR_TYPE(DEF_BYTE,1)){ 46 52 if(ReadProcessMemory(hDebugProcess,(void *)offset,&pData,sizeof(void *),&stAccBytes)){ 47 53 for(i2=0;;i2++){
Note:
See TracChangeset
for help on using the changeset viewer.