if command -v wasmer >/dev/null; then
printf "Using $(wasmer --version)\n"
else
- printf "Using $(node --verison)\n"
+ printf "Using node $(node -v)\n"
fi
failed=0
NODE(Argument) \
NODE(AddressOf) \
NODE(Dereference) \
- NODE(ArrayAccess) \
+ NODE(Subscript) \
NODE(FieldAccess) \
NODE(UnaryFieldAccess) \
NODE(SizeOf) \
Ast_Kind_Return,
Ast_Kind_Address_Of,
Ast_Kind_Dereference,
- Ast_Kind_Array_Access,
+ Ast_Kind_Subscript,
Ast_Kind_Slice,
Ast_Kind_Field_Access,
Ast_Kind_Unary_Field_Access,
struct AstDereference { AstTyped_base; AstTyped *expr; };
struct AstSizeOf { AstTyped_base; AstType *so_ast_type; Type *so_type; u64 size; };
struct AstAlignOf { AstTyped_base; AstType *ao_ast_type; Type *ao_type; u64 alignment; };
-struct AstArrayAccess {
+struct AstSubscript {
AstTyped_base;
BinaryOp __unused_operation; // This will be set to Binary_Op_Subscript
AstTyped *addr;
|| (node->kind == Ast_Kind_Param)
|| (node->kind == Ast_Kind_Global)
|| (node->kind == Ast_Kind_Dereference)
- || (node->kind == Ast_Kind_Array_Access)
+ || (node->kind == Ast_Kind_Subscript)
|| (node->kind == Ast_Kind_Field_Access)
|| (node->kind == Ast_Kind_Memres))
return 1;
CheckStatus check_expression(AstTyped** expr);
CheckStatus check_address_of(AstAddressOf* aof);
CheckStatus check_dereference(AstDereference* deref);
-CheckStatus check_array_access(AstArrayAccess** paa);
+CheckStatus check_subscript(AstSubscript** paa);
CheckStatus check_field_access(AstFieldAccess** pfield);
CheckStatus check_method_call(AstBinaryOp** mcall);
CheckStatus check_size_of(AstSizeOf* so);
CheckStatus check_address_of(AstAddressOf* aof) {
CHECK(expression, &aof->expr);
- if ((aof->expr->kind != Ast_Kind_Array_Access
+ if ((aof->expr->kind != Ast_Kind_Subscript
&& aof->expr->kind != Ast_Kind_Dereference
&& aof->expr->kind != Ast_Kind_Field_Access
&& aof->expr->kind != Ast_Kind_Memres
return Check_Success;
}
-CheckStatus check_array_access(AstArrayAccess** paa) {
- AstArrayAccess* aa = *paa;
- CHECK(expression, &aa->addr);
- CHECK(expression, &aa->expr);
+CheckStatus check_subscript(AstSubscript** psub) {
+ AstSubscript* sub = *psub;
+ CHECK(expression, &sub->addr);
+ CHECK(expression, &sub->expr);
// NOTE: Try operator overloading before checking everything else.
- if ((aa->addr->type != NULL && aa->expr->type != NULL) &&
- (aa->addr->type->kind != Type_Kind_Basic || aa->expr->type->kind != Type_Kind_Basic)) {
- // AstArrayAccess is the same as AstBinaryOp for the first sizeof(AstBinaryOp) bytes
- AstBinaryOp* binop = (AstBinaryOp *) aa;
+ if ((sub->addr->type != NULL && sub->expr->type != NULL) &&
+ (sub->addr->type->kind != Type_Kind_Basic || sub->expr->type->kind != Type_Kind_Basic)) {
+ // AstSubscript is the same as AstBinaryOp for the first sizeof(AstBinaryOp) bytes
+ AstBinaryOp* binop = (AstBinaryOp *) sub;
AstCall *implicit_call = binaryop_try_operator_overload(binop);
if (implicit_call != NULL) {
CHECK(call, implicit_call);
// NOTE: Not an array access
- *paa = (AstArrayAccess *) implicit_call;
+ *psub = (AstSubscript *) implicit_call;
return Check_Success;
}
}
- if (!type_is_array_accessible(aa->addr->type)) {
- onyx_report_error(aa->token->pos,
+ if (!type_is_array_accessible(sub->addr->type)) {
+ onyx_report_error(sub->token->pos,
"Expected pointer or array type for left of array access, got '%s'.",
- node_get_type_name(aa->addr));
+ node_get_type_name(sub->addr));
return Check_Error;
}
- if (types_are_compatible(aa->expr->type, builtin_range_type_type)) {
+ if (types_are_compatible(sub->expr->type, builtin_range_type_type)) {
Type *of = NULL;
- if (aa->addr->type->kind == Type_Kind_Pointer)
- of = aa->addr->type->Pointer.elem;
- else if (aa->addr->type->kind == Type_Kind_Array)
- of = aa->addr->type->Array.elem;
+ if (sub->addr->type->kind == Type_Kind_Pointer)
+ of = sub->addr->type->Pointer.elem;
+ else if (sub->addr->type->kind == Type_Kind_Array)
+ of = sub->addr->type->Array.elem;
else {
// FIXME: Slice creation should be allowed for slice types and dynamic array types, like it
// is below, but this code doesn't look at that.
- onyx_report_error(aa->token->pos, "Invalid type for left of slice creation.");
+ onyx_report_error(sub->token->pos, "Invalid type for left of slice creation.");
return Check_Error;
}
- aa->kind = Ast_Kind_Slice;
- aa->type = type_make_slice(context.ast_alloc, of);
- aa->elem_size = type_size_of(of);
+ sub->kind = Ast_Kind_Slice;
+ sub->type = type_make_slice(context.ast_alloc, of);
+ sub->elem_size = type_size_of(of);
return Check_Success;
}
- resolve_expression_type(aa->expr);
- if (aa->expr->type->kind != Type_Kind_Basic
- || (aa->expr->type->Basic.kind != Basic_Kind_I32 && aa->expr->type->Basic.kind != Basic_Kind_U32)) {
- onyx_report_error(aa->token->pos,
+ resolve_expression_type(sub->expr);
+ if (sub->expr->type->kind != Type_Kind_Basic
+ || (sub->expr->type->Basic.kind != Basic_Kind_I32 && sub->expr->type->Basic.kind != Basic_Kind_U32)) {
+ onyx_report_error(sub->token->pos,
"Expected type u32 or i32 for index, got '%s'.",
- node_get_type_name(aa->expr));
+ node_get_type_name(sub->expr));
return Check_Error;
}
- if (aa->addr->type->kind == Type_Kind_Pointer)
- aa->type = aa->addr->type->Pointer.elem;
- else if (aa->addr->type->kind == Type_Kind_Array)
- aa->type = aa->addr->type->Array.elem;
- else if (aa->addr->type->kind == Type_Kind_Slice
- || aa->addr->type->kind == Type_Kind_DynArray
- || aa->addr->type->kind == Type_Kind_VarArgs) {
+ if (sub->addr->type->kind == Type_Kind_Pointer)
+ sub->type = sub->addr->type->Pointer.elem;
+ else if (sub->addr->type->kind == Type_Kind_Array)
+ sub->type = sub->addr->type->Array.elem;
+ else if (sub->addr->type->kind == Type_Kind_Slice
+ || sub->addr->type->kind == Type_Kind_DynArray
+ || sub->addr->type->kind == Type_Kind_VarArgs) {
// If we are accessing on a slice or a dynamic array, implicitly add a field access for the data member
StructMember smem;
- type_lookup_member(aa->addr->type, "data", &smem);
+ type_lookup_member(sub->addr->type, "data", &smem);
- AstFieldAccess* fa = make_field_access(context.ast_alloc, aa->addr, "data");
+ AstFieldAccess* fa = make_field_access(context.ast_alloc, sub->addr, "data");
fa->type = smem.type;
fa->offset = smem.offset;
fa->idx = smem.idx;
- aa->addr = (AstTyped *) fa;
- aa->type = aa->addr->type->Pointer.elem;
+ sub->addr = (AstTyped *) fa;
+ sub->type = sub->addr->type->Pointer.elem;
}
else {
- onyx_report_error(aa->token->pos, "Invalid type for left of array access.");
+ onyx_report_error(sub->token->pos, "Invalid type for left of array access.");
return Check_Error;
}
- aa->elem_size = type_size_of(aa->type);
+ sub->elem_size = type_size_of(sub->type);
return Check_Success;
}
case Ast_Kind_Address_Of: retval = check_address_of((AstAddressOf *) expr); break;
case Ast_Kind_Dereference: retval = check_dereference((AstDereference *) expr); break;
case Ast_Kind_Slice:
- case Ast_Kind_Array_Access: retval = check_array_access((AstArrayAccess **) pexpr); break;
+ case Ast_Kind_Subscript: retval = check_subscript((AstSubscript **) pexpr); break;
case Ast_Kind_Field_Access: retval = check_field_access((AstFieldAccess **) pexpr); break;
case Ast_Kind_Method_Call: retval = check_method_call((AstBinaryOp **) pexpr); break;
case Ast_Kind_Size_Of: retval = check_size_of((AstSizeOf *) expr); break;
case Ast_Kind_Return: return sizeof(AstReturn);
case Ast_Kind_Address_Of: return sizeof(AstAddressOf);
case Ast_Kind_Dereference: return sizeof(AstDereference);
- case Ast_Kind_Array_Access: return sizeof(AstArrayAccess);
- case Ast_Kind_Slice: return sizeof(AstArrayAccess);
+ case Ast_Kind_Subscript: return sizeof(AstSubscript);
+ case Ast_Kind_Slice: return sizeof(AstSubscript);
case Ast_Kind_Field_Access: return sizeof(AstFieldAccess);
case Ast_Kind_Pipe: return sizeof(AstBinaryOp);
case Ast_Kind_Range_Literal: return sizeof(AstRangeLiteral);
break;
case Ast_Kind_Slice:
- case Ast_Kind_Array_Access:
- ((AstArrayAccess *) nn)->addr = (AstTyped *) ast_clone(a, ((AstArrayAccess *) node)->addr);
- ((AstArrayAccess *) nn)->expr = (AstTyped *) ast_clone(a, ((AstArrayAccess *) node)->expr);
+ case Ast_Kind_Subscript:
+ ((AstSubscript *) nn)->addr = (AstTyped *) ast_clone(a, ((AstSubscript *) node)->addr);
+ ((AstSubscript *) nn)->expr = (AstTyped *) ast_clone(a, ((AstSubscript *) node)->expr);
break;
case Ast_Kind_Field_Access:
OnyxToken *open_bracket = expect_token(parser, '[');
AstTyped *expr = parse_compound_expression(parser, 0);
- AstKind kind = Ast_Kind_Array_Access;
+ AstSubscript *sub_node = make_node(AstSubscript, Ast_Kind_Subscript);
+ sub_node->token = open_bracket;
+ sub_node->addr = retval;
+ sub_node->expr = expr;
+ sub_node->__unused_operation = Binary_Op_Subscript;
- AstArrayAccess *aa_node = make_node(AstArrayAccess, kind);
- aa_node->token = open_bracket;
- aa_node->addr = retval;
- aa_node->expr = expr;
- aa_node->__unused_operation = Binary_Op_Subscript;
-
- retval = (AstTyped *) aa_node;
+ retval = (AstTyped *) sub_node;
expect_token(parser, ']');
break;
}
break;
case Ast_Kind_Slice:
- case Ast_Kind_Array_Access:
- SYMRES(expression, &((AstArrayAccess *)(*expr))->addr);
- SYMRES(expression, &((AstArrayAccess *)(*expr))->expr);
+ case Ast_Kind_Subscript:
+ SYMRES(expression, &((AstSubscript *)(*expr))->addr);
+ SYMRES(expression, &((AstSubscript *)(*expr))->expr);
break;
case Ast_Kind_Struct_Literal:
EMIT_FUNC(unaryop, AstUnaryOp* unop);
EMIT_FUNC(call, AstCall* call);
EMIT_FUNC(intrinsic_call, AstCall* call);
-EMIT_FUNC(array_access_location, AstArrayAccess* aa, u64* offset_return);
+EMIT_FUNC(subscript_location, AstSubscript* sub, u64* offset_return);
EMIT_FUNC(field_access_location, AstFieldAccess* field, u64* offset_return);
EMIT_FUNC(local_location, AstLocal* local, u64* offset_return);
EMIT_FUNC(memory_reservation_location, AstMemRes* memres);
*pcode = code;
}
-EMIT_FUNC(array_access_location, AstArrayAccess* aa, u64* offset_return) {
+EMIT_FUNC(subscript_location, AstSubscript* sub, u64* offset_return) {
bh_arr(WasmInstruction) code = *pcode;
- emit_expression(mod, &code, aa->expr);
- if (aa->elem_size != 1) {
- WID(WI_PTR_CONST, aa->elem_size);
+ emit_expression(mod, &code, sub->expr);
+ if (sub->elem_size != 1) {
+ WID(WI_PTR_CONST, sub->elem_size);
WI(WI_PTR_MUL);
}
// CLEANUP: This is one dense clusterf**k of code...
u64 offset = 0;
- if (aa->addr->kind == Ast_Kind_Array_Access
- && aa->addr->type->kind == Type_Kind_Array) {
- emit_array_access_location(mod, &code, (AstArrayAccess *) aa->addr, &offset);
- } else if (aa->addr->kind == Ast_Kind_Field_Access
- && aa->addr->type->kind == Type_Kind_Array) {
- emit_field_access_location(mod, &code, (AstFieldAccess *) aa->addr, &offset);
- } else if ((aa->addr->kind == Ast_Kind_Local || aa->addr->kind == Ast_Kind_Param)
- && aa->addr->type->kind == Type_Kind_Array) {
- emit_local_location(mod, &code, (AstLocal *) aa->addr, &offset);
- } else if (aa->addr->kind == Ast_Kind_Memres
- && aa->addr->type->kind != Type_Kind_Array) {
- emit_memory_reservation_location(mod, &code, (AstMemRes *) aa->addr);
+ if (sub->addr->kind == Ast_Kind_Subscript
+ && sub->addr->type->kind == Type_Kind_Array) {
+ emit_subscript_location(mod, &code, (AstSubscript *) sub->addr, &offset);
+ } else if (sub->addr->kind == Ast_Kind_Field_Access
+ && sub->addr->type->kind == Type_Kind_Array) {
+ emit_field_access_location(mod, &code, (AstFieldAccess *) sub->addr, &offset);
+ } else if ((sub->addr->kind == Ast_Kind_Local || sub->addr->kind == Ast_Kind_Param)
+ && sub->addr->type->kind == Type_Kind_Array) {
+ emit_local_location(mod, &code, (AstLocal *) sub->addr, &offset);
+ } else if (sub->addr->kind == Ast_Kind_Memres
+ && sub->addr->type->kind != Type_Kind_Array) {
+ emit_memory_reservation_location(mod, &code, (AstMemRes *) sub->addr);
} else {
- emit_expression(mod, &code, aa->addr);
+ emit_expression(mod, &code, sub->addr);
}
WI(WI_PTR_ADD);
source_expr = (AstTyped *) ((AstFieldAccess *) source_expr)->expr;
}
- if (source_expr->kind == Ast_Kind_Array_Access
+ if (source_expr->kind == Ast_Kind_Subscript
&& source_expr->type->kind != Type_Kind_Pointer) {
u64 o2 = 0;
- emit_array_access_location(mod, &code, (AstArrayAccess *) source_expr, &o2);
+ emit_subscript_location(mod, &code, (AstSubscript *) source_expr, &o2);
offset += o2;
} else if ((source_expr->kind == Ast_Kind_Local || source_expr->kind == Ast_Kind_Param)
break;
}
- case Ast_Kind_Array_Access: {
- AstArrayAccess* aa = (AstArrayAccess *) expr;
- emit_array_access_location(mod, &code, aa, offset_return);
+ case Ast_Kind_Subscript: {
+ AstSubscript* sub = (AstSubscript *) expr;
+ emit_subscript_location(mod, &code, sub, offset_return);
break;
}
break;
}
- case Ast_Kind_Array_Access: {
- AstArrayAccess* aa = (AstArrayAccess *) expr;
+ case Ast_Kind_Subscript: {
+ AstSubscript* sub = (AstSubscript *) expr;
u64 offset = 0;
- emit_array_access_location(mod, &code, aa, &offset);
- emit_load_instruction(mod, &code, aa->type, offset);
+ emit_subscript_location(mod, &code, sub, &offset);
+ emit_load_instruction(mod, &code, sub->type, offset);
break;
}
}
case Ast_Kind_Slice: {
- AstArrayAccess* sl = (AstArrayAccess *) expr;
+ AstSubscript* sl = (AstSubscript *) expr;
emit_expression(mod, &code, sl->expr);