authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2016-01-22 22:42:02-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2016-01-22 22:42:02-07:00
log0e51c16ef57b3b8239c512d78f0dcafb202be21c
tree17589df96ea0df0ffc5c66eae1d9404fb0a14151
parent523e3b86af44b97bcf68e3eb0956ef297421ee10

add undefined literal


4 files changed, 54 insertions(+), 21 deletions(-)

src/all_types.hpp+8
......@@ -135,6 +135,7 @@ enum NodeType {
135135 NodeTypeUse,
136136 NodeTypeBoolLiteral,
137137 NodeTypeNullLiteral,
138 NodeTypeUndefinedLiteral,
138139 NodeTypeIfBoolExpr,
139140 NodeTypeIfVarExpr,
140141 NodeTypeWhileExpr,
......@@ -609,6 +610,12 @@ struct AstNodeNullLiteral {
609610 Expr resolved_expr;
610611};
611612
613struct AstNodeUndefinedLiteral {
614 // populated by semantic analyzer
615 StructValExprCodeGen resolved_struct_val_expr;
616 Expr resolved_expr;
617};
618
612619struct AstNodeSymbolExpr {
613620 Buf symbol;
614621
......@@ -692,6 +699,7 @@ struct AstNode {
692699 AstNodeContainerInitExpr container_init_expr;
693700 AstNodeStructValueField struct_val_field;
694701 AstNodeNullLiteral null_literal;
702 AstNodeUndefinedLiteral undefined_literal;
695703 AstNodeSymbolExpr symbol_expr;
696704 AstNodeBoolLiteral bool_literal;
697705 AstNodeBreakExpr break_expr;
src/analyze.cpp+28-3
......@@ -55,6 +55,7 @@ static AstNode *first_executing_node(AstNode *node) {
5555 case NodeTypeUse:
5656 case NodeTypeBoolLiteral:
5757 case NodeTypeNullLiteral:
58 case NodeTypeUndefinedLiteral:
5859 case NodeTypeIfBoolExpr:
5960 case NodeTypeIfVarExpr:
6061 case NodeTypeLabel:
......@@ -1006,6 +1007,7 @@ static void resolve_top_level_decl(CodeGen *g, ImportTableEntry *import, AstNode
10061007 case NodeTypeCharLiteral:
10071008 case NodeTypeBoolLiteral:
10081009 case NodeTypeNullLiteral:
1010 case NodeTypeUndefinedLiteral:
10091011 case NodeTypeSymbol:
10101012 case NodeTypePrefixOpExpr:
10111013 case NodeTypeIfBoolExpr:
......@@ -1079,7 +1081,9 @@ static bool type_has_codegen_value(TypeTableEntryId id) {
10791081}
10801082
10811083static void add_global_const_expr(CodeGen *g, Expr *expr) {
1082 if (expr->const_val.ok && type_has_codegen_value(expr->type_entry->id) && !expr->has_global_const) {
1084 if (expr->const_val.ok &&
1085 type_has_codegen_value(expr->type_entry->id) && !expr->has_global_const)
1086 {
10831087 g->global_const_list.append(expr);
10841088 expr->has_global_const = true;
10851089 }
......@@ -2470,6 +2474,20 @@ static TypeTableEntry *analyze_null_literal_expr(CodeGen *g, ImportTableEntry *i
24702474 return resolve_expr_const_val_as_null(g, node, expected_type);
24712475}
24722476
2477static TypeTableEntry *analyze_undefined_literal_expr(CodeGen *g, ImportTableEntry *import, BlockContext *context,
2478 TypeTableEntry *expected_type, AstNode *node)
2479{
2480 Expr *expr = get_resolved_expr(node);
2481 ConstExprValue *const_val = &expr->const_val;
2482
2483 const_val->ok = true;
2484
2485 zig_panic("TODO");
2486
2487 return expected_type;
2488}
2489
2490
24732491static TypeTableEntry *analyze_number_literal_expr(CodeGen *g, ImportTableEntry *import,
24742492 BlockContext *block_context, TypeTableEntry *expected_type, AstNode *node)
24752493{
......@@ -3634,11 +3652,12 @@ static TypeTableEntry *analyze_expression(CodeGen *g, ImportTableEntry *import,
36343652 case NodeTypeBoolLiteral:
36353653 return_type = resolve_expr_const_val_as_bool(g, node, node->data.bool_literal.value);
36363654 break;
3637
36383655 case NodeTypeNullLiteral:
36393656 return_type = analyze_null_literal_expr(g, import, context, expected_type, node);
36403657 break;
3641
3658 case NodeTypeUndefinedLiteral:
3659 return_type = analyze_undefined_literal_expr(g, import, context, expected_type, node);
3660 break;
36423661 case NodeTypeSymbol:
36433662 return_type = analyze_symbol_expr(g, import, context, expected_type, node);
36443663 break;
......@@ -3804,6 +3823,7 @@ static void analyze_top_level_decl(CodeGen *g, ImportTableEntry *import, AstNode
38043823 case NodeTypeCharLiteral:
38053824 case NodeTypeBoolLiteral:
38063825 case NodeTypeNullLiteral:
3826 case NodeTypeUndefinedLiteral:
38073827 case NodeTypeSymbol:
38083828 case NodeTypePrefixOpExpr:
38093829 case NodeTypeIfBoolExpr:
......@@ -3837,6 +3857,7 @@ static void collect_expr_decl_deps(CodeGen *g, ImportTableEntry *import, AstNode
38373857 case NodeTypeCharLiteral:
38383858 case NodeTypeBoolLiteral:
38393859 case NodeTypeNullLiteral:
3860 case NodeTypeUndefinedLiteral:
38403861 case NodeTypeGoto:
38413862 case NodeTypeBreak:
38423863 case NodeTypeContinue:
......@@ -4155,6 +4176,7 @@ static void detect_top_level_decl_deps(CodeGen *g, ImportTableEntry *import, Ast
41554176 case NodeTypeCharLiteral:
41564177 case NodeTypeBoolLiteral:
41574178 case NodeTypeNullLiteral:
4179 case NodeTypeUndefinedLiteral:
41584180 case NodeTypeSymbol:
41594181 case NodeTypePrefixOpExpr:
41604182 case NodeTypeIfBoolExpr:
......@@ -4364,6 +4386,8 @@ Expr *get_resolved_expr(AstNode *node) {
43644386 return &node->data.bool_literal.resolved_expr;
43654387 case NodeTypeNullLiteral:
43664388 return &node->data.null_literal.resolved_expr;
4389 case NodeTypeUndefinedLiteral:
4390 return &node->data.undefined_literal.resolved_expr;
43674391 case NodeTypeGoto:
43684392 return &node->data.goto_expr.resolved_expr;
43694393 case NodeTypeBreak:
......@@ -4438,6 +4462,7 @@ TopLevelDecl *get_resolved_top_level_decl(AstNode *node) {
44384462 case NodeTypeUse:
44394463 case NodeTypeBoolLiteral:
44404464 case NodeTypeNullLiteral:
4465 case NodeTypeUndefinedLiteral:
44414466 case NodeTypeLabel:
44424467 case NodeTypeGoto:
44434468 case NodeTypeBreak:
src/codegen.cpp+5-17
......@@ -1486,22 +1486,6 @@ static LLVMValueRef gen_asm_expr(CodeGen *g, AstNode *node) {
14861486 return LLVMBuildCall(g->builder, asm_fn, param_values, input_and_output_count, "");
14871487}
14881488
1489static LLVMValueRef gen_null_literal(CodeGen *g, AstNode *node) {
1490 assert(node->type == NodeTypeNullLiteral);
1491
1492 TypeTableEntry *type_entry = get_expr_type(node);
1493 assert(type_entry->id == TypeTableEntryIdMaybe);
1494
1495 LLVMValueRef tmp_struct_ptr = node->data.null_literal.resolved_struct_val_expr.ptr;
1496
1497 add_debug_source_node(g, node);
1498 LLVMValueRef field_ptr = LLVMBuildStructGEP(g->builder, tmp_struct_ptr, 1, "");
1499 LLVMValueRef null_value = LLVMConstNull(LLVMInt1Type());
1500 LLVMBuildStore(g->builder, null_value, field_ptr);
1501
1502 return tmp_struct_ptr;
1503}
1504
15051489static LLVMValueRef gen_container_init_expr(CodeGen *g, AstNode *node) {
15061490 assert(node->type == NodeTypeContainerInitExpr);
15071491
......@@ -1963,7 +1947,11 @@ static LLVMValueRef gen_expr(CodeGen *g, AstNode *node) {
19631947 case NodeTypeFieldAccessExpr:
19641948 return gen_field_access_expr(g, node, false);
19651949 case NodeTypeNullLiteral:
1966 return gen_null_literal(g, node);
1950 // caught by constant expression eval codegen
1951 zig_unreachable();
1952 case NodeTypeUndefinedLiteral:
1953 // caught by constant expression eval codegen
1954 zig_unreachable();
19671955 case NodeTypeIfBoolExpr:
19681956 return gen_if_bool_expr(g, node);
19691957 case NodeTypeIfVarExpr:
src/parser.cpp+13-1
......@@ -129,6 +129,8 @@ const char *node_type_str(NodeType node_type) {
129129 return "BoolLiteral";
130130 case NodeTypeNullLiteral:
131131 return "NullLiteral";
132 case NodeTypeUndefinedLiteral:
133 return "UndefinedLiteral";
132134 case NodeTypeIfBoolExpr:
133135 return "IfBoolExpr";
134136 case NodeTypeIfVarExpr:
......@@ -412,6 +414,9 @@ void ast_print(AstNode *node, int indent) {
412414 case NodeTypeContinue:
413415 fprintf(stderr, "%s\n", node_type_str(node->type));
414416 break;
417 case NodeTypeUndefinedLiteral:
418 fprintf(stderr, "%s\n", node_type_str(node->type));
419 break;
415420 case NodeTypeAsmExpr:
416421 fprintf(stderr, "%s\n", node_type_str(node->type));
417422 break;
......@@ -1368,7 +1373,7 @@ static AstNode *ast_parse_asm_expr(ParseContext *pc, int *token_index, bool mand
13681373
13691374/*
13701375PrimaryExpression : "Number" | "String" | "CharLiteral" | KeywordLiteral | GroupedExpression | GotoExpression | BlockExpression | "Symbol" | ("@" "Symbol" FnCallExpression) | ArrayType | AsmExpression | ("%." "Symbol")
1371KeywordLiteral : token(True) | token(False) | token(Null) | token(Break) | token(Continue)
1376KeywordLiteral : "true" | "false" | "null" | "break" | "continue" | "undefined"
13721377*/
13731378static AstNode *ast_parse_primary_expr(ParseContext *pc, int *token_index, bool mandatory) {
13741379 Token *token = &pc->tokens->at(*token_index);
......@@ -1410,6 +1415,10 @@ static AstNode *ast_parse_primary_expr(ParseContext *pc, int *token_index, bool
14101415 AstNode *node = ast_create_node(pc, NodeTypeContinue, token);
14111416 *token_index += 1;
14121417 return node;
1418 } else if (token->id == TokenIdKeywordUndefined) {
1419 AstNode *node = ast_create_node(pc, NodeTypeUndefinedLiteral, token);
1420 *token_index += 1;
1421 return node;
14131422 } else if (token->id == TokenIdAtSign) {
14141423 *token_index += 1;
14151424 Token *name_tok = ast_eat_token(pc, token_index, TokenIdSymbol);
......@@ -3202,6 +3211,9 @@ void normalize_parent_ptrs(AstNode *node) {
32023211 case NodeTypeNullLiteral:
32033212 // none
32043213 break;
3214 case NodeTypeUndefinedLiteral:
3215 // none
3216 break;
32053217 case NodeTypeIfBoolExpr:
32063218 set_field(&node->data.if_bool_expr.condition);
32073219 set_field(&node->data.if_bool_expr.then_block);