aboutsummaryrefslogtreecommitdiff
path: root/src/analyze.cpp
diff options
context:
space:
mode:
authorAndrew Kelley <superjoe30@gmail.com>2016-01-27 23:22:37 -0700
committerAndrew Kelley <superjoe30@gmail.com>2016-01-27 23:23:02 -0700
commit97c61313dab659e4934e0dd31ffa89284151017b (patch)
treefda7c30a0ec9ecdff64b7c0a5f74de776b488368 /src/analyze.cpp
parent51ab9b03ce97666fd7fd56cf0f81b11fb1709bc6 (diff)
downloadzig-97c61313dab659e4934e0dd31ffa89284151017b.tar.gz
zig-97c61313dab659e4934e0dd31ffa89284151017b.zip
c_import of stdio.h works for some functions
See #88
Diffstat (limited to 'src/analyze.cpp')
-rw-r--r--src/analyze.cpp51
1 files changed, 40 insertions, 11 deletions
diff --git a/src/analyze.cpp b/src/analyze.cpp
index 121c4c04ff..6df6c8baed 100644
--- a/src/analyze.cpp
+++ b/src/analyze.cpp
@@ -12,6 +12,7 @@
#include "os.hpp"
#include "parseh.hpp"
#include "config.h"
+#include "ast_render.hpp"
static TypeTableEntry * analyze_expression(CodeGen *g, ImportTableEntry *import, BlockContext *context,
TypeTableEntry *expected_type, AstNode *node);
@@ -26,6 +27,7 @@ static TypeTableEntry *analyze_error_literal_expr(CodeGen *g, ImportTableEntry *
static TypeTableEntry *analyze_block_expr(CodeGen *g, ImportTableEntry *import, BlockContext *context,
TypeTableEntry *expected_type, AstNode *node);
static TypeTableEntry *resolve_expr_const_val_as_void(CodeGen *g, AstNode *node);
+static void detect_top_level_decl_deps(CodeGen *g, ImportTableEntry *import, AstNode *node);
static AstNode *first_executing_node(AstNode *node) {
switch (node->type) {
@@ -87,6 +89,8 @@ static AstNode *first_executing_node(AstNode *node) {
}
ErrorMsg *add_node_error(CodeGen *g, AstNode *node, Buf *msg) {
+ assert(!node->owner->c_import_node);
+
ErrorMsg *err = err_msg_create_with_line(node->owner->path, node->line, node->column,
node->owner->source_code, node->owner->line_offsets, msg);
@@ -1056,11 +1060,15 @@ static void resolve_c_import_decl(CodeGen *g, ImportTableEntry *parent_import, A
find_libc_path(g);
- ImportTableEntry child_import = {0};
+ ImportTableEntry *child_import = allocate<ImportTableEntry>(1);
+ child_import->fn_table.init(32);
+ child_import->fn_type_table.init(32);
+ child_import->c_import_node = node;
+
ZigList<ErrorMsg *> errors = {0};
int err;
- if ((err = parse_h_buf(&child_import, &errors, child_context->c_import_buf, g->clang_argv, g->clang_argv_len,
+ if ((err = parse_h_buf(child_import, &errors, child_context->c_import_buf, g->clang_argv, g->clang_argv_len,
buf_ptr(g->libc_include_path))))
{
zig_panic("unable to parse h file: %s\n", err_str(err));
@@ -1075,7 +1083,24 @@ static void resolve_c_import_decl(CodeGen *g, ImportTableEntry *parent_import, A
return;
}
- zig_panic("TODO integrate the AST");
+ if (g->verbose) {
+ fprintf(stderr, "\nc_import:\n");
+ fprintf(stderr, "-----------\n");
+ ast_render(stderr, child_import->root, 4);
+ }
+
+ child_import->di_file = parent_import->di_file;
+ child_import->block_context = new_block_context(child_import->root, nullptr);
+ child_import->importers.append({parent_import, node});
+
+ detect_top_level_decl_deps(g, child_import, child_import->root);
+}
+
+static void satisfy_dep(CodeGen *g, AstNode *node) {
+ Buf *name = get_resolved_top_level_decl(node)->name;
+ if (name) {
+ g->unresolved_top_level_decls.maybe_remove(name);
+ }
}
static void resolve_top_level_decl(CodeGen *g, ImportTableEntry *import, AstNode *node) {
@@ -1085,7 +1110,7 @@ static void resolve_top_level_decl(CodeGen *g, ImportTableEntry *import, AstNode
break;
case NodeTypeRootExportDecl:
// handled earlier
- break;
+ return;
case NodeTypeStructDecl:
{
TypeTableEntry *type_entry = node->data.struct_decl.type_entry;
@@ -1115,7 +1140,7 @@ static void resolve_top_level_decl(CodeGen *g, ImportTableEntry *import, AstNode
break;
case NodeTypeImport:
// nothing to do here
- break;
+ return;
case NodeTypeCImport:
resolve_c_import_decl(g, import, node);
break;
@@ -1159,6 +1184,9 @@ static void resolve_top_level_decl(CodeGen *g, ImportTableEntry *import, AstNode
case NodeTypeErrorType:
zig_unreachable();
}
+
+
+ satisfy_dep(g, node);
}
static FnTableEntry *get_context_fn_entry(BlockContext *context) {
@@ -4512,6 +4540,12 @@ static TypeTableEntryId container_to_type(ContainerKind kind) {
static void detect_top_level_decl_deps(CodeGen *g, ImportTableEntry *import, AstNode *node) {
switch (node->type) {
+ case NodeTypeRoot:
+ for (int i = 0; i < import->root->data.root.top_level_decls.length; i += 1) {
+ AstNode *child = import->root->data.root.top_level_decls.at(i);
+ detect_top_level_decl_deps(g, import, child);
+ }
+ break;
case NodeTypeStructDecl:
{
Buf *name = &node->data.struct_decl.name;
@@ -4664,7 +4698,6 @@ static void detect_top_level_decl_deps(CodeGen *g, ImportTableEntry *import, Ast
case NodeTypeParamDecl:
case NodeTypeFnDecl:
case NodeTypeReturnExpr:
- case NodeTypeRoot:
case NodeTypeBlock:
case NodeTypeBinOpExpr:
case NodeTypeUnwrapErrorExpr:
@@ -4732,7 +4765,6 @@ static void recursive_resolve_decl(CodeGen *g, ImportTableEntry *import, AstNode
}
resolve_top_level_decl(g, import, node);
- g->unresolved_top_level_decls.remove(get_resolved_top_level_decl(node)->name);
}
static void resolve_top_level_declarations_root(CodeGen *g, ImportTableEntry *import, AstNode *node) {
@@ -4823,10 +4855,7 @@ void semantic_analyze(CodeGen *g) {
ImportTableEntry *import = entry->value;
- for (int i = 0; i < import->root->data.root.top_level_decls.length; i += 1) {
- AstNode *child = import->root->data.root.top_level_decls.at(i);
- detect_top_level_decl_deps(g, import, child);
- }
+ detect_top_level_decl_deps(g, import, import->root);
}
}