[INFER] Account for 'new' case in non-constructor type handlers, bug 618853.

This commit is contained in:
Brian Hackett
2010-12-20 10:13:39 -08:00
parent 3b8e580d68
commit fc509c0776
5 changed files with 65 additions and 9 deletions

View File

@@ -3028,8 +3028,11 @@ static void array_TypeSort(JSContext *cx, JSTypeFunction *jsfun, JSTypeCallsite
site->forceThisTypes(cx);
if (site->returnTypes)
if (site->returnTypes) {
if (site->isNew)
site->returnTypes->addType(cx, TYPE_UNKNOWN);
site->thisTypes->addSubset(cx, site->pool(), site->returnTypes);
}
if (site->argumentCount == 0)
return;
@@ -3057,6 +3060,8 @@ static void array_TypeInsert(JSContext *cx, JSTypeFunction *jsfun, JSTypeCallsit
if (site->returnTypes) {
/* The return type is an integer (array length). */
if (site->isNew)
site->returnTypes->addType(cx, TYPE_UNKNOWN);
site->returnTypes->addType(cx, TYPE_INT32);
}
@@ -3075,8 +3080,10 @@ static void array_TypeRemove(JSContext *cx, JSTypeFunction *jsfun, JSTypeCallsit
if (!site->returnTypes)
return;
site->forceThisTypes(cx);
if (site->isNew)
site->returnTypes->addType(cx, TYPE_UNKNOWN);
site->forceThisTypes(cx);
site->thisTypes->addGetProperty(cx, site->code, site->returnTypes, JSID_VOID);
site->returnTypes->addType(cx, TYPE_UNDEFINED);
#endif
@@ -3091,6 +3098,8 @@ static void array_TypeSplice(JSContext *cx, JSTypeFunction *jsfun, JSTypeCallsit
if (site->returnTypes) {
/* Treat the returned array the same as the 'this' array. */
if (site->isNew)
site->returnTypes->addType(cx, TYPE_UNKNOWN);
site->thisTypes->addSubset(cx, site->pool(), site->returnTypes);
}
@@ -3116,8 +3125,11 @@ static void array_TypeConcat(JSContext *cx, JSTypeFunction *jsfun, JSTypeCallsit
site->forceThisTypes(cx);
if (site->returnTypes)
if (site->returnTypes) {
if (site->isNew)
site->returnTypes->addType(cx, TYPE_UNKNOWN);
site->returnTypes->addType(cx, (jstype) object);
}
/* Propagate elements of the 'this' array to the result. */
TypeSet *indexTypes = object->getProperty(cx, JSID_VOID, false);
@@ -3154,6 +3166,9 @@ static void array_TypeExtra(JSContext *cx, JSTypeFunction *jsfun, JSTypeCallsite
site->forceThisTypes(cx);
site->forceReturnTypes(cx);
if (site->isNew)
site->returnTypes->addType(cx, TYPE_UNKNOWN);
site->thisTypes->addGetProperty(cx, code, elemTypes, JSID_VOID);
/* Make the call site to use for the higher order function. */