// XXX: sizeof(long) == 8 in 64 bits on OS X... apparently on Windows it is 32 bits (???) JSBool jsval_to_long( JSContext *cx, jsval vp, long *r ) { #ifdef __LP64__ // compatibility check assert( sizeof(long)==8); JSObject *tmp_arg; if( ! JS_ValueToObject( cx, vp, &tmp_arg ) ) return JS_FALSE; JSB_PRECONDITION( js_IsTypedArray( tmp_arg ), "jsb: Not a TypedArray object"); JSB_PRECONDITION( JS_GetTypedArrayByteLength( tmp_arg ) == sizeof(long), "jsb: Invalid Typed Array lenght"); int32_t* arg_array = (int32_t*)JS_GetTypedArrayData( tmp_arg ); long ret = arg_array[0]; ret = ret << 32; ret |= arg_array[1]; #else // compatibility check assert( sizeof(int)==4); long ret = JSVAL_TO_INT(vp); #endif *r = ret; return JS_TRUE; }
JSBool jsval_to_opaque( JSContext *cx, jsval vp, void **r) { #ifdef __LP64__ JSObject *tmp_arg; if( ! JS_ValueToObject( cx, vp, &tmp_arg ) ) return JS_FALSE; JSB_PRECONDITION( js_IsTypedArray( tmp_arg ), "jsb: Not a TypedArray object"); JSB_PRECONDITION( JS_GetTypedArrayByteLength( tmp_arg ) == sizeof(void*), "jsb: Invalid Typed Array lenght"); int32_t* arg_array = (int32_t*)JS_GetTypedArrayData( tmp_arg ); uint64 ret = arg_array[0]; ret = ret << 32; ret |= arg_array[1]; #else assert( sizeof(int)==4); int32_t ret; if( ! jsval_to_int32(cx, vp, &ret ) ) return JS_FALSE; #endif *r = (void*)ret; return JS_TRUE; }
/* [implicit_jscontext] dpoIData allocateData2 (in dpoIData templ, [optional] in uint32_t length); */ NS_IMETHODIMP dpoCContext::AllocateData2(dpoIData *templ, uint32_t length, JSContext *cx, dpoIData **_retval) { // this cast is only safe as long as no other implementations of the dpoIData interface exist dpoCData *cData = (dpoCData *) templ; cl_int err_code; nsresult result; size_t bytePerElements; nsCOMPtr<dpoCData> data; #ifdef PREALLOCATE_IN_JS_HEAP jsval jsBuffer; #endif /* PREALLOCATE_IN_JS_HEAP */ data = new dpoCData( this); if (data == NULL) { DEBUG_LOG_STATUS("AllocateData2", "Cannot create new dpoCData object"); return NS_ERROR_OUT_OF_MEMORY; } if (length == 0) { DEBUG_LOG_STATUS("AllocateData2", "length not provided, assuming template's size"); length = cData->GetLength(); } bytePerElements = cData->GetSize() / cData->GetLength(); DEBUG_LOG_STATUS("AllocateData2", "length " << length << " bytePerElements " << bytePerElements); #ifdef PREALLOCATE_IN_JS_HEAP JSObject *jsArray; if (NS_FAILED(CreateAlignedTA(cData->GetType(), length, &jsArray, cx))) { return NS_ERROR_NOT_AVAILABLE; } if (!jsArray) { DEBUG_LOG_STATUS("AllocateData2", "Cannot create typed array"); return NS_ERROR_OUT_OF_MEMORY; } cl_mem memObj = CreateBuffer(CL_MEM_USE_HOST_PTR | CL_MEM_READ_WRITE, JS_GetTypedArrayByteLength(jsArray, cx), JS_GetArrayBufferViewData(jsArray, cx), &err_code); #else /* PREALLOCATE_IN_JS_HEAP */ JSObject *jsArray = NULL; cl_mem memObj = CreateBuffer(cx, CL_MEM_READ_WRITE, length * bytePerElements, NULL, &err_code); #endif /* PREALLOCATE_IN_JS_HEAP */ if (err_code != CL_SUCCESS) { DEBUG_LOG_ERROR("AllocateData2", err_code); return NS_ERROR_NOT_AVAILABLE; } result = data->InitCData(cx, cmdQueue, memObj, cData->GetType(), length, length * bytePerElements, jsArray); if (NS_SUCCEEDED(result)) { data.forget((dpoCData **) _retval); } return result; }
JSBool jsval_to_cpBB( JSContext *cx, jsval vp, cpBB *ret ) { JSObject *tmp_arg; if( ! JS_ValueToObject( cx, vp, &tmp_arg ) ) return JS_FALSE; JSB_PRECONDITION( JS_IsTypedArrayObject( tmp_arg, cx ), "Not a TypedArray object"); JSB_PRECONDITION( JS_GetTypedArrayByteLength( tmp_arg, cx ) == sizeof(cpFloat)*4, "Invalid length"); *ret = *(cpBB*)JS_GetArrayBufferViewData( tmp_arg, cx); return JS_TRUE; }
JSBool jsval_to_longlong( JSContext *cx, jsval vp, long long *r ) { JSObject *tmp_arg; JSBool ok = JS_ValueToObject( cx, vp, &tmp_arg ); JSB_PRECONDITION2( ok, cx, JS_FALSE, "Error converting value to object"); JSB_PRECONDITION2( tmp_arg && JS_IsTypedArrayObject( tmp_arg ), cx, JS_FALSE, "Not a TypedArray object"); JSB_PRECONDITION2( JS_GetTypedArrayByteLength( tmp_arg ) == sizeof(long long), cx, JS_FALSE, "Invalid Typed Array length"); uint32_t* arg_array = (uint32_t*)JS_GetArrayBufferViewData( tmp_arg ); long long ret = arg_array[0]; ret = ret << 32; ret |= arg_array[1]; *r = ret; return JS_TRUE; }
JSBool jsval_to_CGPoint( JSContext *cx, jsval vp, CGPoint *ret ) { #ifdef JSB_COMPATIBLE_WITH_COCOS2D_HTML5_BASIC_TYPES JSObject *jsobj; if( ! JS_ValueToObject( cx, vp, &jsobj ) ) return JS_FALSE; JSB_PRECONDITION( jsobj, "Not a valid JS object"); jsval valx, valy; JSBool ok = JS_TRUE; ok &= JS_GetProperty(cx, jsobj, "x", &valx); ok &= JS_GetProperty(cx, jsobj, "y", &valy); if( ! ok ) return JS_FALSE; double x, y; ok &= JS_ValueToNumber(cx, valx, &x); ok &= JS_ValueToNumber(cx, valy, &y); if( ! ok ) return JS_FALSE; ret->x = x; ret->y = y; return JS_TRUE; #else // #! JSB_COMPATIBLE_WITH_COCOS2D_HTML5_BASIC_TYPES JSObject *tmp_arg; if( ! JS_ValueToObject( cx, vp, &tmp_arg ) ) return JS_FALSE; JSB_PRECONDITION( tmp_arg && JS_IsTypedArrayObject( tmp_arg, cx ), "Not a TypedArray object"); JSB_PRECONDITION( JS_GetTypedArrayByteLength( tmp_arg, cx ) == sizeof(CGPoint), "Invalid length"); *ret = *(CGPoint*)JS_GetArrayBufferViewData( tmp_arg, cx ); return JS_TRUE; #endif // #! JSB_COMPATIBLE_WITH_COCOS2D_HTML5_BASIC_TYPES }
JSBool jsval_to_longlong( JSContext *cx, jsval vp, long long *r ) { JSObject *tmp_arg; if( ! JS_ValueToObject( cx, vp, &tmp_arg ) ) return JS_FALSE; JSB_PRECONDITION( tmp_arg && JS_IsTypedArrayObject( tmp_arg, cx ), "Not a TypedArray object"); JSB_PRECONDITION( JS_GetTypedArrayByteLength( tmp_arg, cx ) == sizeof(long long), "Invalid Typed Array lenght"); int32_t* arg_array = (int32_t*)JS_GetArrayBufferViewData( tmp_arg, cx ); long long ret = arg_array[0]; ret = ret << 32; ret |= arg_array[1]; *r = ret; return JS_TRUE; }
bool jsval_to_long_long(JSContext *cx, jsval vp, long long* r) { JS::RootedObject tmp_arg(cx); bool ok = JS_ValueToObject( cx, JS::RootedValue(cx, vp), &tmp_arg ); if (!ok) { LOGD("jsval_to_long_long: Error converting value to object"); return false; } JSB_PRECONDITION2( tmp_arg && JS_IsTypedArrayObject( tmp_arg ), cx, false, "Not a TypedArray object"); JSB_PRECONDITION2( JS_GetTypedArrayByteLength( tmp_arg ) == sizeof(long long), cx, false, "Invalid Typed Array length"); uint32_t* arg_array = (uint32_t*)JS_GetArrayBufferViewData( tmp_arg ); long long ret = arg_array[0]; ret = ret << 32; ret |= arg_array[1]; *r = ret; return true; }
/* [implicit_jscontext] dpoIData allocateData (in jsval templ, [optional] in uint32_t length); */ NS_IMETHODIMP dpoCContext::AllocateData(const jsval & templ, uint32_t length, JSContext *cx, dpoIData **_retval) { cl_int err_code; nsresult result; JSObject *tArray; size_t bytePerElements; nsCOMPtr<dpoCData> data; if (!JS_EnterLocalRootScope(cx)) { DEBUG_LOG_STATUS("AllocateData", "Cannot root local scope"); return NS_ERROR_NOT_AVAILABLE; } result = ExtractArray( templ, &tArray, cx); if (NS_FAILED(result)) { return result; } data = new dpoCData( this); if (data == NULL) { DEBUG_LOG_STATUS("AllocateData", "Cannot create new dpoCData object"); return NS_ERROR_OUT_OF_MEMORY; } if (length == 0) { DEBUG_LOG_STATUS("AllocateData", "size not provided, assuming template's size"); length = JS_GetTypedArrayLength(tArray, cx); } bytePerElements = JS_GetTypedArrayByteLength(tArray, cx) / JS_GetTypedArrayLength(tArray, cx); DEBUG_LOG_STATUS("AllocateData", "length " << length << " bytePerElements " << bytePerElements); #ifdef PREALLOCATE_IN_JS_HEAP JSObject *jsArray; if (NS_FAILED(CreateAlignedTA(JS_GetTypedArrayType(tArray, cx), length, &jsArray, cx))) { return NS_ERROR_NOT_AVAILABLE; } if (!jsArray) { DEBUG_LOG_STATUS("AllocateData", "Cannot create typed array"); return NS_ERROR_OUT_OF_MEMORY; } cl_mem memObj = CreateBuffer( CL_MEM_USE_HOST_PTR | CL_MEM_READ_WRITE, JS_GetTypedArrayByteLength(jsArray, cx), GetPointerFromTA(jsArray, cx), &err_code); #else /* PREALLOCATE_IN_JS_HEAP */ JSObject *jsArray = nullptr; cl_mem memObj = CreateBuffer(CL_MEM_READ_WRITE, length * bytePerElements, NULL, &err_code); #endif /* PREALLOCATE_IN_JS_HEAP */ if (err_code != CL_SUCCESS) { DEBUG_LOG_ERROR("AllocateData", err_code); return NS_ERROR_NOT_AVAILABLE; } result = data->InitCData(cx, cmdQueue, memObj, JS_GetTypedArrayType(tArray, cx), length, length * bytePerElements, jsArray); if (NS_SUCCEEDED(result)) { data.forget((dpoCData **) _retval); } JS_LeaveLocalRootScope(cx); return result; }
/* [implicit_jscontext] dpoIData mapData (in jsval source); */ NS_IMETHODIMP dpoCContext::MapData(const jsval & source, JSContext *cx, dpoIData **_retval) { cl_int err_code; nsresult result; JSObject *tArray; nsCOMPtr<dpoCData> data; result = ExtractArray( source, &tArray, cx); if (NS_SUCCEEDED(result)) { // we have a typed array data = new dpoCData( this); if (data == NULL) { DEBUG_LOG_STATUS("MapData", "Cannot create new dpoCData object"); return NS_ERROR_OUT_OF_MEMORY; } // USE_HOST_PTR is save as the CData object will keep the associated typed array alive as long as the // memory buffer lives cl_mem_flags flags = CL_MEM_READ_ONLY; void *tArrayBuffer = NULL; size_t arrayByteLength = JS_GetTypedArrayByteLength(tArray, cx); if(arrayByteLength == 0) { arrayByteLength = 1; } else { tArrayBuffer = GetPointerFromTA(tArray, cx); flags |= CL_MEM_USE_HOST_PTR; } cl_mem memObj = CreateBuffer(flags, arrayByteLength, tArrayBuffer , &err_code); if (err_code != CL_SUCCESS) { DEBUG_LOG_ERROR("MapData", err_code); return NS_ERROR_NOT_AVAILABLE; } result = data->InitCData(cx, cmdQueue, memObj, JS_GetTypedArrayType(tArray, cx), JS_GetTypedArrayLength(tArray, cx), JS_GetTypedArrayByteLength(tArray, cx), tArray); #ifdef SUPPORT_MAPPING_ARRAYS } else if (JSVAL_IS_OBJECT(source)) { // maybe it is a regular array. // // WARNING: We map a pointer to the actual array here. All this works on CPU only // and only of the OpenCL compiler knows what to do! For the current Intel OpenCL SDK // this works but your milage may vary. const jsval *elems = UnsafeDenseArrayElements(cx, JSVAL_TO_OBJECT(source)); if (elems != NULL) { data = new dpoCData( this); if (data == NULL) { DEBUG_LOG_STATUS("MapData", "Cannot create new dpoCData object"); return NS_ERROR_OUT_OF_MEMORY; } cl_mem memObj = CreateBuffer(CL_MEM_COPY_HOST_PTR | CL_MEM_READ_ONLY, sizeof(double *), &elems, &err_code); if (err_code != CL_SUCCESS) { DEBUG_LOG_ERROR("MapData", err_code); return NS_ERROR_NOT_AVAILABLE; } result = data->InitCData(cx, cmdQueue, memObj, 0 /* bogus type */, 1, sizeof(double *), JSVAL_TO_OBJECT(source)); #ifndef DEBUG_OFF } else { DEBUG_LOG_STATUS("MapData", "No elements returned!"); #endif /* DEBUG_OFF */ } #endif /* SUPPORT_MAPPING_ARRAYS */ } if (NS_SUCCEEDED(result)) { data.forget((dpoCData **)_retval); } return result; }
NS_IMETHODIMP TCPSocketParent::SendCallback(const nsAString& aType, const JS::Value& aDataVal, const nsAString& aReadyState, uint32_t aBuffered, JSContext* aCx) { if (!mIPCOpen) { NS_WARNING("Dropping callback due to no IPC connection"); return NS_OK; } CallbackData data; if (aDataVal.isString()) { JSString* jsstr = aDataVal.toString(); nsDependentJSString str; if (!str.init(aCx, jsstr)) { FireInteralError(this, __LINE__); return NS_ERROR_OUT_OF_MEMORY; } data = str; } else if (aDataVal.isUndefined() || aDataVal.isNull()) { data = mozilla::void_t(); } else if (aDataVal.isObject()) { JSObject* obj = &aDataVal.toObject(); if (JS_IsTypedArrayObject(obj)) { NS_ENSURE_TRUE(JS_IsUint8Array(obj), NS_ERROR_FAILURE); uint32_t nbytes = JS_GetTypedArrayByteLength(obj); uint8_t* buffer = JS_GetUint8ArrayData(obj); if (!buffer) { FireInteralError(this, __LINE__); return NS_ERROR_OUT_OF_MEMORY; } FallibleTArray<uint8_t> fallibleArr; if (!fallibleArr.InsertElementsAt(0, buffer, nbytes)) { FireInteralError(this, __LINE__); return NS_ERROR_OUT_OF_MEMORY; } InfallibleTArray<uint8_t> arr; arr.SwapElements(fallibleArr); data = SendableData(arr); } else { nsDependentJSString message, filename; uint32_t lineNumber = 0; uint32_t columnNumber = 0; jsval val; if (!JS_GetProperty(aCx, obj, "message", &val)) { NS_ERROR("No message property on supposed error object"); } else if (JSVAL_IS_STRING(val)) { if (!message.init(aCx, JSVAL_TO_STRING(val))) { NS_WARNING("couldn't initialize string"); } } if (!JS_GetProperty(aCx, obj, "fileName", &val)) { NS_ERROR("No fileName property on supposed error object"); } else if (JSVAL_IS_STRING(val)) { if (!filename.init(aCx, JSVAL_TO_STRING(val))) { NS_WARNING("couldn't initialize string"); } } if (!JS_GetProperty(aCx, obj, "lineNumber", &val)) { NS_ERROR("No lineNumber property on supposed error object"); } else if (JSVAL_IS_INT(val)) { lineNumber = JSVAL_TO_INT(val); } if (!JS_GetProperty(aCx, obj, "columnNumber", &val)) { NS_ERROR("No columnNumber property on supposed error object"); } else if (JSVAL_IS_INT(val)) { columnNumber = JSVAL_TO_INT(val); } data = JSError(message, filename, lineNumber, columnNumber); } } else { NS_ERROR("Unexpected JS value encountered"); FireInteralError(this, __LINE__); return NS_ERROR_FAILURE; } mozilla::unused << PTCPSocketParent::SendCallback(nsString(aType), data, nsString(aReadyState), aBuffered); return NS_OK; }