return arr;
}
+static JSValue js_create_array(JSContext *ctx, int len, JSValueConst *tab)
+{
+ JSValue obj;
+ JSObject *p;
+ int i;
+
+ obj = JS_NewArray(ctx);
+ if (JS_IsException(obj))
+ return JS_EXCEPTION;
+ if (len > 0) {
+ p = JS_VALUE_GET_OBJ(obj);
+ if (expand_fast_array(ctx, p, len) < 0) {
+ JS_FreeValue(ctx, obj);
+ return JS_EXCEPTION;
+ }
+ p->u.array.count = len;
+ for(i = 0; i < len; i++)
+ p->u.array.u.values[i] = JS_DupValue(ctx, tab[i]);
+ /* update the 'length' field */
+ set_value(ctx, &p->prop[0].u.value, JS_NewInt32(ctx, len));
+ }
+ return obj;
+}
+
+static JSValue js_create_array_free(JSContext *ctx, int len, JSValue *tab)
+{
+ JSValue obj;
+ JSObject *p;
+ int i;
+
+ obj = JS_NewArray(ctx);
+ if (JS_IsException(obj))
+ goto fail;
+ if (len > 0) {
+ p = JS_VALUE_GET_OBJ(obj);
+ if (expand_fast_array(ctx, p, len) < 0) {
+ JS_FreeValue(ctx, obj);
+ fail:
+ for(i = 0; i < len; i++)
+ JS_FreeValue(ctx, tab[i]);
+ return JS_EXCEPTION;
+ }
+ p->u.array.count = len;
+ for(i = 0; i < len; i++)
+ p->u.array.u.values[i] = tab[i];
+ /* update the 'length' field */
+ set_value(ctx, &p->prop[0].u.value, JS_NewInt32(ctx, len));
+ }
+ return obj;
+}
+
static void js_free_desc(JSContext *ctx, JSPropertyDescriptor *desc)
{
JS_FreeValue(ctx, desc->getter);
return JS_EXCEPTION;
}
-static JSValue js_build_rest(JSContext *ctx, int first, int argc, JSValueConst *argv)
-{
- JSValue val;
- int i, ret;
-
- val = JS_NewArray(ctx);
- if (JS_IsException(val))
- return val;
- for (i = first; i < argc; i++) {
- ret = JS_DefinePropertyValueUint32(ctx, val, i - first,
- JS_DupValue(ctx, argv[i]),
- JS_PROP_C_W_E);
- if (ret < 0) {
- JS_FreeValue(ctx, val);
- return JS_EXCEPTION;
- }
- }
- return val;
-}
-
static JSValue build_for_in_iterator(JSContext *ctx, JSValue obj)
{
JSObject *p, *p1;
{
int first = get_u16(pc);
pc += 2;
- *sp++ = js_build_rest(ctx, first, argc, (JSValueConst *)argv);
+ first = min_int(first, argc);
+ *sp++ = js_create_array(ctx, argc - first, (JSValueConst *)(argv + first));
if (unlikely(JS_IsException(sp[-1])))
goto exception;
}
}
BREAK;
CASE(OP_array_from):
- {
- int i, ret;
-
- call_argc = get_u16(pc);
- pc += 2;
- ret_val = JS_NewArray(ctx);
- if (unlikely(JS_IsException(ret_val)))
- goto exception;
- call_argv = sp - call_argc;
- for(i = 0; i < call_argc; i++) {
- ret = JS_DefinePropertyValue(ctx, ret_val, __JS_AtomFromUInt32(i), call_argv[i],
- JS_PROP_C_W_E | JS_PROP_THROW);
- call_argv[i] = JS_UNDEFINED;
- if (ret < 0) {
- JS_FreeValue(ctx, ret_val);
- goto exception;
- }
- }
- sp -= call_argc;
- *sp++ = ret_val;
- }
+ call_argc = get_u16(pc);
+ pc += 2;
+ ret_val = js_create_array_free(ctx, call_argc, sp - call_argc);
+ sp -= call_argc;
+ if (unlikely(JS_IsException(ret_val)))
+ goto exception;
+ *sp++ = ret_val;
BREAK;
CASE(OP_apply):
}
}
-static JSValue js_create_array(JSContext *ctx, int len, JSValueConst *tab)
-{
- JSValue obj;
- int i;
-
- obj = JS_NewArray(ctx);
- if (JS_IsException(obj))
- return JS_EXCEPTION;
- for(i = 0; i < len; i++) {
- if (JS_CreateDataPropertyUint32(ctx, obj, i, JS_DupValue(ctx, tab[i]), 0) < 0) {
- JS_FreeValue(ctx, obj);
- return JS_EXCEPTION;
- }
- }
- return obj;
-}
-
static JSValue js_create_array_iterator(JSContext *ctx, JSValueConst this_val,
int argc, JSValueConst *argv, int magic)
{