Changeset 75 in dev for BasicCompiler32/Compile_Calc.cpp
- Timestamp:
- Mar 20, 2007, 4:36:16 AM (18 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
BasicCompiler32/Compile_Calc.cpp
r67 r75 415 415 int i,i2,i3; 416 416 char variable[VN_SIZE]; 417 418 419 420 ////////////////////////////////////// 421 // インクリメント・デクリメント 422 ////////////////////////////////////// 417 423 418 424 for(i=0;;i++){ … … 465 471 } 466 472 467 LONG_PTR lp; 468 if(GetVarType(variable,&lp,0)!=-1){ 473 if(GetVarType(variable,Type(),0)){ 469 474 //変数リストに該当したとき 470 475 SetError(1,NULL,cp); … … 510 515 511 516 char ObjName[VN_SIZE],array_element[VN_SIZE]; 512 CClass *pobj_c;513 517 GetArrayElement(variable,ObjName,array_element); 514 518 if(array_element[0]){ 515 i2=GetVarType(ObjName,(LONG_PTR *)&pobj_c,0);516 if( i2==DEF_OBJECT){519 Type varType; 520 if( GetVarType(ObjName,varType,0) && varType.IsObject() ){ 517 521 char temporary[VN_SIZE]; 518 522 sprintf(temporary,"%s.%c%c%c",ObjName,1,ESC_OPERATOR,CALC_ARRAY_SET); … … 522 526 523 527 int idProc; 524 void *p Info;525 idProc=GetProc(temporary, &pInfo);528 void *pProc; 529 idProc=GetProc(temporary,(void **)&pProc); 526 530 if(idProc){ 527 CallProc(idProc,p Info,temporary,temp2,NULL);531 CallProc(idProc,pProc,temporary,temp2,Type()); 528 532 return; 529 533 } … … 542 546 //////////////////////////////////////// 543 547 544 int VarType,CalcType; 545 LONG_PTR lpVarIndex,lpCalcIndex; 548 Type varType; 549 550 //型を識別 551 if( !GetVarType(variable,varType,false) ){ 552 553 // プロパティ用のメソッドを呼び出す 554 if(!CallPropertyMethod( variable, Command+i+1, Type() )){ 555 //エラーを表示 556 GetVarType(variable,varType,true); 557 } 558 559 return; 560 } 561 562 extern LONG_PTR ProcPtr_BaseIndex; 563 if(varType.IsProcPtr()) ProcPtr_BaseIndex=varType.GetIndex(); 564 else ProcPtr_BaseIndex=-1; 565 546 566 RELATIVE_VAR VarRelativeVar; 547 BOOL bCalcUseHeap; 548 549 //型を識別 550 VarType=GetVarType(variable,&lpVarIndex,0); 551 if(VarType==-1){ 552 553 // プロパティ用のメソッドを呼び出す 554 if(!CallPropertyMethod(variable,Command+i+1,NULL)){ 555 //エラーを表示 556 GetVarType(variable,&lpVarIndex,1); 557 } 558 559 return; 560 } 561 562 extern LONG_PTR ProcPtr_BaseIndex; 563 if(VarType==DEF_PTR_PROC) ProcPtr_BaseIndex=lpVarIndex; 564 else ProcPtr_BaseIndex=-1; 565 566 if(VarType==DEF_STRUCT){ 567 if( varType.IsStruct() ){ 567 568 //代入コピーに備える 568 569 … … 570 571 if(!GetVarOffsetReadWrite( 571 572 variable, 572 &VarType,573 573 &VarRelativeVar, 574 &lpVarIndex)) return;574 varType)) return; 575 575 576 576 SetVarPtrToEax(&VarRelativeVar); … … 582 582 583 583 //NumOpe...(スタックに答えが格納される) 584 CalcType=NumOpe(Command+i+1,VarType,lpVarIndex,&lpCalcIndex,&bCalcUseHeap); 585 if(VarType==-1||CalcType==-1) return; 584 BOOL bCalcUseHeap; 585 Type calcType; 586 if( !NumOpe(Command+i+1,varType,calcType,&bCalcUseHeap) ){ 587 return; 588 } 586 589 587 590 //変数アドレスを取得 588 591 if(!GetVarOffsetReadWrite( 589 592 variable, 590 &VarType,591 593 &VarRelativeVar, 592 &lpVarIndex)) return;593 594 if( VarType&FLAG_PTR){594 varType)) return; 595 596 if(varType.GetBasicType()&FLAG_PTR){ 595 597 SetError(14,variable,cp); 596 598 return; 597 599 } 598 600 599 if( VarType==DEF_STRUCT){600 // オブジェクトインスタンスへの代入601 SetStructVariable( lpVarIndex,CalcType,lpCalcIndex,bCalcUseHeap);601 if( varType.IsStruct() ){ 602 //構造体インスタンスへの代入 603 SetStructVariable(varType,calcType,bCalcUseHeap); 602 604 return; 603 605 } 604 606 605 if( CalcType==DEF_OBJECT && (CalcType!=VarType || lpCalcIndex!=lpVarIndex) ){607 if( calcType.IsObject() && !calcType.Equals( varType ) ){ 606 608 //キャスト演算子のオーバーロードに対応する 607 CallCastOperatorProc( CalcType,lpCalcIndex,bCalcUseHeap,VarType,lpVarIndex);609 CallCastOperatorProc(calcType,bCalcUseHeap,varType); 608 610 } 609 611 … … 614 616 ///////////////////////////////// 615 617 616 CheckDifferentType( VarType,lpVarIndex,CalcType,lpCalcIndex,0,0);618 CheckDifferentType(varType,calcType,0,0); 617 619 618 620 … … 622 624 623 625 //eax、edx:eax、またはst(0)にスタック上のデータを取り出す 624 RestoreDefaultRegisterFromStackMemory( CalcType ); 625 626 SetVariableFromEax( VarType, CalcType, &VarRelativeVar ); 627 /* 628 TODO: 消す 629 if(VarType==DEF_BOOLEAN){ 630 //bool 631 SetBooleanVariable(CalcType,&VarRelativeVar); 632 } 633 else if(VarType==DEF_SBYTE||VarType==DEF_BYTE || (isUnicode==false&&VarType==DEF_CHAR)){ 634 //8ビット整数型変数へスタックの内容を格納する 635 Set8Variable(CalcType,VarRelativeVar.dwKind,VarRelativeVar.offset,VarRelativeVar.bOffsetOffset); 636 } 637 else if(VarType==DEF_INTEGER||VarType==DEF_WORD || (isUnicode&&VarType==DEF_CHAR)){ 638 //16ビット整数型変数へスタックの内容を格納する 639 Set16Variable(CalcType,VarRelativeVar.dwKind,VarRelativeVar.offset,VarRelativeVar.bOffsetOffset); 640 } 641 else if(VarType==DEF_LONG||VarType==DEF_DWORD||IsPtrType(VarType)){ 642 //32ビット整数型変数へスタックの内容を格納する 643 if(VarType==DEF_LONG) 644 SetLongVariable(CalcType,VarRelativeVar.dwKind,VarRelativeVar.offset,VarRelativeVar.bOffsetOffset); 645 else 646 SetDWordVariable(CalcType,VarRelativeVar.dwKind,VarRelativeVar.offset,VarRelativeVar.bOffsetOffset); 647 } 648 else if(VarType==DEF_INT64||VarType==DEF_QWORD){ 649 //64ビット整数型変数へスタックの内容を格納する 650 SetInt64Variable(CalcType,&VarRelativeVar); 651 } 652 else if(VarType==DEF_DOUBLE){ 653 //Double型変数へスタックの内容を格納する 654 SetDoubleVariable(CalcType,VarRelativeVar.dwKind,VarRelativeVar.offset,VarRelativeVar.bOffsetOffset); 655 } 656 else if(VarType==DEF_SINGLE){ 657 //Single型変数へスタックの内容を格納する 658 SetSingleVariable(CalcType,VarRelativeVar.dwKind,VarRelativeVar.offset,VarRelativeVar.bOffsetOffset); 659 }*/ 660 } 661 662 663 // TODO: 消す 664 /* 665 void SetRefVariable( const char *varname, const char *expression ){ 666 //////////////////////////////////////// 667 // 変数のタイプ型を識別して、演算を行う 668 //////////////////////////////////////// 669 670 int VarType,CalcType; 671 LONG_PTR lpVarIndex,lpCalcIndex; 672 RELATIVE_VAR VarRelativeVar; 673 BOOL bCalcUseHeap; 674 675 //型を識別 676 VarType=GetVarType(varname,&lpVarIndex,0); 677 if(VarType==-1){ 678 SetError(300,NULL,cp); 679 return; 680 } 681 682 extern LONG_PTR ProcPtr_BaseIndex; 683 if(VarType==DEF_PTR_PROC) ProcPtr_BaseIndex=lpVarIndex; 684 else ProcPtr_BaseIndex=-1; 685 686 if(VarType==DEF_OBJECT){ 687 //代入演算のオーバーロード オペレータに備える 688 689 //変数アドレスを取得 690 if(!GetVarOffsetReadWrite( 691 varname, 692 &VarType, 693 &VarRelativeVar, 694 &lpVarIndex)) return; 695 696 SetVarPtrToEax(&VarRelativeVar); 697 698 //push eax 699 op_push(REG_EAX); 700 } 701 702 703 //NumOpe...(スタックに答えが格納される) 704 CalcType=NumOpe(expression,VarType,lpVarIndex,&lpCalcIndex,&bCalcUseHeap); 705 if(VarType==-1||CalcType==-1) return; 706 707 //変数アドレスを取得 708 if(!GetVarOffsetReadWrite( 709 varname, 710 &VarType, 711 &VarRelativeVar, 712 &lpVarIndex)) return; 713 714 if(VarType&FLAG_PTR){ 715 SetError(14,varname,cp); 716 return; 717 } 718 719 720 if( VarType == DEF_OBJECT 721 && (VarRelativeVar.dwKind == VAR_REFLOCAL || VarRelativeVar.dwKind == VAR_REFGLOBAL ) ){ 722 // 参照型オブジェクトへの代入(初期化)はポインタ変数と同様の処理に値する 723 PTR_LEVEL_UP( VarType ); 724 725 if( VarRelativeVar.dwKind == VAR_REFGLOBAL ){ 726 VarRelativeVar.dwKind = VAR_GLOBAL; 727 } 728 else if( VarRelativeVar.dwKind == VAR_REFLOCAL ){ 729 VarRelativeVar.dwKind = VAR_LOCAL; 730 } 731 732 if( CalcType == DEF_OBJECT ){ 733 //右辺値が実体オブジェクトのときは、参照をコピー 734 PTR_LEVEL_UP( CalcType ); 735 } 736 } 737 else{ 738 SetError(300,NULL,cp); 739 } 740 741 742 ///////////////////////////////// 743 // 右辺、左辺の型チェックを行う 744 ///////////////////////////////// 745 746 CheckDifferentType(VarType,lpVarIndex,CalcType,lpCalcIndex,0,0); 747 748 749 ///////////////////////////////////////////////// 750 // スタックの内容を変数にコピーするコードを抽出 751 ///////////////////////////////////////////////// 752 753 if(VarType==DEF_BOOLEAN){ 754 //bool 755 SetBooleanVariable(CalcType,&VarRelativeVar); 756 } 757 else if(VarType==DEF_SBYTE||VarType==DEF_BYTE || (isUnicode==false&&VarType==DEF_CHAR)){ 758 //8ビット整数型変数へスタックの内容を格納する 759 Set8Variable(CalcType,VarRelativeVar.dwKind,VarRelativeVar.offset,VarRelativeVar.bOffsetOffset); 760 } 761 else if(VarType==DEF_INTEGER||VarType==DEF_WORD || (isUnicode&&VarType==DEF_CHAR)){ 762 //16ビット整数型変数へスタックの内容を格納する 763 Set16Variable(CalcType,VarRelativeVar.dwKind,VarRelativeVar.offset,VarRelativeVar.bOffsetOffset); 764 } 765 else if(VarType==DEF_LONG||VarType==DEF_DWORD||IsPtrType(VarType)){ 766 //32ビット整数型変数へスタックの内容を格納する 767 if(VarType==DEF_LONG) 768 SetLongVariable(CalcType,VarRelativeVar.dwKind,VarRelativeVar.offset,VarRelativeVar.bOffsetOffset); 769 else 770 SetDWordVariable(CalcType,VarRelativeVar.dwKind,VarRelativeVar.offset,VarRelativeVar.bOffsetOffset); 771 } 772 else if(VarType==DEF_INT64||VarType==DEF_QWORD){ 773 //64ビット整数型変数へスタックの内容を格納する 774 SetInt64Variable(CalcType,&VarRelativeVar); 775 } 776 else if(VarType==DEF_DOUBLE){ 777 //Double型変数へスタックの内容を格納する 778 SetDoubleVariable(CalcType,VarRelativeVar.dwKind,VarRelativeVar.offset,VarRelativeVar.bOffsetOffset); 779 } 780 else if(VarType==DEF_SINGLE){ 781 //Single型変数へスタックの内容を格納する 782 SetSingleVariable(CalcType,VarRelativeVar.dwKind,VarRelativeVar.offset,VarRelativeVar.bOffsetOffset); 783 } 784 } 785 */ 626 RestoreDefaultRegisterFromStackMemory( calcType.GetBasicType() ); 627 628 SetVariableFromEax(varType.GetBasicType(),calcType.GetBasicType(),&VarRelativeVar); 629 }
Note:
See TracChangeset
for help on using the changeset viewer.