| Index: test/cctest/test-api.cc
|
| ===================================================================
|
| --- test/cctest/test-api.cc (revision 10404)
|
| +++ test/cctest/test-api.cc (working copy)
|
| @@ -1,4 +1,4 @@
|
| -// Copyright 2011 the V8 project authors. All rights reserved.
|
| +// Copyright 2012 the V8 project authors. All rights reserved.
|
| // Redistribution and use in source and binary forms, with or without
|
| // modification, are permitted provided that the following conditions are
|
| // met:
|
| @@ -2867,6 +2867,16 @@
|
| obj = env->Global()->Get(v8_str("obj"));
|
| CHECK(!obj->IsInt32());
|
| CHECK(!obj->IsUint32());
|
| + // Positive zero
|
| + CompileRun("var obj = 0.0;");
|
| + obj = env->Global()->Get(v8_str("obj"));
|
| + CHECK(obj->IsInt32());
|
| + CHECK(obj->IsUint32());
|
| + // Positive zero
|
| + CompileRun("var obj = -0.0;");
|
| + obj = env->Global()->Get(v8_str("obj"));
|
| + CHECK(!obj->IsInt32());
|
| + CHECK(!obj->IsUint32());
|
| }
|
|
|
|
|
| @@ -7941,7 +7951,7 @@
|
| other->SetSecurityToken(token);
|
| current->SetSecurityToken(token);
|
|
|
| - // Setup reference from current to other.
|
| + // Set up reference from current to other.
|
| current->Global()->Set(v8_str("other"), other->Global());
|
|
|
| // Check that new variables are introduced in other context.
|
| @@ -8021,7 +8031,7 @@
|
| v8::Persistent<Context> context0 = Context::New();
|
| v8::Persistent<Context> context1 = Context::New();
|
|
|
| - // Setup function in context0 that uses eval from context0.
|
| + // Set up function in context0 that uses eval from context0.
|
| context0->Enter();
|
| v8::Handle<v8::Value> fun =
|
| CompileRun("var x = 42;"
|
| @@ -8059,7 +8069,7 @@
|
| other->SetSecurityToken(token);
|
| current->SetSecurityToken(token);
|
|
|
| - // Setup reference from current to other.
|
| + // Set up reference from current to other.
|
| current->Global()->Set(v8_str("other"), other->Global());
|
|
|
| // Trigger lazy loading in other context.
|
| @@ -10170,7 +10180,7 @@
|
| static unsigned linear_congruential_generator;
|
|
|
|
|
| -void ApiTestFuzzer::Setup(PartOfTest part) {
|
| +void ApiTestFuzzer::SetUp(PartOfTest part) {
|
| linear_congruential_generator = i::FLAG_testing_prng_seed;
|
| fuzzing_ = true;
|
| int count = RegisterThreadedTest::count();
|
| @@ -10234,25 +10244,25 @@
|
|
|
| // Lets not be needlessly self-referential.
|
| TEST(Threading) {
|
| - ApiTestFuzzer::Setup(ApiTestFuzzer::FIRST_PART);
|
| + ApiTestFuzzer::SetUp(ApiTestFuzzer::FIRST_PART);
|
| ApiTestFuzzer::RunAllTests();
|
| ApiTestFuzzer::TearDown();
|
| }
|
|
|
| TEST(Threading2) {
|
| - ApiTestFuzzer::Setup(ApiTestFuzzer::SECOND_PART);
|
| + ApiTestFuzzer::SetUp(ApiTestFuzzer::SECOND_PART);
|
| ApiTestFuzzer::RunAllTests();
|
| ApiTestFuzzer::TearDown();
|
| }
|
|
|
| TEST(Threading3) {
|
| - ApiTestFuzzer::Setup(ApiTestFuzzer::THIRD_PART);
|
| + ApiTestFuzzer::SetUp(ApiTestFuzzer::THIRD_PART);
|
| ApiTestFuzzer::RunAllTests();
|
| ApiTestFuzzer::TearDown();
|
| }
|
|
|
| TEST(Threading4) {
|
| - ApiTestFuzzer::Setup(ApiTestFuzzer::FOURTH_PART);
|
| + ApiTestFuzzer::SetUp(ApiTestFuzzer::FOURTH_PART);
|
| ApiTestFuzzer::RunAllTests();
|
| ApiTestFuzzer::TearDown();
|
| }
|
| @@ -12111,7 +12121,7 @@
|
| callback_templ->GetFunction());
|
| calling_context0->Exit();
|
|
|
| - // Expose context0 in context1 and setup a function that calls the
|
| + // Expose context0 in context1 and set up a function that calls the
|
| // callback function.
|
| calling_context1->Enter();
|
| calling_context1->Global()->Set(v8_str("context0"),
|
| @@ -12269,18 +12279,18 @@
|
|
|
| i::Handle<i::Smi> value(i::Smi::FromInt(2));
|
| i::Handle<i::Object> no_failure;
|
| - no_failure = i::SetElement(jsobj, 1, value, i::kNonStrictMode);
|
| + no_failure = i::JSObject::SetElement(jsobj, 1, value, i::kNonStrictMode);
|
| ASSERT(!no_failure.is_null());
|
| i::USE(no_failure);
|
| CHECK_EQ(2, i::Smi::cast(jsobj->GetElement(1)->ToObjectChecked())->value());
|
| *value.location() = i::Smi::FromInt(256);
|
| - no_failure = i::SetElement(jsobj, 1, value, i::kNonStrictMode);
|
| + no_failure = i::JSObject::SetElement(jsobj, 1, value, i::kNonStrictMode);
|
| ASSERT(!no_failure.is_null());
|
| i::USE(no_failure);
|
| CHECK_EQ(255,
|
| i::Smi::cast(jsobj->GetElement(1)->ToObjectChecked())->value());
|
| *value.location() = i::Smi::FromInt(-1);
|
| - no_failure = i::SetElement(jsobj, 1, value, i::kNonStrictMode);
|
| + no_failure = i::JSObject::SetElement(jsobj, 1, value, i::kNonStrictMode);
|
| ASSERT(!no_failure.is_null());
|
| i::USE(no_failure);
|
| CHECK_EQ(0, i::Smi::cast(jsobj->GetElement(1)->ToObjectChecked())->value());
|
| @@ -13549,21 +13559,24 @@
|
| // Test that idle notification can be handled and eventually returns true.
|
| // This just checks the contract of the IdleNotification() function,
|
| // and does not verify that it does reasonable work.
|
| -THREADED_TEST(IdleNotificationWithHint) {
|
| +TEST(IdleNotificationWithHint) {
|
| v8::HandleScope scope;
|
| LocalContext env;
|
| - CompileRun("function binom(n, m) {"
|
| - " var C = [[1]];"
|
| - " for (var i = 1; i <= n; ++i) {"
|
| - " C[i] = [1];"
|
| - " for (var j = 1; j < i; ++j) {"
|
| - " C[i][j] = C[i-1][j-1] + C[i-1][j];"
|
| - " }"
|
| - " C[i][i] = 1;"
|
| - " }"
|
| - " return C[n][m];"
|
| - "};"
|
| - "binom(1000, 500)");
|
| + {
|
| + i::AlwaysAllocateScope always_allocate;
|
| + CompileRun("function binom(n, m) {"
|
| + " var C = [[1]];"
|
| + " for (var i = 1; i <= n; ++i) {"
|
| + " C[i] = [1];"
|
| + " for (var j = 1; j < i; ++j) {"
|
| + " C[i][j] = C[i-1][j-1] + C[i-1][j];"
|
| + " }"
|
| + " C[i][i] = 1;"
|
| + " }"
|
| + " return C[n][m];"
|
| + "};"
|
| + "binom(1000, 500)");
|
| + }
|
| bool rv = false;
|
| intptr_t old_size = HEAP->SizeOfObjects();
|
| bool no_idle_work = v8::V8::IdleNotification(10);
|
| @@ -13665,6 +13678,59 @@
|
| }
|
|
|
|
|
| +class VisitorImpl : public v8::ExternalResourceVisitor {
|
| + public:
|
| + VisitorImpl(TestResource* r1, TestResource* r2)
|
| + : resource1_(r1),
|
| + resource2_(r2),
|
| + found_resource1_(false),
|
| + found_resource2_(false) {}
|
| + virtual ~VisitorImpl() {}
|
| + virtual void VisitExternalString(v8::Handle<v8::String> string) {
|
| + if (!string->IsExternal()) {
|
| + CHECK(string->IsExternalAscii());
|
| + return;
|
| + }
|
| + v8::String::ExternalStringResource* resource =
|
| + string->GetExternalStringResource();
|
| + CHECK(resource);
|
| + if (resource1_ == resource) {
|
| + CHECK(!found_resource1_);
|
| + found_resource1_ = true;
|
| + }
|
| + if (resource2_ == resource) {
|
| + CHECK(!found_resource2_);
|
| + found_resource2_ = true;
|
| + }
|
| + }
|
| + void CheckVisitedResources() {
|
| + CHECK(found_resource1_);
|
| + CHECK(found_resource2_);
|
| + }
|
| +
|
| + private:
|
| + v8::String::ExternalStringResource* resource1_;
|
| + v8::String::ExternalStringResource* resource2_;
|
| + bool found_resource1_;
|
| + bool found_resource2_;
|
| +};
|
| +
|
| +TEST(VisitExternalStrings) {
|
| + v8::HandleScope scope;
|
| + LocalContext env;
|
| + const char* string = "Some string";
|
| + uint16_t* two_byte_string = AsciiToTwoByteString(string);
|
| + TestResource* resource1 = new TestResource(two_byte_string);
|
| + v8::Local<v8::String> string1 = v8::String::NewExternal(resource1);
|
| + TestResource* resource2 = new TestResource(two_byte_string);
|
| + v8::Local<v8::String> string2 = v8::String::NewExternal(resource2);
|
| +
|
| + VisitorImpl visitor(resource1, resource2);
|
| + v8::V8::VisitExternalResources(&visitor);
|
| + visitor.CheckVisitedResources();
|
| +}
|
| +
|
| +
|
| static double DoubleFromBits(uint64_t value) {
|
| double target;
|
| memcpy(&target, &value, sizeof(target));
|
|
|