| Index: test/cctest/test-api.cc
|
| ===================================================================
|
| --- test/cctest/test-api.cc (revision 3201)
|
| +++ test/cctest/test-api.cc (working copy)
|
| @@ -8610,3 +8610,41 @@
|
| }
|
| }
|
| }
|
| +
|
| +
|
| +static v8::Handle<Value> SpaghettiIncident(const v8::Arguments& args) {
|
| + v8::HandleScope scope;
|
| + v8::TryCatch tc;
|
| + v8::Handle<v8::String> str = args[0]->ToString();
|
| + if (tc.HasCaught())
|
| + return tc.ReThrow();
|
| + return v8::Undefined();
|
| +}
|
| +
|
| +
|
| +// Test that an exception can be propagated down through a spaghetti
|
| +// stack using ReThrow.
|
| +THREADED_TEST(SpaghettiStackReThrow) {
|
| + v8::HandleScope scope;
|
| + LocalContext context;
|
| + context->Global()->Set(
|
| + v8::String::New("s"),
|
| + v8::FunctionTemplate::New(SpaghettiIncident)->GetFunction());
|
| + v8::TryCatch try_catch;
|
| + CompileRun(
|
| + "var i = 0;"
|
| + "var o = {"
|
| + " toString: function () {"
|
| + " if (i == 10) {"
|
| + " throw 'Hey!';"
|
| + " } else {"
|
| + " i++;"
|
| + " return s(o);"
|
| + " }"
|
| + " }"
|
| + "};"
|
| + "s(o);");
|
| + CHECK(try_catch.HasCaught());
|
| + v8::String::Utf8Value value(try_catch.Exception());
|
| + CHECK_EQ(0, strcmp(*value, "Hey!"));
|
| +}
|
|
|