|
@@ -198,6 +198,15 @@ static const char* cReadString() {
|
|
return literal;
|
|
return literal;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static DataType cReadStruct() {
|
|
|
|
+ const char* name = cReadString();
|
|
|
|
+ Struct* st = stsSearch(&structs, name);
|
|
|
|
+ if(st == NULL) {
|
|
|
|
+ cError("struct %s does not exist");
|
|
|
|
+ }
|
|
|
|
+ return dtStruct(st);
|
|
|
|
+}
|
|
|
|
+
|
|
static DataType cExpression();
|
|
static DataType cExpression();
|
|
|
|
|
|
static void cLoadRef(DataType type) {
|
|
static void cLoadRef(DataType type) {
|
|
@@ -311,16 +320,7 @@ static DataType cReadType() {
|
|
case T_INT: dt = dtInt(); break;
|
|
case T_INT: dt = dtInt(); break;
|
|
case T_BOOL: dt = dtBool(); break;
|
|
case T_BOOL: dt = dtBool(); break;
|
|
case T_FLOAT: dt = dtFloat(); break;
|
|
case T_FLOAT: dt = dtFloat(); break;
|
|
- case T_LITERAL:
|
|
|
|
- {
|
|
|
|
- const char* name = cReadString();
|
|
|
|
- Struct* st = stsSearch(&structs, name);
|
|
|
|
- if(st == NULL) {
|
|
|
|
- cError("struct %s does not exist");
|
|
|
|
- }
|
|
|
|
- dt = dtStruct(st);
|
|
|
|
- break;
|
|
|
|
- }
|
|
|
|
|
|
+ case T_LITERAL: dt = cReadStruct(); break;
|
|
default: cUnexpectedToken(t);
|
|
default: cUnexpectedToken(t);
|
|
}
|
|
}
|
|
return cExtendType(dt);
|
|
return cExtendType(dt);
|
|
@@ -741,6 +741,8 @@ static void cReturn() {
|
|
cAddReturn(OP_RETURN_BOOL);
|
|
cAddReturn(OP_RETURN_BOOL);
|
|
} else if(dtCompare(dt, dtFloat())) {
|
|
} else if(dtCompare(dt, dtFloat())) {
|
|
cAddReturn(OP_RETURN_FLOAT);
|
|
cAddReturn(OP_RETURN_FLOAT);
|
|
|
|
+ } else if(dtIsPointer(dt)) {
|
|
|
|
+ cAddReturn(OP_RETURN_POINTER);
|
|
} else {
|
|
} else {
|
|
cError("cannot return %s", cGetName(dt));
|
|
cError("cannot return %s", cGetName(dt));
|
|
}
|
|
}
|
|
@@ -996,16 +998,7 @@ static void cFunctionArgument(Function* f) {
|
|
case T_INT: cFunctionAddArgument(f, dtInt()); break;
|
|
case T_INT: cFunctionAddArgument(f, dtInt()); break;
|
|
case T_FLOAT: cFunctionAddArgument(f, dtFloat()); break;
|
|
case T_FLOAT: cFunctionAddArgument(f, dtFloat()); break;
|
|
case T_BOOL: cFunctionAddArgument(f, dtBool()); break;
|
|
case T_BOOL: cFunctionAddArgument(f, dtBool()); break;
|
|
- case T_LITERAL:
|
|
|
|
- {
|
|
|
|
- const char* structName = cReadString();
|
|
|
|
- Struct* st = stsSearch(&structs, structName);
|
|
|
|
- if(st == NULL) {
|
|
|
|
- cError("struct %s does not exist");
|
|
|
|
- }
|
|
|
|
- cFunctionAddArgument(f, dtStruct(st));
|
|
|
|
- break;
|
|
|
|
- }
|
|
|
|
|
|
+ case T_LITERAL: cFunctionAddArgument(f, cReadStruct()); break;
|
|
default: cUnexpectedToken(t);
|
|
default: cUnexpectedToken(t);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -1068,6 +1061,7 @@ static void cBuildFunction(Function* f, DataType rType) {
|
|
}
|
|
}
|
|
|
|
|
|
static void cFunction(DataType rType) {
|
|
static void cFunction(DataType rType) {
|
|
|
|
+ rType = cExtendType(rType);
|
|
Function f;
|
|
Function f;
|
|
cBuildFunction(&f, rType);
|
|
cBuildFunction(&f, rType);
|
|
Function* found = fsSearch(&functions, &f);
|
|
Function* found = fsSearch(&functions, &f);
|
|
@@ -1121,6 +1115,7 @@ static void cGlobalScope(Token t) {
|
|
case T_INT: cFunction(dtInt()); break;
|
|
case T_INT: cFunction(dtInt()); break;
|
|
case T_BOOL: cFunction(dtBool()); break;
|
|
case T_BOOL: cFunction(dtBool()); break;
|
|
case T_FLOAT: cFunction(dtFloat()); break;
|
|
case T_FLOAT: cFunction(dtFloat()); break;
|
|
|
|
+ case T_LITERAL: cFunction(cReadStruct()); break;
|
|
case T_STRUCT: cStruct(); break;
|
|
case T_STRUCT: cStruct(); break;
|
|
default: cUnexpectedToken(t);
|
|
default: cUnexpectedToken(t);
|
|
}
|
|
}
|