exception_test.cc revision 1a18c8c1c0e4ea1ff06177e93c7ff703376dcee2
12fb9753c58ce1a511fd6996856840120eb2930dbShih-wei Liao// Copyright 2011 Google Inc. All Rights Reserved. 22fb9753c58ce1a511fd6996856840120eb2930dbShih-wei Liao 32fb9753c58ce1a511fd6996856840120eb2930dbShih-wei Liao#include <sys/mman.h> 42fb9753c58ce1a511fd6996856840120eb2930dbShih-wei Liao 52fb9753c58ce1a511fd6996856840120eb2930dbShih-wei Liao#include "assembler.h" 62fb9753c58ce1a511fd6996856840120eb2930dbShih-wei Liao#include "class_linker.h" 72fb9753c58ce1a511fd6996856840120eb2930dbShih-wei Liao#include "common_test.h" 82fb9753c58ce1a511fd6996856840120eb2930dbShih-wei Liao#include "dex_file.h" 92fb9753c58ce1a511fd6996856840120eb2930dbShih-wei Liao#include "jni_compiler.h" 102fb9753c58ce1a511fd6996856840120eb2930dbShih-wei Liao#include "runtime.h" 112fb9753c58ce1a511fd6996856840120eb2930dbShih-wei Liao#include "thread.h" 122fb9753c58ce1a511fd6996856840120eb2930dbShih-wei Liao#include "gtest/gtest.h" 132fb9753c58ce1a511fd6996856840120eb2930dbShih-wei Liao 142fb9753c58ce1a511fd6996856840120eb2930dbShih-wei Liaonamespace art { 152fb9753c58ce1a511fd6996856840120eb2930dbShih-wei Liao 162fb9753c58ce1a511fd6996856840120eb2930dbShih-wei Liao// package java.lang; 172fb9753c58ce1a511fd6996856840120eb2930dbShih-wei Liao// import java.io.IOException; 182fb9753c58ce1a511fd6996856840120eb2930dbShih-wei Liao// class Object {}; 192fb9753c58ce1a511fd6996856840120eb2930dbShih-wei Liao// public class MyClass { 202fb9753c58ce1a511fd6996856840120eb2930dbShih-wei Liao// int f() throws Exception { 212fb9753c58ce1a511fd6996856840120eb2930dbShih-wei Liao// try { 222fb9753c58ce1a511fd6996856840120eb2930dbShih-wei Liao// g(1); 232fb9753c58ce1a511fd6996856840120eb2930dbShih-wei Liao// } catch (IOException e) { 242fb9753c58ce1a511fd6996856840120eb2930dbShih-wei Liao// return 1; 252fb9753c58ce1a511fd6996856840120eb2930dbShih-wei Liao// } catch (Exception e) { 262fb9753c58ce1a511fd6996856840120eb2930dbShih-wei Liao// return 2; 272fb9753c58ce1a511fd6996856840120eb2930dbShih-wei Liao// } 282fb9753c58ce1a511fd6996856840120eb2930dbShih-wei Liao// try { 292fb9753c58ce1a511fd6996856840120eb2930dbShih-wei Liao// g(2); 302fb9753c58ce1a511fd6996856840120eb2930dbShih-wei Liao// } catch (IOException e) { 312fb9753c58ce1a511fd6996856840120eb2930dbShih-wei Liao// return 3; 322fb9753c58ce1a511fd6996856840120eb2930dbShih-wei Liao// } 332fb9753c58ce1a511fd6996856840120eb2930dbShih-wei Liao// return 0; 342fb9753c58ce1a511fd6996856840120eb2930dbShih-wei Liao// } 352fb9753c58ce1a511fd6996856840120eb2930dbShih-wei Liao// void g(int doThrow) throws Exception { 362fb9753c58ce1a511fd6996856840120eb2930dbShih-wei Liao// if (doThrow == 1) 372fb9753c58ce1a511fd6996856840120eb2930dbShih-wei Liao// throw new Exception(); 382fb9753c58ce1a511fd6996856840120eb2930dbShih-wei Liao// else if (doThrow == 2) 392fb9753c58ce1a511fd6996856840120eb2930dbShih-wei Liao// throw new IOException(); 402fb9753c58ce1a511fd6996856840120eb2930dbShih-wei Liao// } 412fb9753c58ce1a511fd6996856840120eb2930dbShih-wei Liao// } 422fb9753c58ce1a511fd6996856840120eb2930dbShih-wei Liao 432fb9753c58ce1a511fd6996856840120eb2930dbShih-wei Liaostatic const char kMyClassExceptionHandleDex[] = 442fb9753c58ce1a511fd6996856840120eb2930dbShih-wei Liao "ZGV4CjAzNQC/bXXtLZJLN1GzLr+ncrvPSl70n8t0yAjgAwAAcAAAAHhWNBIAAAAAAAAAACgDAAAN" 452fb9753c58ce1a511fd6996856840120eb2930dbShih-wei Liao "AAAAcAAAAAcAAACkAAAAAwAAAMAAAAAAAAAAAAAAAAYAAADkAAAAAgAAABQBAACMAgAAVAEAAD4C" 462fb9753c58ce1a511fd6996856840120eb2930dbShih-wei Liao "AABGAgAASQIAAGUCAAB8AgAAkwIAAKgCAAC8AgAAygIAAM0CAADRAgAA1AIAANcCAAABAAAAAgAA" 472fb9753c58ce1a511fd6996856840120eb2930dbShih-wei Liao "AAMAAAAEAAAABQAAAAYAAAAIAAAAAQAAAAAAAAAAAAAACAAAAAYAAAAAAAAACQAAAAYAAAA4AgAA" 482fb9753c58ce1a511fd6996856840120eb2930dbShih-wei Liao "AgABAAAAAAADAAEAAAAAAAQAAQAAAAAABAAAAAoAAAAEAAIACwAAAAUAAQAAAAAABQAAAAAAAAD/" 492fb9753c58ce1a511fd6996856840120eb2930dbShih-wei Liao "////AAAAAAcAAAAAAAAACQMAAAAAAAAEAAAAAQAAAAUAAAAAAAAABwAAABgCAAATAwAAAAAAAAEA" 502fb9753c58ce1a511fd6996856840120eb2930dbShih-wei Liao "AAABAwAAAQABAAAAAADeAgAAAQAAAA4AAAABAAEAAQAAAOMCAAAEAAAAcBAFAAAADgAEAAEAAgAC" 512fb9753c58ce1a511fd6996856840120eb2930dbShih-wei Liao "AOgCAAAVAAAAEiISERIQbiAEAAMAEiBuIAQAAwASAA8ADQABECj9DQABICj6DQASMCj3AAADAAAA" 522fb9753c58ce1a511fd6996856840120eb2930dbShih-wei Liao "AwABAAcAAAADAAYAAgICDAMPAQISAAAAAwACAAEAAAD3AgAAEwAAABIQMwIIACIAAwBwEAEAAAAn" 532fb9753c58ce1a511fd6996856840120eb2930dbShih-wei Liao "ABIgMwIIACIAAgBwEAAAAAAnAA4AAAAAAAAAAAAAAAIAAAAAAAAAAwAAAFQBAAAEAAAAVAEAAAEA" 542fb9753c58ce1a511fd6996856840120eb2930dbShih-wei Liao "AAAAAAY8aW5pdD4AAUkAGkxkYWx2aWsvYW5ub3RhdGlvbi9UaHJvd3M7ABVMamF2YS9pby9JT0V4" 552fb9753c58ce1a511fd6996856840120eb2930dbShih-wei Liao "Y2VwdGlvbjsAFUxqYXZhL2xhbmcvRXhjZXB0aW9uOwATTGphdmEvbGFuZy9NeUNsYXNzOwASTGph" 562fb9753c58ce1a511fd6996856840120eb2930dbShih-wei Liao "dmEvbGFuZy9PYmplY3Q7AAxNeUNsYXNzLmphdmEAAVYAAlZJAAFmAAFnAAV2YWx1ZQADAAcOAAQA" 572fb9753c58ce1a511fd6996856840120eb2930dbShih-wei Liao "Bw4ABwAHLFFOAnYsLR4tIR4AFQEABw48aTxpAAIBAQwcARgDAAABAAWAgATcAgAAAQICgYAE8AID" 582fb9753c58ce1a511fd6996856840120eb2930dbShih-wei Liao "AIgDAQDgAwAAAA8AAAAAAAAAAQAAAAAAAAABAAAADQAAAHAAAAACAAAABwAAAKQAAAADAAAAAwAA" 592fb9753c58ce1a511fd6996856840120eb2930dbShih-wei Liao "AMAAAAAFAAAABgAAAOQAAAAGAAAAAgAAABQBAAADEAAAAQAAAFQBAAABIAAABAAAAFwBAAAGIAAA" 602fb9753c58ce1a511fd6996856840120eb2930dbShih-wei Liao "AQAAABgCAAABEAAAAQAAADgCAAACIAAADQAAAD4CAAADIAAABAAAAN4CAAAEIAAAAQAAAAEDAAAA" 612fb9753c58ce1a511fd6996856840120eb2930dbShih-wei Liao "IAAAAgAAAAkDAAAAEAAAAQAAACgDAAA="; 622fb9753c58ce1a511fd6996856840120eb2930dbShih-wei Liao 63f734cf55d510976f4862b15e35fc86eae2a3daf8Brian Carlstromclass ExceptionTest : public CommonTest { 641a18c8c1c0e4ea1ff06177e93c7ff703376dcee2Shih-wei Liao protected: 651a18c8c1c0e4ea1ff06177e93c7ff703376dcee2Shih-wei Liao virtual void SetUp() { 661a18c8c1c0e4ea1ff06177e93c7ff703376dcee2Shih-wei Liao CommonTest::SetUp(); 671a18c8c1c0e4ea1ff06177e93c7ff703376dcee2Shih-wei Liao 681a18c8c1c0e4ea1ff06177e93c7ff703376dcee2Shih-wei Liao dex_.reset(OpenDexFileBase64(kMyClassExceptionHandleDex, "kMyClassExceptionHandleDex")); 691a18c8c1c0e4ea1ff06177e93c7ff703376dcee2Shih-wei Liao ASSERT_TRUE(dex_ != NULL); 701a18c8c1c0e4ea1ff06177e93c7ff703376dcee2Shih-wei Liao PathClassLoader* class_loader = AllocPathClassLoader(dex_.get()); 711a18c8c1c0e4ea1ff06177e93c7ff703376dcee2Shih-wei Liao ASSERT_TRUE(class_loader != NULL); 721a18c8c1c0e4ea1ff06177e93c7ff703376dcee2Shih-wei Liao my_klass_ = class_linker_->FindClass("Ljava/lang/MyClass;", class_loader); 731a18c8c1c0e4ea1ff06177e93c7ff703376dcee2Shih-wei Liao ASSERT_TRUE(my_klass_ != NULL); 741a18c8c1c0e4ea1ff06177e93c7ff703376dcee2Shih-wei Liao method_f_ = my_klass_->FindVirtualMethod("f", "()I"); 751a18c8c1c0e4ea1ff06177e93c7ff703376dcee2Shih-wei Liao ASSERT_TRUE(method_f_ != NULL); 761a18c8c1c0e4ea1ff06177e93c7ff703376dcee2Shih-wei Liao method_g_ = my_klass_->FindVirtualMethod("g", "(I)V"); 771a18c8c1c0e4ea1ff06177e93c7ff703376dcee2Shih-wei Liao ASSERT_TRUE(method_g_ != NULL); 781a18c8c1c0e4ea1ff06177e93c7ff703376dcee2Shih-wei Liao } 791a18c8c1c0e4ea1ff06177e93c7ff703376dcee2Shih-wei Liao 801a18c8c1c0e4ea1ff06177e93c7ff703376dcee2Shih-wei Liao DexFile::CatchHandlerItem FindCatchHandlerItem(Method* method, 811a18c8c1c0e4ea1ff06177e93c7ff703376dcee2Shih-wei Liao const char exception_type[], 821a18c8c1c0e4ea1ff06177e93c7ff703376dcee2Shih-wei Liao uint32_t addr) { 831a18c8c1c0e4ea1ff06177e93c7ff703376dcee2Shih-wei Liao const DexFile::CodeItem* code_item = dex_->GetCodeItem(method->code_off_); 841a18c8c1c0e4ea1ff06177e93c7ff703376dcee2Shih-wei Liao for (DexFile::CatchHandlerIterator iter = dex_->dexFindCatchHandler(*code_item, addr); 851a18c8c1c0e4ea1ff06177e93c7ff703376dcee2Shih-wei Liao !iter.HasNext(); iter.Next()) { 861a18c8c1c0e4ea1ff06177e93c7ff703376dcee2Shih-wei Liao if (strcmp(exception_type, dex_->dexStringByTypeIdx(iter.Get().type_idx_)) == 0) { 871a18c8c1c0e4ea1ff06177e93c7ff703376dcee2Shih-wei Liao return iter.Get(); 881a18c8c1c0e4ea1ff06177e93c7ff703376dcee2Shih-wei Liao } 891a18c8c1c0e4ea1ff06177e93c7ff703376dcee2Shih-wei Liao } 901a18c8c1c0e4ea1ff06177e93c7ff703376dcee2Shih-wei Liao return DexFile::CatchHandlerItem(); 911a18c8c1c0e4ea1ff06177e93c7ff703376dcee2Shih-wei Liao } 922fb9753c58ce1a511fd6996856840120eb2930dbShih-wei Liao 931a18c8c1c0e4ea1ff06177e93c7ff703376dcee2Shih-wei Liao scoped_ptr<DexFile> dex_; 942fb9753c58ce1a511fd6996856840120eb2930dbShih-wei Liao 951a18c8c1c0e4ea1ff06177e93c7ff703376dcee2Shih-wei Liao Method* method_f_; 961a18c8c1c0e4ea1ff06177e93c7ff703376dcee2Shih-wei Liao Method* method_g_; 972fb9753c58ce1a511fd6996856840120eb2930dbShih-wei Liao 981a18c8c1c0e4ea1ff06177e93c7ff703376dcee2Shih-wei Liao private: 991a18c8c1c0e4ea1ff06177e93c7ff703376dcee2Shih-wei Liao Class* my_klass_; 1001a18c8c1c0e4ea1ff06177e93c7ff703376dcee2Shih-wei Liao}; 1011a18c8c1c0e4ea1ff06177e93c7ff703376dcee2Shih-wei Liao 1021a18c8c1c0e4ea1ff06177e93c7ff703376dcee2Shih-wei LiaoTEST_F(ExceptionTest, FindCatchHandler) { 1031a18c8c1c0e4ea1ff06177e93c7ff703376dcee2Shih-wei Liao const DexFile::CodeItem *code_item = dex_->GetCodeItem(method_f_->code_off_); 1042fb9753c58ce1a511fd6996856840120eb2930dbShih-wei Liao 1052fb9753c58ce1a511fd6996856840120eb2930dbShih-wei Liao ASSERT_TRUE(code_item != NULL); 1062fb9753c58ce1a511fd6996856840120eb2930dbShih-wei Liao 1072fb9753c58ce1a511fd6996856840120eb2930dbShih-wei Liao ASSERT_EQ(2u, code_item->tries_size_); 1082fb9753c58ce1a511fd6996856840120eb2930dbShih-wei Liao ASSERT_NE(0u, code_item->insns_size_); 1092fb9753c58ce1a511fd6996856840120eb2930dbShih-wei Liao 1102fb9753c58ce1a511fd6996856840120eb2930dbShih-wei Liao const struct DexFile::TryItem *t0, *t1; 1111a18c8c1c0e4ea1ff06177e93c7ff703376dcee2Shih-wei Liao t0 = dex_->dexGetTryItems(*code_item, 0); 1121a18c8c1c0e4ea1ff06177e93c7ff703376dcee2Shih-wei Liao t1 = dex_->dexGetTryItems(*code_item, 1); 1132fb9753c58ce1a511fd6996856840120eb2930dbShih-wei Liao EXPECT_LE(t0->start_addr_, t1->start_addr_); 1142fb9753c58ce1a511fd6996856840120eb2930dbShih-wei Liao 1152fb9753c58ce1a511fd6996856840120eb2930dbShih-wei Liao DexFile::CatchHandlerIterator iter = 1161a18c8c1c0e4ea1ff06177e93c7ff703376dcee2Shih-wei Liao dex_->dexFindCatchHandler(*code_item, 4 /* Dex PC in the first try block */); 1171a18c8c1c0e4ea1ff06177e93c7ff703376dcee2Shih-wei Liao ASSERT_EQ(false, iter.HasNext()); 1181a18c8c1c0e4ea1ff06177e93c7ff703376dcee2Shih-wei Liao EXPECT_STREQ("Ljava/io/IOException;", dex_->dexStringByTypeIdx(iter.Get().type_idx_)); 1192fb9753c58ce1a511fd6996856840120eb2930dbShih-wei Liao iter.Next(); 1201a18c8c1c0e4ea1ff06177e93c7ff703376dcee2Shih-wei Liao ASSERT_EQ(false, iter.HasNext()); 1211a18c8c1c0e4ea1ff06177e93c7ff703376dcee2Shih-wei Liao EXPECT_STREQ("Ljava/lang/Exception;", dex_->dexStringByTypeIdx(iter.Get().type_idx_)); 1222fb9753c58ce1a511fd6996856840120eb2930dbShih-wei Liao iter.Next(); 1231a18c8c1c0e4ea1ff06177e93c7ff703376dcee2Shih-wei Liao ASSERT_EQ(true, iter.HasNext()); 1242fb9753c58ce1a511fd6996856840120eb2930dbShih-wei Liao 1251a18c8c1c0e4ea1ff06177e93c7ff703376dcee2Shih-wei Liao iter = dex_->dexFindCatchHandler(*code_item, 8 /* Dex PC in the second try block */); 1261a18c8c1c0e4ea1ff06177e93c7ff703376dcee2Shih-wei Liao ASSERT_EQ(false, iter.HasNext()); 1271a18c8c1c0e4ea1ff06177e93c7ff703376dcee2Shih-wei Liao EXPECT_STREQ("Ljava/io/IOException;", dex_->dexStringByTypeIdx(iter.Get().type_idx_)); 1282fb9753c58ce1a511fd6996856840120eb2930dbShih-wei Liao iter.Next(); 1291a18c8c1c0e4ea1ff06177e93c7ff703376dcee2Shih-wei Liao ASSERT_EQ(true, iter.HasNext()); 1301a18c8c1c0e4ea1ff06177e93c7ff703376dcee2Shih-wei Liao 1311a18c8c1c0e4ea1ff06177e93c7ff703376dcee2Shih-wei Liao iter = dex_->dexFindCatchHandler(*code_item, 11 /* Dex PC not in any try block */); 1321a18c8c1c0e4ea1ff06177e93c7ff703376dcee2Shih-wei Liao ASSERT_EQ(true, iter.HasNext()); 1332fb9753c58ce1a511fd6996856840120eb2930dbShih-wei Liao} 1342fb9753c58ce1a511fd6996856840120eb2930dbShih-wei Liao 1352fb9753c58ce1a511fd6996856840120eb2930dbShih-wei Liao} // namespace art 136