@@ -18238,49 +18238,137 @@ static JSValue JS_CallInternal(JSContext *caller_ctx, JSValueConst func_obj,
1823818238
1823918239 CASE(OP_get_field):
1824018240 {
18241- JSValue val;
18241+ JSValue val, obj ;
1824218242 JSAtom atom;
18243+ JSObject *p;
18244+ JSProperty *pr;
18245+ JSShapeProperty *prs;
18246+
1824318247 atom = get_u32(pc);
1824418248 pc += 4;
18245-
18246- sf->cur_pc = pc;
18247- val = JS_GetProperty(ctx, sp[-1], atom);
18248- if (unlikely(JS_IsException(val)))
18249- goto exception;
18249+
18250+ obj = sp[-1];
18251+ if (likely(JS_VALUE_GET_TAG(obj) == JS_TAG_OBJECT)) {
18252+ p = JS_VALUE_GET_OBJ(obj);
18253+ for(;;) {
18254+ prs = find_own_property(&pr, p, atom);
18255+ if (prs) {
18256+ /* found */
18257+ if (unlikely(prs->flags & JS_PROP_TMASK))
18258+ goto get_field_slow_path;
18259+ val = JS_DupValue(ctx, pr->u.value);
18260+ break;
18261+ }
18262+ if (unlikely(p->is_exotic)) {
18263+ /* XXX: should avoid the slow path for arrays
18264+ and typed arrays by ensuring that 'prop' is
18265+ not numeric */
18266+ obj = JS_MKPTR(JS_TAG_OBJECT, p);
18267+ goto get_field_slow_path;
18268+ }
18269+ p = p->shape->proto;
18270+ if (!p) {
18271+ val = JS_UNDEFINED;
18272+ break;
18273+ }
18274+ }
18275+ } else {
18276+ get_field_slow_path:
18277+ sf->cur_pc = pc;
18278+ val = JS_GetPropertyInternal(ctx, obj, atom, sp[-1], 0);
18279+ if (unlikely(JS_IsException(val)))
18280+ goto exception;
18281+ }
1825018282 JS_FreeValue(ctx, sp[-1]);
1825118283 sp[-1] = val;
1825218284 }
1825318285 BREAK;
1825418286
1825518287 CASE(OP_get_field2):
1825618288 {
18257- JSValue val;
18289+ JSValue val, obj ;
1825818290 JSAtom atom;
18291+ JSObject *p;
18292+ JSProperty *pr;
18293+ JSShapeProperty *prs;
18294+
1825918295 atom = get_u32(pc);
1826018296 pc += 4;
18261-
18262- sf->cur_pc = pc;
18263- val = JS_GetProperty(ctx, sp[-1], atom);
18264- if (unlikely(JS_IsException(val)))
18265- goto exception;
18297+
18298+ obj = sp[-1];
18299+ if (likely(JS_VALUE_GET_TAG(obj) == JS_TAG_OBJECT)) {
18300+ p = JS_VALUE_GET_OBJ(obj);
18301+ for(;;) {
18302+ prs = find_own_property(&pr, p, atom);
18303+ if (prs) {
18304+ /* found */
18305+ if (unlikely(prs->flags & JS_PROP_TMASK))
18306+ goto get_field2_slow_path;
18307+ val = JS_DupValue(ctx, pr->u.value);
18308+ break;
18309+ }
18310+ if (unlikely(p->is_exotic)) {
18311+ /* XXX: should avoid the slow path for arrays
18312+ and typed arrays by ensuring that 'prop' is
18313+ not numeric */
18314+ obj = JS_MKPTR(JS_TAG_OBJECT, p);
18315+ goto get_field2_slow_path;
18316+ }
18317+ p = p->shape->proto;
18318+ if (!p) {
18319+ val = JS_UNDEFINED;
18320+ break;
18321+ }
18322+ }
18323+ } else {
18324+ get_field2_slow_path:
18325+ sf->cur_pc = pc;
18326+ val = JS_GetPropertyInternal(ctx, obj, atom, sp[-1], 0);
18327+ if (unlikely(JS_IsException(val)))
18328+ goto exception;
18329+ }
1826618330 *sp++ = val;
1826718331 }
1826818332 BREAK;
1826918333
1827018334 CASE(OP_put_field):
1827118335 {
1827218336 int ret;
18337+ JSValue obj;
1827318338 JSAtom atom;
18339+ JSObject *p;
18340+ JSProperty *pr;
18341+ JSShapeProperty *prs;
18342+
1827418343 atom = get_u32(pc);
1827518344 pc += 4;
18276- sf->cur_pc = pc;
1827718345
18278- ret = JS_SetPropertyInternal(ctx, sp[-2], atom, sp[-1], sp[-2],
18279- JS_PROP_THROW_STRICT);
18280- JS_FreeValue(ctx, sp[-2]);
18281- sp -= 2;
18282- if (unlikely(ret < 0))
18283- goto exception;
18346+ obj = sp[-2];
18347+ if (likely(JS_VALUE_GET_TAG(obj) == JS_TAG_OBJECT)) {
18348+ p = JS_VALUE_GET_OBJ(obj);
18349+ prs = find_own_property(&pr, p, atom);
18350+ if (!prs)
18351+ goto put_field_slow_path;
18352+ if (likely((prs->flags & (JS_PROP_TMASK | JS_PROP_WRITABLE |
18353+ JS_PROP_LENGTH)) == JS_PROP_WRITABLE)) {
18354+ /* fast path */
18355+ set_value(ctx, &pr->u.value, sp[-1]);
18356+ } else {
18357+ goto put_field_slow_path;
18358+ }
18359+ JS_FreeValue(ctx, obj);
18360+ sp -= 2;
18361+ } else {
18362+ put_field_slow_path:
18363+ sf->cur_pc = pc;
18364+ ret = JS_SetPropertyInternal(ctx, obj, atom, sp[-1], obj,
18365+ JS_PROP_THROW_STRICT);
18366+ JS_FreeValue(ctx, obj);
18367+ sp -= 2;
18368+ if (unlikely(ret < 0))
18369+ goto exception;
18370+ }
18371+
1828418372 }
1828518373 BREAK;
1828618374
0 commit comments