static jsval to_javascript_object(JSContext *context, PyObject *value) { if (PyString_Check(value)) { JSString *obj = JS_NewStringCopyN(context, PyString_AsString(value), PyString_Size(value)); return STRING_TO_JSVAL(obj); } else if (PyUnicode_Check(value)) { PyObject *encoded = PyUnicode_AsUTF8String(value); JSString *obj = JS_NewStringCopyN(context, PyString_AsString(encoded), PyString_Size(encoded)); Py_DECREF(encoded); return STRING_TO_JSVAL(obj); } else if (PyFloat_Check(value)) { return DOUBLE_TO_JSVAL(PyFloat_AsDouble(value)); } else if (PyInt_Check(value)) { return INT_TO_JSVAL(PyInt_AsLong(value)); } else if (PyLong_Check(value)) { return INT_TO_JSVAL(PyLong_AsLong(value)); } else if (PyList_Check(value)) { JSObject *obj = JS_NewArrayObject(context, 0, NULL); int i; for (i = 0; i < PyList_Size(value); i++) { jsval item = to_javascript_object(context, PyList_GetItem(value, i)); JS_SetElement(context, obj, i, &item); } return OBJECT_TO_JSVAL(obj); } else if (PyTuple_Check(value)) { JSObject *obj = JS_NewArrayObject(context, 0, NULL); int i; for (i = 0; i < PyTuple_Size(value); i++) { jsval item = to_javascript_object(context, PyTuple_GetItem(value, i)); JS_SetElement(context, obj, i, &item); } return OBJECT_TO_JSVAL(obj); } else if (PyDict_Check(value)) { JSObject *obj = JS_NewObject(context, NULL, NULL, NULL); populate_javascript_object(context, obj, value); return OBJECT_TO_JSVAL(obj); } else if (PyDateTime_Check(value)) { JSObject *obj = JS_NewDateObject(context, PyDateTime_GET_YEAR(value), PyDateTime_GET_MONTH(value) - 1, PyDateTime_GET_DAY(value), PyDateTime_DATE_GET_HOUR(value), PyDateTime_DATE_GET_MINUTE(value), PyDateTime_DATE_GET_SECOND(value)); return OBJECT_TO_JSVAL(obj); } else { return JSVAL_NULL; } }
NS_IMETHODIMP calDateTime::GetJsDate(JSContext* aCx, JS::Value* aResult) { double msec = double(mNativeTime / 1000); ensureTimezone(); JSObject* obj; bool b; if (NS_SUCCEEDED(mTimezone->GetIsFloating(&b)) && b) { obj = JS_NewDateObject(aCx, mYear, mMonth, mDay, mHour, mMinute, mSecond); } else { obj = JS_NewDateObjectMsec(aCx, msec); } *aResult = JS::ObjectOrNullValue(obj); return NS_OK; }