feat: implemented box access expression in SET
This commit is contained in:
parent
26bc5a796a
commit
22cd01997c
File diff suppressed because it is too large
Load Diff
Binary file not shown.
|
@ -114,18 +114,8 @@ _start:
|
||||||
.type "std::io::getStdoutHandle",@function
|
.type "std::io::getStdoutHandle",@function
|
||||||
"std::io::getStdoutHandle":
|
"std::io::getStdoutHandle":
|
||||||
.cfi_startproc
|
.cfi_startproc
|
||||||
pushq %rbp
|
movl $1, -8(%rsp)
|
||||||
.cfi_def_cfa_offset 16
|
movl $1, %eax
|
||||||
.cfi_offset %rbp, -16
|
|
||||||
movq %rsp, %rbp
|
|
||||||
.cfi_def_cfa_register %rbp
|
|
||||||
movq %rsp, %rax
|
|
||||||
leaq -16(%rax), %rsp
|
|
||||||
movl $0, -16(%rax)
|
|
||||||
xorl %eax, %eax
|
|
||||||
movq %rbp, %rsp
|
|
||||||
popq %rbp
|
|
||||||
.cfi_def_cfa %rsp, 8
|
|
||||||
retq
|
retq
|
||||||
.Lfunc_end4:
|
.Lfunc_end4:
|
||||||
.size "std::io::getStdoutHandle", .Lfunc_end4-"std::io::getStdoutHandle"
|
.size "std::io::getStdoutHandle", .Lfunc_end4-"std::io::getStdoutHandle"
|
||||||
|
|
|
@ -21,5 +21,5 @@ fun print(in ref u8: buf, in u32: n) {
|
||||||
|
|
||||||
Handle: stdout = std::io::getStdoutHandle()
|
Handle: stdout = std::io::getStdoutHandle()
|
||||||
|
|
||||||
write(1 as i32, buf, n as u64)
|
write(stdout.fd as i32, buf, n as u64)
|
||||||
}
|
}
|
||||||
|
|
|
@ -107,8 +107,11 @@ BackendError impl_storage_expr(LLVMBackendCompileUnit* unit,
|
||||||
BoxMember* member = g_array_index(expr->impl.boxAccess.member, BoxMember*, i);
|
BoxMember* member = g_array_index(expr->impl.boxAccess.member, BoxMember*, i);
|
||||||
|
|
||||||
LLVMTypeRef member_type = NULL;
|
LLVMTypeRef member_type = NULL;
|
||||||
|
Type* type = mem_alloc(MemoryNamespaceLlvm, sizeof(Type));
|
||||||
|
type->kind = TypeKindBox;
|
||||||
|
type->impl.box = member->box;
|
||||||
err = get_type_impl(unit, scope->func_scope->global_scope,
|
err = get_type_impl(unit, scope->func_scope->global_scope,
|
||||||
expr->target_type, &member_type);
|
type, &member_type);
|
||||||
if (err.kind != Success) {
|
if (err.kind != Success) {
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1365,7 +1365,7 @@ int createBitNotOperation(Expression* ParentExpression,
|
||||||
*/
|
*/
|
||||||
GArray* getBoxMember(Type* currentBoxType, GArray* names) {
|
GArray* getBoxMember(Type* currentBoxType, GArray* names) {
|
||||||
|
|
||||||
GArray* members = mem_new_g_array(MemoryNamespaceSet, sizeof(BoxMember));
|
GArray* members = mem_new_g_array(MemoryNamespaceSet, sizeof(BoxMember*));
|
||||||
// list of members of the type
|
// list of members of the type
|
||||||
GHashTable* memberList = currentBoxType->impl.box->member;
|
GHashTable* memberList = currentBoxType->impl.box->member;
|
||||||
|
|
||||||
|
@ -1392,7 +1392,7 @@ GArray* getBoxMember(Type* currentBoxType, GArray* names) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
g_array_append_vals(members, (BoxMember*) otherMember->data,
|
g_array_append_vals(members, (BoxMember**) otherMember->data,
|
||||||
otherMember->len);
|
otherMember->len);
|
||||||
|
|
||||||
return members;
|
return members;
|
||||||
|
@ -1428,18 +1428,20 @@ int createBoxAccess(Expression* ParentExpression, AST_NODE_PTR currentNode) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// filling boxAccess variable
|
// filling boxAccess variable
|
||||||
|
ParentExpression->impl.variable = mem_alloc(MemoryNamespaceSet, sizeof(Variable));
|
||||||
ParentExpression->impl.variable->kind = VariableKindBoxMember;
|
ParentExpression->impl.variable->kind = VariableKindBoxMember;
|
||||||
ParentExpression->impl.variable->nodePtr = currentNode;
|
ParentExpression->impl.variable->nodePtr = currentNode;
|
||||||
ParentExpression->impl.variable->name = NULL;
|
ParentExpression->impl.variable->name = boxVariable->name;
|
||||||
ParentExpression->impl.variable->impl.member.nodePtr = currentNode;
|
ParentExpression->impl.variable->impl.member.nodePtr = currentNode;
|
||||||
|
|
||||||
// filling boxacces.variable
|
// filling boxacces.variable
|
||||||
ParentExpression->impl.variable->impl.member.variable = boxVariable;
|
ParentExpression->impl.variable->impl.member.variable = boxVariable;
|
||||||
|
ParentExpression->kind = ExpressionKindVariable;
|
||||||
|
|
||||||
// first one is the box itself
|
// first one is the box itself
|
||||||
GArray* names = mem_alloc(MemoryNamespaceSet, sizeof(GArray));
|
GArray* names = mem_new_g_array(MemoryNamespaceSet, sizeof(char*));
|
||||||
if (currentNode->kind == AST_IdentList) {
|
if (currentNode->kind == AST_IdentList) {
|
||||||
for (size_t i = 1; i < currentNode->children->len; i++) {
|
for (size_t i = 1; i < AST_get_child_count(currentNode); i++) {
|
||||||
g_array_append_val(names, AST_get_node(currentNode, i)->value);
|
g_array_append_val(names, AST_get_node(currentNode, i)->value);
|
||||||
}
|
}
|
||||||
} else if (currentNode->kind == AST_List) {
|
} else if (currentNode->kind == AST_List) {
|
||||||
|
@ -1455,7 +1457,7 @@ int createBoxAccess(Expression* ParentExpression, AST_NODE_PTR currentNode) {
|
||||||
GArray* boxMember = getBoxMember(boxType, names);
|
GArray* boxMember = getBoxMember(boxType, names);
|
||||||
ParentExpression->impl.variable->impl.member.member = boxMember;
|
ParentExpression->impl.variable->impl.member.member = boxMember;
|
||||||
ParentExpression->result =
|
ParentExpression->result =
|
||||||
g_array_index(boxMember, BoxMember, boxMember->len).type;
|
g_array_index(boxMember, BoxMember*, boxMember->len - 1)->type;
|
||||||
return SEMANTIC_OK;
|
return SEMANTIC_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue