[gjs/mozjs91: 4/21] JS_New -> JS::Construct
- From: Evan Welsh <ewlsh src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gjs/mozjs91: 4/21] JS_New -> JS::Construct
- Date: Sun, 11 Jul 2021 04:08:04 +0000 (UTC)
commit 28ddcf4d6ce0415358dceecc6a59864df9367ae4
Author: Evan Welsh <contact evanwelsh com>
Date: Sat Jul 10 20:21:17 2021 -0700
JS_New -> JS::Construct
doc/SpiderMonkey_Memory.md | 6 ++++--
gi/gerror.cpp | 8 +++++++-
gi/gobject.cpp | 14 ++++++++++----
gjs/jsapi-util-error.cpp | 7 +++++--
4 files changed, 26 insertions(+), 9 deletions(-)
---
diff --git a/doc/SpiderMonkey_Memory.md b/doc/SpiderMonkey_Memory.md
index 3e30a7c7..5348e852 100644
--- a/doc/SpiderMonkey_Memory.md
+++ b/doc/SpiderMonkey_Memory.md
@@ -69,7 +69,7 @@ Note that the wrapped T in `JS::PersistentRooted<T>` is the location of your val
Here is the trickier part. If you create an object, say:
```c++
-JSObject *obj = JS_New(cx, whatever, ...);
+JSObject *obj = JS::Construct(cx, whatever, ...);
```
`obj` is NOT now referenced by any other object. If the GC ran right away, `obj` would be collected.
@@ -84,7 +84,9 @@ Any SpiderMonkey APIs that can cause a garbage collection will force you to use
So instead of the above code, you would write
```c++
-JS::RootedObject obj(cx, JS_New(cx, whatever, ...));
+JS::RootedObject obj(cx);
+if (!JS::Construct(cx, whatever, ..., &obj))
+ ...
```
### JSFunctionSpec and extra local roots ###
diff --git a/gi/gerror.cpp b/gi/gerror.cpp
index 08745a59..d3a2fb60 100644
--- a/gi/gerror.cpp
+++ b/gi/gerror.cpp
@@ -335,8 +335,14 @@ gjs_error_from_js_gerror(JSContext *cx,
JS::RootedObject error_constructor(cx);
if (!JS_GetClassObject(cx, error_kind, &error_constructor))
return nullptr;
+ JS::RootedValue error_constructorv(cx);
+ error_constructorv.setObject(*error_constructor);
- return JS_New(cx, error_constructor, error_args);
+ JS::RootedObject object(cx);
+ if (!JS::Construct(cx, error_constructorv, error_args, &object))
+ return nullptr;
+
+ return object;
}
JSObject* ErrorInstance::object_for_c_ptr(JSContext* context, GError* gerror) {
diff --git a/gi/gobject.cpp b/gi/gobject.cpp
index 2c1dc987..ca359314 100644
--- a/gi/gobject.cpp
+++ b/gi/gobject.cpp
@@ -134,7 +134,10 @@ static GObject* gjs_object_constructor(
if (!constructor)
return nullptr;
- JSObject* object;
+ JS::RootedValue constructorv(cx);
+ constructorv.setObject(*constructor);
+
+ JS::RootedObject object(cx);
if (n_construct_properties) {
JS::RootedObject props_hash(cx, JS_NewPlainObject(cx));
@@ -146,9 +149,12 @@ static GObject* gjs_object_constructor(
JS::RootedValueArray<1> args(cx);
args[0].set(JS::ObjectValue(*props_hash));
- object = JS_New(cx, constructor, args);
- } else {
- object = JS_New(cx, constructor, JS::HandleValueArray::empty());
+
+ if (!JS::Construct(cx, constructorv, args, &object))
+ return nullptr;
+ } else if (!JS::Construct(cx, constructorv, JS::HandleValueArray::empty(),
+ &object)) {
+ return nullptr;
}
if (!object)
diff --git a/gjs/jsapi-util-error.cpp b/gjs/jsapi-util-error.cpp
index a966f0f8..835a81b3 100644
--- a/gjs/jsapi-util-error.cpp
+++ b/gjs/jsapi-util-error.cpp
@@ -68,11 +68,14 @@
goto out;
}
- if (!JS_GetClassObject(context, error_kind, &constructor))
+ if (!JS_GetClassObject(context, error_kind, &constructor) || !constructor)
goto out;
+ v_constructor.setObject(*constructor);
+
/* throw new Error(message) */
- new_exc = JS_New(context, constructor, error_args);
+ if (!JS::Construct(context, v_constructor, error_args, &new_exc))
+ goto out;
if (!new_exc)
goto out;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]