Changeset 9 in dev for BasicCompiler64/Compile_Var.cpp
- Timestamp:
- Dec 7, 2006, 3:10:13 AM (18 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
BasicCompiler64/Compile_Var.cpp
r3 r9 754 754 LONG_PTR lpCalcIndex; 755 755 756 CalcType=StaticCalculation(true, InitBuf,type,&i64data,&lpCalcIndex); 756 CalcType=StaticCalculation(false, InitBuf,type,&i64data,&lpCalcIndex); 757 if(!CalcType){ 758 //動的データだった場合 759 return 0; 760 } 757 761 if(IsRealNumberType(CalcType)){ 758 762 memcpy(&dbl,&i64data,sizeof(double)); … … 876 880 int CalcType; 877 881 LONG_PTR lpCalcIndex; 878 CalcType=StaticCalculation(true, InitBuf,type,&i64data,&lpCalcIndex); 882 CalcType=StaticCalculation(false, InitBuf,type,&i64data,&lpCalcIndex); 883 if(!CalcType){ 884 //動的データだった場合 885 return 0; 886 } 879 887 if(IsRealNumberType(CalcType)){ 880 888 memcpy(&dbl,&i64data,sizeof(double)); … … 983 991 extern HANDLE hHeap; 984 992 int i2,i3,VarSize; 993 char VarName[VN_SIZE]; 994 995 996 if(dwFlag & DIMFLAG_CONST){ 997 ////////////////////////////////// 998 // 定数変数の場合を考慮 999 ////////////////////////////////// 1000 for(i2=0;;i2++){ 1001 if(Parameter[i2] == '=' || 1002 Parameter[i2] == 1 && Parameter[i2] == ESC_AS || 1003 Parameter[i2] =='('){ 1004 VarName[i2] = 0; 1005 break; 1006 } 1007 VarName[i2] = Parameter[i2]; 1008 } 1009 1010 //定数と2重定義されていないる場合は抜け出す 1011 if(CDBConst::obj.GetType(VarName)){ 1012 return; 1013 } 1014 1015 //定数マクロとして定義されている場合は抜け出す 1016 if(GetConstHash(VarName)){ 1017 return; 1018 } 1019 } 1020 985 1021 986 1022 //構文を解析 987 char VarName[VN_SIZE];988 1023 int SubScripts[MAX_ARRAYDIM]; 989 1024 TYPEINFO TypeInfo; … … 993 1028 return; 994 1029 1030 1031 //定数と2重定義されていないかを調べる 1032 if(CDBConst::obj.GetType(VarName)){ 1033 SetError(15,VarName,cp); 1034 return; 1035 } 1036 1037 //定数マクロとして定義されている場合 1038 if(GetConstHash(VarName)){ 1039 SetError(15,VarName,cp); 1040 return; 1041 } 1042 1043 995 1044 //タイプサイズを取得 996 1045 int TypeSize; 997 1046 TypeSize=GetTypeSize(TypeInfo.type,TypeInfo.u.lpIndex); 998 999 //定数と2重定義されていないかを調べる1000 if(GetConstHash(VarName)){1001 SetError(15,VarName,cp);1002 return;1003 }1004 1047 1005 1048 if(dwFlag&DIMFLAG_STATIC){ … … 1059 1102 if(VarSize%8) VarSize+=8-(VarSize%8); 1060 1103 1104 VARIABLE *pVar = &LocalVar[MaxLocalVarNum]; 1105 1106 MaxLocalVarNum++; 1107 1061 1108 //変数データを追加 1062 lstrcpy(LocalVar[MaxLocalVarNum].name,VarName); 1063 LocalVar[MaxLocalVarNum].fRef=0; 1064 if(SubScripts[0]==-1) LocalVar[MaxLocalVarNum].bArray=0; 1065 else LocalVar[MaxLocalVarNum].bArray=1; 1066 LocalVar[MaxLocalVarNum].type=TypeInfo.type; 1067 LocalVar[MaxLocalVarNum].u.index=TypeInfo.u.lpIndex; 1109 lstrcpy(pVar->name,VarName); 1110 pVar->fRef=0; 1111 if(dwFlag & DIMFLAG_CONST) pVar->bConst = 1; 1112 else pVar->bConst = 0; 1113 if(SubScripts[0]==-1) pVar->bArray=0; 1114 else pVar->bArray=1; 1115 pVar->type=TypeInfo.type; 1116 pVar->u.index=TypeInfo.u.lpIndex; 1068 1117 AllLocalVarSize+=VarSize; 1069 LocalVar[MaxLocalVarNum].offset=AllLocalVarSize;1118 pVar->offset=AllLocalVarSize; 1070 1119 1071 1120 //レキシカルスコープ 1072 LocalVar[MaxLocalVarNum].ScopeLevel=obj_LexScopes.GetNowLevel();1073 LocalVar[MaxLocalVarNum].ScopeStartAddress=obj_LexScopes.GetStartAddress();1074 LocalVar[MaxLocalVarNum].bLiving=TRUE;1121 pVar->ScopeLevel=obj_LexScopes.GetNowLevel(); 1122 pVar->ScopeStartAddress=obj_LexScopes.GetStartAddress(); 1123 pVar->bLiving=TRUE; 1075 1124 1076 1125 if(InitBuf[0]){ 1077 InitLocalVar(-LocalVar[MaxLocalVarNum].offset,1078 LocalVar[MaxLocalVarNum].type,1079 LocalVar[MaxLocalVarNum].u.index,1080 LocalVar[MaxLocalVarNum].SubScripts,1126 int result = InitLocalVar(-pVar->offset, 1127 pVar->type, 1128 pVar->u.index, 1129 pVar->SubScripts, 1081 1130 InitBuf); 1131 1132 if(!result){ 1133 //動的な式だった場合は代入演算を行う 1134 char temporary[8192]; 1135 sprintf(temporary,"%s=%s",VarName,InitBuf); 1136 OpcodeCalc(temporary); 1137 } 1082 1138 } 1083 1139 else{ 1084 1140 //0初期化未完成 1085 1141 } 1086 1087 MaxLocalVarNum++;1088 1142 } 1089 1143
Note:
See TracChangeset
for help on using the changeset viewer.