Changeset 40 in dev for BasicCompiler32/Compile_Calc.cpp
- Timestamp:
- Jan 28, 2007, 3:48:22 AM (18 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
BasicCompiler32/Compile_Calc.cpp
r36 r40 600 600 } 601 601 } 602 603 void SetRefVariable( const char *varname, const char *expression ){ 604 //////////////////////////////////////// 605 // 変数のタイプ型を識別して、演算を行う 606 //////////////////////////////////////// 607 608 int VarType,CalcType; 609 LONG_PTR lpVarIndex,lpCalcIndex; 610 RELATIVE_VAR VarRelativeVar; 611 BOOL bCalcUseHeap; 612 613 //型を識別 614 VarType=GetVarType(varname,&lpVarIndex,0); 615 if(VarType==-1){ 616 SetError(300,NULL,cp); 617 return; 618 } 619 620 extern LONG_PTR ProcPtr_BaseIndex; 621 if(VarType==DEF_PTR_PROC) ProcPtr_BaseIndex=lpVarIndex; 622 else ProcPtr_BaseIndex=-1; 623 624 if(VarType==DEF_OBJECT){ 625 //代入演算のオーバーロード オペレータに備える 626 627 //変数アドレスを取得 628 if(!GetVarOffsetReadWrite( 629 varname, 630 &VarType, 631 &VarRelativeVar, 632 &lpVarIndex)) return; 633 634 SetVarPtrToEax(&VarRelativeVar); 635 636 //push eax 637 op_push(REG_EAX); 638 } 639 640 641 //NumOpe...(スタックに答えが格納される) 642 CalcType=NumOpe(expression,VarType,lpVarIndex,&lpCalcIndex,&bCalcUseHeap); 643 if(VarType==-1||CalcType==-1) return; 644 645 //変数アドレスを取得 646 if(!GetVarOffsetReadWrite( 647 varname, 648 &VarType, 649 &VarRelativeVar, 650 &lpVarIndex)) return; 651 652 if(VarType&FLAG_PTR){ 653 SetError(14,varname,cp); 654 return; 655 } 656 657 658 if( VarType == DEF_OBJECT && VarRelativeVar.dwKind == VAR_REFLOCAL ){ 659 // 参照型オブジェクトへの代入(初期化)はポインタ変数と同様の処理に値する 660 VarType = PTR_LEVEL_UP( VarType ); 661 662 VarRelativeVar.dwKind = VAR_LOCAL; 663 664 if( CalcType == DEF_OBJECT ){ 665 //右辺値が実体オブジェクトのときは、参照をコピー 666 CalcType = PTR_LEVEL_UP( DEF_OBJECT ); 667 } 668 } 669 else{ 670 SetError(300,NULL,cp); 671 } 672 673 674 ///////////////////////////////// 675 // 右辺、左辺の型チェックを行う 676 ///////////////////////////////// 677 678 CheckDifferentType(VarType,lpVarIndex,CalcType,lpCalcIndex,0,0); 679 680 681 ///////////////////////////////////////////////// 682 // スタックの内容を変数にコピーするコードを抽出 683 ///////////////////////////////////////////////// 684 685 if(VarType==DEF_BOOLEAN){ 686 //bool 687 SetBooleanVariable(CalcType,&VarRelativeVar); 688 } 689 else if(VarType==DEF_CHAR||VarType==DEF_BYTE){ 690 //8ビット整数型変数へスタックの内容を格納する 691 Set8Variable(CalcType,VarRelativeVar.dwKind,VarRelativeVar.offset,VarRelativeVar.bOffsetOffset); 692 } 693 else if(VarType==DEF_INTEGER||VarType==DEF_WORD){ 694 //16ビット整数型変数へスタックの内容を格納する 695 Set16Variable(CalcType,VarRelativeVar.dwKind,VarRelativeVar.offset,VarRelativeVar.bOffsetOffset); 696 } 697 else if(VarType==DEF_LONG||VarType==DEF_DWORD||IsPtrType(VarType)){ 698 //32ビット整数型変数へスタックの内容を格納する 699 if(VarType==DEF_LONG) 700 SetLongVariable(CalcType,VarRelativeVar.dwKind,VarRelativeVar.offset,VarRelativeVar.bOffsetOffset); 701 else 702 SetDWordVariable(CalcType,VarRelativeVar.dwKind,VarRelativeVar.offset,VarRelativeVar.bOffsetOffset); 703 } 704 else if(VarType==DEF_INT64||VarType==DEF_QWORD){ 705 //64ビット整数型変数へスタックの内容を格納する 706 SetInt64Variable(CalcType,&VarRelativeVar); 707 } 708 else if(VarType==DEF_DOUBLE){ 709 //Double型変数へスタックの内容を格納する 710 SetDoubleVariable(CalcType,VarRelativeVar.dwKind,VarRelativeVar.offset,VarRelativeVar.bOffsetOffset); 711 } 712 else if(VarType==DEF_SINGLE){ 713 //Single型変数へスタックの内容を格納する 714 SetSingleVariable(CalcType,VarRelativeVar.dwKind,VarRelativeVar.offset,VarRelativeVar.bOffsetOffset); 715 } 716 }
Note:
See TracChangeset
for help on using the changeset viewer.