| 1294 | |
| 1295 | |
| 1296 | JSBool jsval_to_ccarray(JSContext* cx, jsval v, CCArray** ret) { |
| 1297 | JSObject *jsobj; |
| 1298 | JSBool ok = v.isObject() && JS_ValueToObject( cx, v, &jsobj ); |
| 1299 | JSB_PRECONDITION3( ok, cx, JS_FALSE, "Error converting value to object"); |
| 1300 | JSB_PRECONDITION3( jsobj && JS_IsArrayObject( cx, jsobj), cx, JS_FALSE, "Object must be an array"); |
| 1301 | |
| 1302 | uint32_t len = 0; |
| 1303 | JS_GetArrayLength(cx, jsobj, &len); |
| 1304 | CCArray* arr = CCArray::createWithCapacity(len); |
| 1305 | for (uint32_t i=0; i < len; i++) { |
| 1306 | jsval value; |
| 1307 | if (JS_GetElement(cx, jsobj, i, &value)) { |
| 1308 | if (value.isObject()) |
| 1309 | { |
| 1310 | js_proxy_t *proxy; |
| 1311 | JSObject *tmp = JSVAL_TO_OBJECT(value); |
| 1312 | proxy = jsb_get_js_proxy(tmp); |
| 1313 | CAObject* cobj = (CAObject *)(proxy ? proxy->ptr : NULL); |
| 1314 | // Don't test it. |
| 1315 | //TEST_NATIVE_OBJECT(cx, cobj) |
| 1316 | if (cobj) { |
| 1317 | // It's a native js object. |
| 1318 | arr->addObject(cobj); |
| 1319 | } |
| 1320 | else if (!JS_IsArrayObject(cx, tmp)){ |
| 1321 | // It's a normal js object. |
| 1322 | CCDictionary* dictVal = NULL; |
| 1323 | JSBool ok = jsval_to_ccdictionary(cx, value, &dictVal); |
| 1324 | if (ok) { |
| 1325 | arr->addObject(dictVal); |
| 1326 | } |
| 1327 | } |
| 1328 | else { |
| 1329 | // It's a js array object. |
| 1330 | CCArray* arrVal = NULL; |
| 1331 | JSBool ok = jsval_to_ccarray(cx, value, &arrVal); |
| 1332 | if (ok) { |
| 1333 | arr->addObject(arrVal); |
| 1334 | } |
| 1335 | } |
| 1336 | } |
| 1337 | else if (JSVAL_IS_STRING(value)) { |
| 1338 | JSStringWrapper valueWapper(JSVAL_TO_STRING(value), cx); |
| 1339 | arr->addObject(CCString::create(valueWapper.get())); |
| 1340 | // CCLOG("iterate array: value = %s", valueWapper.get().c_str()); |
| 1341 | } |
| 1342 | else if (JSVAL_IS_NUMBER(value)) { |
| 1343 | double number = 0.0; |
| 1344 | JSBool ok = JS_ValueToNumber(cx, value, &number); |
| 1345 | if (ok) { |
| 1346 | arr->addObject(CCString::createWithFormat("%f",number)); |
| 1347 | // CCLOG("iterate array: value = %lf", number); |
| 1348 | } |
| 1349 | } |
| 1350 | else if (JSVAL_IS_BOOLEAN(value)) { |
| 1351 | JSBool boolVal = JS_FALSE; |
| 1352 | JSBool ok = JS_ValueToBoolean(cx, value, &boolVal); |
| 1353 | if (ok) { |