Mercurial > hg > octave-lyh
diff libinterp/interp-core/pt-jit.cc @ 15334:8125773322d4
Error on undefined an unused variables in JIT
* jit-typeinfo.cc (jit_typeinfo::jit_typeinfo): Support grab_fn for all types
except any and remove copy_fn initialization.
* jit-typeinfo.h (jit_typeinfo::copy): Removed function.
* pt-jit.cc (jit_convert::visit_identifier): Grab identifier on visit.
(jit_convert::visit_index_expression): Update resolve signature.
(jit_convert::resolve): Change parameters.
(jit_convert::do_assign): Update resolve call.
(jit_convert_llvm::visit): Remove now dead case.
* pt-jit.h (jit_convert::resolve): Change resolve signature.
author | Max Brister <max@2bass.com> |
---|---|
date | Sat, 08 Sep 2012 17:20:05 -0600 |
parents | de9bfcf637df |
children | 3f43e9d6d86e |
line wrap: on
line diff
--- a/libinterp/interp-core/pt-jit.cc +++ b/libinterp/interp-core/pt-jit.cc @@ -359,7 +359,12 @@ result = block->append (factory.create<jit_magic_end> (end_context)); } else - result = get_variable (ti.name ()); + { + jit_variable *var = get_variable (ti.name ()); + jit_instruction *instr; + instr = factory.create<jit_call> (&jit_typeinfo::grab, var); + result = block->append (instr); + } } void @@ -458,7 +463,7 @@ void jit_convert::visit_index_expression (tree_index_expression& exp) { - result = resolve (jit_typeinfo::paren_subsref (), exp); + result = resolve (exp); } void @@ -532,7 +537,7 @@ if (etype == octave_value::op_incr || etype == octave_value::op_decr) { - jit_value *ret = create_checked (&jit_typeinfo::copy, operandv); + jit_value *ret = create_checked (&jit_typeinfo::grab, operandv); do_assign (operand, result); result = ret; } @@ -772,8 +777,8 @@ } jit_instruction * -jit_convert::resolve (const jit_operation& fres, tree_index_expression& exp, - jit_value *extra_arg) +jit_convert::resolve (tree_index_expression& exp, jit_value *extra_arg, + bool lhs) { std::string type = exp.type_tags (); if (! (type.size () == 1 && type[0] == '(')) @@ -781,7 +786,8 @@ std::list<tree_argument_list *> args = exp.arg_lists (); if (args.size () != 1) - throw jit_fail_exception ("Bad number of arguments in tree_index_expression"); + throw jit_fail_exception ("Bad number of arguments in " + "tree_index_expression"); tree_argument_list *arg_list = args.front (); if (! arg_list) @@ -791,7 +797,16 @@ throw jit_fail_exception ("Empty arg_list"); tree_expression *tree_object = exp.expression (); - jit_value *object = visit (tree_object); + jit_value *object; + if (lhs) + { + tree_identifier *id = dynamic_cast<tree_identifier *> (tree_object); + if (! id) + throw jit_fail_exception ("expected identifier"); + object = get_variable (id->name ()); + } + else + object = visit (tree_object); size_t narg = arg_list->size (); tree_argument_list::iterator iter = arg_list->begin (); @@ -813,6 +828,9 @@ if (extra_arg) call_args[call_args.size () - 1] = extra_arg; + const jit_operation& fres = lhs ? jit_typeinfo::paren_subsasgn () + : jit_typeinfo::paren_subsref (); + return create_checked (fres, call_args); } @@ -827,8 +845,7 @@ else if (tree_index_expression *idx = dynamic_cast<tree_index_expression *> (exp)) { - jit_value *new_object = resolve (jit_typeinfo::paren_subsasgn (), *idx, - rhs); + jit_value *new_object = resolve (*idx, rhs, true); do_assign (idx->expression (), new_object, true); // FIXME: Will not work for values that must be release/grabed @@ -1122,13 +1139,6 @@ if (assign.artificial ()) return; - if (isa<jit_assign_base> (new_value)) - { - const jit_function& ol = jit_typeinfo::get_grab (new_value->type ()); - if (ol.valid ()) - assign.stash_llvm (ol.call (builder, new_value)); - } - jit_value *overwrite = assign.overwrite (); if (isa<jit_assign_base> (overwrite)) { @@ -2108,4 +2118,12 @@ %! endwhile %! assert (b, a(1)); +%!function test_undef () +%! for i=1:1e7 +%! XXX; +%! endfor +%!endfunction + +%!error <undefined near> (test_undef); + */