jsval long_long_to_jsval(JSContext* cx, long long v) { JSObject *tmp = JS_NewUint32Array(cx, 2); uint32_t *data = (uint32_t *)JS_GetArrayBufferViewData(tmp); data[0] = ((uint32_t *)(&v))[0]; data[1] = ((uint32_t *)(&v))[1]; return OBJECT_TO_JSVAL(tmp); }
jsval CGPoint_to_jsval( JSContext *cx, CGPoint p) { #ifdef JSB_COMPATIBLE_WITH_COCOS2D_HTML5_BASIC_TYPES JSObject *object = JS_NewObject(cx, NULL, NULL, NULL ); if (!object) return JSVAL_VOID; if (!JS_DefineProperty(cx, object, "x", DOUBLE_TO_JSVAL(p.x), NULL, NULL, JSPROP_ENUMERATE | JSPROP_PERMANENT) || !JS_DefineProperty(cx, object, "y", DOUBLE_TO_JSVAL(p.y), NULL, NULL, JSPROP_ENUMERATE | JSPROP_PERMANENT) ) return JSVAL_VOID; return OBJECT_TO_JSVAL(object); #else // JSB_COMPATIBLE_WITH_COCOS2D_HTML5_BASIC_TYPES #ifdef __LP64__ JSObject *typedArray = JS_NewFloat64Array( cx, 2 ); #else JSObject *typedArray = JS_NewFloat32Array( cx, 2 ); #endif CGPoint *buffer = (CGPoint*)JS_GetArrayBufferViewData(typedArray, cx ); *buffer = p; return OBJECT_TO_JSVAL(typedArray); #endif // ! JSB_COMPATIBLE_WITH_COCOS2D_HTML5_BASIC_TYPES }
jsval longlong_to_jsval( JSContext *cx, long long number ) { //NSCAssert( sizeof(long long)==8, @"Error!"); JSObject *typedArray = JS_NewUint32Array( cx, 2 ); int32_t *buffer = (int32_t*)JS_GetArrayBufferViewData(typedArray, cx); buffer[0] = number >> 32; buffer[1] = number & 0xffffffff; return OBJECT_TO_JSVAL(typedArray); }
/* [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 js_cocos2dx_extension_WebSocket_send(JSContext *cx, uint32_t argc, jsval *vp) { jsval *argv = JS_ARGV(cx, vp); JSObject *obj = JS_THIS_OBJECT(cx, vp); js_proxy_t *proxy = jsb_get_js_proxy(obj); WebSocket* cobj = (WebSocket *)(proxy ? proxy->ptr : NULL); JSB_PRECONDITION2( cobj, cx, JS_FALSE, "Invalid Native Object"); if(argc == 1){ do { if (JSVAL_IS_STRING(argv[0])) { std::string data; jsval_to_std_string(cx, argv[0], &data); cobj->send(data); break; } if (argv[0].isObject()) { uint8_t *bufdata = NULL; uint32_t len = 0; JSObject* jsobj = JSVAL_TO_OBJECT(argv[0]); if (JS_IsArrayBufferObject(jsobj)) { bufdata = JS_GetArrayBufferData(jsobj); len = JS_GetArrayBufferByteLength(jsobj); } else if (JS_IsArrayBufferViewObject(jsobj)) { bufdata = (uint8_t*)JS_GetArrayBufferViewData(jsobj); len = JS_GetArrayBufferViewByteLength(jsobj); } if (bufdata && len > 0) { cobj->send(bufdata, len); break; } } JS_ReportError(cx, "data type to be sent is unsupported."); } while (0); JS_SET_RVAL(cx, vp, JSVAL_VOID); return JS_TRUE; } JS_ReportError(cx, "wrong number of arguments: %d, was expecting %d", argc, 0); return JS_TRUE; }
jsval cpBB_to_jsval(JSContext *cx, cpBB bb ) { #ifdef __LP64__ JSObject *typedArray = JS_NewFloat64Array( cx, 4 ); #else JSObject *typedArray = JS_NewFloat32Array( cx, 4 ); #endif cpBB *buffer = (cpBB*)JS_GetArrayBufferViewData(typedArray, cx); *buffer = bb; return OBJECT_TO_JSVAL(typedArray); }
JSBool JSB_get_arraybufferview_dataptr( JSContext *cx, jsval vp, GLsizei *count, GLvoid **data ) { JSObject *jsobj; JSBool ok = JS_ValueToObject( cx, vp, &jsobj ); JSB_PRECONDITION2( ok && jsobj, cx, JS_FALSE, "Error converting value to object"); JSB_PRECONDITION2( JS_IsArrayBufferViewObject(jsobj), cx, JS_FALSE, "Not an ArrayBufferView object"); *data = JS_GetArrayBufferViewData(jsobj); *count = JS_GetArrayBufferViewByteLength(jsobj); return JS_TRUE; }
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; }
// convert buffer to json bool js_FlatUtil_flat2js(JSContext *cx, uint32_t argc, jsval *vp) { JS::CallArgs args = JS::CallArgsFromVp(argc, vp); bool ok = true; if (4 == argc) { std::string arg0; ok &= jsval_to_std_string(cx, args.get(0), &arg0); JSB_PRECONDITION2(ok, cx, false, "js_FlatUtil_flat2js : Error processing arguments"); cocos2d::Data arg1; uint8_t *bufdata = NULL; uint32_t len = 0; JSObject* jsobj = args.get(1).toObjectOrNull(); if (JS_IsArrayBufferObject(jsobj)) { bufdata = JS_GetArrayBufferData(jsobj); len = JS_GetArrayBufferByteLength(jsobj); } else if (JS_IsArrayBufferViewObject(jsobj)) { bufdata = (uint8_t*)JS_GetArrayBufferViewData(jsobj); len = JS_GetArrayBufferViewByteLength(jsobj); } JSB_PRECONDITION2(bufdata && len > 0, cx, false, "js_FlatUtil_flat2js : Error processing arguments"); arg1.copy(bufdata, len); std::string arg2; ok &= jsval_to_std_string(cx, args.get(2), &arg2); JSB_PRECONDITION2(ok, cx, false, "js_FlatUtil_flat2js : Error processing arguments"); bool arg3; arg3 = JS::ToBoolean(args.get(3)); auto ret = FlatUtil::flat2js(arg0, arg1, arg2, arg3); jsval jsret = JSVAL_NULL; jsret = std_string_to_jsval(cx, ret); args.rval().set(jsret); return true; } JS_ReportError(cx, "js_FlatUtil_flat2js : wrong number of arguments"); return false; }
jsval longlong_to_jsval( JSContext *cx, long long number ) { #if JSB_REPRESENT_LONGLONG_AS_STR char chr[128]; snprintf(chr, sizeof(chr)-1, "%lld", number); JSString *ret_obj = JS_NewStringCopyZ(cx, chr); return STRING_TO_JSVAL(ret_obj); #else CCAssert( sizeof(long long)==8, "Error!"); JSObject *typedArray = JS_NewUint32Array( cx, 2 ); uint32_t *buffer = (uint32_t*)JS_GetArrayBufferViewData(typedArray, cx); buffer[0] = number >> 32; buffer[1] = number & 0xffffffff; return OBJECT_TO_JSVAL(typedArray); #endif }
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; }
bool TestViewType(JSContext *cx) { JS::Rooted<JSObject*> obj(cx, CreateViewType(cx)); CHECK(obj); CHECK(JS_IsArrayBufferViewObject(obj)); CHECK(JS_GetArrayBufferViewType(obj) == ExpectedType); CHECK(JS_GetArrayBufferViewByteLength(obj) == ExpectedByteLength); { JS::AutoCheckCannotGC nogc; T *data1 = static_cast<T*>(JS_GetArrayBufferViewData(obj, nogc)); T *data2; uint32_t len; CHECK(obj == GetObjectAs(obj, &len, &data2)); CHECK(data1 == data2); CHECK(len == ExpectedLength); } return true; }
inline uint8_t *dpoCContext::GetPointerFromTA(JSObject *ta, JSContext *cx) { return (uint8_t *) JS_GetArrayBufferViewData(ta, cx); }
// any getUniform(WebGLProgram? program, WebGLUniformLocation? location); bool JSB_glGetUniformfv(JSContext *cx, uint32_t argc, jsval *vp) { JSB_PRECONDITION2( argc == 2, cx, false, "JSB_glGetUniformfv: Invalid number of arguments" ); JS::CallArgs args = JS::CallArgsFromVp(argc, vp); bool ok = true; uint32_t arg0, arg1; ok &= jsval_to_uint( cx, args.get(0), &arg0 ); ok &= jsval_to_uint( cx, args.get(1), &arg1 ); JSB_PRECONDITION2(ok, cx, false, "JSB_glGetUniformfv: Error processing arguments"); GLint activeUniforms; glGetProgramiv(arg0, GL_ACTIVE_UNIFORMS, &activeUniforms); GLsizei length; glGetProgramiv(arg0, GL_ACTIVE_UNIFORM_MAX_LENGTH, &length); GLchar* namebuffer = new (std::nothrow) GLchar[length+1]; GLint size = -1; GLenum type = -1; bool isLocationFound = false; for(int i = 0; i < activeUniforms; ++i) { glGetActiveUniform(arg0, i, length, NULL, &size, &type, namebuffer); if(arg1 == glGetUniformLocation(arg0, namebuffer)) { isLocationFound = true; break; } } if(!isLocationFound) { size = -1; type = -1; } CC_SAFE_DELETE_ARRAY(namebuffer); int usize = 0; int utype = 0; switch(type) { // float case GL_FLOAT: usize = 1; utype = GL_FLOAT; break; case GL_FLOAT_MAT2: usize = 2 * 2; utype = GL_FLOAT; break; case GL_FLOAT_MAT3: usize = 3 * 3; utype = GL_FLOAT; break; case GL_FLOAT_MAT4: usize = 4 * 4; utype = GL_FLOAT; break; case GL_FLOAT_VEC2: usize = 2; utype = GL_FLOAT; break; case GL_FLOAT_VEC3: usize = 3; utype = GL_FLOAT; break; case GL_FLOAT_VEC4: usize = 4; utype = GL_FLOAT; break; // int case GL_INT: usize = 1; utype = GL_INT; break; case GL_INT_VEC2: usize = 1; utype = GL_INT; break; case GL_INT_VEC3: usize = 1; utype = GL_INT; break; case GL_INT_VEC4: usize = 1; utype = GL_INT; break; default: JSB_PRECONDITION2(false, cx, false, "JSB_glGetUniformfv: Uniform Type not supported"); } JSObject *typedArray = NULL; if( utype == GL_FLOAT) { // FIXME: glew on windows will cause array overflow after invoking glGetUniformfv. // It seems that glGetUniformfv re-assign the memeroy with a wrong size which is 4x than we pass in. // For temporary solution, we allocate 4x array. GLfloat* param = new (std::nothrow) GLfloat[usize*4]; glGetUniformfv(arg0, arg1, param); typedArray = JS_NewFloat32Array(cx, usize); float *buffer = (float*)JS_GetArrayBufferViewData(typedArray); memcpy( buffer, param, sizeof(float) * usize); CC_SAFE_DELETE_ARRAY(param); } else if( utype == GL_INT ) { // FIXME: glew on windows will cause array overflow after invoking glGetUniformfv. // It seems that glGetUniformfv re-assign the memeroy with a wrong size which is 4x than we pass in. // For temporary solution, we allocate 4x array. GLint* param = new (std::nothrow) GLint[usize*4]; glGetUniformiv(arg0, arg1, param); typedArray = JS_NewInt32Array(cx, usize); GLint *buffer = (GLint*)JS_GetArrayBufferViewData(typedArray); memcpy( buffer, param, sizeof(GLint) * usize); CC_SAFE_DELETE_ARRAY(param); } args.rval().set(OBJECT_TO_JSVAL(typedArray)); return true; }
// any getUniform(WebGLProgram? program, WebGLUniformLocation? location); JSBool JSB_glGetUniformfv(JSContext *cx, uint32_t argc, jsval *vp) { JSB_PRECONDITION2( argc == 2, cx, JS_FALSE, "JSB_glGetUniformfv: Invalid number of arguments" ); jsval *argvp = JS_ARGV(cx,vp); JSBool ok = JS_TRUE; uint32_t arg0, arg1; ok &= jsval_to_uint( cx, *argvp++, &arg0 ); ok &= jsval_to_uint( cx, *argvp++, &arg1 ); JSB_PRECONDITION2(ok, cx, JS_FALSE, "JSB_glGetUniformfv: Error processing arguments"); GLsizei length; glGetProgramiv(arg0, GL_ACTIVE_UNIFORM_MAX_LENGTH, &length); GLchar* namebuffer = new GLchar[length+1]; GLint size = -1; GLenum type = -1; glGetActiveUniform(arg0, arg1, length, NULL, &size, &type, namebuffer); CC_SAFE_DELETE_ARRAY(namebuffer); int usize = 0; int utype = 0; switch(type) { // float case GL_FLOAT: usize = 1; utype = GL_FLOAT; break; case GL_FLOAT_MAT2: usize = 2 * 2; utype = GL_FLOAT; break; case GL_FLOAT_MAT3: usize = 3 * 3; utype = GL_FLOAT; break; case GL_FLOAT_MAT4: usize = 4 * 4; utype = GL_FLOAT; break; case GL_FLOAT_VEC2: usize = 2; utype = GL_FLOAT; break; case GL_FLOAT_VEC3: usize = 3; utype = GL_FLOAT; break; case GL_FLOAT_VEC4: usize = 4; utype = GL_FLOAT; break; // int case GL_INT: usize = 1; utype = GL_INT; break; case GL_INT_VEC2: usize = 1; utype = GL_INT; break; case GL_INT_VEC3: usize = 1; utype = GL_INT; break; case GL_INT_VEC4: usize = 1; utype = GL_INT; break; default: JSB_PRECONDITION2(false, cx, JS_FALSE, "JSB_glGetUniformfv: Uniform Type not supported"); } JSObject *typedArray = NULL; if( utype == GL_FLOAT) { // FIXME: glew on windows will cause array overflow after invoking glGetUniformfv. // It seems that glGetUniformfv re-assign the memeroy with a wrong size which is 4x than we pass in. // For temporary solution, we allocate 4x array. GLfloat* param = new GLfloat[usize*4]; glGetUniformfv(arg0, arg1, param); typedArray = JS_NewFloat32Array(cx, usize); float *buffer = (float*)JS_GetArrayBufferViewData(typedArray); memcpy( buffer, param, sizeof(float) * usize); CC_SAFE_DELETE_ARRAY(param); } else if( utype == GL_INT ) { // FIXME: glew on windows will cause array overflow after invoking glGetUniformfv. // It seems that glGetUniformfv re-assign the memeroy with a wrong size which is 4x than we pass in. // For temporary solution, we allocate 4x array. GLint* param = new GLint[usize*4]; glGetUniformiv(arg0, arg1, param); typedArray = JS_NewInt32Array(cx, usize); GLint *buffer = (GLint*)JS_GetArrayBufferViewData(typedArray); memcpy( buffer, param, sizeof(GLint) * usize); CC_SAFE_DELETE_ARRAY(param); } JS_SET_RVAL(cx, vp, OBJECT_TO_JSVAL(typedArray)); return JS_TRUE; }
// any getUniform(WebGLProgram? program, WebGLUniformLocation? location); JSBool JSB_glGetUniformfv(JSContext *cx, uint32_t argc, jsval *vp) { JSB_PRECONDITION2( argc == 2, cx, JS_FALSE, "JSB_glGetUniformfv: Invalid number of arguments" ); jsval *argvp = JS_ARGV(cx,vp); JSBool ok = JS_TRUE; uint32_t arg0, arg1; ok &= jsval_to_uint( cx, *argvp++, &arg0 ); ok &= jsval_to_uint( cx, *argvp++, &arg1 ); JSB_PRECONDITION2(ok, cx, JS_FALSE, "JSB_glGetUniformfv: Error processing arguments"); GLsizei length; glGetProgramiv(arg0, GL_ACTIVE_ATTRIBUTE_MAX_LENGTH, &length); GLchar* namebuffer = new GLchar[length]; GLint size = -1; GLenum type = -1; glGetActiveUniform(arg0, arg1, length, NULL, &size, &type, namebuffer); CC_SAFE_DELETE_ARRAY(namebuffer); int usize = 0; int utype = 0; switch(type) { // float case GL_FLOAT: usize = 1; utype = GL_FLOAT; break; case GL_FLOAT_MAT2: usize = 2 * 2; utype = GL_FLOAT; break; case GL_FLOAT_MAT3: usize = 3 * 3; utype = GL_FLOAT; break; case GL_FLOAT_MAT4: usize = 4 * 4; utype = GL_FLOAT; break; case GL_FLOAT_VEC2: usize = 2; utype = GL_FLOAT; break; case GL_FLOAT_VEC3: usize = 3; utype = GL_FLOAT; break; case GL_FLOAT_VEC4: usize = 4; utype = GL_FLOAT; break; // int case GL_INT: usize = 1; utype = GL_INT; break; case GL_INT_VEC2: usize = 1; utype = GL_INT; break; case GL_INT_VEC3: usize = 1; utype = GL_INT; break; case GL_INT_VEC4: usize = 1; utype = GL_INT; break; default: JSB_PRECONDITION2(false, cx, JS_FALSE, "JSB_glGetUniformfv: Uniform Type not supported"); } JSObject *typedArray = NULL; if( utype == GL_FLOAT) { GLfloat* param = new GLfloat[usize]; glGetUniformfv(arg0, arg1, param); typedArray = JS_NewFloat32Array(cx, usize); float *buffer = (float*)JS_GetArrayBufferViewData(typedArray); memcpy( buffer, param, sizeof(float) * usize); CC_SAFE_DELETE_ARRAY(param); } else if( utype == GL_INT ) { GLint* param = new GLint[usize]; glGetUniformiv(arg0, arg1, param); typedArray = JS_NewInt32Array(cx, usize); GLint *buffer = (GLint*)JS_GetArrayBufferViewData(typedArray); memcpy( buffer, param, sizeof(GLint) * usize); CC_SAFE_DELETE_ARRAY(param); } JS_SET_RVAL(cx, vp, OBJECT_TO_JSVAL(typedArray)); return JS_TRUE; }