From 2b682d4be5596cb2838cb835bc1a1a332783eec4 Mon Sep 17 00:00:00 2001 From: edwin Date: Fri, 13 Oct 2006 18:25:21 +0000 Subject: [PATCH] * src/vm/jit/verify/icmds.c: Check basic types of instance for field access. * src/vm/jit/verify/typecheck-fields.inc: Check basic type of value. * src/vm/jit/verify/typecheck-stackbased-gen.inc: Regenerated. * src/vm/jit/verify/typecheck-variablesbased-gen.inc: Likewise. * src/vm/jit/verify/typecheck.c (verify_fieldaccess): Define VERIFY_ERROR for the include file. * src/vm/jit/verify/typecheck-stackbased.c (VERIFY_ERROR): Fixed macro. * tests/regression/jasmin/test_verify_fail_putfieldconst_basic_type_instance.j, tests/regression/jasmin/test_verify_fail_getfield_basic_type_instance.j, tests/regression/jasmin/test_verify_fail_putfield_basic_type_value.j, tests/regression/jasmin/test_verify_fail_putstatic_basic_type_value.j, tests/regression/jasmin/test_verify_fail_putfieldconst_basic_type_value.j, tests/regression/jasmin/test_verify_fail_getfield_basic_type_value.j, tests/regression/jasmin/test_verify_fail_putfield_basic_type_instance.j, tests/regression/jasmin/test_verify_fail_putfield_basic_type_lookup.j, tests/regression/jasmin/test_verify_fail_getfield_basic_type_lookup.j, tests/regression/jasmin/test_verify_fail_putstaticconst_basic_type_value.j: New tests. * tests/regression/jasmin/runtest: Look for specified ICMDs in -sia output. --- src/vm/jit/verify/icmds.c | 21 ++- src/vm/jit/verify/typecheck-fields.inc | 5 + .../jit/verify/typecheck-stackbased-gen.inc | 141 +++++++++--------- src/vm/jit/verify/typecheck-stackbased.c | 2 +- .../verify/typecheck-variablesbased-gen.inc | 92 ++++++------ src/vm/jit/verify/typecheck.c | 4 +- tests/regression/jasmin/runtest | 14 ++ ...verify_fail_getfield_basic_type_instance.j | 52 +++++++ ...t_verify_fail_getfield_basic_type_lookup.j | 49 ++++++ ...st_verify_fail_getfield_basic_type_value.j | 49 ++++++ ...verify_fail_putfield_basic_type_instance.j | 55 +++++++ ...t_verify_fail_putfield_basic_type_lookup.j | 48 ++++++ ...st_verify_fail_putfield_basic_type_value.j | 51 +++++++ ...y_fail_putfieldconst_basic_type_instance.j | 52 +++++++ ...rify_fail_putfieldconst_basic_type_value.j | 48 ++++++ ...t_verify_fail_putstatic_basic_type_value.j | 43 ++++++ ...ify_fail_putstaticconst_basic_type_value.j | 40 +++++ 17 files changed, 636 insertions(+), 130 deletions(-) create mode 100644 tests/regression/jasmin/test_verify_fail_getfield_basic_type_instance.j create mode 100644 tests/regression/jasmin/test_verify_fail_getfield_basic_type_lookup.j create mode 100644 tests/regression/jasmin/test_verify_fail_getfield_basic_type_value.j create mode 100644 tests/regression/jasmin/test_verify_fail_putfield_basic_type_instance.j create mode 100644 tests/regression/jasmin/test_verify_fail_putfield_basic_type_lookup.j create mode 100644 tests/regression/jasmin/test_verify_fail_putfield_basic_type_value.j create mode 100644 tests/regression/jasmin/test_verify_fail_putfieldconst_basic_type_instance.j create mode 100644 tests/regression/jasmin/test_verify_fail_putfieldconst_basic_type_value.j create mode 100644 tests/regression/jasmin/test_verify_fail_putstatic_basic_type_value.j create mode 100644 tests/regression/jasmin/test_verify_fail_putstaticconst_basic_type_value.j diff --git a/src/vm/jit/verify/icmds.c b/src/vm/jit/verify/icmds.c index 5a3042040..24a3cd85a 100644 --- a/src/vm/jit/verify/icmds.c +++ b/src/vm/jit/verify/icmds.c @@ -86,31 +86,30 @@ case ICMD_AALOAD: case ICMD_PUTFIELD: /* {STACKBASED} */ CHECK_STACK_DEPTH(2); - if (IS_CAT1(stack[0])) - stack -= 2; - else { - stack -= 3; + if (!IS_CAT1(stack[0])) { + CHECK_STACK_DEPTH(3); + stack -= 1; } - stack = typecheck_stackbased_verify_fieldaccess(STATE, stack+1, stack+2, stack); + CHECK_STACK_TYPE(stack[-1], TYPE_ADR); + stack = typecheck_stackbased_verify_fieldaccess(STATE, stack-1, stack, stack-2); if (stack == NULL) EXCEPTION; break; case ICMD_PUTSTATIC: /* {STACKBASED} */ CHECK_STACK_DEPTH(1); - if (IS_CAT1(stack[0])) + if (!IS_CAT1(stack[0])) { + /* (stack depth >= 2 is guaranteed) */ stack -= 1; - else { - stack -= 2; } - stack = typecheck_stackbased_verify_fieldaccess(STATE, NULL, stack+1, stack); + stack = typecheck_stackbased_verify_fieldaccess(STATE, NULL, stack, stack-1); if (stack == NULL) EXCEPTION; break; case ICMD_GETFIELD: /* {STACKBASED} */ - stack -= 1; - stack = typecheck_stackbased_verify_fieldaccess(STATE, stack+1, NULL, stack); + CHECK_STACK_TYPE(stack[0], TYPE_ADR); + stack = typecheck_stackbased_verify_fieldaccess(STATE, stack, NULL, stack-1); if (stack == NULL) EXCEPTION; break; diff --git a/src/vm/jit/verify/typecheck-fields.inc b/src/vm/jit/verify/typecheck-fields.inc index e3f8b5a89..b777385b5 100644 --- a/src/vm/jit/verify/typecheck-fields.inc +++ b/src/vm/jit/verify/typecheck-fields.inc @@ -56,6 +56,11 @@ fieldref = state->iptr->sx.s23.s3.fmiref; } + /* check the basic value type for PUT instructions */ + + if (value && value->type != fieldref->parseddesc.fd->type) + VERIFY_ERROR("Field type mismatch"); + /* try to resolve the field reference lazily */ result = resolve_field_lazy(state->m, fieldref); diff --git a/src/vm/jit/verify/typecheck-stackbased-gen.inc b/src/vm/jit/verify/typecheck-stackbased-gen.inc index a46fdb7a0..a1abfd95e 100644 --- a/src/vm/jit/verify/typecheck-stackbased-gen.inc +++ b/src/vm/jit/verify/typecheck-stackbased-gen.inc @@ -14,7 +14,7 @@ GENERATED /* may use stack[1] ... stack[1] */ GENERATED GENERATED -# line 308 "src/vm/jit/verify/icmds.c" +# line 307 "src/vm/jit/verify/icmds.c" GENERATED if (IPTR->flags.bits & INS_FLAG_CLASS) { GENERATED /* a java.lang.Class reference */ GENERATED TYPEINFO_INIT_JAVA_LANG_CLASS(DST->typeinfo,IPTR->sx.val.c); @@ -174,7 +174,7 @@ GENERATED /* may use stack[-1] ... stack[0] */ GENERATED GENERATED -# line 219 "src/vm/jit/verify/icmds.c" +# line 218 "src/vm/jit/verify/icmds.c" GENERATED if (!TYPEINFO_MAYBE_PRIMITIVE_ARRAY(OP1->typeinfo,ARRAYTYPE_INT)) GENERATED VERIFY_ERROR("Array type mismatch"); GENERATED @@ -207,7 +207,7 @@ GENERATED /* may use stack[-1] ... stack[0] */ GENERATED GENERATED -# line 229 "src/vm/jit/verify/icmds.c" +# line 228 "src/vm/jit/verify/icmds.c" GENERATED if (!TYPEINFO_MAYBE_PRIMITIVE_ARRAY(OP1->typeinfo,ARRAYTYPE_LONG)) GENERATED VERIFY_ERROR("Array type mismatch"); GENERATED @@ -240,7 +240,7 @@ GENERATED /* may use stack[-1] ... stack[0] */ GENERATED GENERATED -# line 214 "src/vm/jit/verify/icmds.c" +# line 213 "src/vm/jit/verify/icmds.c" GENERATED if (!TYPEINFO_MAYBE_PRIMITIVE_ARRAY(OP1->typeinfo,ARRAYTYPE_FLOAT)) GENERATED VERIFY_ERROR("Array type mismatch"); GENERATED @@ -273,7 +273,7 @@ GENERATED /* may use stack[-1] ... stack[0] */ GENERATED GENERATED -# line 209 "src/vm/jit/verify/icmds.c" +# line 208 "src/vm/jit/verify/icmds.c" GENERATED if (!TYPEINFO_MAYBE_PRIMITIVE_ARRAY(OP1->typeinfo,ARRAYTYPE_DOUBLE)) GENERATED VERIFY_ERROR("Array type mismatch"); GENERATED @@ -341,7 +341,7 @@ GENERATED /* may use stack[-1] ... stack[0] */ GENERATED GENERATED -# line 198 "src/vm/jit/verify/icmds.c" +# line 197 "src/vm/jit/verify/icmds.c" GENERATED if (!TYPEINFO_MAYBE_PRIMITIVE_ARRAY(OP1->typeinfo,ARRAYTYPE_BOOLEAN) GENERATED && !TYPEINFO_MAYBE_PRIMITIVE_ARRAY(OP1->typeinfo,ARRAYTYPE_BYTE)) GENERATED VERIFY_ERROR("Array type mismatch"); @@ -375,7 +375,7 @@ GENERATED /* may use stack[-1] ... stack[0] */ GENERATED GENERATED -# line 204 "src/vm/jit/verify/icmds.c" +# line 203 "src/vm/jit/verify/icmds.c" GENERATED if (!TYPEINFO_MAYBE_PRIMITIVE_ARRAY(OP1->typeinfo,ARRAYTYPE_CHAR)) GENERATED VERIFY_ERROR("Array type mismatch"); GENERATED @@ -408,7 +408,7 @@ GENERATED /* may use stack[-1] ... stack[0] */ GENERATED GENERATED -# line 224 "src/vm/jit/verify/icmds.c" +# line 223 "src/vm/jit/verify/icmds.c" GENERATED if (!TYPEINFO_MAYBE_PRIMITIVE_ARRAY(OP1->typeinfo,ARRAYTYPE_SHORT)) GENERATED VERIFY_ERROR("Array type mismatch"); GENERATED @@ -504,7 +504,7 @@ GENERATED /* may use stack[-2] ... stack[0] */ GENERATED GENERATED -# line 255 "src/vm/jit/verify/icmds.c" +# line 254 "src/vm/jit/verify/icmds.c" GENERATED if (!TYPEINFO_MAYBE_PRIMITIVE_ARRAY(OP1->typeinfo,ARRAYTYPE_INT)) GENERATED VERIFY_ERROR("Array type mismatch"); GENERATED @@ -537,7 +537,7 @@ GENERATED /* may use stack[-3] ... stack[0] */ GENERATED GENERATED -# line 265 "src/vm/jit/verify/icmds.c" +# line 264 "src/vm/jit/verify/icmds.c" GENERATED if (!TYPEINFO_MAYBE_PRIMITIVE_ARRAY(OP1->typeinfo,ARRAYTYPE_LONG)) GENERATED VERIFY_ERROR("Array type mismatch"); GENERATED @@ -570,7 +570,7 @@ GENERATED /* may use stack[-2] ... stack[0] */ GENERATED GENERATED -# line 250 "src/vm/jit/verify/icmds.c" +# line 249 "src/vm/jit/verify/icmds.c" GENERATED if (!TYPEINFO_MAYBE_PRIMITIVE_ARRAY(OP1->typeinfo,ARRAYTYPE_FLOAT)) GENERATED VERIFY_ERROR("Array type mismatch"); GENERATED @@ -603,7 +603,7 @@ GENERATED /* may use stack[-3] ... stack[0] */ GENERATED GENERATED -# line 245 "src/vm/jit/verify/icmds.c" +# line 244 "src/vm/jit/verify/icmds.c" GENERATED if (!TYPEINFO_MAYBE_PRIMITIVE_ARRAY(OP1->typeinfo,ARRAYTYPE_DOUBLE)) GENERATED VERIFY_ERROR("Array type mismatch"); GENERATED @@ -636,7 +636,7 @@ GENERATED /* may use stack[-2] ... stack[0] */ GENERATED GENERATED -# line 270 "src/vm/jit/verify/icmds.c" +# line 269 "src/vm/jit/verify/icmds.c" GENERATED /* we just check the basic input types and that the */ GENERATED /* destination is an array of references. Assignability to */ GENERATED /* the actual array must be checked at runtime, each time the */ @@ -673,7 +673,7 @@ GENERATED /* may use stack[-2] ... stack[0] */ GENERATED GENERATED -# line 234 "src/vm/jit/verify/icmds.c" +# line 233 "src/vm/jit/verify/icmds.c" GENERATED if (!TYPEINFO_MAYBE_PRIMITIVE_ARRAY(OP1->typeinfo,ARRAYTYPE_BOOLEAN) GENERATED && !TYPEINFO_MAYBE_PRIMITIVE_ARRAY(OP1->typeinfo,ARRAYTYPE_BYTE)) GENERATED VERIFY_ERROR("Array type mismatch"); @@ -707,7 +707,7 @@ GENERATED /* may use stack[-2] ... stack[0] */ GENERATED GENERATED -# line 240 "src/vm/jit/verify/icmds.c" +# line 239 "src/vm/jit/verify/icmds.c" GENERATED if (!TYPEINFO_MAYBE_PRIMITIVE_ARRAY(OP1->typeinfo,ARRAYTYPE_CHAR)) GENERATED VERIFY_ERROR("Array type mismatch"); GENERATED @@ -740,7 +740,7 @@ GENERATED /* may use stack[-2] ... stack[0] */ GENERATED GENERATED -# line 260 "src/vm/jit/verify/icmds.c" +# line 259 "src/vm/jit/verify/icmds.c" GENERATED if (!TYPEINFO_MAYBE_PRIMITIVE_ARRAY(OP1->typeinfo,ARRAYTYPE_SHORT)) GENERATED VERIFY_ERROR("Array type mismatch"); GENERATED @@ -763,7 +763,7 @@ GENERATED /* may use stack[0] ... stack[0] */ GENERATED GENERATED -# line 656 "src/vm/jit/verify/icmds.c" +# line 655 "src/vm/jit/verify/icmds.c" GENERATED /* we pop 1 */ GENERATED CHECK_CAT1(stack[0]); GENERATED @@ -779,7 +779,7 @@ GENERATED /* may use stack[-1] ... stack[0] */ GENERATED GENERATED -# line 661 "src/vm/jit/verify/icmds.c" +# line 660 "src/vm/jit/verify/icmds.c" GENERATED /* we pop either 11 or 2 */ GENERATED if (IS_CAT1(stack[0])) GENERATED CHECK_CAT1(stack[-1]); @@ -799,7 +799,7 @@ GENERATED /* may use stack[0] ... stack[1] */ GENERATED GENERATED -# line 676 "src/vm/jit/verify/icmds.c" +# line 675 "src/vm/jit/verify/icmds.c" GENERATED /* we dup 1 */ GENERATED CHECK_CAT1(stack[0]); GENERATED @@ -823,7 +823,7 @@ GENERATED /* may use stack[-1] ... stack[1] */ GENERATED GENERATED -# line 683 "src/vm/jit/verify/icmds.c" +# line 682 "src/vm/jit/verify/icmds.c" GENERATED /* we dup 1 */ GENERATED CHECK_CAT1(stack[0]); GENERATED /* we skip 1 */ @@ -849,7 +849,7 @@ GENERATED /* may use stack[-2] ... stack[1] */ GENERATED GENERATED -# line 694 "src/vm/jit/verify/icmds.c" +# line 693 "src/vm/jit/verify/icmds.c" GENERATED /* we dup 1 */ GENERATED CHECK_CAT1(stack[0]); GENERATED /* we skip either 11 or 2 */ @@ -874,7 +874,7 @@ GENERATED /* may use stack[-1] ... stack[2] */ GENERATED GENERATED -# line 707 "src/vm/jit/verify/icmds.c" +# line 706 "src/vm/jit/verify/icmds.c" GENERATED /* we dup either 11 or 2 */ GENERATED if (IS_CAT1(stack[0])) GENERATED CHECK_CAT1(stack[-1]); @@ -895,7 +895,7 @@ GENERATED /* may use stack[-2] ... stack[2] */ GENERATED GENERATED -# line 716 "src/vm/jit/verify/icmds.c" +# line 715 "src/vm/jit/verify/icmds.c" GENERATED /* we dup either 11 or 2 */ GENERATED if (IS_CAT1(stack[0])) GENERATED CHECK_CAT1(stack[-1]); @@ -921,7 +921,7 @@ GENERATED /* may use stack[-3] ... stack[2] */ GENERATED GENERATED -# line 730 "src/vm/jit/verify/icmds.c" +# line 729 "src/vm/jit/verify/icmds.c" GENERATED /* we dup either 11 or 2 */ GENERATED if (IS_CAT1(stack[0])) GENERATED CHECK_CAT1(stack[-1]); @@ -950,7 +950,7 @@ GENERATED /* may use stack[-1] ... stack[0] */ GENERATED GENERATED -# line 667 "src/vm/jit/verify/icmds.c" +# line 666 "src/vm/jit/verify/icmds.c" GENERATED CHECK_CAT1(stack[0]); GENERATED CHECK_CAT1(stack[-1]); GENERATED @@ -1255,7 +1255,7 @@ GENERATED /* may use stack[1] ... stack[1] */ GENERATED GENERATED -# line 347 "src/vm/jit/verify/icmds.c" +# line 346 "src/vm/jit/verify/icmds.c" GENERATED /* {RESULTNOW} */ GENERATED TYPECHECK_COUNT(stat_ins_branch); GENERATED @@ -1289,7 +1289,7 @@ GENERATED /* may use stack[1] ... stack[2] */ GENERATED GENERATED -# line 353 "src/vm/jit/verify/icmds.c" +# line 352 "src/vm/jit/verify/icmds.c" GENERATED /* {RESULTNOW} */ GENERATED TYPECHECK_COUNT(stat_ins_branch); GENERATED @@ -1321,7 +1321,7 @@ GENERATED /* may use stack[1] ... stack[2] */ GENERATED GENERATED -# line 359 "src/vm/jit/verify/icmds.c" +# line 358 "src/vm/jit/verify/icmds.c" GENERATED /* {RESULTNOW} */ GENERATED TYPECHECK_COUNT(stat_ins_branch); GENERATED @@ -1343,7 +1343,7 @@ GENERATED superblockend = true; GENERATED GENERATED -# line 344 "src/vm/jit/verify/icmds.c" +# line 343 "src/vm/jit/verify/icmds.c" GENERATED /* {RESULTNOW} */ GENERATED TYPECHECK_COUNT(stat_ins_branch); GENERATED @@ -1368,7 +1368,7 @@ GENERATED /* may use stack[0] ... stack[0] */ GENERATED GENERATED -# line 540 "src/vm/jit/verify/icmds.c" +# line 539 "src/vm/jit/verify/icmds.c" GENERATED /* {RESULTNOW} */ GENERATED tbptr = BLOCK_OF(IPTR->sx.s23.s3.jsrtarget.insindex); GENERATED @@ -1392,7 +1392,7 @@ GENERATED superblockend = true; GENERATED GENERATED -# line 559 "src/vm/jit/verify/icmds.c" +# line 558 "src/vm/jit/verify/icmds.c" GENERATED /* {RESULTNOW} */ GENERATED CHECK_LOCAL_TYPE(IPTR->s1.varindex, TYPE_ADR); GENERATED if (!TYPEINFO_IS_PRIMITIVE(STATE->locals[IPTR->s1.varindex].typeinfo)) @@ -1418,7 +1418,7 @@ GENERATED /* may use stack[1] ... stack[1] */ GENERATED GENERATED -# line 411 "src/vm/jit/verify/icmds.c" +# line 410 "src/vm/jit/verify/icmds.c" GENERATED /* {RESULTNOW} */ GENERATED TYPECHECK_COUNT(stat_ins_switch); GENERATED @@ -1453,7 +1453,7 @@ GENERATED /* may use stack[1] ... stack[1] */ GENERATED GENERATED -# line 427 "src/vm/jit/verify/icmds.c" +# line 426 "src/vm/jit/verify/icmds.c" GENERATED /* {RESULTNOW} */ GENERATED TYPECHECK_COUNT(stat_ins_switch); GENERATED @@ -1486,7 +1486,7 @@ GENERATED /* may use stack[0] ... stack[0] */ GENERATED GENERATED -# line 493 "src/vm/jit/verify/icmds.c" +# line 492 "src/vm/jit/verify/icmds.c" GENERATED if (STATE->returntype.type != TYPE_INT) GENERATED VERIFY_ERROR("Return type mismatch"); GENERATED @@ -1508,7 +1508,7 @@ GENERATED /* may use stack[-1] ... stack[0] */ GENERATED GENERATED -# line 498 "src/vm/jit/verify/icmds.c" +# line 497 "src/vm/jit/verify/icmds.c" GENERATED if (STATE->returntype.type != TYPE_LNG) GENERATED VERIFY_ERROR("Return type mismatch"); GENERATED @@ -1530,7 +1530,7 @@ GENERATED /* may use stack[0] ... stack[0] */ GENERATED GENERATED -# line 503 "src/vm/jit/verify/icmds.c" +# line 502 "src/vm/jit/verify/icmds.c" GENERATED if (STATE->returntype.type != TYPE_FLT) GENERATED VERIFY_ERROR("Return type mismatch"); GENERATED @@ -1552,7 +1552,7 @@ GENERATED /* may use stack[-1] ... stack[0] */ GENERATED GENERATED -# line 508 "src/vm/jit/verify/icmds.c" +# line 507 "src/vm/jit/verify/icmds.c" GENERATED if (STATE->returntype.type != TYPE_DBL) GENERATED VERIFY_ERROR("Return type mismatch"); GENERATED @@ -1575,7 +1575,7 @@ GENERATED /* may use stack[0] ... stack[0] */ GENERATED GENERATED -# line 468 "src/vm/jit/verify/icmds.c" +# line 467 "src/vm/jit/verify/icmds.c" GENERATED TYPECHECK_COUNT(stat_ins_areturn); GENERATED if (!TYPEINFO_IS_REFERENCE(OP1->typeinfo)) GENERATED VERIFY_ERROR("illegal instruction: ARETURN on non-reference"); @@ -1609,7 +1609,7 @@ GENERATED superblockend = true; GENERATED GENERATED -# line 513 "src/vm/jit/verify/icmds.c" +# line 512 "src/vm/jit/verify/icmds.c" GENERATED if (STATE->returntype.type != TYPE_VOID) GENERATED VERIFY_ERROR("Return type mismatch"); GENERATED @@ -1641,7 +1641,7 @@ GENERATED /* variable number of outslots! */ GENERATED GENERATED -# line 119 "src/vm/jit/verify/icmds.c" +# line 118 "src/vm/jit/verify/icmds.c" GENERATED stack = typecheck_stackbased_verify_fieldaccess(STATE, NULL, NULL, stack); GENERATED if (stack == NULL) GENERATED EXCEPTION; @@ -1659,16 +1659,15 @@ GENERATED # line 100 "src/vm/jit/verify/icmds.c" GENERATED CHECK_STACK_DEPTH(1); - GENERATED if (IS_CAT1(stack[0])) + GENERATED if (!IS_CAT1(stack[0])) { + GENERATED /* (stack depth >= 2 is guaranteed) */ GENERATED stack -= 1; - GENERATED else { - GENERATED stack -= 2; GENERATED } - GENERATED stack = typecheck_stackbased_verify_fieldaccess(STATE, NULL, stack+1, stack); + GENERATED stack = typecheck_stackbased_verify_fieldaccess(STATE, NULL, stack, stack-1); GENERATED if (stack == NULL) GENERATED EXCEPTION; GENERATED -# line 1672 "src/vm/jit/verify/typecheck-stackbased-gen.inc" +# line 1671 "src/vm/jit/verify/typecheck-stackbased-gen.inc" GENERATED GENERATED break; GENERATED @@ -1680,13 +1679,13 @@ GENERATED /* variable number of outslots! */ GENERATED GENERATED -# line 112 "src/vm/jit/verify/icmds.c" - GENERATED stack -= 1; - GENERATED stack = typecheck_stackbased_verify_fieldaccess(STATE, stack+1, NULL, stack); +# line 111 "src/vm/jit/verify/icmds.c" + GENERATED CHECK_STACK_TYPE(stack[0], TYPE_ADR); + GENERATED stack = typecheck_stackbased_verify_fieldaccess(STATE, stack, NULL, stack-1); GENERATED if (stack == NULL) GENERATED EXCEPTION; GENERATED -# line 1690 "src/vm/jit/verify/typecheck-stackbased-gen.inc" +# line 1689 "src/vm/jit/verify/typecheck-stackbased-gen.inc" GENERATED GENERATED break; GENERATED @@ -1699,16 +1698,16 @@ GENERATED # line 88 "src/vm/jit/verify/icmds.c" GENERATED CHECK_STACK_DEPTH(2); - GENERATED if (IS_CAT1(stack[0])) - GENERATED stack -= 2; - GENERATED else { - GENERATED stack -= 3; + GENERATED if (!IS_CAT1(stack[0])) { + GENERATED CHECK_STACK_DEPTH(3); + GENERATED stack -= 1; GENERATED } - GENERATED stack = typecheck_stackbased_verify_fieldaccess(STATE, stack+1, stack+2, stack); + GENERATED CHECK_STACK_TYPE(stack[-1], TYPE_ADR); + GENERATED stack = typecheck_stackbased_verify_fieldaccess(STATE, stack-1, stack, stack-2); GENERATED if (stack == NULL) GENERATED EXCEPTION; GENERATED -# line 1712 "src/vm/jit/verify/typecheck-stackbased-gen.inc" +# line 1711 "src/vm/jit/verify/typecheck-stackbased-gen.inc" GENERATED GENERATED break; GENERATED @@ -1723,7 +1722,7 @@ GENERATED /* variable number of outslots! */ GENERATED GENERATED -# line 582 "src/vm/jit/verify/icmds.c" +# line 581 "src/vm/jit/verify/icmds.c" GENERATED TYPECHECK_COUNT(stat_ins_invoke); GENERATED GENERATED INSTRUCTION_GET_METHODDESC(IPTR, md); @@ -1749,7 +1748,7 @@ GENERATED } GENERATED TYPECHECK_COUNTIF(INSTRUCTION_IS_UNRESOLVED(IPTR), stat_ins_invoke_unresolved); GENERATED -# line 1753 "src/vm/jit/verify/typecheck-stackbased-gen.inc" +# line 1752 "src/vm/jit/verify/typecheck-stackbased-gen.inc" GENERATED GENERATED break; GENERATED @@ -1766,12 +1765,12 @@ GENERATED /* may use stack[0] ... stack[0] */ GENERATED GENERATED -# line 192 "src/vm/jit/verify/icmds.c" +# line 191 "src/vm/jit/verify/icmds.c" GENERATED if (!TYPEINFO_MAYBE_ARRAY(OP1->typeinfo) GENERATED && OP1->typeinfo.typeclass.cls != pseudo_class_Arraystub) GENERATED VERIFY_ERROR("illegal instruction: ARRAYLENGTH on non-array"); GENERATED -# line 1775 "src/vm/jit/verify/typecheck-stackbased-gen.inc" +# line 1774 "src/vm/jit/verify/typecheck-stackbased-gen.inc" GENERATED GENERATED stack[0].type = TYPE_INT; GENERATED break; @@ -1793,7 +1792,7 @@ GENERATED /* may use stack[0] ... stack[0] */ GENERATED GENERATED -# line 447 "src/vm/jit/verify/icmds.c" +# line 446 "src/vm/jit/verify/icmds.c" GENERATED TYPECHECK_COUNT(stat_ins_athrow); GENERATED r = typeinfo_is_assignable_to_class(&OP1->typeinfo, GENERATED CLASSREF_OR_CLASSINFO(class_java_lang_Throwable)); @@ -1813,7 +1812,7 @@ GENERATED IPTR->flags.bits |= INS_FLAG_UNRESOLVED; GENERATED } GENERATED -# line 1817 "src/vm/jit/verify/typecheck-stackbased-gen.inc" +# line 1816 "src/vm/jit/verify/typecheck-stackbased-gen.inc" GENERATED GENERATED stack += -1; GENERATED break; @@ -1834,7 +1833,7 @@ GENERATED /* may use stack[0] ... stack[0] */ GENERATED GENERATED -# line 326 "src/vm/jit/verify/icmds.c" +# line 325 "src/vm/jit/verify/icmds.c" GENERATED /* returnAddress is not allowed */ GENERATED if (!TYPEINFO_IS_REFERENCE(OP1->typeinfo)) GENERATED VERIFY_ERROR("Illegal instruction: CHECKCAST on non-reference"); @@ -1842,7 +1841,7 @@ GENERATED if (!typeinfo_init_class(&(DST->typeinfo),IPTR->sx.s23.s3.c)) GENERATED EXCEPTION; GENERATED -# line 1846 "src/vm/jit/verify/typecheck-stackbased-gen.inc" +# line 1845 "src/vm/jit/verify/typecheck-stackbased-gen.inc" GENERATED GENERATED break; GENERATED @@ -1864,12 +1863,12 @@ GENERATED /* may use stack[0] ... stack[0] */ GENERATED GENERATED -# line 335 "src/vm/jit/verify/icmds.c" +# line 334 "src/vm/jit/verify/icmds.c" GENERATED /* returnAddress is not allowed */ GENERATED if (!TYPEINFO_IS_REFERENCE(OP1->typeinfo)) GENERATED VERIFY_ERROR("Illegal instruction: INSTANCEOF on non-reference"); GENERATED -# line 1873 "src/vm/jit/verify/typecheck-stackbased-gen.inc" +# line 1872 "src/vm/jit/verify/typecheck-stackbased-gen.inc" GENERATED GENERATED stack[0].type = TYPE_INT; GENERATED break; @@ -1886,13 +1885,13 @@ GENERATED /* variable number of inslots! */ GENERATED GENERATED -# line 620 "src/vm/jit/verify/icmds.c" +# line 619 "src/vm/jit/verify/icmds.c" GENERATED if (!typecheck_stackbased_multianewarray(STATE, stack, stackfloor)) GENERATED EXCEPTION; GENERATED stack -= (IPTR->s1.argcount - 1); GENERATED stack[0].type = TYPE_ADR; GENERATED -# line 1896 "src/vm/jit/verify/typecheck-stackbased-gen.inc" +# line 1895 "src/vm/jit/verify/typecheck-stackbased-gen.inc" GENERATED GENERATED break; GENERATED @@ -1909,14 +1908,14 @@ GENERATED /* may use stack[1] ... stack[1] */ GENERATED GENERATED -# line 345 "src/vm/jit/verify/icmds.c" +# line 344 "src/vm/jit/verify/icmds.c" GENERATED /* {RESULTNOW} */ GENERATED TYPECHECK_COUNT(stat_ins_branch); GENERATED GENERATED /* propagate stack and variables to the target block */ GENERATED REACH(IPTR->dst); GENERATED -# line 1920 "src/vm/jit/verify/typecheck-stackbased-gen.inc" +# line 1919 "src/vm/jit/verify/typecheck-stackbased-gen.inc" GENERATED GENERATED break; GENERATED @@ -1931,7 +1930,7 @@ GENERATED /* variable number of outslots! */ GENERATED GENERATED -# line 636 "src/vm/jit/verify/icmds.c" +# line 635 "src/vm/jit/verify/icmds.c" GENERATED TYPECHECK_COUNT(stat_ins_builtin); GENERATED if (!typecheck_stackbased_verify_builtin(STATE, stack, stackfloor)) GENERATED EXCEPTION; @@ -1948,7 +1947,7 @@ GENERATED } GENERATED } GENERATED -# line 1952 "src/vm/jit/verify/typecheck-stackbased-gen.inc" +# line 1951 "src/vm/jit/verify/typecheck-stackbased-gen.inc" GENERATED GENERATED break; GENERATED diff --git a/src/vm/jit/verify/typecheck-stackbased.c b/src/vm/jit/verify/typecheck-stackbased.c index a79f6b1a1..97661184d 100644 --- a/src/vm/jit/verify/typecheck-stackbased.c +++ b/src/vm/jit/verify/typecheck-stackbased.c @@ -106,7 +106,7 @@ static void typecheck_stackbased_show_state(verifier_state *state, #define VERIFY_ERROR(msg) \ do { \ LOG1("VerifyError: %s", msg); \ - exceptions_throw_verifyerror(state.m, msg); \ + exceptions_throw_verifyerror(STATE->m, msg); \ return false; \ } while (0) diff --git a/src/vm/jit/verify/typecheck-variablesbased-gen.inc b/src/vm/jit/verify/typecheck-variablesbased-gen.inc index b31b7141e..86a41fc32 100644 --- a/src/vm/jit/verify/typecheck-variablesbased-gen.inc +++ b/src/vm/jit/verify/typecheck-variablesbased-gen.inc @@ -12,7 +12,7 @@ # define DST VAROP(iptr->dst) GENERATED GENERATED -# line 308 "src/vm/jit/verify/icmds.c" +# line 307 "src/vm/jit/verify/icmds.c" GENERATED if (IPTR->flags.bits & INS_FLAG_CLASS) { GENERATED /* a java.lang.Class reference */ GENERATED TYPEINFO_INIT_JAVA_LANG_CLASS(DST->typeinfo,IPTR->sx.val.c); @@ -264,7 +264,7 @@ # define DST VAROP(iptr->dst) GENERATED GENERATED -# line 219 "src/vm/jit/verify/icmds.c" +# line 218 "src/vm/jit/verify/icmds.c" GENERATED if (!TYPEINFO_MAYBE_PRIMITIVE_ARRAY(OP1->typeinfo,ARRAYTYPE_INT)) GENERATED VERIFY_ERROR("Array type mismatch"); GENERATED @@ -288,7 +288,7 @@ # define DST VAROP(iptr->dst) GENERATED GENERATED -# line 229 "src/vm/jit/verify/icmds.c" +# line 228 "src/vm/jit/verify/icmds.c" GENERATED if (!TYPEINFO_MAYBE_PRIMITIVE_ARRAY(OP1->typeinfo,ARRAYTYPE_LONG)) GENERATED VERIFY_ERROR("Array type mismatch"); GENERATED @@ -312,7 +312,7 @@ # define DST VAROP(iptr->dst) GENERATED GENERATED -# line 214 "src/vm/jit/verify/icmds.c" +# line 213 "src/vm/jit/verify/icmds.c" GENERATED if (!TYPEINFO_MAYBE_PRIMITIVE_ARRAY(OP1->typeinfo,ARRAYTYPE_FLOAT)) GENERATED VERIFY_ERROR("Array type mismatch"); GENERATED @@ -336,7 +336,7 @@ # define DST VAROP(iptr->dst) GENERATED GENERATED -# line 209 "src/vm/jit/verify/icmds.c" +# line 208 "src/vm/jit/verify/icmds.c" GENERATED if (!TYPEINFO_MAYBE_PRIMITIVE_ARRAY(OP1->typeinfo,ARRAYTYPE_DOUBLE)) GENERATED VERIFY_ERROR("Array type mismatch"); GENERATED @@ -387,7 +387,7 @@ # define DST VAROP(iptr->dst) GENERATED GENERATED -# line 198 "src/vm/jit/verify/icmds.c" +# line 197 "src/vm/jit/verify/icmds.c" GENERATED if (!TYPEINFO_MAYBE_PRIMITIVE_ARRAY(OP1->typeinfo,ARRAYTYPE_BOOLEAN) GENERATED && !TYPEINFO_MAYBE_PRIMITIVE_ARRAY(OP1->typeinfo,ARRAYTYPE_BYTE)) GENERATED VERIFY_ERROR("Array type mismatch"); @@ -412,7 +412,7 @@ # define DST VAROP(iptr->dst) GENERATED GENERATED -# line 204 "src/vm/jit/verify/icmds.c" +# line 203 "src/vm/jit/verify/icmds.c" GENERATED if (!TYPEINFO_MAYBE_PRIMITIVE_ARRAY(OP1->typeinfo,ARRAYTYPE_CHAR)) GENERATED VERIFY_ERROR("Array type mismatch"); GENERATED @@ -436,7 +436,7 @@ # define DST VAROP(iptr->dst) GENERATED GENERATED -# line 224 "src/vm/jit/verify/icmds.c" +# line 223 "src/vm/jit/verify/icmds.c" GENERATED if (!TYPEINFO_MAYBE_PRIMITIVE_ARRAY(OP1->typeinfo,ARRAYTYPE_SHORT)) GENERATED VERIFY_ERROR("Array type mismatch"); GENERATED @@ -530,7 +530,7 @@ # define OP1 VAROP(iptr->s1) GENERATED GENERATED -# line 362 "src/vm/jit/verify/icmds.c" +# line 361 "src/vm/jit/verify/icmds.c" GENERATED /* {RESULTNOW} */ GENERATED TYPECHECK_COUNT(stat_ins_branch); GENERATED @@ -552,7 +552,7 @@ # define OP1 VAROP(iptr->s1) GENERATED GENERATED -# line 255 "src/vm/jit/verify/icmds.c" +# line 254 "src/vm/jit/verify/icmds.c" GENERATED if (!TYPEINFO_MAYBE_PRIMITIVE_ARRAY(OP1->typeinfo,ARRAYTYPE_INT)) GENERATED VERIFY_ERROR("Array type mismatch"); GENERATED @@ -571,7 +571,7 @@ # define OP1 VAROP(iptr->s1) GENERATED GENERATED -# line 265 "src/vm/jit/verify/icmds.c" +# line 264 "src/vm/jit/verify/icmds.c" GENERATED if (!TYPEINFO_MAYBE_PRIMITIVE_ARRAY(OP1->typeinfo,ARRAYTYPE_LONG)) GENERATED VERIFY_ERROR("Array type mismatch"); GENERATED @@ -590,7 +590,7 @@ # define OP1 VAROP(iptr->s1) GENERATED GENERATED -# line 250 "src/vm/jit/verify/icmds.c" +# line 249 "src/vm/jit/verify/icmds.c" GENERATED if (!TYPEINFO_MAYBE_PRIMITIVE_ARRAY(OP1->typeinfo,ARRAYTYPE_FLOAT)) GENERATED VERIFY_ERROR("Array type mismatch"); GENERATED @@ -609,7 +609,7 @@ # define OP1 VAROP(iptr->s1) GENERATED GENERATED -# line 245 "src/vm/jit/verify/icmds.c" +# line 244 "src/vm/jit/verify/icmds.c" GENERATED if (!TYPEINFO_MAYBE_PRIMITIVE_ARRAY(OP1->typeinfo,ARRAYTYPE_DOUBLE)) GENERATED VERIFY_ERROR("Array type mismatch"); GENERATED @@ -628,7 +628,7 @@ # define OP1 VAROP(iptr->s1) GENERATED GENERATED -# line 270 "src/vm/jit/verify/icmds.c" +# line 269 "src/vm/jit/verify/icmds.c" GENERATED /* we just check the basic input types and that the */ GENERATED /* destination is an array of references. Assignability to */ GENERATED /* the actual array must be checked at runtime, each time the */ @@ -651,7 +651,7 @@ # define OP1 VAROP(iptr->s1) GENERATED GENERATED -# line 234 "src/vm/jit/verify/icmds.c" +# line 233 "src/vm/jit/verify/icmds.c" GENERATED if (!TYPEINFO_MAYBE_PRIMITIVE_ARRAY(OP1->typeinfo,ARRAYTYPE_BOOLEAN) GENERATED && !TYPEINFO_MAYBE_PRIMITIVE_ARRAY(OP1->typeinfo,ARRAYTYPE_BYTE)) GENERATED VERIFY_ERROR("Array type mismatch"); @@ -671,7 +671,7 @@ # define OP1 VAROP(iptr->s1) GENERATED GENERATED -# line 240 "src/vm/jit/verify/icmds.c" +# line 239 "src/vm/jit/verify/icmds.c" GENERATED if (!TYPEINFO_MAYBE_PRIMITIVE_ARRAY(OP1->typeinfo,ARRAYTYPE_CHAR)) GENERATED VERIFY_ERROR("Array type mismatch"); GENERATED @@ -690,7 +690,7 @@ # define OP1 VAROP(iptr->s1) GENERATED GENERATED -# line 260 "src/vm/jit/verify/icmds.c" +# line 259 "src/vm/jit/verify/icmds.c" GENERATED if (!TYPEINFO_MAYBE_PRIMITIVE_ARRAY(OP1->typeinfo,ARRAYTYPE_SHORT)) GENERATED VERIFY_ERROR("Array type mismatch"); GENERATED @@ -739,7 +739,7 @@ GENERATED superblockend = true; GENERATED GENERATED -# line 344 "src/vm/jit/verify/icmds.c" +# line 343 "src/vm/jit/verify/icmds.c" GENERATED /* {RESULTNOW} */ GENERATED TYPECHECK_COUNT(stat_ins_branch); GENERATED @@ -758,7 +758,7 @@ # define DST VAROP(iptr->dst) GENERATED GENERATED -# line 535 "src/vm/jit/verify/icmds.c" +# line 534 "src/vm/jit/verify/icmds.c" GENERATED TYPEINFO_INIT_RETURNADDRESS(DST->typeinfo, BPTR->next); GENERATED REACH(IPTR->sx.s23.s3.jsrtarget); GENERATED @@ -776,7 +776,7 @@ GENERATED superblockend = true; GENERATED GENERATED -# line 552 "src/vm/jit/verify/icmds.c" +# line 551 "src/vm/jit/verify/icmds.c" GENERATED /* check returnAddress variable */ GENERATED if (!typevector_checkretaddr(jd->var,IPTR->s1.varindex)) GENERATED VERIFY_ERROR("illegal instruction: RET using non-returnAddress variable"); @@ -794,7 +794,7 @@ # define OP1 VAROP(iptr->s1) GENERATED GENERATED -# line 411 "src/vm/jit/verify/icmds.c" +# line 410 "src/vm/jit/verify/icmds.c" GENERATED /* {RESULTNOW} */ GENERATED TYPECHECK_COUNT(stat_ins_switch); GENERATED @@ -824,7 +824,7 @@ # define OP1 VAROP(iptr->s1) GENERATED GENERATED -# line 427 "src/vm/jit/verify/icmds.c" +# line 426 "src/vm/jit/verify/icmds.c" GENERATED /* {RESULTNOW} */ GENERATED TYPECHECK_COUNT(stat_ins_switch); GENERATED @@ -854,7 +854,7 @@ # define OP1 VAROP(iptr->s1) GENERATED GENERATED -# line 493 "src/vm/jit/verify/icmds.c" +# line 492 "src/vm/jit/verify/icmds.c" GENERATED if (STATE->returntype.type != TYPE_INT) GENERATED VERIFY_ERROR("Return type mismatch"); GENERATED @@ -873,7 +873,7 @@ # define OP1 VAROP(iptr->s1) GENERATED GENERATED -# line 498 "src/vm/jit/verify/icmds.c" +# line 497 "src/vm/jit/verify/icmds.c" GENERATED if (STATE->returntype.type != TYPE_LNG) GENERATED VERIFY_ERROR("Return type mismatch"); GENERATED @@ -892,7 +892,7 @@ # define OP1 VAROP(iptr->s1) GENERATED GENERATED -# line 503 "src/vm/jit/verify/icmds.c" +# line 502 "src/vm/jit/verify/icmds.c" GENERATED if (STATE->returntype.type != TYPE_FLT) GENERATED VERIFY_ERROR("Return type mismatch"); GENERATED @@ -911,7 +911,7 @@ # define OP1 VAROP(iptr->s1) GENERATED GENERATED -# line 508 "src/vm/jit/verify/icmds.c" +# line 507 "src/vm/jit/verify/icmds.c" GENERATED if (STATE->returntype.type != TYPE_DBL) GENERATED VERIFY_ERROR("Return type mismatch"); GENERATED @@ -931,7 +931,7 @@ # define OP1 VAROP(iptr->s1) GENERATED GENERATED -# line 468 "src/vm/jit/verify/icmds.c" +# line 467 "src/vm/jit/verify/icmds.c" GENERATED TYPECHECK_COUNT(stat_ins_areturn); GENERATED if (!TYPEINFO_IS_REFERENCE(OP1->typeinfo)) GENERATED VERIFY_ERROR("illegal instruction: ARETURN on non-reference"); @@ -965,7 +965,7 @@ GENERATED superblockend = true; GENERATED GENERATED -# line 513 "src/vm/jit/verify/icmds.c" +# line 512 "src/vm/jit/verify/icmds.c" GENERATED if (STATE->returntype.type != TYPE_VOID) GENERATED VERIFY_ERROR("Return type mismatch"); GENERATED @@ -998,7 +998,7 @@ # define DST VAROP(iptr->dst) GENERATED GENERATED -# line 183 "src/vm/jit/verify/icmds.c" +# line 182 "src/vm/jit/verify/icmds.c" GENERATED if (!verify_fieldaccess(state, NULL, NULL)) GENERATED return false; GENERATED maythrow = true; @@ -1018,7 +1018,7 @@ # define OP1 VAROP(iptr->s1) GENERATED GENERATED -# line 131 "src/vm/jit/verify/icmds.c" +# line 130 "src/vm/jit/verify/icmds.c" GENERATED if (!verify_fieldaccess(state, NULL, VAROP(iptr->s1))) GENERATED return false; GENERATED maythrow = true; @@ -1040,7 +1040,7 @@ # define DST VAROP(iptr->dst) GENERATED GENERATED -# line 177 "src/vm/jit/verify/icmds.c" +# line 176 "src/vm/jit/verify/icmds.c" GENERATED if (!verify_fieldaccess(state, VAROP(iptr->s1), NULL)) GENERATED return false; GENERATED maythrow = true; @@ -1062,7 +1062,7 @@ # define OP1 VAROP(iptr->s1) GENERATED GENERATED -# line 125 "src/vm/jit/verify/icmds.c" +# line 124 "src/vm/jit/verify/icmds.c" GENERATED if (!verify_fieldaccess(state, VAROP(iptr->s1), VAROP(iptr->sx.s23.s2))) GENERATED return false; GENERATED maythrow = true; @@ -1085,7 +1085,7 @@ # define OP1 VAROP(iptr->s1) GENERATED GENERATED -# line 572 "src/vm/jit/verify/icmds.c" +# line 571 "src/vm/jit/verify/icmds.c" GENERATED TYPECHECK_COUNT(stat_ins_invoke); GENERATED if (!verify_invocation(state)) GENERATED EXCEPTION; @@ -1108,7 +1108,7 @@ # define DST VAROP(iptr->dst) GENERATED GENERATED -# line 192 "src/vm/jit/verify/icmds.c" +# line 191 "src/vm/jit/verify/icmds.c" GENERATED if (!TYPEINFO_MAYBE_ARRAY(OP1->typeinfo) GENERATED && OP1->typeinfo.typeclass.cls != pseudo_class_Arraystub) GENERATED VERIFY_ERROR("illegal instruction: ARRAYLENGTH on non-array"); @@ -1132,7 +1132,7 @@ # define OP1 VAROP(iptr->s1) GENERATED GENERATED -# line 447 "src/vm/jit/verify/icmds.c" +# line 446 "src/vm/jit/verify/icmds.c" GENERATED TYPECHECK_COUNT(stat_ins_athrow); GENERATED r = typeinfo_is_assignable_to_class(&OP1->typeinfo, GENERATED CLASSREF_OR_CLASSINFO(class_java_lang_Throwable)); @@ -1169,7 +1169,7 @@ # define DST VAROP(iptr->dst) GENERATED GENERATED -# line 326 "src/vm/jit/verify/icmds.c" +# line 325 "src/vm/jit/verify/icmds.c" GENERATED /* returnAddress is not allowed */ GENERATED if (!TYPEINFO_IS_REFERENCE(OP1->typeinfo)) GENERATED VERIFY_ERROR("Illegal instruction: CHECKCAST on non-reference"); @@ -1197,7 +1197,7 @@ # define DST VAROP(iptr->dst) GENERATED GENERATED -# line 335 "src/vm/jit/verify/icmds.c" +# line 334 "src/vm/jit/verify/icmds.c" GENERATED /* returnAddress is not allowed */ GENERATED if (!TYPEINFO_IS_REFERENCE(OP1->typeinfo)) GENERATED VERIFY_ERROR("Illegal instruction: INSTANCEOF on non-reference"); @@ -1222,7 +1222,7 @@ # define DST VAROP(iptr->dst) GENERATED GENERATED -# line 615 "src/vm/jit/verify/icmds.c" +# line 614 "src/vm/jit/verify/icmds.c" GENERATED if (!verify_multianewarray(STATE)) GENERATED EXCEPTION; GENERATED @@ -1244,7 +1244,7 @@ # define OP1 VAROP(iptr->s1) GENERATED GENERATED -# line 279 "src/vm/jit/verify/icmds.c" +# line 278 "src/vm/jit/verify/icmds.c" GENERATED if (!TYPEINFO_MAYBE_PRIMITIVE_ARRAY(OP1->typeinfo, ARRAYTYPE_INT)) GENERATED VERIFY_ERROR("Array type mismatch"); GENERATED @@ -1263,7 +1263,7 @@ # define OP1 VAROP(iptr->s1) GENERATED GENERATED -# line 284 "src/vm/jit/verify/icmds.c" +# line 283 "src/vm/jit/verify/icmds.c" GENERATED if (!TYPEINFO_MAYBE_PRIMITIVE_ARRAY(OP1->typeinfo, ARRAYTYPE_LONG)) GENERATED VERIFY_ERROR("Array type mismatch"); GENERATED @@ -1282,7 +1282,7 @@ # define OP1 VAROP(iptr->s1) GENERATED GENERATED -# line 289 "src/vm/jit/verify/icmds.c" +# line 288 "src/vm/jit/verify/icmds.c" GENERATED if (!TYPEINFO_MAYBE_PRIMITIVE_ARRAY(OP1->typeinfo, ARRAYTYPE_BOOLEAN) GENERATED && !TYPEINFO_MAYBE_PRIMITIVE_ARRAY(OP1->typeinfo, ARRAYTYPE_BYTE)) GENERATED VERIFY_ERROR("Array type mismatch"); @@ -1302,7 +1302,7 @@ # define OP1 VAROP(iptr->s1) GENERATED GENERATED -# line 295 "src/vm/jit/verify/icmds.c" +# line 294 "src/vm/jit/verify/icmds.c" GENERATED if (!TYPEINFO_MAYBE_PRIMITIVE_ARRAY(OP1->typeinfo, ARRAYTYPE_CHAR)) GENERATED VERIFY_ERROR("Array type mismatch"); GENERATED @@ -1321,7 +1321,7 @@ # define OP1 VAROP(iptr->s1) GENERATED GENERATED -# line 300 "src/vm/jit/verify/icmds.c" +# line 299 "src/vm/jit/verify/icmds.c" GENERATED if (!TYPEINFO_MAYBE_PRIMITIVE_ARRAY(OP1->typeinfo, ARRAYTYPE_SHORT)) GENERATED VERIFY_ERROR("Array type mismatch"); GENERATED @@ -1338,7 +1338,7 @@ GENERATED maythrow = true; GENERATED GENERATED -# line 157 "src/vm/jit/verify/icmds.c" +# line 156 "src/vm/jit/verify/icmds.c" GENERATED /* XXX this mess will go away with const operands */ GENERATED INSTRUCTION_GET_FIELDREF(state->iptr, fieldref); GENERATED constvalue.type = fieldref->parseddesc.fd->type; @@ -1369,7 +1369,7 @@ # define OP1 VAROP(iptr->s1) GENERATED GENERATED -# line 137 "src/vm/jit/verify/icmds.c" +# line 136 "src/vm/jit/verify/icmds.c" GENERATED /* XXX this mess will go away with const operands */ GENERATED INSTRUCTION_GET_FIELDREF(state->iptr, fieldref); GENERATED constvalue.type = fieldref->parseddesc.fd->type; @@ -1403,7 +1403,7 @@ # define OP1 VAROP(iptr->s1) GENERATED GENERATED -# line 630 "src/vm/jit/verify/icmds.c" +# line 629 "src/vm/jit/verify/icmds.c" GENERATED TYPECHECK_COUNT(stat_ins_builtin); GENERATED if (!verify_builtin(state)) GENERATED EXCEPTION; diff --git a/src/vm/jit/verify/typecheck.c b/src/vm/jit/verify/typecheck.c index 6bcc88b2c..90d34f977 100644 --- a/src/vm/jit/verify/typecheck.c +++ b/src/vm/jit/verify/typecheck.c @@ -28,7 +28,7 @@ Changes: Christian Thalinger - $Id: typecheck.c 5773 2006-10-13 14:34:19Z edwin $ + $Id: typecheck.c 5777 2006-10-13 18:25:21Z edwin $ */ @@ -533,8 +533,10 @@ verify_fieldaccess(verifier_state *state, #define TYPECHECK_VARIABLESBASED #define EXCEPTION do { return false; } while (0) +#define VERIFY_ERROR(msg) TYPECHECK_VERIFYERROR_bool(msg) #include #undef EXCEPTION +#undef VERIFY_ERROR #undef TYPECHECK_VARIABLESBASED return true; diff --git a/tests/regression/jasmin/runtest b/tests/regression/jasmin/runtest index d2740a304..0d4105d5e 100755 --- a/tests/regression/jasmin/runtest +++ b/tests/regression/jasmin/runtest @@ -67,8 +67,10 @@ do TESTEXPECT="TESTEXPECT" TESTLOG="TESTLOG" TESTERR="TESTERR" + TESTSIA="TESTSIA" EXPECTSTATUS=0 + CHECKICMD=0 # compile the test @@ -79,6 +81,11 @@ do EXPECTERROR=$(grep 'ERROR:.*' "$TEST" | sed 's,.*ERROR:[ \t]*,,') fi + if grep 'ICMD:' "$TEST" >/dev/null ; then + CHECKICMD=1 + EXPECTICMD=$(grep 'ICMD:.*' "$TEST" | sed 's,.*ICMD:[ \t]*,,') + fi + # run the test $TIMEOUTRUN $JAVA $JAVAFLAGS "$TESTBASENAME" >"$TESTOUT" 2>"$TESTERR" @@ -114,6 +121,13 @@ do fi fi + if [ "$CHECKICMD" -ne 0 ] ; then + rm -f "$TESTSIA" + touch "$TESTSIA" + $JAVA $JAVAFLAGS -sia "$TESTBASENAME" >"$TESTSIA" 2>/dev/null + cat "$TESTSIA" | sed -n '/^'"$TESTBASENAME"'\.main/,$p' | sed '/^=====.*flags: -1/,$d' | tee TEST | grep "$EXPECTICMD" + fi + shift done diff --git a/tests/regression/jasmin/test_verify_fail_getfield_basic_type_instance.j b/tests/regression/jasmin/test_verify_fail_getfield_basic_type_instance.j new file mode 100644 index 000000000..662757c92 --- /dev/null +++ b/tests/regression/jasmin/test_verify_fail_getfield_basic_type_instance.j @@ -0,0 +1,52 @@ +.class public test_verify_fail_getfield_basic_type_instance +.super java/lang/Object + +.field public "intfield" I + +; ====================================================================== + +.method public ()V + .limit stack 2 + + aload_0 + invokenonvirtual java/lang/Object/()V + + aload_0 + ldc 567 + putfield test_verify_fail_getfield_basic_type_instance/intfield I + + return +.end method + +; ====================================================================== + +.method public static check(I)V + .limit locals 1 + .limit stack 10 + getstatic java/lang/System/out Ljava/io/PrintStream; + iload_0 + invokevirtual java/io/PrintStream/println(I)V + return +.end method + +; ====================================================================== + +.method public static main([Ljava/lang/String;)V + .limit stack 2 + .limit locals 2 + + new test_verify_fail_getfield_basic_type_instance + dup + invokespecial test_verify_fail_getfield_basic_type_instance/()V + + pop + iconst_1 + + getfield test_verify_fail_getfield_basic_type_instance/intfield I + ; ERROR: VerifyError + + invokestatic test_verify_fail_getfield_basic_type_instance/check(I)V + + return +.end method + diff --git a/tests/regression/jasmin/test_verify_fail_getfield_basic_type_lookup.j b/tests/regression/jasmin/test_verify_fail_getfield_basic_type_lookup.j new file mode 100644 index 000000000..72e21518b --- /dev/null +++ b/tests/regression/jasmin/test_verify_fail_getfield_basic_type_lookup.j @@ -0,0 +1,49 @@ +.class public test_verify_fail_getfield_basic_type_lookup +.super java/lang/Object + +.field public "f" Ljava/lang/String; + +; ====================================================================== + +.method public ()V + .limit stack 2 + + aload_0 + invokenonvirtual java/lang/Object/()V + + aload_0 + ldc "test" + putfield test_verify_fail_getfield_basic_type_lookup/f Ljava/lang/String; + + return +.end method + +; ====================================================================== + +.method public static check(I)V + .limit locals 1 + .limit stack 10 + getstatic java/lang/System/out Ljava/io/PrintStream; + iload_0 + invokevirtual java/io/PrintStream/println(I)V + return +.end method + +; ====================================================================== + +.method public static main([Ljava/lang/String;)V + .limit stack 2 + .limit locals 2 + + new test_verify_fail_getfield_basic_type_lookup + dup + invokespecial test_verify_fail_getfield_basic_type_lookup/()V + + getfield test_verify_fail_getfield_basic_type_lookup/f I + ; ERROR: NoSuchFieldError + + invokestatic test_verify_fail_getfield_basic_type_lookup/check(I)V + + return +.end method + diff --git a/tests/regression/jasmin/test_verify_fail_getfield_basic_type_value.j b/tests/regression/jasmin/test_verify_fail_getfield_basic_type_value.j new file mode 100644 index 000000000..403ccbdaf --- /dev/null +++ b/tests/regression/jasmin/test_verify_fail_getfield_basic_type_value.j @@ -0,0 +1,49 @@ +.class public test_verify_fail_getfield_basic_type_value +.super java/lang/Object + +.field public "f" Ljava/lang/String; + +; ====================================================================== + +.method public ()V + .limit stack 2 + + aload_0 + invokenonvirtual java/lang/Object/()V + + aload_0 + ldc "test" + putfield test_verify_fail_getfield_basic_type_value/f Ljava/lang/String; + + return +.end method + +; ====================================================================== + +.method public static check(I)V + .limit locals 1 + .limit stack 10 + getstatic java/lang/System/out Ljava/io/PrintStream; + iload_0 + invokevirtual java/io/PrintStream/println(I)V + return +.end method + +; ====================================================================== + +.method public static main([Ljava/lang/String;)V + .limit stack 2 + .limit locals 2 + + new test_verify_fail_getfield_basic_type_value + dup + invokespecial test_verify_fail_getfield_basic_type_value/()V + + getfield test_verify_fail_getfield_basic_type_value/f Ljava/lang/String; + + invokestatic test_verify_fail_getfield_basic_type_value/check(I)V + ; ERROR: VerifyError + + return +.end method + diff --git a/tests/regression/jasmin/test_verify_fail_putfield_basic_type_instance.j b/tests/regression/jasmin/test_verify_fail_putfield_basic_type_instance.j new file mode 100644 index 000000000..5e1b01f9c --- /dev/null +++ b/tests/regression/jasmin/test_verify_fail_putfield_basic_type_instance.j @@ -0,0 +1,55 @@ +.class public test_verify_fail_putfield_basic_type_instance +.super java/lang/Object + +.field public "intfield" I + +; ====================================================================== + +.method public ()V + .limit stack 2 + + aload_0 + invokenonvirtual java/lang/Object/()V + + aload_0 + ldc 567 + putfield test_verify_fail_putfield_basic_type_instance/intfield I + + return +.end method + +; ====================================================================== + +.method public static check(I)V + .limit locals 1 + .limit stack 10 + getstatic java/lang/System/out Ljava/io/PrintStream; + iload_0 + invokevirtual java/io/PrintStream/println(I)V + return +.end method + +; ====================================================================== + +.method public static main([Ljava/lang/String;)V + .limit stack 2 + .limit locals 2 + + ldc 42 + istore 1 + + new test_verify_fail_putfield_basic_type_instance + dup + invokespecial test_verify_fail_putfield_basic_type_instance/()V + + pop + iconst_1 + + iload 1 + putfield test_verify_fail_putfield_basic_type_instance/intfield I + ; ERROR: VerifyError + ; ICMD: PUTFIELD + + return +.end method + diff --git a/tests/regression/jasmin/test_verify_fail_putfield_basic_type_lookup.j b/tests/regression/jasmin/test_verify_fail_putfield_basic_type_lookup.j new file mode 100644 index 000000000..034af7c4b --- /dev/null +++ b/tests/regression/jasmin/test_verify_fail_putfield_basic_type_lookup.j @@ -0,0 +1,48 @@ +.class public test_verify_fail_putfield_basic_type_lookup +.super java/lang/Object + +.field public "f" Ljava/lang/String; + +; ====================================================================== + +.method public ()V + .limit stack 2 + + aload_0 + invokenonvirtual java/lang/Object/()V + + aload_0 + ldc "test" + putfield test_verify_fail_putfield_basic_type_lookup/f Ljava/lang/String; + + return +.end method + +; ====================================================================== + +.method public static check(I)V + .limit locals 1 + .limit stack 10 + getstatic java/lang/System/out Ljava/io/PrintStream; + iload_0 + invokevirtual java/io/PrintStream/println(I)V + return +.end method + +; ====================================================================== + +.method public static main([Ljava/lang/String;)V + .limit stack 2 + .limit locals 2 + + new test_verify_fail_putfield_basic_type_lookup + dup + invokespecial test_verify_fail_putfield_basic_type_lookup/()V + + iconst_2 + putfield test_verify_fail_putfield_basic_type_lookup/f I + ; ERROR: NoSuchFieldError + + return +.end method + diff --git a/tests/regression/jasmin/test_verify_fail_putfield_basic_type_value.j b/tests/regression/jasmin/test_verify_fail_putfield_basic_type_value.j new file mode 100644 index 000000000..fe3a82fd4 --- /dev/null +++ b/tests/regression/jasmin/test_verify_fail_putfield_basic_type_value.j @@ -0,0 +1,51 @@ +.class public test_verify_fail_putfield_basic_type_value +.super java/lang/Object + +.field public "f" Ljava/lang/String; + +; ====================================================================== + +.method public ()V + .limit stack 2 + + aload_0 + invokenonvirtual java/lang/Object/()V + + aload_0 + ldc "test" + putfield test_verify_fail_putfield_basic_type_value/f Ljava/lang/String; + + return +.end method + +; ====================================================================== + +.method public static check(I)V + .limit locals 1 + .limit stack 10 + getstatic java/lang/System/out Ljava/io/PrintStream; + iload_0 + invokevirtual java/io/PrintStream/println(I)V + return +.end method + +; ====================================================================== + +.method public static main([Ljava/lang/String;)V + .limit stack 2 + .limit locals 2 + + ldc 42 + istore 1 + + new test_verify_fail_putfield_basic_type_value + dup + invokespecial test_verify_fail_putfield_basic_type_value/()V + + iload 1 + putfield test_verify_fail_putfield_basic_type_value/f Ljava/lang/String; + ; ERROR: VerifyError + + return +.end method + diff --git a/tests/regression/jasmin/test_verify_fail_putfieldconst_basic_type_instance.j b/tests/regression/jasmin/test_verify_fail_putfieldconst_basic_type_instance.j new file mode 100644 index 000000000..26c715f12 --- /dev/null +++ b/tests/regression/jasmin/test_verify_fail_putfieldconst_basic_type_instance.j @@ -0,0 +1,52 @@ +.class public test_verify_fail_putfieldconst_basic_type_instance +.super java/lang/Object + +.field public "intfield" I + +; ====================================================================== + +.method public ()V + .limit stack 2 + + aload_0 + invokenonvirtual java/lang/Object/()V + + aload_0 + ldc 567 + putfield test_verify_fail_putfieldconst_basic_type_instance/intfield I + + return +.end method + +; ====================================================================== + +.method public static check(I)V + .limit locals 1 + .limit stack 10 + getstatic java/lang/System/out Ljava/io/PrintStream; + iload_0 + invokevirtual java/io/PrintStream/println(I)V + return +.end method + +; ====================================================================== + +.method public static main([Ljava/lang/String;)V + .limit stack 2 + .limit locals 2 + + new test_verify_fail_putfieldconst_basic_type_instance + dup + invokespecial test_verify_fail_putfieldconst_basic_type_instance/()V + + pop + iconst_1 + + iconst_2 + putfield test_verify_fail_putfieldconst_basic_type_instance/intfield I + ; ERROR: VerifyError + ; CACAOICMD: PUTFIELDCONST + + return +.end method + diff --git a/tests/regression/jasmin/test_verify_fail_putfieldconst_basic_type_value.j b/tests/regression/jasmin/test_verify_fail_putfieldconst_basic_type_value.j new file mode 100644 index 000000000..7e2f8cfeb --- /dev/null +++ b/tests/regression/jasmin/test_verify_fail_putfieldconst_basic_type_value.j @@ -0,0 +1,48 @@ +.class public test_verify_fail_putfieldconst_basic_type_value +.super java/lang/Object + +.field public "f" Ljava/lang/String; + +; ====================================================================== + +.method public ()V + .limit stack 2 + + aload_0 + invokenonvirtual java/lang/Object/()V + + aload_0 + ldc "test" + putfield test_verify_fail_putfieldconst_basic_type_value/f Ljava/lang/String; + + return +.end method + +; ====================================================================== + +.method public static check(I)V + .limit locals 1 + .limit stack 10 + getstatic java/lang/System/out Ljava/io/PrintStream; + iload_0 + invokevirtual java/io/PrintStream/println(I)V + return +.end method + +; ====================================================================== + +.method public static main([Ljava/lang/String;)V + .limit stack 2 + .limit locals 2 + + new test_verify_fail_putfieldconst_basic_type_value + dup + invokespecial test_verify_fail_putfieldconst_basic_type_value/()V + + ldc 42 + putfield test_verify_fail_putfieldconst_basic_type_value/f Ljava/lang/String; + ; ERROR: VerifyError + + return +.end method + diff --git a/tests/regression/jasmin/test_verify_fail_putstatic_basic_type_value.j b/tests/regression/jasmin/test_verify_fail_putstatic_basic_type_value.j new file mode 100644 index 000000000..44943ecb8 --- /dev/null +++ b/tests/regression/jasmin/test_verify_fail_putstatic_basic_type_value.j @@ -0,0 +1,43 @@ +.class public test_verify_fail_putstatic_basic_type_value +.super java/lang/Object + +.field public static "f" Ljava/lang/String; + +; ====================================================================== + +.method public ()V + .limit stack 2 + + aload_0 + invokenonvirtual java/lang/Object/()V + + return +.end method + +; ====================================================================== + +.method public static check(I)V + .limit locals 1 + .limit stack 10 + getstatic java/lang/System/out Ljava/io/PrintStream; + iload_0 + invokevirtual java/io/PrintStream/println(I)V + return +.end method + +; ====================================================================== + +.method public static main([Ljava/lang/String;)V + .limit stack 2 + .limit locals 2 + + ldc 42 + istore 1 + + iload 1 + putstatic test_verify_fail_putstatic_basic_type_value/f Ljava/lang/String; + ; ERROR: VerifyError + + return +.end method + diff --git a/tests/regression/jasmin/test_verify_fail_putstaticconst_basic_type_value.j b/tests/regression/jasmin/test_verify_fail_putstaticconst_basic_type_value.j new file mode 100644 index 000000000..9836f1172 --- /dev/null +++ b/tests/regression/jasmin/test_verify_fail_putstaticconst_basic_type_value.j @@ -0,0 +1,40 @@ +.class public test_verify_fail_putstaticconst_basic_type_value +.super java/lang/Object + +.field public static "f" Ljava/lang/String; + +; ====================================================================== + +.method public ()V + .limit stack 2 + + aload_0 + invokenonvirtual java/lang/Object/()V + + return +.end method + +; ====================================================================== + +.method public static check(I)V + .limit locals 1 + .limit stack 10 + getstatic java/lang/System/out Ljava/io/PrintStream; + iload_0 + invokevirtual java/io/PrintStream/println(I)V + return +.end method + +; ====================================================================== + +.method public static main([Ljava/lang/String;)V + .limit stack 2 + .limit locals 2 + + ldc 42 + putstatic test_verify_fail_putstaticconst_basic_type_value/f Ljava/lang/String; + ; ERROR: VerifyError + + return +.end method + -- 2.25.1