Don't use variable-length arrays.

Change-Id: I3f70cadaaade189fd834d9aadb8839fe8ad87f1f
diff --git a/src/dex_file.cc b/src/dex_file.cc
index d3e1c68..c3e7c84 100644
--- a/src/dex_file.cc
+++ b/src/dex_file.cc
@@ -789,13 +789,12 @@
                               DexDebugNewPositionCb position_cb, DexDebugNewLocalCb local_cb,
                               void* context) const {
   const byte* stream = GetDebugInfoStream(code_item);
-  LocalInfo local_in_reg[code_item->registers_size_];
-
+  UniquePtr<LocalInfo[]> local_in_reg(local_cb != NULL ? new LocalInfo[code_item->registers_size_] : NULL);
   if (stream != NULL) {
-    DecodeDebugInfo0(code_item, is_static, method_idx, position_cb, local_cb, context, stream, local_in_reg);
+    DecodeDebugInfo0(code_item, is_static, method_idx, position_cb, local_cb, context, stream, &local_in_reg[0]);
   }
   for (int reg = 0; reg < code_item->registers_size_; reg++) {
-    InvokeLocalCbIfLive(context, reg, code_item->insns_size_in_code_units_, local_in_reg, local_cb);
+    InvokeLocalCbIfLive(context, reg, code_item->insns_size_in_code_units_, &local_in_reg[0], local_cb);
   }
 }
 
diff --git a/src/dex_file.h b/src/dex_file.h
index 429c7bc..e6c8a94 100644
--- a/src/dex_file.h
+++ b/src/dex_file.h
@@ -1041,7 +1041,8 @@
     ClassDataField() :  field_idx_delta_(0), access_flags_(0) {}
    private:
     DISALLOW_COPY_AND_ASSIGN(ClassDataField);
-  } field_;
+  };
+  ClassDataField field_;
 
   // Read and decode a field from a class_data_item stream into field
   void ReadClassDataField();
@@ -1054,7 +1055,8 @@
     ClassDataMethod() : method_idx_delta_(0), access_flags_(0), code_off_(0) {}
    private:
     DISALLOW_COPY_AND_ASSIGN(ClassDataMethod);
-  } method_;
+  };
+  ClassDataMethod method_;
 
   // Read and decode a method from a class_data_item stream into method
   void ReadClassDataMethod();
diff --git a/src/dex_file_verifier.cc b/src/dex_file_verifier.cc
index eb06e2a..af9d4bb 100644
--- a/src/dex_file_verifier.cc
+++ b/src/dex_file_verifier.cc
@@ -642,8 +642,8 @@
     return false;
   }
 
-  uint32_t handler_offsets[handlers_size];
-  if (!CheckAndGetHandlerOffsets(code_item, handler_offsets, handlers_size)) {
+  UniquePtr<uint32_t[]> handler_offsets(new uint32_t[handlers_size]);
+  if (!CheckAndGetHandlerOffsets(code_item, &handler_offsets[0], handlers_size)) {
     return false;
   }
 
diff --git a/src/jni_internal_test.cc b/src/jni_internal_test.cc
index 414f003..8bdc8c6 100644
--- a/src/jni_internal_test.cc
+++ b/src/jni_internal_test.cc
@@ -783,29 +783,29 @@
   env_->set_region_fn(a, size - 1, size, NULL); \
   EXPECT_EXCEPTION(aioobe_); \
   /* Prepare a couple of buffers. */ \
-  scalar_type src_buf[size]; \
-  scalar_type dst_buf[size]; \
+  UniquePtr<scalar_type[]> src_buf(new scalar_type[size]); \
+  UniquePtr<scalar_type[]> dst_buf(new scalar_type[size]); \
   for (jsize i = 0; i < size; ++i) { src_buf[i] = scalar_type(i); } \
   for (jsize i = 0; i < size; ++i) { dst_buf[i] = scalar_type(-1); } \
   /* Copy all of src_buf onto the heap. */ \
-  env_->set_region_fn(a, 0, size, src_buf); \
+  env_->set_region_fn(a, 0, size, &src_buf[0]); \
   /* Copy back only part. */ \
   env_->get_region_fn(a, 1, size - 2, &dst_buf[1]); \
-  EXPECT_NE(memcmp(src_buf, dst_buf, sizeof(src_buf)), 0) << "short copy equal"; \
+  EXPECT_NE(memcmp(&src_buf[0], &dst_buf[0], size * sizeof(scalar_type)), 0) << "short copy equal"; \
   /* Copy the missing pieces. */ \
-  env_->get_region_fn(a, 0, 1, dst_buf); \
+  env_->get_region_fn(a, 0, 1, &dst_buf[0]); \
   env_->get_region_fn(a, size - 1, 1, &dst_buf[size - 1]); \
-  EXPECT_EQ(memcmp(src_buf, dst_buf, sizeof(src_buf)), 0) << "fixed copy not equal"; \
+  EXPECT_EQ(memcmp(&src_buf[0], &dst_buf[0], size * sizeof(scalar_type)), 0) << "fixed copy not equal"; \
   /* Copy back the whole array. */ \
-  env_->get_region_fn(a, 0, size, dst_buf); \
-  EXPECT_EQ(memcmp(src_buf, dst_buf, sizeof(src_buf)), 0) << "full copy not equal"; \
+  env_->get_region_fn(a, 0, size, &dst_buf[0]); \
+  EXPECT_EQ(memcmp(&src_buf[0], &dst_buf[0], size * sizeof(scalar_type)), 0) << "full copy not equal"; \
   /* GetPrimitiveArrayCritical */ \
   void* v = env_->GetPrimitiveArrayCritical(a, NULL); \
-  EXPECT_EQ(memcmp(src_buf, v, sizeof(src_buf)), 0) << "GetPrimitiveArrayCritical not equal"; \
+  EXPECT_EQ(memcmp(&src_buf[0], v, size * sizeof(scalar_type)), 0) << "GetPrimitiveArrayCritical not equal"; \
   env_->ReleasePrimitiveArrayCritical(a, v, 0); \
   /* GetXArrayElements */ \
   scalar_type* xs = env_->get_elements_fn(a, NULL); \
-  EXPECT_EQ(memcmp(src_buf, xs, sizeof(src_buf)), 0) << # get_elements_fn " not equal"; \
+  EXPECT_EQ(memcmp(&src_buf[0], xs, size * sizeof(scalar_type)), 0) << # get_elements_fn " not equal"; \
   env_->release_elements_fn(a, xs, 0); \
   EXPECT_EQ(reinterpret_cast<uintptr_t>(v), reinterpret_cast<uintptr_t>(xs))
 
diff --git a/src/object_test.cc b/src/object_test.cc
index 3512171..80ed0bb 100644
--- a/src/object_test.cc
+++ b/src/object_test.cc
@@ -35,7 +35,7 @@
                     const char* utf8_in,
                     const char* utf16_expected_le,
                     int32_t expected_hash) {
-    uint16_t utf16_expected[length];
+    UniquePtr<uint16_t[]> utf16_expected(new uint16_t[length]);
     for (int32_t i = 0; i < length; i++) {
       uint16_t ch = (((utf16_expected_le[i*2 + 0] & 0xff) << 8) |
                      ((utf16_expected_le[i*2 + 1] & 0xff) << 0));