@@ -133,7 +133,7 @@ void doneClass(Object * tree)
133
133
scope_pop ();
134
134
}
135
135
136
- Object * beginFunction (char * returnType , char * funcName , Object * parameters )
136
+ Object * beginFunction (char * funcName , char * returnType , char * resolvedSpecificType , Object * parameters )
137
137
{
138
138
if (returnType == 0 ) {
139
139
criticalError (ERROR_ParseError , "Return category mustn't be null.\n" );
@@ -206,7 +206,7 @@ Object *beginFunction(char *returnType, char *funcName, Object * parameters)
206
206
}
207
207
//add parameters to the function
208
208
types = parameters -> paramTypes ;
209
- //assuming for every category there is a name
209
+ //assuming for every Type there is a name
210
210
while (types != 0 ) {
211
211
if (!external ) {
212
212
addSymbol (result ,
@@ -217,6 +217,11 @@ Object *beginFunction(char *returnType, char *funcName, Object * parameters)
217
217
types = types -> next ;
218
218
}
219
219
220
+ //If the return type is a generic type...
221
+ if (resolvedSpecificType ) {
222
+ compilerDebugPrintf ("Setting generic ytype (%s)\n" , resolvedSpecificType );
223
+ result -> resolvedSpecificType = resolvedSpecificType ;
224
+ }
220
225
221
226
addSymbol (parentScope , result );
222
227
scope_push (result );
@@ -1029,6 +1034,7 @@ Object *conjugate(Object * subject, Object * verb, Object * objects)
1029
1034
if (!realVerb ) {
1030
1035
realVerb = findFunctionByFullName (genericVerbName );
1031
1036
genericVerb = true;
1037
+ compilerDebugPrintf ("%s is a Generic Verb\n" ,genericVerbName );
1032
1038
}
1033
1039
1034
1040
if (!realVerb && subject ) {
@@ -1211,27 +1217,30 @@ Object *conjugate(Object * subject, Object * verb, Object * objects)
1211
1217
//== Generic shenanigans ==
1212
1218
//compilerDebugPrintf("Conjverb Generic type %s\n",verb->genericType);
1213
1219
1214
- if (verb -> genericType ) {
1215
- // if (hasParams) {
1216
- // invoke_pos += snprintf(&invocation[invoke_pos], BUFFLEN - invoke_pos, "/* verb is generic */");
1217
- // }
1218
- result -> genericType = strdup (verb -> genericType );
1220
+ if (verb -> resolvedSpecificType ) {
1221
+ result -> genericType = strdup (verb -> resolvedSpecificType );
1222
+ } else if (verb -> genericType ) {
1223
+ result -> genericType = strdup (verb -> genericType );
1219
1224
1220
- Object * pType = findByName (result -> genericType );
1221
- if (pType && getFlag (pType ,FLAG_PRIMITIVE )) {
1222
- invoke_pos +=
1223
- snprintf (& invocation [invoke_pos ], BUFFLEN - invoke_pos , ",true" );
1224
- } else {
1225
+ if (hasParams ) {
1226
+ invoke_pos += snprintf (& invocation [invoke_pos ], BUFFLEN - invoke_pos , ", " );
1227
+ }
1228
+
1229
+ Object * pType = findByName (result -> genericType );
1230
+ if (pType && getFlag (pType , FLAG_PRIMITIVE )) {
1231
+ invoke_pos +=
1232
+ snprintf (& invocation [invoke_pos ], BUFFLEN - invoke_pos , "true" );
1233
+ } else {
1234
+ invoke_pos +=
1235
+ snprintf (& invocation [invoke_pos ], BUFFLEN - invoke_pos , "false" );
1236
+ }
1225
1237
invoke_pos +=
1226
- snprintf (& invocation [invoke_pos ], BUFFLEN - invoke_pos , ",false" );
1227
- }
1228
- invoke_pos +=
1229
- snprintf (& invocation [invoke_pos ], BUFFLEN - invoke_pos , ",%s" ,result -> genericType );
1238
+ snprintf (& invocation [invoke_pos ], BUFFLEN - invoke_pos , ",%s" , result -> genericType );
1230
1239
}
1231
1240
1232
1241
1233
1242
1234
- if (!strcmp (realVerb -> returnType , "Generic_$$" )) {
1243
+ if (!strcmp (realVerb -> returnType , GENERIC_PARAM )) {
1235
1244
if (realVerb -> genericType ) {
1236
1245
result -> returnType = strdup (realVerb -> genericType );
1237
1246
addParam (result , realVerb -> genericType );
@@ -1426,7 +1435,7 @@ Object *sVerbIdent(char *staticVerb)
1426
1435
return result ;
1427
1436
}
1428
1437
1429
- Object * verbCtor (char * type , char * ytype )
1438
+ Object * verbCtor (char * type , char * genericType )
1430
1439
{
1431
1440
compilerDebugPrintf ("verbCtor(%s)\n" , type );
1432
1441
Object * result = findByName (type );
@@ -1435,9 +1444,9 @@ Object *verbCtor(char *type, char *ytype)
1435
1444
sprintf (error , "Cannot find Class \"%s\".\n" , type );
1436
1445
criticalError (ERROR_UndefinedVerb , error );
1437
1446
}
1438
- if (ytype ) {
1439
- compilerDebugPrintf ("Setting generic ytype (%s)\n" , ytype );
1440
- result -> genericType = ytype ;
1447
+ if (genericType ) {
1448
+ compilerDebugPrintf ("Setting generic ytype (%s)\n" , genericType );
1449
+ result -> genericType = genericType ;
1441
1450
}
1442
1451
return result ;
1443
1452
}
@@ -1587,9 +1596,9 @@ Object *objectChar(char *c)
1587
1596
compilerDebugPrintf ("objectInt(%c)\n" , c [1 ]);
1588
1597
char buffer [4 ]; // 20 = (log10(2^64))
1589
1598
snprintf (buffer , 4 , "%s" , c );
1590
- Object * result = CreateObject (0 , 0 , 0 , Expression , "Char " );
1599
+ Object * result = CreateObject (0 , 0 , 0 , Expression , "char " );
1591
1600
addCode (result , buffer );
1592
- addParam (result , "Char " );
1601
+ addParam (result , "char " );
1593
1602
return result ;
1594
1603
}
1595
1604
0 commit comments