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