|
@@ -519,6 +519,41 @@ static DataType cCast(DataType in, DataType a, Operation aOp, DataType b,
|
|
|
return out;
|
|
|
}
|
|
|
|
|
|
+static DataType cUnaryNot(DataType dt) {
|
|
|
+ cExpectType(dt, dtBool(), "!");
|
|
|
+ cAddOperation(OP_NOT);
|
|
|
+ return dt;
|
|
|
+}
|
|
|
+
|
|
|
+static DataType cUnaryBitNot(DataType dt) {
|
|
|
+ if(dtIsInt32(dt)) {
|
|
|
+ cAddOperation(OP_BIT_NOT_INT32);
|
|
|
+ } else if(dtIsInt64(dt)) {
|
|
|
+ cAddOperation(OP_BIT_NOT_INT64);
|
|
|
+ } else {
|
|
|
+ cError("~ needs an int or long not %s", cGetName(dt));
|
|
|
+ }
|
|
|
+ return dt;
|
|
|
+}
|
|
|
+
|
|
|
+static DataType cUnaryDereference(DataType dt) {
|
|
|
+ cRemoveReference(&dt, "&");
|
|
|
+ return cDereference(dt);
|
|
|
+}
|
|
|
+
|
|
|
+static DataType cUnaryReference(DataType dt) {
|
|
|
+ if(!dtIsPointer(dt)) {
|
|
|
+ cError("* expects a pointer");
|
|
|
+ }
|
|
|
+ dt = dtReference(dt);
|
|
|
+ if(!dtIsPointer(dt) && !dtIsVariable(dt)) {
|
|
|
+ dt = dtToVariable(dt);
|
|
|
+ } else {
|
|
|
+ cAddOperation(OP_REFERENCE);
|
|
|
+ }
|
|
|
+ return dt;
|
|
|
+}
|
|
|
+
|
|
|
static DataType cPreUnary() {
|
|
|
int marker = tGetMarker();
|
|
|
if(cConsumeTokenIf(T_OPEN_BRACKET)) {
|
|
@@ -543,36 +578,13 @@ static DataType cPreUnary() {
|
|
|
} else if(cConsumeTokenIf(T_SUB)) {
|
|
|
return cInvertSign(cUnpack(cPreUnary()));
|
|
|
} else if(cConsumeTokenIf(T_NOT)) {
|
|
|
- DataType dt = cPreUnary();
|
|
|
- cExpectType(dt, dtBool(), "!");
|
|
|
- cAddOperation(OP_NOT);
|
|
|
- return dt;
|
|
|
+ return cUnaryNot(cPreUnary());
|
|
|
} else if(cConsumeTokenIf(T_BIT_NOT)) {
|
|
|
- DataType dt = cPreUnary();
|
|
|
- if(dtIsInt32(dt)) {
|
|
|
- cAddOperation(OP_BIT_NOT_INT32);
|
|
|
- } else if(dtIsInt64(dt)) {
|
|
|
- cAddOperation(OP_BIT_NOT_INT64);
|
|
|
- } else {
|
|
|
- cError("~ needs an int or long not %s", cGetName(dt));
|
|
|
- }
|
|
|
- return dt;
|
|
|
+ return cUnaryBitNot(cPreUnary());
|
|
|
} else if(cConsumeTokenIf(T_BIT_AND)) {
|
|
|
- DataType dt = cPreUnary();
|
|
|
- cRemoveReference(&dt, "&");
|
|
|
- return cDereference(dt);
|
|
|
+ return cUnaryDereference(cPreUnary());
|
|
|
} else if(cConsumeTokenIf(T_MUL)) {
|
|
|
- DataType dt = cPreUnary();
|
|
|
- if(!dtIsPointer(dt)) {
|
|
|
- cError("* expects a pointer");
|
|
|
- }
|
|
|
- dt = dtReference(dt);
|
|
|
- if(!dtIsPointer(dt) && !dtIsVariable(dt)) {
|
|
|
- dt = dtToVariable(dt);
|
|
|
- } else {
|
|
|
- cAddOperation(OP_REFERENCE);
|
|
|
- }
|
|
|
- return dt;
|
|
|
+ return cUnaryReference(cPreUnary());
|
|
|
}
|
|
|
return cAccess();
|
|
|
}
|