Bugfixes for table updates and array concat updates
This commit is contained in:
parent
46b61d3ed2
commit
2a12cb869b
@ -366,7 +366,7 @@ static CORD compile_lvalue(env_t *env, ast_t *ast)
|
||||
if (table_type->default_value) {
|
||||
type_t *value_type = get_type(env, table_type->default_value);
|
||||
return CORD_all("*Table$get_or_setdefault(",
|
||||
compile_lvalue(env, index->indexed), ", ",
|
||||
compile_to_pointer_depth(env, index->indexed, 1, false), ", ",
|
||||
compile_type(table_type->key_type), ", ",
|
||||
compile_type(value_type), ", ",
|
||||
compile(env, index->index), ", ",
|
||||
@ -871,7 +871,7 @@ CORD compile_statement(env_t *env, ast_t *ast)
|
||||
if (update->lhs->tag == Var)
|
||||
return CORD_all("Array$insert_all(&", lhs, ", ", rhs, ", I(0), ", padded_item_size, ");");
|
||||
else
|
||||
return CORD_all(lhs, "Array$concat(", lhs, ", ", rhs, ", ", padded_item_size, ");");
|
||||
return CORD_all(lhs, " = Array$concat(", lhs, ", ", rhs, ", ", padded_item_size, ");");
|
||||
} else {
|
||||
code_err(ast, "'++=' is not implemented for %T types", lhs_t);
|
||||
}
|
||||
@ -3682,7 +3682,7 @@ CORD compile(env_t *env, ast_t *ast)
|
||||
if (table_type->default_value) {
|
||||
type_t *value_type = get_type(env, table_type->default_value);
|
||||
return CORD_all("Table$get_or_default(",
|
||||
compile(env, indexing->indexed), ", ",
|
||||
compile_to_pointer_depth(env, indexing->indexed, 0, false), ", ",
|
||||
compile_type(table_type->key_type), ", ",
|
||||
compile_type(value_type), ", ",
|
||||
compile(env, indexing->index), ", ",
|
||||
|
@ -25,7 +25,7 @@ PUREFUNC public uint64_t Struct$hash(const void *obj, const TypeInfo_t *type)
|
||||
if (type->StructInfo.num_fields == 1)
|
||||
return generic_hash(obj, type->StructInfo.fields[0].type);
|
||||
|
||||
uint32_t field_hashes[type->StructInfo.num_fields] = {};
|
||||
uint64_t field_hashes[type->StructInfo.num_fields] = {};
|
||||
ptrdiff_t byte_offset = 0;
|
||||
ptrdiff_t bit_offset = 0;
|
||||
for (int i = 0; i < type->StructInfo.num_fields; i++) {
|
||||
@ -45,7 +45,13 @@ PUREFUNC public uint64_t Struct$hash(const void *obj, const TypeInfo_t *type)
|
||||
}
|
||||
if (field.type->align && byte_offset % field.type->align > 0)
|
||||
byte_offset += field.type->align - (byte_offset % field.type->align);
|
||||
field_hashes[i] = generic_hash(obj + byte_offset, field.type);
|
||||
|
||||
if (field.type->metamethods.hash == NULL && (size_t)field.type->size < sizeof(uint64_t)) {
|
||||
memcpy(&field_hashes[i], obj + byte_offset, (size_t)field.type->size);
|
||||
} else {
|
||||
field_hashes[i] = generic_hash(obj + byte_offset, field.type);
|
||||
}
|
||||
|
||||
byte_offset += field.type->size;
|
||||
}
|
||||
}
|
||||
|
@ -36,7 +36,7 @@ void *Table$get(Table_t t, const void *key, const TypeInfo_t *type);
|
||||
val_t *nonnull_var = Table$get(t, &k, info_expr); \
|
||||
nonnull_var ? nonnull_expr : null_expr; })
|
||||
#define Table$get_or_setdefault(table_expr, key_t, val_t, key_expr, default_expr, info_expr) ({ \
|
||||
Table_t *t = &table_expr; const key_t k = key_expr; \
|
||||
Table_t *t = table_expr; const key_t k = key_expr; \
|
||||
val_t *v = Table$get(*t, &k, info_expr); \
|
||||
v ? v : (val_t*)Table$reserve(t, &k, (val_t[1]){default_expr}, info_expr); })
|
||||
#define Table$get_or_default(table_expr, key_t, val_t, key_expr, default_expr, info_expr) ({ \
|
||||
|
Loading…
Reference in New Issue
Block a user