diff --git a/js/src/jsapi-tests/testOps.cpp b/js/src/jsapi-tests/testOps.cpp new file mode 100644 index 000000000000..e58b14a4f822 --- /dev/null +++ b/js/src/jsapi-tests/testOps.cpp @@ -0,0 +1,60 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- + * vim: set ts=8 sw=4 et tw=99: + * + * Tests for operators and implicit type conversion. + */ + +#include "tests.h" + +static JSBool +my_convert(JSContext* context, JSObject* obj, JSType type, jsval* rval) +{ + if (type == JSTYPE_VOID || type == JSTYPE_STRING || type == JSTYPE_NUMBER || type == JSTYPE_BOOLEAN) + return JS_NewNumberValue(context, 123, rval); + return JS_FALSE; +} + +static JSClass myClass = { + "MyClass", + 0, + JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, + JS_EnumerateStub, JS_ResolveStub, my_convert, JS_FinalizeStub, + JSCLASS_NO_OPTIONAL_MEMBERS +}; + +static JSBool +createMyObject(JSContext* context, JSObject* obj, uintN argc, jsval *argv, jsval* rval) +{ + JS_BeginRequest(context); + + //JS_GC(context); //<- if we make GC here, all is ok + + JSObject* myObject = JS_NewObject(context, &myClass, NULL, NULL); + *rval = OBJECT_TO_JSVAL(myObject); + + JS_EndRequest(context); + + return JS_TRUE; +} + +static JSFunctionSpec s_functions[] = +{ + { "createMyObject", createMyObject, 0 }, + { 0,0,0,0,0 } +}; + +BEGIN_TEST(testOps_bug559006) +{ + CHECK(JS_DefineFunctions(cx, global, s_functions)); + + EXEC("function main() { while(1) return 0 + createMyObject(); }"); + + for (int i = 0; i < 9; i++) { + jsvalRoot rval(cx); + CHECK(JS_CallFunctionName(cx, global, "main", 0, NULL, rval.addr())); + CHECK_SAME(rval, INT_TO_JSVAL(123)); + } + return true; +} +END_TEST(testOps_bug559006) +