Changeset 109 in dev
- Timestamp:
- May 6, 2007, 7:09:04 PM (18 years ago)
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
BasicCompiler32/Compile_Func.cpp
r97 r109 12 12 case FUNC_SIZEOF: 13 13 case FUNC_VARPTR: 14 case FUNC_OBJPTR: 14 15 return DEF_DWORD; 15 16 case FUNC_GETDOUBLE: … … 35 36 if(lstrcmpi(FuncName,"SizeOf")==0) return FUNC_SIZEOF; 36 37 if(lstrcmpi(FuncName,"VarPtr")==0) return FUNC_VARPTR; 38 if(lstrcmpi(FuncName,"ObjPtr")==0) return FUNC_OBJPTR; 37 39 if(lstrcmpi(FuncName,"GetDouble")==0) return FUNC_GETDOUBLE; 38 40 if(lstrcmpi(FuncName,"GetSingle")==0) return FUNC_GETSINGLE; … … 376 378 SetVarPtrToEax(&RelativeVar); 377 379 380 // TODO: 取り除く(この動きはObjPtrに託す) 378 381 if( beforeType == DEF_OBJECT && lstrcmpi( Parameter, "This" ) != 0 ){ 379 382 //参照をオブジェクトポインタに変更 … … 381 384 //mov eax,dword ptr[eax] 382 385 op_mov_RM( sizeof(long), REG_EAX, REG_EAX, 0, MOD_BASE ); 386 } 387 } 388 void Opcode_Func_ObjPtr( const char *Parameter, Type &resultType, bool isCallOn ){ 389 if( isCallOn == false ){ 390 // 戻り値の型を取得するだけ 391 392 //変数のアドレスを取得 393 if(!GetVarType( Parameter, resultType, true )) return; 394 395 resultType.PtrLevelUp(); 396 397 return; 398 } 399 400 RELATIVE_VAR RelativeVar; 401 402 //変数のアドレスを取得 403 if(!GetVarOffsetReadOnly( Parameter, &RelativeVar, resultType )) return; 404 405 int beforeType = resultType.GetBasicType(); 406 407 resultType.PtrLevelUp(); 408 409 SetVarPtrToEax(&RelativeVar); 410 411 if( beforeType == DEF_OBJECT && lstrcmpi( Parameter, "This" ) != 0 ){ 412 //参照をオブジェクトポインタに変更 413 414 //mov eax,dword ptr[eax] 415 op_mov_RM( sizeof(long), REG_EAX, REG_EAX, 0, MOD_BASE ); 416 } 417 else{ 418 SetError(134,NULL,cp ); 383 419 } 384 420 } … … 472 508 Opcode_Func_VarPtr( Parameter, resultType, isCallOn ); 473 509 break; 510 case FUNC_OBJPTR: 511 Opcode_Func_ObjPtr( Parameter, resultType, isCallOn ); 512 break; 474 513 475 514 case FUNC_GETDOUBLE: -
BasicCompiler32/FunctionValue.h
r3 r109 10 10 //メモリ操作 11 11 #define FUNC_VARPTR 0x0591 12 #define FUNC_OBJPTR 0x0592 12 13 13 14 //その他 -
BasicCompiler64/Compile_Func.cpp
r97 r109 10 10 case FUNC_ADDRESSOF: 11 11 case FUNC_VARPTR: 12 case FUNC_OBJPTR: 12 13 return DEF_PTR_VOID; 13 14 case FUNC_GETDOUBLE: … … 31 32 if(lstrcmpi(FuncName,"SizeOf")==0) return FUNC_SIZEOF; 32 33 if(lstrcmpi(FuncName,"VarPtr")==0) return FUNC_VARPTR; 34 if(lstrcmpi(FuncName,"ObjPtr")==0) return FUNC_OBJPTR; 33 35 if(lstrcmpi(FuncName,"GetDouble")==0) return FUNC_GETDOUBLE; 34 36 if(lstrcmpi(FuncName,"GetSingle")==0) return FUNC_GETSINGLE; … … 221 223 SetVarPtrToReg(REG_RAX,&RelativeVar); 222 224 225 // TODO: 取り除く(この動きはObjPtrに託す) 223 226 if( beforeType == DEF_OBJECT && lstrcmpi( Parameter, "This" ) != 0 ){ 224 227 //参照をオブジェクトポインタに変更 … … 226 229 //mov rax,qword ptr[rax] 227 230 op_mov_RM( sizeof(_int64), REG_RAX, REG_RAX, 0, MOD_BASE ); 231 } 232 } 233 void Opcode_Func_ObjPtr( const char *Parameter, Type &resultType, bool isCallOn ){ 234 if( isCallOn == false ){ 235 // 戻り値の型を取得するだけ 236 237 //変数のアドレスを取得 238 if(!GetVarType( Parameter, resultType, true )) return; 239 240 resultType.PtrLevelUp(); 241 242 return; 243 } 244 245 RELATIVE_VAR RelativeVar; 246 247 //変数のアドレスを取得 248 if(!GetVarOffsetReadOnly( Parameter, &RelativeVar, resultType )) return; 249 250 int beforeType = resultType.GetBasicType(); 251 252 resultType.PtrLevelUp(); 253 254 SetVarPtrToReg(REG_RAX,&RelativeVar); 255 256 if( beforeType == DEF_OBJECT && lstrcmpi( Parameter, "This" ) != 0 ){ 257 //参照をオブジェクトポインタに変更 258 259 //mov rax,qword ptr[rax] 260 op_mov_RM( sizeof(_int64), REG_RAX, REG_RAX, 0, MOD_BASE ); 261 } 262 else{ 263 SetError(134,NULL,cp ); 228 264 } 229 265 } … … 270 306 Opcode_Func_VarPtr( Parameter, resultType, isCallOn ); 271 307 break; 308 case FUNC_OBJPTR: 309 Opcode_Func_ObjPtr( Parameter, resultType, isCallOn ); 310 break; 272 311 273 312 case FUNC_GETDOUBLE: -
BasicCompiler64/FunctionValue.h
r3 r109 9 9 //メモリ操作 10 10 #define FUNC_VARPTR 0x0591 11 #define FUNC_OBJPTR 0x0592 11 12 12 13 //その他 -
BasicCompiler_Common/error.cpp
r107 r109 188 188 if(num==132) lstrcpy(msg,"明示的なコンストラクタ呼び出しと初期値の指定を同時に行うことはできません。"); 189 189 if(num==133) lstrcpy(msg,"Thisに代入はできません。"); 190 if(num==134) lstrcpy( msg,"ObjPtr関数にはオブジェクト インスタンス以外を指定できません。" ); 190 191 191 192 //Enum関連
Note:
See TracChangeset
for help on using the changeset viewer.