Browse Source

refactoring

Kajetan Johannes Hammerle 3 years ago
parent
commit
d7da37eec7
1 changed files with 39 additions and 27 deletions
  1. 39 27
      Compiler.c

+ 39 - 27
Compiler.c

@@ -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();
 }