diff --git a/source/quickjs-atom.h b/source/quickjs-atom.h index b0ebcdbb..9e845d47 100644 --- a/source/quickjs-atom.h +++ b/source/quickjs-atom.h @@ -40,7 +40,6 @@ DEF(delete, "delete") DEF(void, "void") DEF(new, "new") DEF(in, "in") -DEF(instanceof, "instanceof") DEF(do, "do") DEF(while, "while") DEF(for, "for") diff --git a/source/quickjs-opcode.h b/source/quickjs-opcode.h index 52aa3524..78137978 100644 --- a/source/quickjs-opcode.h +++ b/source/quickjs-opcode.h @@ -222,7 +222,6 @@ DEF( lt, 1, 2, 1, none) DEF( lte, 1, 2, 1, none) DEF( gt, 1, 2, 1, none) DEF( gte, 1, 2, 1, none) -DEF( instanceof, 1, 2, 1, none) DEF( in, 1, 2, 1, none) DEF( eq, 1, 2, 1, none) DEF( neq, 1, 2, 1, none) diff --git a/source/quickjs.c b/source/quickjs.c index 0e9c2a0e..2269d2bf 100644 --- a/source/quickjs.c +++ b/source/quickjs.c @@ -6873,105 +6873,6 @@ static JSValue JS_GetPrototypeFree(JSContext *ctx, JSValue obj) return obj1; } -/* return TRUE, FALSE or (-1) in case of exception */ -static int JS_OrdinaryIsInstanceOf(JSContext *ctx, JSValueConst val, - JSValueConst obj) -{ - JSValue obj_proto; - JSObject *proto; - const JSObject *p, *proto1; - BOOL ret; - - if (!JS_IsFunction(ctx, obj)) - return FALSE; - p = JS_VALUE_GET_OBJ(obj); - if (p->class_id == JS_CLASS_BOUND_FUNCTION) { - JSBoundFunction *s = p->u.bound_function; - return JS_IsInstanceOf(ctx, val, s->func_obj); - } - - /* Only explicitly boxed values are instances of constructors */ - if (JS_VALUE_GET_TAG(val) != JS_TAG_OBJECT) - return FALSE; - obj_proto = JS_GetProperty(ctx, obj, JS_ATOM_prototype); - if (JS_VALUE_GET_TAG(obj_proto) != JS_TAG_OBJECT) { - if (!JS_IsException(obj_proto)) - JS_ThrowTypeError(ctx, "operand 'prototype' property is not an object"); - ret = -1; - goto done; - } - proto = JS_VALUE_GET_OBJ(obj_proto); - p = JS_VALUE_GET_OBJ(val); - for(;;) { - proto1 = p->shape->proto; - if (!proto1) { - /* slow case if exotic object in the prototype chain */ - if (unlikely(p->is_exotic && !p->fast_array)) { - JSValue obj1; - obj1 = JS_DupValue(ctx, JS_MKPTR(JS_TAG_OBJECT, (JSObject *)p)); - for(;;) { - obj1 = JS_GetPrototypeFree(ctx, obj1); - if (JS_IsException(obj1)) { - ret = -1; - break; - } - if (JS_IsNull(obj1)) { - ret = FALSE; - break; - } - if (proto == JS_VALUE_GET_OBJ(obj1)) { - JS_FreeValue(ctx, obj1); - ret = TRUE; - break; - } - /* must check for timeout to avoid infinite loop */ - if (js_poll_interrupts(ctx)) { - JS_FreeValue(ctx, obj1); - ret = -1; - break; - } - } - } else { - ret = FALSE; - } - break; - } - p = proto1; - if (proto == p) { - ret = TRUE; - break; - } - } -done: - JS_FreeValue(ctx, obj_proto); - return ret; -} - -/* return TRUE, FALSE or (-1) in case of exception */ -int JS_IsInstanceOf(JSContext *ctx, JSValueConst val, JSValueConst obj) -{ - JSValue method; - - if (!JS_IsObject(obj)) - goto fail; - method = JS_GetProperty(ctx, obj, JS_ATOM_Symbol_hasInstance); - if (JS_IsException(method)) - return -1; - if (!JS_IsNull(method) && !JS_IsNull(method)) { - JSValue ret; - ret = JS_CallFree(ctx, method, obj, 1, &val); - return JS_ToBoolFree(ctx, ret); - } - - /* legacy case */ - if (!JS_IsFunction(ctx, obj)) { - fail: - JS_ThrowTypeError(ctx, "invalid 'instanceof' right operand"); - return -1; - } - return JS_OrdinaryIsInstanceOf(ctx, val, obj); -} - /* return the value associated to the autoinit property or an exception */ typedef JSValue JSAutoInitFunc(JSContext *ctx, JSObject *p, JSAtom atom, void *opaque); @@ -11670,22 +11571,6 @@ static __exception int js_operator_in(JSContext *ctx, JSValue *sp) return 0; } -static __exception int js_operator_instanceof(JSContext *ctx, JSValue *sp) -{ - JSValue op1, op2; - BOOL ret; - - op1 = sp[-2]; - op2 = sp[-1]; - ret = JS_IsInstanceOf(ctx, op1, op2); - if (ret < 0) - return ret; - JS_FreeValue(ctx, op1); - JS_FreeValue(ctx, op2); - sp[-2] = JS_NewBool(ctx, ret); - return 0; -} - static __exception int js_operator_delete(JSContext *ctx, JSValue *sp) { JSValue op1, op2; @@ -15495,12 +15380,6 @@ static JSValue JS_CallInternal_OLD(JSContext *caller_ctx, JSValueConst func_obj, goto exception; sp--; BREAK; - CASE(OP_instanceof): - sf->cur_pc = pc; - if (js_operator_instanceof(ctx, sp)) - goto exception; - sp--; - BREAK; CASE(OP_delete): sf->cur_pc = pc; if (js_operator_delete(ctx, sp)) @@ -15844,7 +15723,6 @@ enum { TOK_VOID, TOK_NEW, TOK_IN, - TOK_INSTANCEOF, TOK_DO, TOK_WHILE, TOK_FOR, @@ -16946,7 +16824,7 @@ static __exception int next_token(JSParseState *s) flags); if (JS_IsException(ret)) goto fail; - /* reject `10instanceof Number` */ + /* reject number immediately followed by identifier */ if (JS_VALUE_IS_NAN(ret) || lre_js_is_ident_next(unicode_from_utf8(p, UTF8_CHAR_LEN_MAX, &p1))) { JS_FreeValue(s->ctx, ret); @@ -20506,9 +20384,6 @@ static __exception int js_parse_expr_binary(JSParseState *s, int level, case TOK_GTE: opcode = OP_gte; break; - case TOK_INSTANCEOF: - opcode = OP_instanceof; - break; case TOK_IN: if (parse_flags & PF_IN_ACCEPTED) { opcode = OP_in; @@ -28145,9 +28020,6 @@ static int JS_InstantiateFunctionListItem(JSContext *ctx, JSValueConst obj, if (atom == JS_ATOM_Symbol_toPrimitive) { /* Symbol.toPrimitive functions are not writable */ prop_flags = JS_PROP_CONFIGURABLE; - } else if (atom == JS_ATOM_Symbol_hasInstance) { - /* Function.prototype[Symbol.hasInstance] is not writable nor configurable */ - prop_flags = 0; } } break; @@ -28155,9 +28027,6 @@ static int JS_InstantiateFunctionListItem(JSContext *ctx, JSValueConst obj, if (atom == JS_ATOM_Symbol_toPrimitive) { /* Symbol.toPrimitive functions are not writable */ prop_flags = JS_PROP_CONFIGURABLE; - } else if (atom == JS_ATOM_Symbol_hasInstance) { - /* Function.prototype[Symbol.hasInstance] is not writable nor configurable */ - prop_flags = 0; } JS_DefineAutoInitProperty(ctx, obj, atom, JS_AUTOINIT_ID_PROP, (void *)e, prop_flags); @@ -29464,23 +29333,11 @@ static JSValue js_function_toString(JSContext *ctx, JSValueConst this_val, } } -static JSValue js_function_hasInstance(JSContext *ctx, JSValueConst this_val, - int argc, JSValueConst *argv) -{ - int ret; - ret = JS_OrdinaryIsInstanceOf(ctx, argv[0], this_val); - if (ret < 0) - return JS_EXCEPTION; - else - return JS_NewBool(ctx, ret); -} - static const JSCFunctionListEntry js_function_proto_funcs[] = { JS_CFUNC_DEF("call", 1, js_function_call ), JS_CFUNC_MAGIC_DEF("apply", 2, js_function_apply, 0 ), JS_CFUNC_DEF("bind", 1, js_function_bind ), JS_CFUNC_DEF("toString", 0, js_function_toString ), - JS_CFUNC_DEF("[Symbol.hasInstance]", 1, js_function_hasInstance ), JS_CGETSET_DEF("fileName", js_function_proto_fileName, NULL ), JS_CGETSET_MAGIC_DEF("lineNumber", js_function_proto_lineNumber, NULL, 0 ), JS_CGETSET_MAGIC_DEF("columnNumber", js_function_proto_lineNumber, NULL, 1 ), diff --git a/source/quickjs.h b/source/quickjs.h index b959f6fb..9b71543b 100644 --- a/source/quickjs.h +++ b/source/quickjs.h @@ -765,7 +765,6 @@ JSValue JS_EvalThis(JSContext *ctx, JSValueConst this_obj, const char *input, size_t input_len, const char *filename, int eval_flags); JSValue JS_GetGlobalObject(JSContext *ctx); -int JS_IsInstanceOf(JSContext *ctx, JSValueConst val, JSValueConst obj); int JS_DefineProperty(JSContext *ctx, JSValueConst this_obj, JSAtom prop, JSValueConst val, JSValueConst getter, JSValueConst setter, int flags);