forked from cosmonaut/wraith-lang
				
			add type specification to iterator variable
							parent
							
								
									62f42e47b9
								
							
						
					
					
						commit
						3b43d44f35
					
				|  | @ -2,11 +2,9 @@ struct Program | |||
| { | ||||
|     static Main(): int | ||||
|     { | ||||
|         sum: int; | ||||
|         sum: int = 0; | ||||
| 
 | ||||
|         sum = 0; | ||||
| 
 | ||||
|         for (i in [1..1000]) | ||||
|         for (i: int in [1..1000]) | ||||
|         { | ||||
|             if ((i % 3 == 0) || (i % 5 == 0)) | ||||
|             { | ||||
|  |  | |||
|  | @ -256,7 +256,7 @@ Conditional             : IfStatement | |||
|                             $$ = MakeIfElseNode($1, $3); | ||||
|                         } | ||||
| 
 | ||||
| ForStatement            : FOR LEFT_PAREN Identifier IN LEFT_BRACKET Number POINT POINT Number RIGHT_BRACKET RIGHT_PAREN LEFT_BRACE Statements RIGHT_BRACE | ||||
| ForStatement            : FOR LEFT_PAREN VariableDeclaration IN LEFT_BRACKET Number POINT POINT Number RIGHT_BRACKET RIGHT_PAREN LEFT_BRACE Statements RIGHT_BRACE | ||||
|                         { | ||||
|                             $$ = MakeForLoopNode($3, $6, $9, $13); | ||||
|                         } | ||||
|  |  | |||
|  | @ -619,6 +619,23 @@ static LLVMBasicBlockRef CompileReturnVoid(LLVMBuilderRef builder, LLVMValueRef | |||
|     return LLVMGetLastBasicBlock(function); | ||||
| } | ||||
| 
 | ||||
| /* FIXME: path for reference types */ | ||||
| static LLVMValueRef CompileFunctionVariableDeclaration(LLVMBuilderRef builder, LLVMValueRef function, Node *variableDeclaration) | ||||
| { | ||||
|     LLVMValueRef variable; | ||||
|     char *variableName = variableDeclaration->children[1]->value.string; | ||||
|     char *ptrName = strdup(variableName); | ||||
|     strcat(ptrName, "_ptr"); | ||||
| 
 | ||||
|     variable = LLVMBuildAlloca(builder, ResolveType(variableDeclaration->children[0]), ptrName); | ||||
| 
 | ||||
|     free(ptrName); | ||||
| 
 | ||||
|     AddLocalVariable(scope, variable, NULL, variableName); | ||||
| 
 | ||||
|     return variable; | ||||
| } | ||||
| 
 | ||||
| static LLVMBasicBlockRef CompileAssignment(LLVMBuilderRef builder, LLVMValueRef function, Node *assignmentStatement) | ||||
| { | ||||
|     LLVMValueRef result = CompileExpression(builder, assignmentStatement->children[1]); | ||||
|  | @ -631,6 +648,10 @@ static LLVMBasicBlockRef CompileAssignment(LLVMBuilderRef builder, LLVMValueRef | |||
|     { | ||||
|         identifier = FindVariablePointer(assignmentStatement->children[0]->value.string); | ||||
|     } | ||||
|     else if (assignmentStatement->children[0]->syntaxKind == Declaration) | ||||
|     { | ||||
|         identifier = CompileFunctionVariableDeclaration(builder, function, assignmentStatement->children[0]); | ||||
|     } | ||||
|     else | ||||
|     { | ||||
|         printf("Identifier not found!"); | ||||
|  | @ -642,23 +663,6 @@ static LLVMBasicBlockRef CompileAssignment(LLVMBuilderRef builder, LLVMValueRef | |||
|     return LLVMGetLastBasicBlock(function); | ||||
| } | ||||
| 
 | ||||
| /* FIXME: path for reference types */ | ||||
| static LLVMBasicBlockRef CompileFunctionVariableDeclaration(LLVMBuilderRef builder, LLVMValueRef function, Node *variableDeclaration) | ||||
| { | ||||
|     LLVMValueRef variable; | ||||
|     char *variableName = variableDeclaration->children[1]->value.string; | ||||
|     char *ptrName = strdup(variableName); | ||||
|     strcat(ptrName, "_ptr"); | ||||
| 
 | ||||
|     variable = LLVMBuildAlloca(builder, ResolveType(variableDeclaration->children[0]), ptrName); | ||||
| 
 | ||||
|     free(ptrName); | ||||
| 
 | ||||
|     AddLocalVariable(scope, variable, NULL, variableName); | ||||
| 
 | ||||
|     return LLVMGetLastBasicBlock(function); | ||||
| } | ||||
| 
 | ||||
| static LLVMBasicBlockRef CompileIfStatement(LLVMBuilderRef builder, LLVMValueRef function, Node *ifStatement) | ||||
| { | ||||
|     uint32_t i; | ||||
|  | @ -729,7 +733,8 @@ static LLVMBasicBlockRef CompileForLoopStatement(LLVMBuilderRef builder, LLVMVal | |||
|     LLVMBasicBlockRef checkBlock = LLVMAppendBasicBlock(function, "loopCheck"); | ||||
|     LLVMBasicBlockRef bodyBlock = LLVMAppendBasicBlock(function, "loopBody"); | ||||
|     LLVMBasicBlockRef afterLoopBlock = LLVMAppendBasicBlock(function, "afterLoop"); | ||||
|     char *iteratorVariableName = forLoopStatement->children[0]->value.string; | ||||
|     char *iteratorVariableName = forLoopStatement->children[0]->children[1]->value.string; | ||||
|     LLVMTypeRef iteratorVariableType = ResolveType(forLoopStatement->children[0]->children[0]); | ||||
| 
 | ||||
|     PushScopeFrame(scope); | ||||
| 
 | ||||
|  | @ -739,7 +744,7 @@ static LLVMBasicBlockRef CompileForLoopStatement(LLVMBuilderRef builder, LLVMVal | |||
|     LLVMBuildBr(builder, checkBlock); | ||||
| 
 | ||||
|     LLVMPositionBuilderAtEnd(builder, checkBlock); | ||||
|     LLVMValueRef iteratorValue = LLVMBuildPhi(builder, LLVMInt64Type(), iteratorVariableName); | ||||
|     LLVMValueRef iteratorValue = LLVMBuildPhi(builder, iteratorVariableType, iteratorVariableName); | ||||
|     AddLocalVariable(scope, NULL, iteratorValue, iteratorVariableName); | ||||
| 
 | ||||
|     LLVMPositionBuilderAtEnd(builder, bodyBlock); | ||||
|  | @ -789,7 +794,8 @@ static LLVMBasicBlockRef CompileStatement(LLVMBuilderRef builder, LLVMValueRef f | |||
|             return CompileAssignment(builder, function, statement); | ||||
| 
 | ||||
|         case Declaration: | ||||
|             return CompileFunctionVariableDeclaration(builder, function, statement); | ||||
|             CompileFunctionVariableDeclaration(builder, function, statement); | ||||
|             return LLVMGetLastBasicBlock(function); | ||||
| 
 | ||||
|         case ForLoop: | ||||
|             return CompileForLoopStatement(builder, function, statement); | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue