Make runtime able to call inline asm with 1 argument.
parent
03d4124320
commit
dc83382903
|
@ -2683,7 +2683,7 @@ void py_compile(py_parse_node_t pn) {
|
||||||
|
|
||||||
// compile pass 2 and 3
|
// compile pass 2 and 3
|
||||||
emit_t *emit_bc = NULL;
|
emit_t *emit_bc = NULL;
|
||||||
emit_t *emit_x64 = NULL;
|
emit_t *emit_native = NULL;
|
||||||
emit_inline_asm_t *emit_inline_thumb = NULL;
|
emit_inline_asm_t *emit_inline_thumb = NULL;
|
||||||
for (scope_t *s = comp->scope_head; s != NULL; s = s->next) {
|
for (scope_t *s = comp->scope_head; s != NULL; s = s->next) {
|
||||||
if (s->emit_options == EMIT_OPT_ASM_THUMB) {
|
if (s->emit_options == EMIT_OPT_ASM_THUMB) {
|
||||||
|
@ -2699,10 +2699,10 @@ void py_compile(py_parse_node_t pn) {
|
||||||
} else {
|
} else {
|
||||||
switch (s->emit_options) {
|
switch (s->emit_options) {
|
||||||
case EMIT_OPT_NATIVE_PYTHON:
|
case EMIT_OPT_NATIVE_PYTHON:
|
||||||
if (emit_x64 == NULL) {
|
if (emit_native == NULL) {
|
||||||
emit_x64 = emit_x64_new(max_num_labels);
|
emit_native = emit_x64_new(max_num_labels);
|
||||||
}
|
}
|
||||||
comp->emit = emit_x64;
|
comp->emit = emit_native;
|
||||||
comp->emit_method_table = &emit_x64_method_table;
|
comp->emit_method_table = &emit_x64_method_table;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
|
@ -57,7 +57,7 @@ static int emit_inline_thumb_count_params(emit_inline_asm_t *emit, int n_params,
|
||||||
}
|
}
|
||||||
for (int i = 0; i < n_params; i++) {
|
for (int i = 0; i < n_params; i++) {
|
||||||
if (!PY_PARSE_NODE_IS_ID(pn_params[i])) {
|
if (!PY_PARSE_NODE_IS_ID(pn_params[i])) {
|
||||||
printf("SyntaxError: parameter to inline assembler must be an identifier %d\n", PY_PARSE_NODE_STRUCT_KIND((py_parse_node_struct_t*)pn_params[i]));
|
printf("SyntaxError: parameter to inline assembler must be an identifier\n");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
const char *p = qstr_str(PY_PARSE_NODE_LEAF_ARG(pn_params[i]));
|
const char *p = qstr_str(PY_PARSE_NODE_LEAF_ARG(pn_params[i]));
|
||||||
|
@ -122,7 +122,10 @@ static int get_arg_label(emit_inline_asm_t *emit, qstr op, py_parse_node_t *pn_a
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
printf("SyntaxError: label '%s' not defined\n", qstr_str(label_qstr));
|
// only need to have the labels on the last pass
|
||||||
|
if (emit->pass == PASS_3) {
|
||||||
|
printf("SyntaxError: label '%s' not defined\n", qstr_str(label_qstr));
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
11
py/runtime.c
11
py/runtime.c
|
@ -772,6 +772,17 @@ py_obj_t rt_call_function_1(py_obj_t fun, py_obj_t arg) {
|
||||||
assert(o->u_fun_bc.n_args == 1);
|
assert(o->u_fun_bc.n_args == 1);
|
||||||
DEBUG_OP_printf("calling byte code %p with 1 arg\n", o->u_fun_bc.code);
|
DEBUG_OP_printf("calling byte code %p with 1 arg\n", o->u_fun_bc.code);
|
||||||
return py_execute_byte_code(o->u_fun_bc.code, o->u_fun_bc.len, &arg, 1);
|
return py_execute_byte_code(o->u_fun_bc.code, o->u_fun_bc.len, &arg, 1);
|
||||||
|
} else if (IS_O(fun, O_FUN_ASM)) {
|
||||||
|
py_obj_base_t *o = fun;
|
||||||
|
assert(o->u_fun_asm.n_args == 1);
|
||||||
|
DEBUG_OP_printf("calling inline asm %p with 1 arg\n", o->u_fun_asm.fun);
|
||||||
|
machine_int_t arg_val;
|
||||||
|
if (IS_SMALL_INT(arg)) {
|
||||||
|
arg_val = FROM_SMALL_INT(arg);
|
||||||
|
} else {
|
||||||
|
arg_val = arg;
|
||||||
|
}
|
||||||
|
return ((py_fun_1_t)o->u_fun_asm.fun)(arg_val);
|
||||||
} else if (IS_O(fun, O_BOUND_METH)) {
|
} else if (IS_O(fun, O_BOUND_METH)) {
|
||||||
py_obj_base_t *o = fun;
|
py_obj_base_t *o = fun;
|
||||||
return rt_call_function_2(o->u_bound_meth.meth, o->u_bound_meth.self, arg);
|
return rt_call_function_2(o->u_bound_meth.meth, o->u_bound_meth.self, arg);
|
||||||
|
|
Loading…
Reference in New Issue