1088 case tkAddAssign: return EAssignAdd; |
1090 case tkAddAssign: return EAssignAdd; |
1089 case tkSubAssign: return EAssignSub; |
1091 case tkSubAssign: return EAssignSub; |
1090 case tkMultiplyAssign: return EAssignMul; |
1092 case tkMultiplyAssign: return EAssignMul; |
1091 case tkDivideAssign: return EAssignDiv; |
1093 case tkDivideAssign: return EAssignDiv; |
1092 case tkModulusAssign: return EAssignMod; |
1094 case tkModulusAssign: return EAssignMod; |
|
1095 case tkDoublePlus: return EAssignIncrement; |
|
1096 case tkDoubleMinus: return EAssignDecrement; |
1093 default: break; |
1097 default: break; |
1094 } |
1098 } |
1095 |
1099 |
1096 assert (false); |
1100 assert (false); |
1097 return (EAssignmentOperator) 0; |
1101 return (EAssignmentOperator) 0; |
1103 { |
1107 { |
1104 if (var->IsGlobal()) |
1108 if (var->IsGlobal()) |
1105 { |
1109 { |
1106 switch (op) |
1110 switch (op) |
1107 { |
1111 { |
1108 case EAssign: return dhAssignGlobalVar; |
1112 case EAssign: return dhAssignGlobalVar; |
1109 case EAssignAdd: return dhAddGlobalVar; |
1113 case EAssignAdd: return dhAddGlobalVar; |
1110 case EAssignSub: return dhSubtractGlobalVar; |
1114 case EAssignSub: return dhSubtractGlobalVar; |
1111 case EAssignMul: return dhMultiplyGlobalVar; |
1115 case EAssignMul: return dhMultiplyGlobalVar; |
1112 case EAssignDiv: return dhDivideGlobalVar; |
1116 case EAssignDiv: return dhDivideGlobalVar; |
1113 case EAssignMod: return dhModGlobalVar; |
1117 case EAssignMod: return dhModGlobalVar; |
|
1118 case EAssignIncrement: return dhIncreaseGlobalVar; |
|
1119 case EAssignDecrement: return dhDecreaseGlobalVar; |
1114 } |
1120 } |
1115 } |
1121 } |
1116 |
1122 |
1117 switch (op) |
1123 switch (op) |
1118 { |
1124 { |
1119 case EAssign: return dhAssignLocalVar; |
1125 case EAssign: return dhAssignLocalVar; |
1120 case EAssignAdd: return dhAddLocalVar; |
1126 case EAssignAdd: return dhAddLocalVar; |
1121 case EAssignSub: return dhSubtractLocalVar; |
1127 case EAssignSub: return dhSubtractLocalVar; |
1122 case EAssignMul: return dhMultiplyLocalVar; |
1128 case EAssignMul: return dhMultiplyLocalVar; |
1123 case EAssignDiv: return dhDivideLocalVar; |
1129 case EAssignDiv: return dhDivideLocalVar; |
1124 case EAssignMod: return dhModLocalVar; |
1130 case EAssignMod: return dhModLocalVar; |
|
1131 case EAssignIncrement: return dhIncreaseLocalVar; |
|
1132 case EAssignDecrement: return dhDecreaseLocalVar; |
1125 } |
1133 } |
1126 |
1134 |
1127 assert (false); |
1135 assert (false); |
1128 return (EDataHeader) 0; |
1136 return (EDataHeader) 0; |
1129 } |
1137 } |
1136 // |
1144 // |
1137 DataBuffer* BotscriptParser::ParseAssignment (ScriptVariable* var) |
1145 DataBuffer* BotscriptParser::ParseAssignment (ScriptVariable* var) |
1138 { |
1146 { |
1139 // Get an operator |
1147 // Get an operator |
1140 EAssignmentOperator oper = ParseAssignmentOperator(); |
1148 EAssignmentOperator oper = ParseAssignmentOperator(); |
|
1149 DataBuffer* retbuf = new DataBuffer; |
1141 |
1150 |
1142 if (mCurrentMode == ETopLevelMode) |
1151 if (mCurrentMode == ETopLevelMode) |
1143 Error ("can't alter variables at top level"); |
1152 Error ("can't alter variables at top level"); |
1144 |
1153 |
1145 // Parse the right operand |
1154 // Parse the right operand |
1146 DataBuffer* retbuf = new DataBuffer; |
1155 if (oper != EAssignIncrement && oper != EAssignDecrement) |
1147 DataBuffer* expr = ParseExpression (var->type); |
1156 { |
|
1157 DataBuffer* expr = ParseExpression (var->type); |
|
1158 retbuf->MergeAndDestroy (expr); |
|
1159 } |
1148 |
1160 |
1149 #if 0 |
1161 #if 0 |
1150 // <<= and >>= do not have data headers. Solution: expand them. |
1162 // <<= and >>= do not have data headers. Solution: expand them. |
1151 // a <<= b -> a = a << b |
1163 // a <<= b -> a = a << b |
1152 // a >>= b -> a = a >> b |
1164 // a >>= b -> a = a >> b |
1153 if (oper == OPER_ASSIGNLEFTSHIFT || oper == OPER_ASSIGNRIGHTSHIFT) |
1165 retbuf->WriteDWord (var->IsGlobal() ? dhPushGlobalVar : dhPushLocalVar); |
1154 { |
1166 retbuf->WriteDWord (var->index); |
1155 retbuf->WriteDWord (var->IsGlobal() ? dhPushGlobalVar : dhPushLocalVar); |
1167 retbuf->MergeAndDestroy (expr); |
1156 retbuf->WriteDWord (var->index); |
1168 retbuf->WriteDWord ((oper == OPER_ASSIGNLEFTSHIFT) ? dhLeftShift : dhRightShift); |
1157 retbuf->MergeAndDestroy (expr); |
1169 retbuf->WriteDWord (var->IsGlobal() ? dhAssignGlobalVar : dhAssignLocalVar); |
1158 retbuf->WriteDWord ((oper == OPER_ASSIGNLEFTSHIFT) ? dhLeftShift : dhRightShift); |
1170 retbuf->WriteDWord (var->index); |
1159 retbuf->WriteDWord (var->IsGlobal() ? dhAssignGlobalVar : dhAssignLocalVar); |
|
1160 retbuf->WriteDWord (var->index); |
|
1161 } |
|
1162 else |
|
1163 { |
|
1164 #endif |
1171 #endif |
1165 retbuf->MergeAndDestroy (expr); |
1172 |
1166 EDataHeader dh = GetAssigmentDataHeader (oper, var); |
1173 EDataHeader dh = GetAssigmentDataHeader (oper, var); |
1167 retbuf->WriteDWord (dh); |
1174 retbuf->WriteDWord (dh); |
1168 retbuf->WriteDWord (var->index); |
1175 retbuf->WriteDWord (var->index); |
1169 #if 0 |
|
1170 } |
|
1171 #endif |
|
1172 |
|
1173 return retbuf; |
1176 return retbuf; |
1174 } |
1177 } |
1175 |
1178 |
1176 // ============================================================================ |
1179 // ============================================================================ |
1177 // |
1180 // |
1365 { |
1368 { |
1366 // Substitute the placeholder with the mark position |
1369 // Substitute the placeholder with the mark position |
1367 for (int i = 0; i < 4; ++i) |
1370 for (int i = 0; i < 4; ++i) |
1368 mMainBuffer->GetBuffer()[ref->pos + i] = (ref->target->pos >> (8 * i)) & 0xFF; |
1371 mMainBuffer->GetBuffer()[ref->pos + i] = (ref->target->pos >> (8 * i)) & 0xFF; |
1369 |
1372 |
1370 Print ("reference at %1 resolved to mark at %2\n", ref->pos, ref->target->pos); |
1373 // Print ("reference at %1 resolved to mark at %2\n", ref->pos, ref->target->pos); |
1371 } |
1374 } |
1372 |
1375 |
1373 // Then, dump the main buffer to the file |
1376 // Then, dump the main buffer to the file |
1374 fwrite (mMainBuffer->GetBuffer(), 1, mMainBuffer->GetWrittenSize(), fp); |
1377 fwrite (mMainBuffer->GetBuffer(), 1, mMainBuffer->GetWrittenSize(), fp); |
1375 Print ("-- %1 byte%s1 written to %2\n", mMainBuffer->GetWrittenSize(), outfile); |
1378 Print ("-- %1 byte%s1 written to %2\n", mMainBuffer->GetWrittenSize(), outfile); |