Add fflush and some bugfix to extern calling - io can be used now for primitives
This commit is contained in:
@@ -350,11 +350,15 @@ obj interpreter (Object) {
|
|||||||
})
|
})
|
||||||
if (results.size != 1)
|
if (results.size != 1)
|
||||||
error(string("wrong number of mains to call: ") + results.size)
|
error(string("wrong number of mains to call: ") + results.size)
|
||||||
|
println("=============")
|
||||||
println("calling main!")
|
println("calling main!")
|
||||||
|
println("=============")
|
||||||
var var_stack = stack<map<string, value>>()
|
var var_stack = stack<map<string, value>>()
|
||||||
var result = call_function(results[0], vector<value>(), &var_stack)
|
var result = call_function(results[0], vector<value>(), &var_stack)
|
||||||
println("\nMain returned: ")
|
println("=============")
|
||||||
|
println("Main returned: ")
|
||||||
print_value(result)
|
print_value(result)
|
||||||
|
println("=============")
|
||||||
}
|
}
|
||||||
fun interpret_function_call(func_call: *ast_node, var_stack: *stack<map<string, value>>): pair<value, control_flow> {
|
fun interpret_function_call(func_call: *ast_node, var_stack: *stack<map<string, value>>): pair<value, control_flow> {
|
||||||
// should handle dot style method call here
|
// should handle dot style method call here
|
||||||
@@ -405,7 +409,7 @@ obj interpreter (Object) {
|
|||||||
return value::variable(make_pair(get_real_value(dereference_val).pointer.first, dereference_val.pointer.second->clone_with_decreased_indirection()))
|
return value::variable(make_pair(get_real_value(dereference_val).pointer.first, dereference_val.pointer.second->clone_with_decreased_indirection()))
|
||||||
}
|
}
|
||||||
// check for built-in-ish externs (everything the standard library needs)
|
// check for built-in-ish externs (everything the standard library needs)
|
||||||
if (func_name == "printf" || func_name == "malloc" || func_name == "free")
|
if (func_name == "printf" || func_name == "malloc" || func_name == "free" || func_name == "fflush")
|
||||||
return call_built_in_extern(func_name, parameters)
|
return call_built_in_extern(func_name, parameters)
|
||||||
if (!func->function.body_statement)
|
if (!func->function.body_statement)
|
||||||
error(string("trying to call unsupported extern function: ") + func_name)
|
error(string("trying to call unsupported extern function: ") + func_name)
|
||||||
@@ -423,7 +427,9 @@ obj interpreter (Object) {
|
|||||||
return to_ret
|
return to_ret
|
||||||
}
|
}
|
||||||
fun call_built_in_extern(func_name: string, parameters: vector<value>): value {
|
fun call_built_in_extern(func_name: string, parameters: vector<value>): value {
|
||||||
println(string("calling func: ") + func_name)
|
/*println(string("calling func: ") + func_name)*/
|
||||||
|
for (var i = 0; i < parameters.size; i++;)
|
||||||
|
parameters[i] = get_real_value(parameters[i])
|
||||||
if (func_name == "printf") {
|
if (func_name == "printf") {
|
||||||
assert(parameters.size == 2 && is_pointer(parameters[0]) && is_pointer(parameters[1]), "Calling printf with wrong params")
|
assert(parameters.size == 2 && is_pointer(parameters[0]) && is_pointer(parameters[1]), "Calling printf with wrong params")
|
||||||
printf((parameters[0].pointer.first) cast *char, (parameters[1].pointer.first) cast *char)
|
printf((parameters[0].pointer.first) cast *char, (parameters[1].pointer.first) cast *char)
|
||||||
@@ -434,6 +440,9 @@ obj interpreter (Object) {
|
|||||||
} else if (func_name == "free") {
|
} else if (func_name == "free") {
|
||||||
assert(parameters.size == 1 && is_pointer(parameters[0]), "Calling free with wrong params")
|
assert(parameters.size == 1 && is_pointer(parameters[0]), "Calling free with wrong params")
|
||||||
free(parameters[0].pointer.first)
|
free(parameters[0].pointer.first)
|
||||||
|
} else if (func_name == "fflush") {
|
||||||
|
assert(parameters.size == 1 && is_integer(parameters[0]), "Calling fflush with wrong params")
|
||||||
|
fflush(parameters[0].integer)
|
||||||
} else if (func_name == "exit") {
|
} else if (func_name == "exit") {
|
||||||
assert(parameters.size == 1 && is_integer(parameters[0]), "Calling exit with wrong params")
|
assert(parameters.size == 1 && is_integer(parameters[0]), "Calling exit with wrong params")
|
||||||
exit(parameters[0].integer)
|
exit(parameters[0].integer)
|
||||||
|
|||||||
Reference in New Issue
Block a user