Skip to content

Commit 57f8ec0

Browse files
author
Fabrice Bellard
committed
inlined fast path for get_field, get_field2 and put_field
1 parent 2c90110 commit 57f8ec0

File tree

1 file changed

+107
-19
lines changed

1 file changed

+107
-19
lines changed

quickjs.c

Lines changed: 107 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)