summaryrefslogtreecommitdiff
path: root/src/mongo/scripting
diff options
context:
space:
mode:
Diffstat (limited to 'src/mongo/scripting')
-rw-r--r--src/mongo/scripting/bson_template_evaluator.h5
-rw-r--r--src/mongo/scripting/bson_template_evaluator_test.cpp50
-rw-r--r--src/mongo/scripting/engine.cpp4
-rw-r--r--src/mongo/scripting/engine.h2
-rw-r--r--src/mongo/scripting/mozjs/bindata.cpp2
-rw-r--r--src/mongo/scripting/mozjs/db.cpp2
-rw-r--r--src/mongo/scripting/mozjs/dbcollection.cpp2
-rw-r--r--src/mongo/scripting/mozjs/implscope.cpp2
-rw-r--r--src/mongo/scripting/mozjs/implscope.h2
-rw-r--r--src/mongo/scripting/mozjs/jscustomallocator.cpp15
-rw-r--r--src/mongo/scripting/mozjs/jsthread.cpp2
-rw-r--r--src/mongo/scripting/mozjs/maxkey.cpp2
-rw-r--r--src/mongo/scripting/mozjs/minkey.cpp2
-rw-r--r--src/mongo/scripting/mozjs/mongo.cpp15
-rw-r--r--src/mongo/scripting/mozjs/objectwrapper.cpp7
-rw-r--r--src/mongo/scripting/mozjs/proxyscope.cpp8
-rw-r--r--src/mongo/scripting/mozjs/timestamp.cpp4
-rw-r--r--src/mongo/scripting/mozjs/wrapconstrainedmethod.h9
18 files changed, 83 insertions, 52 deletions
diff --git a/src/mongo/scripting/bson_template_evaluator.h b/src/mongo/scripting/bson_template_evaluator.h
index e5b6c5925a6..534f5ed7c26 100644
--- a/src/mongo/scripting/bson_template_evaluator.h
+++ b/src/mongo/scripting/bson_template_evaluator.h
@@ -47,8 +47,8 @@
#include <string>
#include "mongo/db/jsobj.h"
-#include "mongo/stdx/functional.h"
#include "mongo/platform/random.h"
+#include "mongo/stdx/functional.h"
namespace mongo {
@@ -94,7 +94,8 @@ public:
typedef stdx::function<Status(BsonTemplateEvaluator* btl,
const char* fieldName,
const BSONObj& in,
- BSONObjBuilder& builder)> OperatorFn;
+ BSONObjBuilder& builder)>
+ OperatorFn;
/*
* @params seed : Random seed to be used when generating random data
diff --git a/src/mongo/scripting/bson_template_evaluator_test.cpp b/src/mongo/scripting/bson_template_evaluator_test.cpp
index d4a4c2850f4..51e573fc7e0 100644
--- a/src/mongo/scripting/bson_template_evaluator_test.cpp
+++ b/src/mongo/scripting/bson_template_evaluator_test.cpp
@@ -26,8 +26,8 @@
* then also delete it in the license file.
*/
-#include "mongo/db/jsobj.h"
#include "mongo/scripting/bson_template_evaluator.h"
+#include "mongo/db/jsobj.h"
#include "mongo/unittest/unittest.h"
namespace mongo {
@@ -94,7 +94,8 @@ TEST(BSONTemplateEvaluatorTest, RAND_INT) {
ASSERT_EQUALS(BsonTemplateEvaluator::StatusSuccess,
t.evaluate(BSON("randField" << randObj << "hello"
<< "world"
- << "id" << 1),
+ << "id"
+ << 1),
builder8));
BSONObj obj8 = builder8.obj();
ASSERT_EQUALS(obj8.nFields(), 3);
@@ -121,7 +122,8 @@ TEST(BSONTemplateEvaluatorTest, RAND_INT) {
ASSERT_EQUALS(BsonTemplateEvaluator::StatusSuccess,
t.evaluate(BSON("randField1" << randObj << "hello"
<< "world"
- << "randField2" << randObj),
+ << "randField2"
+ << randObj),
builder10));
BSONObj obj10 = builder10.obj();
ASSERT_EQUALS(obj10.nFields(), 3);
@@ -138,7 +140,8 @@ TEST(BSONTemplateEvaluatorTest, RAND_INT) {
ASSERT_EQUALS(BsonTemplateEvaluator::StatusSuccess,
t.evaluate(BSON("testArray" << BSON_ARRAY(0 << 5 << 10 << 20) << "hello"
<< "world"
- << "randField" << randObj),
+ << "randField"
+ << randObj),
builder11));
BSONObj obj11 = builder11.obj();
ASSERT_EQUALS(obj11.nFields(), 3);
@@ -188,7 +191,8 @@ TEST(BSONTemplateEvaluatorTest, RAND_INT_PLUS_THREAD) {
ASSERT_EQUALS(BsonTemplateEvaluator::StatusSuccess,
t.evaluate(BSON("randField" << randObj << "hello"
<< "world"
- << "id" << 1),
+ << "id"
+ << 1),
builder8));
BSONObj obj8 = builder8.obj();
ASSERT_EQUALS(obj8.nFields(), 3);
@@ -215,7 +219,8 @@ TEST(BSONTemplateEvaluatorTest, RAND_INT_PLUS_THREAD) {
ASSERT_EQUALS(BsonTemplateEvaluator::StatusSuccess,
t.evaluate(BSON("randField1" << randObj << "hello"
<< "world"
- << "randField2" << randObj),
+ << "randField2"
+ << randObj),
builder10));
BSONObj obj10 = builder10.obj();
ASSERT_EQUALS(obj10.nFields(), 3);
@@ -234,7 +239,8 @@ TEST(BSONTemplateEvaluatorTest, RAND_INT_PLUS_THREAD) {
ASSERT_EQUALS(BsonTemplateEvaluator::StatusSuccess,
t.evaluate(BSON("testArray" << BSON_ARRAY(0 << 5 << 10 << 20) << "hello"
<< "world"
- << "randField" << randObj),
+ << "randField"
+ << randObj),
builder11));
BSONObj obj11 = builder11.obj();
ASSERT_EQUALS(obj11.nFields(), 3);
@@ -438,7 +444,8 @@ TEST(BSONTemplateEvaluatorTest, RAND_STRING) {
ASSERT_EQUALS(BsonTemplateEvaluator::StatusSuccess,
t.evaluate(BSON("id" << 1 << "hello"
<< "world"
- << "randField" << randObj),
+ << "randField"
+ << randObj),
builder6));
BSONObj obj6 = builder6.obj();
ASSERT_EQUALS(obj6.nFields(), 3);
@@ -452,7 +459,8 @@ TEST(BSONTemplateEvaluatorTest, RAND_STRING) {
ASSERT_EQUALS(BsonTemplateEvaluator::StatusSuccess,
t.evaluate(BSON("randField" << randObj << "hello"
<< "world"
- << "id" << 1),
+ << "id"
+ << 1),
builder7));
BSONObj obj7 = builder7.obj();
ASSERT_EQUALS(obj7.nFields(), 3);
@@ -477,7 +485,8 @@ TEST(BSONTemplateEvaluatorTest, RAND_STRING) {
ASSERT_EQUALS(BsonTemplateEvaluator::StatusSuccess,
t.evaluate(BSON("randField1" << randObj << "hello"
<< "world"
- << "randField2" << randObj),
+ << "randField2"
+ << randObj),
builder10));
BSONObj obj10 = builder10.obj();
ASSERT_EQUALS(obj10.nFields(), 3);
@@ -493,7 +502,8 @@ TEST(BSONTemplateEvaluatorTest, RAND_STRING) {
ASSERT_EQUALS(BsonTemplateEvaluator::StatusSuccess,
t.evaluate(BSON("testArray" << BSON_ARRAY(0 << 5 << 10 << 20) << "hello"
<< "world"
- << "randField" << randObj),
+ << "randField"
+ << randObj),
builder11));
BSONObj obj11 = builder11.obj();
ASSERT_EQUALS(obj11.nFields(), 3);
@@ -548,7 +558,9 @@ TEST(BSONTemplateEvaluatorTest, CONCAT) {
ASSERT_EQUALS(obj4.nFields(), 3);
expectedObj = BSON("concatField1"
<< "hello world"
- << "middleKey" << 1 << "concatField2"
+ << "middleKey"
+ << 1
+ << "concatField2"
<< "hello world");
ASSERT_EQUALS(obj4.equal(expectedObj), true);
@@ -670,7 +682,8 @@ TEST(BSONTemplateEvaluatorTest, NESTING) {
BSONObj bazObj = BSON("baz" << innerObj);
outerObj = BSON("foo"
<< "hi"
- << "bar" << bazObj);
+ << "bar"
+ << bazObj);
ASSERT_EQUALS(BsonTemplateEvaluator::StatusSuccess,
t.evaluate(BSON("id" << outerObj), builder3));
BSONObj obj3 = builder3.obj();
@@ -691,7 +704,10 @@ TEST(BSONTemplateEvaluatorTest, NESTING) {
<< "bye");
outerObj = BSON("foo"
<< "hi"
- << "bar" << barObj4 << "baz" << bazObj4);
+ << "bar"
+ << barObj4
+ << "baz"
+ << bazObj4);
ASSERT_EQUALS(BsonTemplateEvaluator::StatusSuccess,
t.evaluate(BSON("id" << outerObj), builder4));
BSONObj obj4 = builder4.obj();
@@ -715,7 +731,8 @@ TEST(BSONTemplateEvaluatorTest, NESTING) {
<< "let"
<< "target"
<< "x"
- << "value" << innerObj);
+ << "value"
+ << innerObj);
ASSERT_EQUALS(BsonTemplateEvaluator::StatusBadOperator, t.evaluate(outerObj, builder5));
// Test success for elements in an array that need evaluation
@@ -726,7 +743,8 @@ TEST(BSONTemplateEvaluatorTest, NESTING) {
BSONObj elem3 = BSON("baz" << 42);
outerObj = BSON("foo"
<< "hi"
- << "bar" << BSON_ARRAY(elem1 << elem2 << elem3 << 7));
+ << "bar"
+ << BSON_ARRAY(elem1 << elem2 << elem3 << 7));
ASSERT_EQUALS(BsonTemplateEvaluator::StatusSuccess, t.evaluate(outerObj, builder6));
BSONObj obj6 = builder6.obj();
BSONElement obj6_bar = obj6["bar"];
diff --git a/src/mongo/scripting/engine.cpp b/src/mongo/scripting/engine.cpp
index d693601276d..392dcdc6e8b 100644
--- a/src/mongo/scripting/engine.cpp
+++ b/src/mongo/scripting/engine.cpp
@@ -33,13 +33,13 @@
#include "mongo/scripting/engine.h"
-#include <cctype>
#include <boost/filesystem/operations.hpp>
+#include <cctype>
#include "mongo/client/dbclientcursor.h"
#include "mongo/client/dbclientinterface.h"
-#include "mongo/db/service_context.h"
#include "mongo/db/operation_context.h"
+#include "mongo/db/service_context.h"
#include "mongo/platform/unordered_set.h"
#include "mongo/util/file.h"
#include "mongo/util/log.h"
diff --git a/src/mongo/scripting/engine.h b/src/mongo/scripting/engine.h
index 219b5a4f5c8..98384f1515a 100644
--- a/src/mongo/scripting/engine.h
+++ b/src/mongo/scripting/engine.h
@@ -29,8 +29,8 @@
#pragma once
-#include "mongo/db/service_context.h"
#include "mongo/db/jsobj.h"
+#include "mongo/db/service_context.h"
#include "mongo/platform/atomic_word.h"
namespace mongo {
diff --git a/src/mongo/scripting/mozjs/bindata.cpp b/src/mongo/scripting/mozjs/bindata.cpp
index ba07c3164ad..d7bacb5558e 100644
--- a/src/mongo/scripting/mozjs/bindata.cpp
+++ b/src/mongo/scripting/mozjs/bindata.cpp
@@ -30,8 +30,8 @@
#include "mongo/scripting/mozjs/bindata.h"
-#include <iomanip>
#include <cctype>
+#include <iomanip>
#include "mongo/scripting/mozjs/implscope.h"
#include "mongo/scripting/mozjs/internedstring.h"
diff --git a/src/mongo/scripting/mozjs/db.cpp b/src/mongo/scripting/mozjs/db.cpp
index 565cf20cb1c..ed8575b0f4a 100644
--- a/src/mongo/scripting/mozjs/db.cpp
+++ b/src/mongo/scripting/mozjs/db.cpp
@@ -32,13 +32,13 @@
#include "mongo/db/namespace_string.h"
#include "mongo/db/operation_context.h"
+#include "mongo/s/d_state.h"
#include "mongo/scripting/mozjs/idwrapper.h"
#include "mongo/scripting/mozjs/implscope.h"
#include "mongo/scripting/mozjs/internedstring.h"
#include "mongo/scripting/mozjs/objectwrapper.h"
#include "mongo/scripting/mozjs/valuereader.h"
#include "mongo/scripting/mozjs/valuewriter.h"
-#include "mongo/s/d_state.h"
namespace mongo {
namespace mozjs {
diff --git a/src/mongo/scripting/mozjs/dbcollection.cpp b/src/mongo/scripting/mozjs/dbcollection.cpp
index 8d094721f8f..e7c6bb67ae0 100644
--- a/src/mongo/scripting/mozjs/dbcollection.cpp
+++ b/src/mongo/scripting/mozjs/dbcollection.cpp
@@ -32,12 +32,12 @@
#include "mongo/db/namespace_string.h"
#include "mongo/db/operation_context.h"
+#include "mongo/s/d_state.h"
#include "mongo/scripting/mozjs/bson.h"
#include "mongo/scripting/mozjs/db.h"
#include "mongo/scripting/mozjs/implscope.h"
#include "mongo/scripting/mozjs/objectwrapper.h"
#include "mongo/scripting/mozjs/valuewriter.h"
-#include "mongo/s/d_state.h"
namespace mongo {
namespace mozjs {
diff --git a/src/mongo/scripting/mozjs/implscope.cpp b/src/mongo/scripting/mozjs/implscope.cpp
index f8978b01b7d..73a18238af1 100644
--- a/src/mongo/scripting/mozjs/implscope.cpp
+++ b/src/mongo/scripting/mozjs/implscope.cpp
@@ -32,9 +32,9 @@
#include "mongo/scripting/mozjs/implscope.h"
+#include <js/CharacterEncoding.h>
#include <jscustomallocator.h>
#include <jsfriendapi.h>
-#include <js/CharacterEncoding.h>
#include "mongo/base/error_codes.h"
#include "mongo/db/operation_context.h"
diff --git a/src/mongo/scripting/mozjs/implscope.h b/src/mongo/scripting/mozjs/implscope.h
index be125f3e987..59aaa297ff0 100644
--- a/src/mongo/scripting/mozjs/implscope.h
+++ b/src/mongo/scripting/mozjs/implscope.h
@@ -53,9 +53,9 @@
#include "mongo/scripting/mozjs/mongo.h"
#include "mongo/scripting/mozjs/mongohelpers.h"
#include "mongo/scripting/mozjs/nativefunction.h"
+#include "mongo/scripting/mozjs/numberdecimal.h"
#include "mongo/scripting/mozjs/numberint.h"
#include "mongo/scripting/mozjs/numberlong.h"
-#include "mongo/scripting/mozjs/numberdecimal.h"
#include "mongo/scripting/mozjs/object.h"
#include "mongo/scripting/mozjs/oid.h"
#include "mongo/scripting/mozjs/regexp.h"
diff --git a/src/mongo/scripting/mozjs/jscustomallocator.cpp b/src/mongo/scripting/mozjs/jscustomallocator.cpp
index a817d2a8cad..ea7a3346350 100644
--- a/src/mongo/scripting/mozjs/jscustomallocator.cpp
+++ b/src/mongo/scripting/mozjs/jscustomallocator.cpp
@@ -29,12 +29,12 @@
#include "mongo/platform/basic.h"
#include <cstddef>
-#include <type_traits>
#include <jscustomallocator.h>
+#include <type_traits>
#include "mongo/config.h"
-#include "mongo/util/concurrency/threadlocal.h"
#include "mongo/scripting/mozjs/implscope.h"
+#include "mongo/util/concurrency/threadlocal.h"
#ifdef __linux__
#include <malloc.h>
@@ -189,10 +189,13 @@ void js_free(void* p) {
mongo::sm::total_bytes = tb - current;
}
- mongo::sm::wrap_alloc([](void* ptr, size_t b) {
- std::free(ptr);
- return nullptr;
- }, p, 0);
+ mongo::sm::wrap_alloc(
+ [](void* ptr, size_t b) {
+ std::free(ptr);
+ return nullptr;
+ },
+ p,
+ 0);
}
void* js_realloc(void* p, size_t bytes) {
diff --git a/src/mongo/scripting/mozjs/jsthread.cpp b/src/mongo/scripting/mozjs/jsthread.cpp
index 783272c7d75..a8f72a56039 100644
--- a/src/mongo/scripting/mozjs/jsthread.cpp
+++ b/src/mongo/scripting/mozjs/jsthread.cpp
@@ -32,8 +32,8 @@
#include "mongo/scripting/mozjs/jsthread.h"
-#include <cstdio>
#include "vm/PosixNSPR.h"
+#include <cstdio>
#include "mongo/db/jsobj.h"
#include "mongo/scripting/mozjs/implscope.h"
diff --git a/src/mongo/scripting/mozjs/maxkey.cpp b/src/mongo/scripting/mozjs/maxkey.cpp
index 0ba67d63f8f..411f71dd746 100644
--- a/src/mongo/scripting/mozjs/maxkey.cpp
+++ b/src/mongo/scripting/mozjs/maxkey.cpp
@@ -30,8 +30,8 @@
#include "mongo/scripting/mozjs/maxkey.h"
-#include "mongo/scripting/mozjs/internedstring.h"
#include "mongo/scripting/mozjs/implscope.h"
+#include "mongo/scripting/mozjs/internedstring.h"
#include "mongo/scripting/mozjs/objectwrapper.h"
#include "mongo/scripting/mozjs/valuereader.h"
#include "mongo/scripting/mozjs/wrapconstrainedmethod.h"
diff --git a/src/mongo/scripting/mozjs/minkey.cpp b/src/mongo/scripting/mozjs/minkey.cpp
index c4906fba6f5..c85ca2f6b25 100644
--- a/src/mongo/scripting/mozjs/minkey.cpp
+++ b/src/mongo/scripting/mozjs/minkey.cpp
@@ -30,8 +30,8 @@
#include "mongo/scripting/mozjs/minkey.h"
-#include "mongo/scripting/mozjs/internedstring.h"
#include "mongo/scripting/mozjs/implscope.h"
+#include "mongo/scripting/mozjs/internedstring.h"
#include "mongo/scripting/mozjs/objectwrapper.h"
#include "mongo/scripting/mozjs/valuereader.h"
#include "mongo/scripting/mozjs/wrapconstrainedmethod.h"
diff --git a/src/mongo/scripting/mozjs/mongo.cpp b/src/mongo/scripting/mozjs/mongo.cpp
index 53bf47c77c9..1b7ce7dcd21 100644
--- a/src/mongo/scripting/mozjs/mongo.cpp
+++ b/src/mongo/scripting/mozjs/mongo.cpp
@@ -374,11 +374,13 @@ void MongoBase::Functions::auth::call(JSContext* cx, JS::CallArgs args) {
params = ValueWriter(cx, args.get(0)).toBSON();
break;
case 3:
- params = BSON(saslCommandMechanismFieldName
- << "MONGODB-CR" << saslCommandUserDBFieldName
- << ValueWriter(cx, args[0]).toString() << saslCommandUserFieldName
- << ValueWriter(cx, args[1]).toString() << saslCommandPasswordFieldName
- << ValueWriter(cx, args[2]).toString());
+ params =
+ BSON(saslCommandMechanismFieldName << "MONGODB-CR" << saslCommandUserDBFieldName
+ << ValueWriter(cx, args[0]).toString()
+ << saslCommandUserFieldName
+ << ValueWriter(cx, args[1]).toString()
+ << saslCommandPasswordFieldName
+ << ValueWriter(cx, args[2]).toString());
break;
default:
uasserted(ErrorCodes::BadValue, "mongoAuth takes 1 object or 3 string arguments");
@@ -485,7 +487,8 @@ void MongoBase::Functions::copyDatabaseWithSCRAM::call(JSContext* cx, JS::CallAr
BSONObj saslFirstCommandPrefix =
BSON("copydbsaslstart" << 1 << "fromhost" << fromHost << "fromdb" << fromDb
- << saslCommandMechanismFieldName << "SCRAM-SHA-1");
+ << saslCommandMechanismFieldName
+ << "SCRAM-SHA-1");
BSONObj saslFollowupCommandPrefix =
BSON("copydb" << 1 << "fromhost" << fromHost << "fromdb" << fromDb << "todb" << toDb);
diff --git a/src/mongo/scripting/mozjs/objectwrapper.cpp b/src/mongo/scripting/mozjs/objectwrapper.cpp
index 0f891b549fe..c9a800fee2e 100644
--- a/src/mongo/scripting/mozjs/objectwrapper.cpp
+++ b/src/mongo/scripting/mozjs/objectwrapper.cpp
@@ -524,8 +524,11 @@ BSONObj ObjectWrapper::toBSON() {
const int sizeWithEOO = b.len() + 1 /*EOO*/ - 4 /*BSONObj::Holder ref count*/;
uassert(17260,
str::stream() << "Converting from JavaScript to BSON failed: "
- << "Object size " << sizeWithEOO << " exceeds limit of "
- << BSONObjMaxInternalSize << " bytes.",
+ << "Object size "
+ << sizeWithEOO
+ << " exceeds limit of "
+ << BSONObjMaxInternalSize
+ << " bytes.",
sizeWithEOO <= BSONObjMaxInternalSize);
return b.obj();
diff --git a/src/mongo/scripting/mozjs/proxyscope.cpp b/src/mongo/scripting/mozjs/proxyscope.cpp
index 7c360302d31..d5233f8379d 100644
--- a/src/mongo/scripting/mozjs/proxyscope.cpp
+++ b/src/mongo/scripting/mozjs/proxyscope.cpp
@@ -336,11 +336,9 @@ void MozJSProxyScope::implThread(void* arg) {
while (true) {
stdx::unique_lock<stdx::mutex> lk(proxy->_mutex);
- proxy->_condvar.wait(lk,
- [proxy] {
- return proxy->_state == State::ProxyRequest ||
- proxy->_state == State::Shutdown;
- });
+ proxy->_condvar.wait(lk, [proxy] {
+ return proxy->_state == State::ProxyRequest || proxy->_state == State::Shutdown;
+ });
if (proxy->_state == State::Shutdown)
break;
diff --git a/src/mongo/scripting/mozjs/timestamp.cpp b/src/mongo/scripting/mozjs/timestamp.cpp
index 48364d62550..99d83f7c343 100644
--- a/src/mongo/scripting/mozjs/timestamp.cpp
+++ b/src/mongo/scripting/mozjs/timestamp.cpp
@@ -56,7 +56,9 @@ double getTimestampArg(JSContext* cx, JS::CallArgs args, int idx, std::string na
if (val < 0 || val > maxArgVal) {
uasserted(ErrorCodes::BadValue,
str::stream() << name << " must be non-negative and not greater than "
- << maxArgVal << ", got " << val);
+ << maxArgVal
+ << ", got "
+ << val);
}
return val;
}
diff --git a/src/mongo/scripting/mozjs/wrapconstrainedmethod.h b/src/mongo/scripting/mozjs/wrapconstrainedmethod.h
index db21289cb93..74ea796665e 100644
--- a/src/mongo/scripting/mozjs/wrapconstrainedmethod.h
+++ b/src/mongo/scripting/mozjs/wrapconstrainedmethod.h
@@ -95,19 +95,22 @@ bool wrapConstrainedMethod(JSContext* cx, unsigned argc, JS::Value* vp) {
uasserted(ErrorCodes::BadValue,
str::stream() << "Cannot call \"" << T::name()
<< "\" on non-object of type \""
- << ValueWriter(cx, args.thisv()).typeAsString() << "\"");
+ << ValueWriter(cx, args.thisv()).typeAsString()
+ << "\"");
}
if (!instanceOf<Args..., void>(getScope(cx), &isProto, args.thisv())) {
uasserted(ErrorCodes::BadValue,
str::stream() << "Cannot call \"" << T::name() << "\" on object of type \""
- << ObjectWrapper(cx, args.thisv()).getClassName() << "\"");
+ << ObjectWrapper(cx, args.thisv()).getClassName()
+ << "\"");
}
if (noProto && isProto) {
uasserted(ErrorCodes::BadValue,
str::stream() << "Cannot call \"" << T::name() << "\" on prototype of \""
- << ObjectWrapper(cx, args.thisv()).getClassName() << "\"");
+ << ObjectWrapper(cx, args.thisv()).getClassName()
+ << "\"");
}
T::call(cx, args);