From 270e3c346f5fe9b97bed4fc8b30fdbdca079c819 Mon Sep 17 00:00:00 2001 From: Boris Zbarsky Date: Fri, 4 Nov 2011 01:32:10 -0400 Subject: [PATCH] Bug 688685 test. r=waldo --- js/src/jsapi-tests/Makefile.in | 1 + .../jsapi-tests/testAddPropertyPropcache.cpp | 72 +++++++++++++++++++ 2 files changed, 73 insertions(+) create mode 100644 js/src/jsapi-tests/testAddPropertyPropcache.cpp diff --git a/js/src/jsapi-tests/Makefile.in b/js/src/jsapi-tests/Makefile.in index 394facbba39..75845e9ede4 100644 --- a/js/src/jsapi-tests/Makefile.in +++ b/js/src/jsapi-tests/Makefile.in @@ -49,6 +49,7 @@ PROGRAM = jsapi-tests$(BIN_SUFFIX) CPPSRCS = \ tests.cpp \ selfTest.cpp \ + testAddPropertyPropcache.cpp \ testArgumentsObject.cpp \ testBug604087.cpp \ testChromeBuffer.cpp \ diff --git a/js/src/jsapi-tests/testAddPropertyPropcache.cpp b/js/src/jsapi-tests/testAddPropertyPropcache.cpp new file mode 100644 index 00000000000..b30437baebe --- /dev/null +++ b/js/src/jsapi-tests/testAddPropertyPropcache.cpp @@ -0,0 +1,72 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- + * vim: set ts=8 sw=4 et tw=99: + */ + +#include "tests.h" +#include "jsxdrapi.h" + +/* Do the test a bunch of times, because sometimes we seem to randomly + miss the propcache */ +static const int expectedCount = 100; +static int callCount = 0; + +static JSBool +addProperty(JSContext *cx, JSObject *obj, jsid id, jsval *vp) +{ + callCount++; + return true; +} + +JSClass addPropertyClass = { + "AddPropertyTester", + 0, + addProperty, + JS_PropertyStub, /* delProperty */ + JS_PropertyStub, /* getProperty */ + JS_StrictPropertyStub, /* setProperty */ + JS_EnumerateStub, + JS_ResolveStub, + JS_ConvertStub +}; + +BEGIN_TEST(testAddPropertyHook) +{ + jsvalRoot proto(cx); + JSObject *obj = JS_NewObject(cx, NULL, NULL, NULL); + CHECK(obj); + proto = OBJECT_TO_JSVAL(obj); + JS_InitClass(cx, global, obj, &addPropertyClass, NULL, 0, NULL, NULL, NULL, + NULL); + + jsvalRoot arr(cx); + obj = JS_NewArrayObject(cx, 0, NULL); + CHECK(obj); + arr = OBJECT_TO_JSVAL(obj); + + CHECK(JS_DefineProperty(cx, global, "arr", arr, + JS_PropertyStub, JS_StrictPropertyStub, + JSPROP_ENUMERATE)); + + for (int i = 0; i < expectedCount; ++i) { + jsvalRoot vobj(cx); + obj = JS_NewObject(cx, &addPropertyClass, NULL, NULL); + CHECK(obj); + vobj = OBJECT_TO_JSVAL(obj); + CHECK(JS_DefineElement(cx, JSVAL_TO_OBJECT(arr), i, vobj, + JS_PropertyStub, JS_StrictPropertyStub, + JSPROP_ENUMERATE)); + } + + // Now add a prop to each of the objects, but make sure to do + // so at the same bytecode location so we can hit the propcache. + EXEC("'use strict'; \n" + "for (var i = 0; i < arr.length; ++i) \n" + " arr[i].prop = 42; \n" + ); + + CHECK(callCount == expectedCount); + + return true; +} +END_TEST(testAddPropertyHook) +