static ejsval _ejs_ArrayBuffer_prototype_slice (ejsval env, ejsval _this, uint32_t argc, ejsval *args) { EJSArrayBuffer* buffer = (EJSArrayBuffer*)EJSVAL_TO_OBJECT(_this); uint32_t len; uint32_t offset; switch (argc) { case 0: len = buffer->size; offset = 0; break; case 1: len = ToUint32(args[0]); offset = 0; break; case 2: default: len = ToUint32(args[0]); offset = ToUint32(args[1]); break; } return _ejs_arraybuffer_new_slice(_this, offset, len); }
static ejsval _ejs_ArrayBuffer_impl (ejsval env, ejsval _this, uint32_t argc, ejsval *args) { if (EJSVAL_IS_UNDEFINED(_this)) { printf ("ArrayBuffer called as a function\n"); EJS_NOT_IMPLEMENTED(); } uint32_t size = 0; if (argc > 0) size = ToUint32(args[0]); EJSArrayBuffer* buffer = (EJSArrayBuffer*)EJSVAL_TO_OBJECT(_this); buffer->dependent = EJS_FALSE; buffer->size = size; if (size) buffer->data.alloced_buf = calloc (1, size); return _this; }
static ejsval bound_wrapper (ejsval env, ejsval _this, uint32_t argc, ejsval *args) { ejsval target = EJS_BOUNDFUNC_ENV_GET_TARGET(env); ejsval thisArg = EJS_BOUNDFUNC_ENV_GET_THIS(env); uint32_t bound_argc = ToUint32(EJS_BOUNDFUNC_ENV_GET_ARGC(env)); if (bound_argc == 0) { return _ejs_invoke_closure(target, thisArg, argc, args); } else if (argc == 0) { return _ejs_invoke_closure(target, thisArg, bound_argc, _ejs_closureenv_get_slot_ref(env, EJS_BOUNDFUNC_FIRST_ARG_SLOT)); } else { uint32_t call_argc = argc + bound_argc; ejsval* call_args = alloca(sizeof(ejsval) * call_argc); memcpy (call_args, _ejs_closureenv_get_slot_ref(env, EJS_BOUNDFUNC_FIRST_ARG_SLOT), sizeof(ejsval) * bound_argc); memcpy (call_args + bound_argc, args, sizeof(ejsval) * argc); return _ejs_invoke_closure(target, thisArg, call_argc, call_args); } }
PrimitiveTypeMapCache() { // if we create the TypeMap as a static function member, the constructor // is guarantueed to be called by only one thread (see C++11 standard sec 6.7) // while all other threads wait for completion. Thus no manual synchronization // is needed for the initialization. // create all type mappers /* convert primitive types */ #define CONVERT_NUMBER(NAME, TYPE, PRED, CONV) \ { \ func_t f = [](const Local<Value>& val) \ -> std::tuple<size_t, void*, cl_int> { \ if (!val->PRED()){ \ return std::tuple<size_t, void*,cl_int>(0, NULL, CL_INVALID_ARG_VALUE);\ } \ void* ptr_data = new TYPE; \ size_t ptr_size = sizeof(TYPE); \ *((TYPE *)ptr_data) = val->CONV(); \ return std::tuple<size_t, void*,cl_int>(ptr_size, ptr_data, 0); \ }; \ m_converters[NAME] = f; \ } CONVERT_NUMBER("char", cl_char, IsInt32, ToInt32()->Value); CONVERT_NUMBER("uchar", cl_uchar, IsInt32, ToUint32()->Value); CONVERT_NUMBER("short", cl_short, IsInt32, ToInt32()->Value); CONVERT_NUMBER("ushort", cl_ushort, IsInt32, ToUint32()->Value); CONVERT_NUMBER("int", cl_int , IsInt32, ToInt32()->Value); CONVERT_NUMBER("uint", cl_uint, IsInt32, ToUint32()->Value); CONVERT_NUMBER("long", cl_long, IsNumber, ToInteger()->Value); CONVERT_NUMBER("ulong", cl_ulong, IsNumber, ToInteger()->Value); CONVERT_NUMBER("float", cl_float, IsNumber, NumberValue); CONVERT_NUMBER("double", cl_double, IsNumber, NumberValue); CONVERT_NUMBER("half", cl_half, IsNumber, NumberValue); #undef CONVERT_NUMBER /* convert vector types (e.g. float4, int16, etc) */ #define CONVERT_VECT(NAME, TYPE, I, PRED, COND) \ { \ func_t f = [](const Local<Value>& val) \ -> std::tuple<size_t, void*, cl_int> { \ if (!val->IsArray()) { \ /*THROW_ERR(CL_INVALID_ARG_VALUE); */ \ return std::tuple<size_t,void*,cl_int>(0, NULL, CL_INVALID_ARG_VALUE);\ } \ Local<Array> arr = Local<Array>::Cast(val); \ if (arr->Length() != I) { \ /*THROW_ERR(CL_INVALID_ARG_SIZE);*/ \ return std::tuple<size_t,void*,cl_int>(0, NULL, CL_INVALID_ARG_SIZE); \ } \ TYPE * vvc = new TYPE[I]; \ size_t ptr_size = sizeof(TYPE) * I; \ void* ptr_data = vvc; \ for (unsigned int i = 0; i < I; ++ i) { \ if (!arr->Get(i)->PRED()) { \ /*THROW_ERR(CL_INVALID_ARG_VALUE);*/ \ /*THROW_ERR(CL_INVALID_ARG_VALUE);*/ \ return std::tuple<size_t,void*,cl_int>(0, NULL, CL_INVALID_ARG_VALUE);\ } \ vvc[i] = arr->Get(i)->COND(); \ } \ return std::tuple<size_t,void*,cl_int>(ptr_size, ptr_data, 0); \ }; \ m_converters["NAME ## I"] = f; \ } #define CONVERT_VECTS(NAME, TYPE, PRED, COND) \ CONVERT_VECT(NAME, TYPE, 2, PRED, COND);\ CONVERT_VECT(NAME, TYPE, 3, PRED, COND);\ CONVERT_VECT(NAME, TYPE, 4, PRED, COND);\ CONVERT_VECT(NAME, TYPE, 8, PRED, COND);\ CONVERT_VECT(MAME, TYPE, 16, PRED, COND); CONVERT_VECTS("char", cl_char, IsInt32, ToInt32()->Value); CONVERT_VECTS("uchar", cl_uchar, IsInt32, ToUint32()->Value); CONVERT_VECTS("short", cl_short, IsInt32, ToInt32()->Value); CONVERT_VECTS("ushort", cl_ushort, IsInt32, ToUint32()->Value); CONVERT_VECTS("int", cl_int, IsInt32, ToInt32()->Value); CONVERT_VECTS("uint", cl_uint, IsInt32, ToUint32()->Value); CONVERT_VECTS("long", cl_long, IsNumber, ToInteger()->Value); CONVERT_VECTS("ulong", cl_ulong, IsNumber, ToInteger()->Value); CONVERT_VECTS("float", cl_float, IsNumber, NumberValue); CONVERT_VECTS("double", cl_double, IsNumber, NumberValue); CONVERT_VECTS("half", cl_half, IsNumber, NumberValue); #undef CONVERT_VECT #undef CONVERT_VECTS // add boolean conversion m_converters["bool"] = [](const Local<Value>& val) { size_t ptr_size = sizeof(cl_bool); void* ptr_data = new cl_bool; *((cl_bool *)ptr_data) = val->BooleanValue() ? 1 : 0; return std::tuple<size_t,void*,cl_int>(ptr_size, ptr_data, 0); }; }
void allinone_for_load_just_ensure_these_functions_and_variables_are_included_please_do_not_call() { JSValueHash(_ejs_nan); JSValueHash(jsPositiveInfinity); JSValueHash(jsNegativeInfinity); JSValueHash(jsMax); JSValueHash(jsMin); JSValueHash(_ejs_null); JSValueHash(_ejs_undefined); JSValueHash(_ejs_true); JSValueHash(_ejs_false); JSValueHash(_ejs_one); JSValueHash(_ejs_zero); JSValueHash(_ejs_global); JSValueHash(_ejs_console); JSValueHash(_ejs_Object); JSValueHash(_ejs_Boolean); JSValueHash(_ejs_Number); JSValueHash(_ejs_String); JSValueHash(_ejs_Array); JSValueHash(_ejs_Function); JSValueHash(_ejs_Process); JSValueHash(_ejs_Symbol_create); JSValueHash(_ejs_Math); JSValueHash(_ejs_JSON); jsextern_print_tick(); jsextern_os_msleep(0); jsextern_os_swap(NULL, 0, 0); jsextern_pcre_compile(NULL); jsextern_pcre_study(NULL); jsextern_pcre_bracketcount(NULL); jsextern_pcre_exec(NULL, NULL, NULL, 0, 0, NULL, 0); jsextern_pcre_free(NULL); jsextern_thread_create((void *(*)(void *))NULL, NULL); jsextern_thread_destroy(0); jsextern_mutex_create(); jsextern_mutex_destroy(0); jsextern_mutex_lock(0); jsextern_mutex_unlock(0); jsextern_signal_create(); jsextern_signal_destroy(0); jsextern_signal_wait(0); jsextern_signal_send(0); JSValueHash(_ejs_undefined); _ejs_eval(_ejs_undefined, _ejs_undefined, 0, NULL); //Object _ejs_object_getprop_utf8(_ejs_undefined, NULL); _ejs_object_setprop_utf8(_ejs_global, NULL, _ejs_undefined); _ejs_object_define_value_property(_ejs_undefined, _ejs_undefined, _ejs_undefined, 0); _ejs_object_define_getter_property(_ejs_undefined, _ejs_undefined, _ejs_undefined, 0); _ejs_object_define_setter_property(_ejs_undefined, _ejs_undefined, _ejs_undefined, 0); _ejs_Object_create(_ejs_undefined, _ejs_undefined, 0, NULL); _ejs_Object_getOwnPropertyNames(_ejs_undefined, _ejs_undefined, 0, NULL); //vtable _ejs_specop_get(_ejs_undefined, _ejs_undefined, _ejs_undefined); _ejs_specop_set(_ejs_undefined, _ejs_undefined, _ejs_undefined, _ejs_undefined); //option ToEJSBool(_ejs_undefined); ToDouble(_ejs_undefined); ToUint32(_ejs_undefined); _ejs_op_typeof(_ejs_undefined); _ejs_op_instanceof(_ejs_undefined, _ejs_undefined); _ejs_op_typeof_is_array(_ejs_undefined); _ejs_op_plusplus(_ejs_undefined, EJS_FALSE); _ejs_op_minusminus(_ejs_undefined, EJS_FALSE); _ejs_op_bitwise_xor(_ejs_undefined, _ejs_undefined); _ejs_op_bitwise_and(_ejs_undefined, _ejs_undefined); _ejs_op_bitwise_or(_ejs_undefined, _ejs_undefined); _ejs_op_rsh(_ejs_undefined, _ejs_undefined); _ejs_op_ursh(_ejs_undefined, _ejs_undefined); _ejs_op_lsh(_ejs_undefined, _ejs_undefined); _ejs_op_ulsh(_ejs_undefined, _ejs_undefined); _ejs_op_mod(_ejs_undefined, _ejs_undefined); _ejs_op_add(_ejs_undefined, _ejs_undefined); _ejs_op_sub(_ejs_undefined, _ejs_undefined); _ejs_op_mult(_ejs_undefined, _ejs_undefined); _ejs_op_div(_ejs_undefined, _ejs_undefined); _ejs_op_lt(_ejs_undefined, _ejs_undefined); _ejs_op_le(_ejs_undefined, _ejs_undefined); _ejs_op_gt(_ejs_undefined, _ejs_undefined); _ejs_op_ge(_ejs_undefined, _ejs_undefined); _ejs_op_strict_eq(_ejs_undefined, _ejs_undefined); _ejs_op_strict_neq(_ejs_undefined, _ejs_undefined); _ejs_op_eq(_ejs_undefined, _ejs_undefined); _ejs_op_neq(_ejs_undefined, _ejs_undefined); //arguments _ejs_arguments_new(0, NULL); //Array _ejs_array_new(jsValue32Size, false); //String _ejs_string_new_utf8_len(NULL, 0); //Function _ejs_function_new_utf8(_ejs_undefined, NULL, (EJSClosureFunc)NULL); _ejs_invoke_closure(_ejs_undefined, _ejs_undefined, 0, NULL); //RegExp _ejs_regexp_new_utf8(NULL, NULL); }