ejsval _ejs_typedarray_new_from_array (EJSTypedArrayType element_type, ejsval arrayObj) { EJSObject *arr = EJSVAL_TO_OBJECT(arrayObj); int arrlen = EJSARRAY_LEN(arr); ejsval typedarr = _ejs_typedarray_new (element_type, arrlen); int i; void* data = _ejs_typedarray_get_data (EJSVAL_TO_OBJECT(typedarr)); // this is woefully underoptimized... for (i = 0; i < arrlen; i ++) { ejsval item = _ejs_object_getprop (arrayObj, NUMBER_TO_EJSVAL(i)); switch (element_type) { case EJS_TYPEDARRAY_INT8: ((int8_t*)data)[i] = (int8_t)EJSVAL_TO_NUMBER(item); break; case EJS_TYPEDARRAY_UINT8: ((uint8_t*)data)[i] = (uint8_t)EJSVAL_TO_NUMBER(item); break; case EJS_TYPEDARRAY_UINT8CLAMPED: EJS_NOT_IMPLEMENTED(); case EJS_TYPEDARRAY_INT16: ((int16_t*)data)[i] = (int16_t)EJSVAL_TO_NUMBER(item); break; case EJS_TYPEDARRAY_UINT16: ((uint16_t*)data)[i] = (uint16_t)EJSVAL_TO_NUMBER(item); break; case EJS_TYPEDARRAY_INT32: ((int32_t*)data)[i] = (int32_t)EJSVAL_TO_NUMBER(item); break; case EJS_TYPEDARRAY_UINT32: ((uint32_t*)data)[i] = (uint32_t)EJSVAL_TO_NUMBER(item); break; case EJS_TYPEDARRAY_FLOAT32: ((float*)data)[i] = (float)EJSVAL_TO_NUMBER(item); break; case EJS_TYPEDARRAY_FLOAT64: ((double*)data)[i] = (double)EJSVAL_TO_NUMBER(item); break; default: EJS_NOT_REACHED(); } } return typedarr; }
void _ejs_throw_nativeerror_utf8 (EJSNativeErrorType error_type, const char *message) { ejsval exc = _ejs_nativeerror_new_utf8 (error_type, message); _ejs_log ("throwing exception with message %s\n", message); _ejs_throw (exc); EJS_NOT_REACHED(); }
// ECMA262 25.4.5.25.0 Thrower Functions static ejsval thrower(ejsval env, ejsval _this, uint32_t argc, ejsval *args) { ejsval x = _ejs_undefined; if (argc > 0) x = args[0]; _ejs_throw(x); EJS_NOT_REACHED(); }
void _ejs_throw_nativeerror (EJSNativeErrorType error_type, ejsval message) { ejsval exc = _ejs_nativeerror_new (error_type, message); char *message_utf8 = ucs2_to_utf8(EJSVAL_TO_FLAT_STRING(message)); _ejs_log ("throwing exception with message %s\n", message_utf8); free (message_utf8); _ejs_throw (exc); EJS_NOT_REACHED(); }
static ejsval _ejs_child_process_spawn (ejsval env, ejsval _this, uint32_t argc, ejsval* args) { char* argv0 = ucs2_to_utf8(EJSVAL_TO_FLAT_STRING(args[0])); EJSArray* argv_rest = (EJSArray*)EJSVAL_TO_OBJECT(args[1]); char **argv = (char**)calloc(sizeof(char*), EJSARRAY_LEN(argv_rest) + 2); argv[0] = argv0; for (uint32_t i = 0; i < EJSARRAY_LEN(argv_rest); i ++) argv[1+i] = ucs2_to_utf8(EJSVAL_TO_FLAT_STRING(ToString(EJSDENSEARRAY_ELEMENTS(argv_rest)[i]))); pid_t pid; switch (pid = fork()) { case -1: /* error */ perror("fork"); printf ("we should totally throw an exception here\n"); break; case 0: /* child */ execvp (argv0, argv); perror("execv"); EJS_NOT_REACHED(); break; default: /* parent */ { int stat; int wait_rv; do { wait_rv = waitpid(pid, &stat, 0); } while (wait_rv == -1 && errno == EINTR); if (wait_rv != pid) { perror ("waitpid"); printf ("we should totally throw an exception here\n"); } break; } } for (uint32_t i = 0; i < EJSARRAY_LEN(argv_rest)+1; i ++) free (argv[i]); free (argv); return _ejs_undefined; }