Cleaning up to bring into main. Speed problem seems to have dissapeard, but we have fixes and the ^ operator in here
This commit is contained in:
@@ -710,7 +710,6 @@ obj ast_transformation (Object) {
|
|||||||
} else if (get_node("\"^=\"", node)){
|
} else if (get_node("\"^=\"", node)){
|
||||||
var possible_assign = find_and_make_any_operator_overload_call(string("^="), vector(assign_to, to_assign), scope, template_replacements)
|
var possible_assign = find_and_make_any_operator_overload_call(string("^="), vector(assign_to, to_assign), scope, template_replacements)
|
||||||
if (possible_assign) {
|
if (possible_assign) {
|
||||||
/*print("Computed and returning operator/=")*/
|
|
||||||
return possible_assign
|
return possible_assign
|
||||||
}
|
}
|
||||||
to_assign = make_operator_call("^", vector(assign_to, to_assign))
|
to_assign = make_operator_call("^", vector(assign_to, to_assign))
|
||||||
|
|||||||
@@ -76,7 +76,7 @@ obj code_triple (Object) {
|
|||||||
obj c_generator (Object) {
|
obj c_generator (Object) {
|
||||||
var id_counter: int
|
var id_counter: int
|
||||||
var ast_to_syntax: map<*ast_node, *tree<symbol>>
|
var ast_to_syntax: map<*ast_node, *tree<symbol>>
|
||||||
/*var ast_name_map: hash_map<*ast_node, string>*/
|
var ast_name_map: map<*ast_node, string>
|
||||||
var closure_struct_map: map<set<*ast_node>, string>
|
var closure_struct_map: map<set<*ast_node>, string>
|
||||||
var function_type_map: map<type, string>
|
var function_type_map: map<type, string>
|
||||||
var function_typedef_string: string
|
var function_typedef_string: string
|
||||||
@@ -88,7 +88,7 @@ obj c_generator (Object) {
|
|||||||
fun construct(): *c_generator {
|
fun construct(): *c_generator {
|
||||||
id_counter = 0
|
id_counter = 0
|
||||||
ast_to_syntax.construct()
|
ast_to_syntax.construct()
|
||||||
/*ast_name_map.construct()*/
|
ast_name_map.construct()
|
||||||
closure_struct_map.construct()
|
closure_struct_map.construct()
|
||||||
function_type_map.construct()
|
function_type_map.construct()
|
||||||
function_typedef_string.construct()
|
function_typedef_string.construct()
|
||||||
@@ -147,7 +147,7 @@ obj c_generator (Object) {
|
|||||||
fun copy_construct(old: *c_generator) {
|
fun copy_construct(old: *c_generator) {
|
||||||
id_counter = old->id_counter
|
id_counter = old->id_counter
|
||||||
ast_to_syntax.copy_construct(&old->ast_to_syntax)
|
ast_to_syntax.copy_construct(&old->ast_to_syntax)
|
||||||
/*ast_name_map.copy_construct(&old->ast_name_map)*/
|
ast_name_map.copy_construct(&old->ast_name_map)
|
||||||
closure_struct_map.copy_construct(&old->closure_struct_map)
|
closure_struct_map.copy_construct(&old->closure_struct_map)
|
||||||
function_type_map.copy_construct(&old->function_type_map)
|
function_type_map.copy_construct(&old->function_type_map)
|
||||||
function_typedef_string.copy_construct(&old->function_typedef_string)
|
function_typedef_string.copy_construct(&old->function_typedef_string)
|
||||||
@@ -163,7 +163,7 @@ obj c_generator (Object) {
|
|||||||
}
|
}
|
||||||
fun destruct() {
|
fun destruct() {
|
||||||
ast_to_syntax.destruct()
|
ast_to_syntax.destruct()
|
||||||
/*ast_name_map.destruct()*/
|
ast_name_map.destruct()
|
||||||
closure_struct_map.destruct()
|
closure_struct_map.destruct()
|
||||||
function_type_map.destruct()
|
function_type_map.destruct()
|
||||||
function_typedef_string.destruct()
|
function_typedef_string.destruct()
|
||||||
@@ -632,7 +632,7 @@ obj c_generator (Object) {
|
|||||||
// temporary returns if we're asked for them or we need them for destruct
|
// temporary returns if we're asked for them or we need them for destruct
|
||||||
if (!func_return_type->is_ref && !func_return_type->is_void() && need_variable) {
|
if (!func_return_type->is_ref && !func_return_type->is_void() && need_variable) {
|
||||||
// kind of ugly combo here of
|
// kind of ugly combo here of
|
||||||
var temp_ident = ast_identifier_ptr(string("temporary_return")+get_id() + "temporary_end1", func_return_type, null<ast_node>())
|
var temp_ident = ast_identifier_ptr(string("temporary_return") + get_id(), func_return_type, null<ast_node>())
|
||||||
var declaration = ast_declaration_statement_ptr(temp_ident, null<ast_node>())
|
var declaration = ast_declaration_statement_ptr(temp_ident, null<ast_node>())
|
||||||
// have to pass false to the declaration generator, so can't do it through generate_statement
|
// have to pass false to the declaration generator, so can't do it through generate_statement
|
||||||
call_string.pre += generate_declaration_statement(declaration, enclosing_object, enclosing_func, false).one_string() + ";\n"
|
call_string.pre += generate_declaration_statement(declaration, enclosing_object, enclosing_func, false).one_string() + ";\n"
|
||||||
@@ -650,7 +650,7 @@ obj c_generator (Object) {
|
|||||||
if (!dot_style_method_call) {
|
if (!dot_style_method_call) {
|
||||||
// lambda
|
// lambda
|
||||||
if (pre_call == "" && (!func_return_type->is_void() || func_return_type->indirection)) {
|
if (pre_call == "" && (!func_return_type->is_void() || func_return_type->indirection)) {
|
||||||
var temp_ident = ast_identifier_ptr(string("temporary_return")+get_id() + "temporary_end2", func_return_type, null<ast_node>())
|
var temp_ident = ast_identifier_ptr(string("temporary_return") + get_id(), func_return_type, null<ast_node>())
|
||||||
var declaration = ast_declaration_statement_ptr(temp_ident, null<ast_node>())
|
var declaration = ast_declaration_statement_ptr(temp_ident, null<ast_node>())
|
||||||
// have to pass false to the declaration generator, so can't do it through generate_statement
|
// have to pass false to the declaration generator, so can't do it through generate_statement
|
||||||
call_string.pre += generate_declaration_statement(declaration, enclosing_object, enclosing_func, false).one_string() + ";\n"
|
call_string.pre += generate_declaration_statement(declaration, enclosing_object, enclosing_func, false).one_string() + ";\n"
|
||||||
@@ -805,17 +805,17 @@ obj c_generator (Object) {
|
|||||||
return string("impossible type") + indirection
|
return string("impossible type") + indirection
|
||||||
}
|
}
|
||||||
fun get_name(node: *ast_node): string {
|
fun get_name(node: *ast_node): string {
|
||||||
/*var maybe_it = ast_name_map.get_ptr_or_null(node);*/
|
var maybe_it = ast_name_map.get_ptr_or_null(node);
|
||||||
/*if (maybe_it)*/
|
if (maybe_it)
|
||||||
/*return *maybe_it*/
|
return *maybe_it
|
||||||
var result = string("impossible name")
|
var result = string("impossible name")
|
||||||
var make_unique = true
|
var make_unique = true
|
||||||
match (*node) {
|
match (*node) {
|
||||||
ast_node::type_def(backing) {
|
ast_node::type_def(backing) {
|
||||||
/*var upper = backing.scope[string("~enclosing_scope")][0]*/
|
var upper = backing.scope[string("~enclosing_scope")][0]
|
||||||
result = cify_name(backing.name)
|
result = cify_name(backing.name)
|
||||||
/*if (is_template(upper))*/
|
if (is_template(upper))
|
||||||
/*upper->template.instantiated_map.reverse_get(node).for_each(fun(t: ref type) result += string("_") + type_decoration(&t);)*/
|
upper->template.instantiated_map.reverse_get(node).for_each(fun(t: ref type) result += string("_") + type_decoration(&t);)
|
||||||
}
|
}
|
||||||
ast_node::adt_def(backing) {
|
ast_node::adt_def(backing) {
|
||||||
error("shouldn't have adt")
|
error("shouldn't have adt")
|
||||||
@@ -827,11 +827,11 @@ obj c_generator (Object) {
|
|||||||
make_unique = false
|
make_unique = false
|
||||||
} else {
|
} else {
|
||||||
result = "fun_"
|
result = "fun_"
|
||||||
/*var upper = backing.scope.get_with_default(string("~enclosing_scope"), vector(null<ast_node>()))[0]*/
|
var upper = backing.scope.get_with_default(string("~enclosing_scope"), vector(null<ast_node>()))[0]
|
||||||
/*if (upper && is_type_def(upper))*/
|
if (upper && is_type_def(upper))
|
||||||
/*result += get_name(upper) + "_"*/
|
result += get_name(upper) + "_"
|
||||||
result += cify_name(node->function.name)
|
result += cify_name(node->function.name)
|
||||||
/*node->function.parameters.for_each(fun(param: *ast_node) result += string("_") + type_decoration(param->identifier.type);)*/
|
node->function.parameters.for_each(fun(param: *ast_node) result += string("_") + type_decoration(param->identifier.type);)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ast_node::identifier(backing) {
|
ast_node::identifier(backing) {
|
||||||
@@ -843,13 +843,11 @@ obj c_generator (Object) {
|
|||||||
if (result == "impossible name")
|
if (result == "impossible name")
|
||||||
error("HUGE PROBLEMS")
|
error("HUGE PROBLEMS")
|
||||||
// TODO keyword avoid seems not to work
|
// TODO keyword avoid seems not to work
|
||||||
/*if (make_unique && (ast_name_map.contains_value(result) || c_keyword_avoid.contains(result)))*/
|
if (make_unique && (ast_name_map.contains_value(result) || c_keyword_avoid.contains(result)))
|
||||||
/*result += get_id()*/
|
result += get_id()
|
||||||
if (make_unique)
|
/*if (make_unique)*/
|
||||||
result += to_string(hash(node)) + "_end_of_hash"
|
/*result += to_string(hash(node)) + "_end_of_hash"*/
|
||||||
/*println("the hash of the node is: " + to_string(hash(node)))*/
|
ast_name_map.set(node, result)
|
||||||
/*println("the result of the node is: " + result)*/
|
|
||||||
/*ast_name_map.set(node, result)*/
|
|
||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
fun cify_name(name: string): string {
|
fun cify_name(name: string): string {
|
||||||
|
|||||||
@@ -47,28 +47,19 @@ fun min<T>(a: T, b: T): T {
|
|||||||
return a;
|
return a;
|
||||||
}
|
}
|
||||||
|
|
||||||
fun hash<T>(item: T): ulong {
|
fun hash<T(Hashable)>(item: T): ulong return item.hash()
|
||||||
var h = hash_first(item)
|
fun hash<T>(item: *T): ulong return (item) cast ulong
|
||||||
/*h ^= h >> 16*/
|
fun hash(item: char): ulong return (item) cast ulong
|
||||||
/*h *= 0x85ebca6b*/
|
fun hash(item: uchar): ulong return (item) cast ulong
|
||||||
/*h ^= h >> 13*/
|
fun hash(item: short): ulong return (item) cast ulong
|
||||||
/*h *= 0xc2b2ae35*/
|
fun hash(item: ushort): ulong return (item) cast ulong
|
||||||
/*h ^= h >> 16*/
|
fun hash(item: int): ulong return (item) cast ulong
|
||||||
return h
|
fun hash(item: uint): ulong return (item) cast ulong
|
||||||
}
|
fun hash(item: long): ulong return (item) cast ulong
|
||||||
|
fun hash(item: ulong): ulong return (item) cast ulong
|
||||||
|
|
||||||
fun hash_first<T(Hashable)>(item: T): ulong return item.hash()
|
|
||||||
fun hash_first<T>(item: *T): ulong return (item) cast ulong
|
|
||||||
fun hash_first(item: char): ulong return (item) cast ulong
|
|
||||||
fun hash_first(item: uchar): ulong return (item) cast ulong
|
|
||||||
fun hash_first(item: short): ulong return (item) cast ulong
|
|
||||||
fun hash_first(item: ushort): ulong return (item) cast ulong
|
|
||||||
fun hash_first(item: int): ulong return (item) cast ulong
|
|
||||||
fun hash_first(item: uint): ulong return (item) cast ulong
|
|
||||||
fun hash_first(item: long): ulong return (item) cast ulong
|
|
||||||
fun hash_first(item: ulong): ulong return (item) cast ulong
|
|
||||||
// default hash
|
// default hash
|
||||||
fun hash_first<T>(item: T): ulong {
|
fun hash<T>(item: T): ulong {
|
||||||
io::println("using empty hash - please do not do!")
|
io::println("using empty hash - please do not do!")
|
||||||
return (0) cast ulong
|
return (0) cast ulong
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user