hello.zig working with all structs anonymous

This commit is contained in:
Andrew Kelley 2016-12-18 17:24:52 -05:00
parent e50ced44a2
commit 37b13bf151
10 changed files with 57 additions and 34 deletions

View File

@ -151,7 +151,7 @@ GroupedExpression = "(" Expression ")"
KeywordLiteral = "true" | "false" | "null" | "break" | "continue" | "undefined" | "zeroes" | "error" | "type" | "this" KeywordLiteral = "true" | "false" | "null" | "break" | "continue" | "undefined" | "zeroes" | "error" | "type" | "this"
ContainerDecl = ("struct" | "enum" | "union") "{" many(StructMember) "}" ContainerDecl = option("extern") ("struct" | "enum" | "union") "{" many(StructMember) "}"
``` ```

View File

@ -598,6 +598,7 @@ struct AstNodeContainerDecl {
ContainerKind kind; ContainerKind kind;
ZigList<AstNode *> fields; ZigList<AstNode *> fields;
ZigList<AstNode *> decls; ZigList<AstNode *> decls;
bool is_extern;
}; };
struct AstNodeStructField { struct AstNodeStructField {
@ -801,6 +802,7 @@ struct TypeStructField {
}; };
struct TypeTableEntryStruct { struct TypeTableEntryStruct {
AstNode *decl_node; AstNode *decl_node;
bool is_extern;
bool is_packed; bool is_packed;
uint32_t src_field_count; uint32_t src_field_count;
uint32_t gen_field_count; uint32_t gen_field_count;
@ -827,6 +829,7 @@ struct TypeTableEntryError {
struct TypeTableEntryEnum { struct TypeTableEntryEnum {
AstNode *decl_node; AstNode *decl_node;
bool is_extern;
uint32_t src_field_count; uint32_t src_field_count;
uint32_t gen_field_count; uint32_t gen_field_count;
TypeEnumField *fields; TypeEnumField *fields;
@ -845,6 +848,7 @@ struct TypeTableEntryEnum {
struct TypeTableEntryUnion { struct TypeTableEntryUnion {
AstNode *decl_node; AstNode *decl_node;
bool is_extern;
uint32_t src_field_count; uint32_t src_field_count;
uint32_t gen_field_count; uint32_t gen_field_count;
TypeStructField *fields; TypeStructField *fields;

View File

@ -838,12 +838,15 @@ TypeTableEntry *get_partial_container_type(CodeGen *g, Scope *scope, ContainerKi
switch (kind) { switch (kind) {
case ContainerKindStruct: case ContainerKindStruct:
entry->data.structure.decl_node = decl_node; entry->data.structure.decl_node = decl_node;
entry->data.structure.is_extern = decl_node->data.container_decl.is_extern;
break; break;
case ContainerKindEnum: case ContainerKindEnum:
entry->data.enumeration.decl_node = decl_node; entry->data.enumeration.decl_node = decl_node;
entry->data.enumeration.is_extern = decl_node->data.container_decl.is_extern;
break; break;
case ContainerKindUnion: case ContainerKindUnion:
entry->data.unionation.decl_node = decl_node; entry->data.unionation.decl_node = decl_node;
entry->data.unionation.is_extern = decl_node->data.container_decl.is_extern;
break; break;
} }

View File

@ -8007,6 +8007,9 @@ static TypeTableEntry *ir_analyze_container_init_fields(IrAnalyze *ira, IrInstru
TypeTableEntry *container_type, size_t instr_field_count, IrInstructionContainerInitFieldsField *fields, TypeTableEntry *container_type, size_t instr_field_count, IrInstructionContainerInitFieldsField *fields,
bool depends_on_compile_var) bool depends_on_compile_var)
{ {
if (!type_is_complete(container_type))
resolve_container_type(ira->codegen, container_type);
size_t actual_field_count = container_type->data.structure.src_field_count; size_t actual_field_count = container_type->data.structure.src_field_count;
IrInstruction *first_non_const_instruction = nullptr; IrInstruction *first_non_const_instruction = nullptr;

View File

@ -684,11 +684,6 @@ static AstNode *ast_parse_primary_expr(ParseContext *pc, size_t *token_index, bo
AstNode *node = ast_create_node(pc, NodeTypeErrorType, token); AstNode *node = ast_create_node(pc, NodeTypeErrorType, token);
*token_index += 1; *token_index += 1;
return node; return node;
} else if (token->id == TokenIdKeywordExtern) {
*token_index += 1;
AstNode *node = ast_parse_fn_proto(pc, token_index, true, VisibModPrivate);
node->data.fn_proto.is_extern = true;
return node;
} else if (token->id == TokenIdAtSign) { } else if (token->id == TokenIdAtSign) {
*token_index += 1; *token_index += 1;
Token *name_tok = ast_eat_token(pc, token_index, TokenIdSymbol); Token *name_tok = ast_eat_token(pc, token_index, TokenIdSymbol);
@ -742,6 +737,13 @@ static AstNode *ast_parse_primary_expr(ParseContext *pc, size_t *token_index, bo
if (container_decl) if (container_decl)
return container_decl; return container_decl;
if (token->id == TokenIdKeywordExtern) {
*token_index += 1;
AstNode *node = ast_parse_fn_proto(pc, token_index, true, VisibModPrivate);
node->data.fn_proto.is_extern = true;
return node;
}
if (!mandatory) if (!mandatory)
return nullptr; return nullptr;
@ -2224,28 +2226,39 @@ static AstNode *ast_parse_use(ParseContext *pc, size_t *token_index, VisibMod vi
} }
/* /*
ContainerDecl = ("struct" | "enum" | "union") "{" many(StructMember) "}" ContainerDecl = option("extern") ("struct" | "enum" | "union") "{" many(StructMember) "}"
StructMember = (StructField | FnDef | GlobalVarDecl) StructMember = (StructField | FnDef | GlobalVarDecl)
StructField = Symbol option(":" Expression) ",") StructField = Symbol option(":" Expression) ",")
*/ */
static AstNode *ast_parse_container_decl(ParseContext *pc, size_t *token_index, bool mandatory) { static AstNode *ast_parse_container_decl(ParseContext *pc, size_t *token_index, bool mandatory) {
Token *first_token = &pc->tokens->at(*token_index); Token *first_token = &pc->tokens->at(*token_index);
Token *container_kind_token;
bool is_extern;
if (first_token->id == TokenIdKeywordExtern) {
container_kind_token = &pc->tokens->at(*token_index + 1);
is_extern = true;
} else {
container_kind_token = first_token;
is_extern = false;
}
ContainerKind kind; ContainerKind kind;
if (first_token->id == TokenIdKeywordStruct) { if (container_kind_token->id == TokenIdKeywordStruct) {
kind = ContainerKindStruct; kind = ContainerKindStruct;
} else if (first_token->id == TokenIdKeywordEnum) { } else if (container_kind_token->id == TokenIdKeywordEnum) {
kind = ContainerKindEnum; kind = ContainerKindEnum;
} else if (first_token->id == TokenIdKeywordUnion) { } else if (container_kind_token->id == TokenIdKeywordUnion) {
kind = ContainerKindUnion; kind = ContainerKindUnion;
} else if (mandatory) { } else if (mandatory) {
ast_invalid_token_error(pc, first_token); ast_invalid_token_error(pc, container_kind_token);
} else { } else {
return nullptr; return nullptr;
} }
*token_index += 1; *token_index += is_extern ? 2 : 1;
AstNode *node = ast_create_node(pc, NodeTypeContainerDecl, first_token); AstNode *node = ast_create_node(pc, NodeTypeContainerDecl, first_token);
node->data.container_decl.is_extern = is_extern;
node->data.container_decl.kind = kind; node->data.container_decl.kind = kind;
ast_eat_token(pc, token_index, TokenIdLBrace); ast_eat_token(pc, token_index, TokenIdLBrace);

View File

@ -34,7 +34,7 @@ pub fn toSlice(str: &u8) -> []u8 {
/// A buffer that allocates memory and maintains a null byte at the end. /// A buffer that allocates memory and maintains a null byte at the end.
pub struct CBuf { pub const CBuf = struct {
list: List(u8), list: List(u8),
/// Must deinitialize with deinit. /// Must deinitialize with deinit.
@ -124,7 +124,7 @@ pub struct CBuf {
pub fn startsWithCStr(self: &const CBuf, s: &const u8) -> bool { pub fn startsWithCStr(self: &const CBuf, s: &const u8) -> bool {
self.startsWithMem(s[0...strlen(s)]) self.startsWithMem(s[0...strlen(s)])
} }
} };
fn testSimpleCBuf() { fn testSimpleCBuf() {
@setFnTest(this, true); @setFnTest(this, true);

View File

@ -69,7 +69,7 @@ pub const OpenWrite = 0b0010;
pub const OpenCreate = 0b0100; pub const OpenCreate = 0b0100;
pub const OpenTruncate = 0b1000; pub const OpenTruncate = 0b1000;
pub struct OutStream { pub const OutStream = struct {
fd: i32, fd: i32,
buffer: [buffer_size]u8, buffer: [buffer_size]u8,
index: usize, index: usize,
@ -153,11 +153,11 @@ pub struct OutStream {
return; return;
} }
} }
} };
// TODO created a BufferedInStream struct and move some of this code there // TODO created a BufferedInStream struct and move some of this code there
// BufferedInStream API goes on top of minimal InStream API. // BufferedInStream API goes on top of minimal InStream API.
pub struct InStream { pub const InStream = struct {
fd: i32, fd: i32,
/// Call close to clean up. /// Call close to clean up.
@ -360,7 +360,7 @@ pub struct InStream {
return usize(stat.size); return usize(stat.size);
} }
} };
pub fn parseUnsigned(inline T: type, buf: []u8, radix: u8) -> %T { pub fn parseUnsigned(inline T: type, buf: []u8, radix: u8) -> %T {
var x: T = 0; var x: T = 0;

View File

@ -342,31 +342,31 @@ pub const socklen_t = u32;
pub const in_addr = u32; pub const in_addr = u32;
pub const in6_addr = [16]u8; pub const in6_addr = [16]u8;
export struct sockaddr { pub const sockaddr = extern struct {
family: sa_family_t, family: sa_family_t,
port: u16, port: u16,
data: [12]u8, data: [12]u8,
} };
export struct sockaddr_in { pub const sockaddr_in = extern struct {
family: sa_family_t, family: sa_family_t,
port: u16, port: u16,
addr: in_addr, addr: in_addr,
zero: [8]u8, zero: [8]u8,
} };
export struct sockaddr_in6 { pub const sockaddr_in6 = extern struct {
family: sa_family_t, family: sa_family_t,
port: u16, port: u16,
flowinfo: u32, flowinfo: u32,
addr: in6_addr, addr: in6_addr,
scope_id: u32, scope_id: u32,
} };
export struct iovec { pub const iovec = extern struct {
iov_base: &u8, iov_base: &u8,
iov_len: usize, iov_len: usize,
} };
// //
//const IF_NAMESIZE = 16; //const IF_NAMESIZE = 16;

View File

@ -442,7 +442,7 @@ pub inline fn syscall6(number: usize, arg1: usize, arg2: usize, arg3: usize, arg
: "rcx", "r11") : "rcx", "r11")
} }
export struct msghdr { pub const msghdr = extern struct {
msg_name: &u8, msg_name: &u8,
msg_namelen: socklen_t, msg_namelen: socklen_t,
msg_iov: &iovec, msg_iov: &iovec,
@ -452,9 +452,9 @@ export struct msghdr {
msg_controllen: socklen_t, msg_controllen: socklen_t,
__pad2: socklen_t, __pad2: socklen_t,
msg_flags: i32, msg_flags: i32,
} };
export struct stat { pub const stat = extern struct {
dev: u64, dev: u64,
ino: u64, ino: u64,
nlink: usize, nlink: usize,
@ -472,9 +472,9 @@ export struct stat {
mtim: timespec, mtim: timespec,
ctim: timespec, ctim: timespec,
__unused: [3]isize, __unused: [3]isize,
} };
export struct timespec { pub const timespec = extern struct {
tv_sec: isize, tv_sec: isize,
tv_nsec: isize, tv_nsec: isize,
} };

View File

@ -1,8 +1,8 @@
pub enum Cmp { pub const Cmp = enum {
Equal, Equal,
Greater, Greater,
Less, Less,
} };
pub fn min(x: var, y: var) -> @typeOf(x + y) { pub fn min(x: var, y: var) -> @typeOf(x + y) {
if (x < y) x else y if (x < y) x else y