// sequence<WebGLShader>? getAttachedShaders(WebGLProgram? program); bool JSB_glGetAttachedShaders(JSContext *cx, uint32_t argc, jsval *vp) { JSB_PRECONDITION2( argc == 1, cx, false, "Invalid number of arguments" ); JS::CallArgs args = JS::CallArgsFromVp(argc, vp); bool ok = true; uint32_t arg0; ok &= jsval_to_uint( cx, args.get(0), &arg0 ); JSB_PRECONDITION2(ok, cx, false, "Error processing arguments"); GLsizei length; glGetProgramiv(arg0, GL_ATTACHED_SHADERS, &length); GLuint* buffer = new (std::nothrow) GLuint[length]; memset(buffer, 0, length * sizeof(GLuint)); //Fix bug 2448, it seems that glGetAttachedShaders will crash if we send NULL to the third parameter (eg Windows), same as in lua binding GLsizei realShaderCount = 0; glGetAttachedShaders(arg0, length, &realShaderCount, buffer); JS::RootedObject jsobj(cx, JS_NewArrayObject(cx, length)); JSB_PRECONDITION2(jsobj, cx, false, "Error creating JS Object"); for( int i=0; i<length; i++) { JS::RootedValue e(cx, INT_TO_JSVAL(buffer[i])); JS_SetElement(cx, jsobj, i, e ); } args.rval().set(OBJECT_TO_JSVAL(jsobj)); CC_SAFE_DELETE_ARRAY(buffer); return true; }
// sequence<DOMString>? getSupportedExtensions(); bool JSB_glGetSupportedExtensions(JSContext *cx, uint32_t argc, jsval *vp) { JSB_PRECONDITION2( argc == 0, cx, false, "Invalid number of arguments" ); JS::CallArgs args = JS::CallArgsFromVp(argc, vp); const GLubyte *extensions = glGetString(GL_EXTENSIONS); JS::RootedObject jsobj(cx, JS_NewArrayObject(cx, 0)); JSB_PRECONDITION2(jsobj, cx, false, "Error creating JS Object"); // copy, to be able to add '\0' size_t len = strlen((char*)extensions); GLubyte* copy = new (std::nothrow) GLubyte[len+1]; strncpy((char*)copy, (const char*)extensions, len ); int start_extension=0; int element=0; for( size_t i=0; i<len+1; i++) { if( copy[i]==' ' || copy[i]==',' || i==len ) { copy[i] = 0; JS::RootedValue str(cx, charptr_to_jsval(cx, (const char*)©[start_extension])); JS_SetElement(cx, jsobj, element++, str ); start_extension = i+1; i++; } } args.rval().set(OBJECT_TO_JSVAL(jsobj)); CC_SAFE_DELETE_ARRAY(copy); return true; }
void ReplSource::save() { BSONObjBuilder b; verify( !hostName.empty() ); b.append("host", hostName); // todo: finish allowing multiple source configs. // this line doesn't work right when source is null, if that is allowed as it is now: //b.append("source", _sourceName); BSONObj pattern = b.done(); BSONObj o = jsobj(); LOG( 1 ) << "Saving repl source: " << o << endl; { OpDebug debug; Client::Context ctx("local.sources"); UpdateResult res = update( UpdateRequest(NamespaceString("local.sources"), debug) .query(pattern) .updates(o) .upsert()); verify( ! res.modifiers ); verify( res.numMatched == 1 ); } }
bool jsval_array_to_string(JSContext *cx, jsval v, std::string* ret) { JS::RootedObject jsobj(cx); bool ok = v.isObject() && JS_ValueToObject( cx, JS::RootedValue(cx, v), &jsobj ); JSB_PRECONDITION2( ok, cx, false, "Error converting value to object"); JSB_PRECONDITION2( jsobj && JS_IsArrayObject( cx, jsobj), cx, false, "Object must be an array"); uint32_t len; JS_GetArrayLength(cx, jsobj, &len); for( uint32_t i=0; i< len;i++ ) { JS::RootedValue valarg(cx); JS_GetElement(cx, jsobj, i, &valarg); std::string temp; ok = jsval_to_std_string(cx, valarg, &temp); JSB_PRECONDITION2(ok, cx, false, "Error processing arguments"); if(i != len -1) ret->append(temp + ","); else ret->append(temp); } return true; }
void __JSDownloaderDelegator::onSuccess(Texture2D *tex) { CCASSERT(tex, "__JSDownloaderDelegator::onSuccess must make sure tex not null!"); //Director::getInstance()->getScheduler()->performFunctionInCocosThread([this, tex] { JS::RootedObject global(_cx, ScriptingCore::getInstance()->getGlobalObject()); JSAutoCompartment ac(_cx, global); jsval valArr[2]; if (tex) { valArr[0] = BOOLEAN_TO_JSVAL(true); JS::RootedObject jsobj(_cx, js_get_or_create_jsobject<Texture2D>(_cx, tex)); valArr[1] = OBJECT_TO_JSVAL(jsobj); } else { valArr[0] = BOOLEAN_TO_JSVAL(false); valArr[1] = JSVAL_NULL; } JS::RootedValue callback(_cx, OBJECT_TO_JSVAL(_jsCallback)); if (!callback.isNull()) { JS::RootedValue retval(_cx); JS_CallFunctionValue(_cx, global, callback, JS::HandleValueArray::fromMarkedLocation(2, valArr), &retval); } release(); }//); }
bool js_cocos2dx_experimental_video_VideoPlayer_constructor(JSContext *cx, uint32_t argc, jsval *vp) { JS::CallArgs args = JS::CallArgsFromVp(argc, vp); bool ok = true; cocos2d::experimental::ui::VideoPlayer* cobj = new (std::nothrow) cocos2d::experimental::ui::VideoPlayer(); js_type_class_t *typeClass = js_get_type_from_native<cocos2d::experimental::ui::VideoPlayer>(cobj); // link the native object with the javascript object JS::RootedObject jsobj(cx, jsb_ref_create_jsobject(cx, cobj, typeClass, "cocos2d::experimental::ui::VideoPlayer")); args.rval().set(OBJECT_TO_JSVAL(jsobj)); if (JS_HasProperty(cx, jsobj, "_ctor", &ok) && ok) ScriptingCore::getInstance()->executeFunctionWithOwner(OBJECT_TO_JSVAL(jsobj), "_ctor", args); return true; }
JSObject* product_to_obj(JSContext* cx, const sdkbox::Product& p) { #if MOZJS_MAJOR_VERSION >= 31 JS::RootedObject jsobj(cx, JS_NewObject(cx, NULL, JS::NullPtr(), JS::NullPtr())); JS::RootedValue name(cx); JS::RootedValue id(cx); JS::RootedValue title(cx); JS::RootedValue description(cx); JS::RootedValue price(cx); name = std_string_to_jsval(cx, p.name); JS_SetProperty(cx, jsobj, "name", name); id = std_string_to_jsval(cx, p.id); JS_SetProperty(cx, jsobj, "id", id); title = std_string_to_jsval(cx, p.title); JS_SetProperty(cx, jsobj, "title", title); description = std_string_to_jsval(cx, p.description); JS_SetProperty(cx, jsobj, "description", description); price = std_string_to_jsval(cx, p.price); JS_SetProperty(cx, jsobj, "price", price); #else JSObject* jsobj = JS_NewObject(cx, NULL, NULL, NULL); jsval name; jsval id; jsval title; jsval description; jsval price; name = std_string_to_jsval(cx, p.name); JS_SetProperty(cx, jsobj, "name", &name); id = std_string_to_jsval(cx, p.id); JS_SetProperty(cx, jsobj, "id", &id); title = std_string_to_jsval(cx, p.title); JS_SetProperty(cx, jsobj, "title", &title); description = std_string_to_jsval(cx, p.description); JS_SetProperty(cx, jsobj, "description", &description); price = std_string_to_jsval(cx, p.price); JS_SetProperty(cx, jsobj, "price", &price); #endif return jsobj; }
NS_IMETHODIMP PlaceInfo::GetVisits(JSContext* aContext, JS::Value* _visits) { // If the visits data was not provided, return null rather // than an empty array to distinguish this case from the case // of a place without any visit. if (!mVisitsAvailable) { *_visits = JSVAL_NULL; return NS_OK; } // TODO bug 625913 when we use this in situations that have more than one // visit here, we will likely want to make this cache the value. JS::Rooted<JSObject*> visits(aContext, JS_NewArrayObject(aContext, 0, nullptr)); NS_ENSURE_TRUE(visits, NS_ERROR_OUT_OF_MEMORY); JS::Rooted<JSObject*> global(aContext, JS::CurrentGlobalOrNull(aContext)); NS_ENSURE_TRUE(global, NS_ERROR_UNEXPECTED); nsCOMPtr<nsIXPConnect> xpc = mozilla::services::GetXPConnect(); for (VisitsArray::size_type idx = 0; idx < mVisits.Length(); idx++) { nsCOMPtr<nsIXPConnectJSObjectHolder> wrapper; nsresult rv = xpc->WrapNative(aContext, global, mVisits[idx], NS_GET_IID(mozIVisitInfo), getter_AddRefs(wrapper)); NS_ENSURE_SUCCESS(rv, rv); JS::Rooted<JSObject*> jsobj(aContext, wrapper->GetJSObject()); NS_ENSURE_STATE(jsobj); JS::Rooted<JS::Value> wrappedVisit(aContext, OBJECT_TO_JSVAL(jsobj)); bool rc = JS_SetElement(aContext, visits, idx, &wrappedVisit); NS_ENSURE_TRUE(rc, NS_ERROR_UNEXPECTED); } *_visits = OBJECT_TO_JSVAL(visits); return NS_OK; }
bool js_cocos2dx_GLNode_constructor(JSContext *cx, uint32_t argc, jsval *vp) { if (argc == 0) { cocos2d::GLNode* cobj = new (std::nothrow) cocos2d::GLNode; js_type_class_t *typeClass = js_get_type_from_native<cocos2d::GLNode>(cobj); JS::RootedObject jsobj(cx, jsb_ref_create_jsobject(cx, cobj, typeClass, "cocos2d::GLNode")); JS::CallArgs args = JS::CallArgsFromVp(argc, vp); args.rval().set(OBJECT_TO_JSVAL(jsobj)); bool ok=false; if (JS_HasProperty(cx, jsobj, "_ctor", &ok) && ok) ScriptingCore::getInstance()->executeFunctionWithOwner(OBJECT_TO_JSVAL(jsobj), "_ctor", args); return true; } JS_ReportError(cx, "wrong number of arguments: %d, was expecting %d", argc, 0); return false; }
void js_PluginIAPJS_IAP_finalize(JSFreeOp *fop, JSObject *obj) { CCLOGINFO("jsbindings: finalizing JS object %p (IAP)", obj); js_proxy_t* nproxy; js_proxy_t* jsproxy; #if (COCOS2D_VERSION >= 0x00031000) JSContext *cx = ScriptingCore::getInstance()->getGlobalContext(); JS::RootedObject jsobj(cx, obj); jsproxy = jsb_get_js_proxy(jsobj); #else jsproxy = jsb_get_js_proxy(obj); #endif if (jsproxy) { nproxy = jsb_get_native_proxy(jsproxy->ptr); sdkbox::IAP *nobj = static_cast<sdkbox::IAP *>(nproxy->ptr); if (nobj) delete nobj; jsb_remove_proxy(nproxy, jsproxy); } }
void js_PluginGoogleAnalyticsJS_PluginGoogleAnalytics_finalize(JSFreeOp *fop, JSObject *obj) { CCLOGINFO("jsbindings: finalizing JS object %p (PluginGoogleAnalytics)", obj); js_proxy_t* nproxy; js_proxy_t* jsproxy; #if (SDKBOX_COCOS_JSB_VERSION >= 2) JSContext *cx = ScriptingCore::getInstance()->getGlobalContext(); JS::RootedObject jsobj(cx, obj); jsproxy = jsb_get_js_proxy(jsobj); #else jsproxy = jsb_get_js_proxy(obj); #endif if (jsproxy) { nproxy = jsb_get_native_proxy(jsproxy->ptr); sdkbox::PluginGoogleAnalytics *nobj = static_cast<sdkbox::PluginGoogleAnalytics *>(nproxy->ptr); if (nobj) delete nobj; jsb_remove_proxy(nproxy, jsproxy); } }
JSOBJECT* JS_NEW_OBJECT( JSContext* cx ) { JS::RootedObject jsobj(cx); jsobj.set( JS_NewObject(cx, NULL, JS::NullPtr(), JS::NullPtr()) ); return jsobj; }
bool js_cocos2dx_extension_EventListenerAssetsManagerEx_create(JSContext *cx, uint32_t argc, jsval *vp) { JS::CallArgs args = JS::CallArgsFromVp(argc, vp); bool ok = true; if (argc == 2) { cocos2d::extension::AssetsManagerEx* arg0 = nullptr; std::function<void (cocos2d::extension::EventAssetsManagerEx *)> arg1; do { if (args.get(0).isNull()) { arg0 = nullptr; break; } if (!args.get(0).isObject()) { ok = false; break; } js_proxy_t *jsProxy; JS::RootedObject tmpObj(cx, args.get(0).toObjectOrNull()); jsProxy = jsb_get_js_proxy(tmpObj); arg0 = (cocos2d::extension::AssetsManagerEx*)(jsProxy ? jsProxy->ptr : NULL); JSB_PRECONDITION2( arg0, cx, false, "Invalid Native Object"); } while (0); do { if(JS_TypeOfValue(cx, args.get(1)) == JSTYPE_FUNCTION) { JS::RootedObject jstarget(cx, args.thisv().toObjectOrNull()); std::shared_ptr<JSFunctionWrapper> func(new JSFunctionWrapper(cx, jstarget, args.get(1))); auto lambda = [=](cocos2d::extension::EventAssetsManagerEx* larg0) -> void { JSB_AUTOCOMPARTMENT_WITH_GLOBAL_OBJCET jsval largv[1]; do { if (larg0) { js_type_class_t* typeClass = js_get_type_from_native<cocos2d::extension::EventAssetsManagerEx>(larg0); largv[0] = OBJECT_TO_JSVAL(jsb_get_or_create_weak_jsobject(cx, larg0, typeClass, "cocos2d::extension::EventAssetsManagerEx")); } else { largv[0] = JSVAL_NULL; } } while (0); JS::RootedValue rval(cx); bool succeed = func->invoke(1, &largv[0], &rval); if (!succeed && JS_IsExceptionPending(cx)) { JS_ReportPendingException(cx); } removeJSObject(cx, larg0); }; arg1 = lambda; } else { arg1 = nullptr; } } while(0) ; JSB_PRECONDITION2(ok, cx, false, "js_cocos2dx_extension_EventListenerAssetsManagerEx_create : Error processing arguments"); cocos2d::extension::EventListenerAssetsManagerEx* ret = cocos2d::extension::EventListenerAssetsManagerEx::create(arg0, arg1); jsval jsret = JSVAL_NULL; if (ret) { JS::RootedObject jsobj(cx, js_get_or_create_jsobject<cocos2d::extension::EventListenerAssetsManagerEx>(cx, ret)); jsret = OBJECT_TO_JSVAL(jsobj); } else { jsret = JSVAL_NULL; } args.rval().set(jsret); return true; } JS_ReportError(cx, "js_cocos2dx_extension_EventListenerAssetsManagerEx_create : wrong number of arguments"); return false; }
static bool js_cocos2dx_CCTableView_create(JSContext *cx, uint32_t argc, jsval *vp) { JS::CallArgs args = JS::CallArgsFromVp(argc, vp); bool ok = true; if (argc == 3 || argc == 2) { JSB_TableViewDataSource* pNativeSource = new (std::nothrow) JSB_TableViewDataSource(); JS::RootedObject jsdata(cx, args.get(0).toObjectOrNull()); pNativeSource->setTableViewDataSource(jsdata); cocos2d::Size arg1; ok &= jsval_to_ccsize(cx, args.get(1), &arg1); cocos2d::extension::TableView* ret = NULL; ret = new (std::nothrow) TableView(); ret->autorelease(); ret->setDataSource(pNativeSource); jsval jsret; do { if (ret) { JS::RootedObject jsobj(cx, js_get_or_create_jsobject<cocos2d::extension::TableView>(cx, ret)); jsret = OBJECT_TO_JSVAL(jsobj); JS_SetProperty(cx, jsobj, "_dataSource", args.get(0)); } else { jsret = JSVAL_NULL; } } while (0); if (argc == 2) { ret->initWithViewSize(arg1); } else { cocos2d::Node* arg2; do { js_proxy_t *proxy; JS::RootedObject tmpObj(cx, args.get(2).toObjectOrNull()); proxy = jsb_get_js_proxy(tmpObj); arg2 = (cocos2d::Node*)(proxy ? proxy->ptr : NULL); JSB_PRECONDITION2( arg2, cx, false, "Invalid Native Object"); } while (0); JSB_PRECONDITION2(ok, cx, false, "Error processing arguments"); ret->initWithViewSize(arg1, arg2); } ret->reloadData(); __Dictionary* userDict = new (std::nothrow) __Dictionary(); userDict->setObject(pNativeSource, KEY_TABLEVIEW_DATA_SOURCE); ret->setUserObject(userDict); userDict->release(); pNativeSource->release(); args.rval().set(jsret); return true; } JS_ReportError(cx, "wrong number of arguments"); return false; }