Initial checkin of OOPHM plugins into trunk. Testing of non-XPCOM plugins
is still required, and more platforms need to be built.
git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@5868 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/plugins/xpcom/RootedObject.h b/plugins/xpcom/RootedObject.h
new file mode 100755
index 0000000..7251034
--- /dev/null
+++ b/plugins/xpcom/RootedObject.h
@@ -0,0 +1,77 @@
+#ifndef _H_RootedObject
+#define _H_RootedObject
+/*
+ * Copyright 2008 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+#include "Debug.h"
+
+#include "jsapi.h"
+
+class RootedObject {
+public:
+ RootedObject(JSContext* ctx, const char* name = 0) : ctx(ctx), obj(0) {
+ if (!JS_AddNamedRoot(ctx, &obj, name)) {
+ Debug::log(Debug::Error) << "RootedObject(" << (name ? name : "")
+ << "): JS_AddNamedRoot failed" << Debug::flush;
+ }
+ }
+
+ ~RootedObject() {
+ // Always returns success, so no need to check.
+ JS_RemoveRoot(ctx, &obj);
+ }
+
+ JSObject& operator*() const {
+ assert(obj != 0);
+ return *obj;
+ }
+
+ JSObject* operator->() const {
+ assert(obj != 0);
+ return obj;
+ }
+
+ bool operator==(JSObject* p) const {
+ return obj == p;
+ }
+
+ bool operator!=(JSObject* p) const {
+ return obj != p;
+ }
+
+ JSObject* get() const {
+ return obj;
+ }
+
+ RootedObject& operator=(JSObject* val) {
+ obj = val;
+ return *this;
+ }
+
+private:
+ JSContext* ctx;
+ JSObject* obj;
+};
+
+inline bool operator==(JSObject* p, const RootedObject& ro) {
+ return p == ro.get();
+}
+
+inline bool operator!=(JSObject* p, const RootedObject& ro) {
+ return p != ro.get();
+}
+
+#endif