|
@@ -308,8 +308,12 @@ static DataType cCallFunction(const char* name) {
|
|
|
return found->returnType;
|
|
|
}
|
|
|
|
|
|
+static bool cCompare(DataType left, DataType right) {
|
|
|
+ return dtCompare(left, right) || (dtIsPointer(left) && dtIsNull(right));
|
|
|
+}
|
|
|
+
|
|
|
static void cStore(DataType left, DataType right, const char* name) {
|
|
|
- if(!dtCompare(left, right)) {
|
|
|
+ if(!cCompare(left, right)) {
|
|
|
cInvalidOperation(left, right, name);
|
|
|
} else if(dtIsPointer(left)) {
|
|
|
cAddOperation(OP_STORE_POINTER);
|
|
@@ -372,6 +376,7 @@ static DataType cPrimary() {
|
|
|
case T_CONST_FLOAT: cConstantFloat(); return dtFloat();
|
|
|
case T_TRUE: cAddOperation(OP_PUSH_TRUE); return dtBool();
|
|
|
case T_FALSE: cAddOperation(OP_PUSH_FALSE); return dtBool();
|
|
|
+ case T_NULLPTR: cAddOperation(OP_PUSH_NULLPTR); return dtNull();
|
|
|
case T_OPEN_BRACKET: return cBracketPrimary();
|
|
|
case T_LITERAL: return cLiteral();
|
|
|
case T_NEW: return cAllocArray();
|
|
@@ -731,7 +736,7 @@ static void cReturn() {
|
|
|
return;
|
|
|
}
|
|
|
DataType dt = cUnpackedExpression();
|
|
|
- if(!dtCompare(dt, returnType)) {
|
|
|
+ if(!cCompare(returnType, dt)) {
|
|
|
cError("wrong return type, should be %s", cGetName(returnType));
|
|
|
} else if(dtIsInt(dt)) {
|
|
|
cAddReturn(OP_RETURN_INT);
|
|
@@ -741,7 +746,7 @@ static void cReturn() {
|
|
|
cAddReturn(OP_RETURN_BOOL);
|
|
|
} else if(dtIsFloat(dt)) {
|
|
|
cAddReturn(OP_RETURN_FLOAT);
|
|
|
- } else if(dtIsPointer(dt)) {
|
|
|
+ } else if(dtIsPointer(dt) || dtIsNull(dt)) {
|
|
|
cAddReturn(OP_RETURN_POINTER);
|
|
|
} else {
|
|
|
cError("cannot return %s", cGetName(dt));
|