Index: test/cctest/test-api.cc |
diff --git a/test/cctest/test-api.cc b/test/cctest/test-api.cc |
index c7e9432c5211a5d4ba4048986fecc78eda12e3b4..e2a7fb1856c7c97398fa8e932652fbd275b295bf 100644 |
--- a/test/cctest/test-api.cc |
+++ b/test/cctest/test-api.cc |
@@ -1050,8 +1050,10 @@ THREADED_TEST(Date) { |
v8::HandleScope scope; |
LocalContext env; |
double PI = 3.1415926; |
- Local<Value> date_obj = v8::Date::New(PI); |
- CHECK_EQ(3.0, date_obj->NumberValue()); |
+ Local<Value> date = v8::Date::New(PI); |
+ CHECK_EQ(3.0, date->NumberValue()); |
+ date.As<v8::Date>()->Set(v8_str("property"), v8::Integer::New(42)); |
+ CHECK_EQ(42, date.As<v8::Date>()->Get(v8_str("property"))->Int32Value()); |
} |
@@ -6960,111 +6962,50 @@ THREADED_TEST(CallAsFunction) { |
v8::HandleScope scope; |
LocalContext context; |
- { Local<v8::FunctionTemplate> t = v8::FunctionTemplate::New(); |
- Local<ObjectTemplate> instance_template = t->InstanceTemplate(); |
- instance_template->SetCallAsFunctionHandler(call_as_function); |
- Local<v8::Object> instance = t->GetFunction()->NewInstance(); |
- context->Global()->Set(v8_str("obj"), instance); |
- v8::TryCatch try_catch; |
- Local<Value> value; |
- CHECK(!try_catch.HasCaught()); |
- |
- value = CompileRun("obj(42)"); |
- CHECK(!try_catch.HasCaught()); |
- CHECK_EQ(42, value->Int32Value()); |
- |
- value = CompileRun("(function(o){return o(49)})(obj)"); |
- CHECK(!try_catch.HasCaught()); |
- CHECK_EQ(49, value->Int32Value()); |
- |
- // test special case of call as function |
- value = CompileRun("[obj]['0'](45)"); |
- CHECK(!try_catch.HasCaught()); |
- CHECK_EQ(45, value->Int32Value()); |
- |
- value = CompileRun("obj.call = Function.prototype.call;" |
- "obj.call(null, 87)"); |
- CHECK(!try_catch.HasCaught()); |
- CHECK_EQ(87, value->Int32Value()); |
- |
- // Regression tests for bug #1116356: Calling call through call/apply |
- // must work for non-function receivers. |
- const char* apply_99 = "Function.prototype.call.apply(obj, [this, 99])"; |
- value = CompileRun(apply_99); |
- CHECK(!try_catch.HasCaught()); |
- CHECK_EQ(99, value->Int32Value()); |
- |
- const char* call_17 = "Function.prototype.call.call(obj, this, 17)"; |
- value = CompileRun(call_17); |
- CHECK(!try_catch.HasCaught()); |
- CHECK_EQ(17, value->Int32Value()); |
+ Local<v8::FunctionTemplate> t = v8::FunctionTemplate::New(); |
+ Local<ObjectTemplate> instance_template = t->InstanceTemplate(); |
+ instance_template->SetCallAsFunctionHandler(call_as_function); |
+ Local<v8::Object> instance = t->GetFunction()->NewInstance(); |
+ context->Global()->Set(v8_str("obj"), instance); |
+ v8::TryCatch try_catch; |
+ Local<Value> value; |
+ CHECK(!try_catch.HasCaught()); |
- // Check that the call-as-function handler can be called through |
- // new. |
- value = CompileRun("new obj(43)"); |
- CHECK(!try_catch.HasCaught()); |
- CHECK_EQ(-43, value->Int32Value()); |
+ value = CompileRun("obj(42)"); |
+ CHECK(!try_catch.HasCaught()); |
+ CHECK_EQ(42, value->Int32Value()); |
- // Check that the call-as-function handler can be called through |
- // the API. |
- v8::Handle<Value> args[] = { v8_num(28) }; |
- value = instance->CallAsFunction(instance, 1, args); |
- CHECK(!try_catch.HasCaught()); |
- CHECK_EQ(28, value->Int32Value()); |
- } |
+ value = CompileRun("(function(o){return o(49)})(obj)"); |
+ CHECK(!try_catch.HasCaught()); |
+ CHECK_EQ(49, value->Int32Value()); |
- { Local<v8::FunctionTemplate> t = v8::FunctionTemplate::New(); |
- Local<ObjectTemplate> instance_template = t->InstanceTemplate(); |
- Local<v8::Object> instance = t->GetFunction()->NewInstance(); |
- context->Global()->Set(v8_str("obj2"), instance); |
- v8::TryCatch try_catch; |
- Local<Value> value; |
- CHECK(!try_catch.HasCaught()); |
+ // test special case of call as function |
+ value = CompileRun("[obj]['0'](45)"); |
+ CHECK(!try_catch.HasCaught()); |
+ CHECK_EQ(45, value->Int32Value()); |
- // Call an object without call-as-function handler through the JS |
- value = CompileRun("obj2(28)"); |
- CHECK(value.IsEmpty()); |
- CHECK(try_catch.HasCaught()); |
- String::AsciiValue exception_value1(try_catch.Exception()); |
- CHECK_EQ(*exception_value1, |
- "TypeError: Property 'obj2' of object " |
- "#<Object> is not a function"); |
- try_catch.Reset(); |
- |
- // Call an object without call-as-function handler through the API |
- value = CompileRun("obj2(28)"); |
- v8::Handle<Value> args[] = { v8_num(28) }; |
- value = instance->CallAsFunction(instance, 1, args); |
- CHECK(value.IsEmpty()); |
- CHECK(try_catch.HasCaught()); |
- String::AsciiValue exception_value2(try_catch.Exception()); |
- CHECK_EQ(*exception_value2, "TypeError: [object Object] is not a function"); |
- try_catch.Reset(); |
- } |
+ value = CompileRun("obj.call = Function.prototype.call;" |
+ "obj.call(null, 87)"); |
+ CHECK(!try_catch.HasCaught()); |
+ CHECK_EQ(87, value->Int32Value()); |
- { Local<v8::FunctionTemplate> t = v8::FunctionTemplate::New(); |
- Local<ObjectTemplate> instance_template = t->InstanceTemplate(); |
- instance_template->SetCallAsFunctionHandler(ThrowValue); |
- Local<v8::Object> instance = t->GetFunction()->NewInstance(); |
- context->Global()->Set(v8_str("obj3"), instance); |
- v8::TryCatch try_catch; |
- Local<Value> value; |
- CHECK(!try_catch.HasCaught()); |
+ // Regression tests for bug #1116356: Calling call through call/apply |
+ // must work for non-function receivers. |
+ const char* apply_99 = "Function.prototype.call.apply(obj, [this, 99])"; |
+ value = CompileRun(apply_99); |
+ CHECK(!try_catch.HasCaught()); |
+ CHECK_EQ(99, value->Int32Value()); |
- // Catch the exception which is thrown by call-as-function handler |
- value = CompileRun("obj3(22)"); |
- CHECK(try_catch.HasCaught()); |
- String::AsciiValue exception_value1(try_catch.Exception()); |
- CHECK_EQ(*exception_value1, "22"); |
- try_catch.Reset(); |
+ const char* call_17 = "Function.prototype.call.call(obj, this, 17)"; |
+ value = CompileRun(call_17); |
+ CHECK(!try_catch.HasCaught()); |
+ CHECK_EQ(17, value->Int32Value()); |
- v8::Handle<Value> args[] = { v8_num(23) }; |
- value = instance->CallAsFunction(instance, 1, args); |
- CHECK(try_catch.HasCaught()); |
- String::AsciiValue exception_value2(try_catch.Exception()); |
- CHECK_EQ(*exception_value2, "23"); |
- try_catch.Reset(); |
- } |
+ // Check that the call-as-function handler can be called through |
+ // new. |
+ value = CompileRun("new obj(43)"); |
+ CHECK(!try_catch.HasCaught()); |
+ CHECK_EQ(-43, value->Int32Value()); |
} |
@@ -13801,6 +13742,11 @@ TEST(RegExp) { |
context->Global()->Set(v8_str("re"), re); |
ExpectTrue("re.test('FoobarbaZ')"); |
+ // RegExps are objects on which you can set properties. |
+ re->Set(v8_str("property"), v8::Integer::New(32)); |
+ v8::Handle<v8::Value> value = CompileRun("re.property"); |
+ ASSERT_EQ(32, value->Int32Value()); |
+ |
v8::TryCatch try_catch; |
re = v8::RegExp::New(v8_str("foo["), v8::RegExp::kNone); |
CHECK(re.IsEmpty()); |