Add infrastructure for registering built-in native methods.

While I'm here, make fiddling with Thread state easier.

Change-Id: I3d215a3a852aa8970c3974b2edefce9dd261ccd7
diff --git a/src/thread.h b/src/thread.h
index 41bb0da..86e78b7 100644
--- a/src/thread.h
+++ b/src/thread.h
@@ -320,8 +320,10 @@
     return state_;
   }
 
-  void SetState(State new_state) {
+  State SetState(State new_state) {
+    State old_state = state_;
     state_ = new_state;
+    return old_state;
   }
 
   static ThreadOffset SuspendCountOffset() {
@@ -531,8 +533,7 @@
     }
     Thread::State old_state;
     if (current_thread != NULL) {
-      old_state = current_thread->GetState();
-      current_thread->SetState(Thread::kWaiting);  // TODO: VMWAIT
+      old_state = current_thread->SetState(Thread::kWaiting);  // TODO: VMWAIT
     } else {
       // happens during VM shutdown
       old_state = Thread::kUnknown;  // TODO: something else
@@ -553,6 +554,22 @@
   DISALLOW_COPY_AND_ASSIGN(ThreadListLock);
 };
 
+class ScopedThreadStateChange {
+ public:
+  ScopedThreadStateChange(Thread* thread, Thread::State new_state) : thread_(thread) {
+    old_thread_state_ = thread_->SetState(new_state);
+  }
+
+  ~ScopedThreadStateChange() {
+    thread_->SetState(old_thread_state_);
+  }
+
+ private:
+  Thread* thread_;
+  Thread::State old_thread_state_;
+  DISALLOW_COPY_AND_ASSIGN(ScopedThreadStateChange);
+};
+
 }  // namespace art
 
 #endif  // ART_SRC_THREAD_H_