Index: test/cctest/test-api-fast-accessor-builder.cc |
diff --git a/test/cctest/test-api-fast-accessor-builder.cc b/test/cctest/test-api-fast-accessor-builder.cc |
index 1e1c972694446cb304a69e82b35241ca3fac0704..9cadc28df1ff3be8475eb904f231fb4ebd23a359 100644 |
--- a/test/cctest/test-api-fast-accessor-builder.cc |
+++ b/test/cctest/test-api-fast-accessor-builder.cc |
@@ -51,9 +51,9 @@ namespace { |
"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" \ |
"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" \ |
"*/ " // 16 lines * 64 'X' =~ 1024 character comment. |
-#define FN_WARMUP(name, src) \ |
- "function " name "() { " src INLINE_SPOILER \ |
- " }; for(i = 0; i < 2; i++) { " name "() } " |
+#define FN(name, src) "function " name "() { " src INLINE_SPOILER " }" |
+#define WARMUP(name, count) "for(i = 0; i < " count "; i++) { " name "() } " |
+#define FN_WARMUP(name, src) FN(name, src) "; " WARMUP(name, "2") |
static void NativePropertyAccessor( |
const v8::FunctionCallbackInfo<v8::Value>& info) { |
@@ -286,3 +286,67 @@ TEST(FastAccessorLoad) { |
CompileRun(FN_WARMUP("loadval", "return obj.loadval")); |
ExpectString("loadval()", "Hello"); |
} |
+ |
+ |
+void ApiCallbackInt(const v8::FunctionCallbackInfo<v8::Value>& info) { |
+ info.GetReturnValue().Set(12345); |
+} |
+ |
+const char* kApiCallbackStringValue = |
+ "Hello World! Bizarro C++ world, actually."; |
+void ApiCallbackString(const v8::FunctionCallbackInfo<v8::Value>& info) { |
+ info.GetReturnValue().Set(v8_str(kApiCallbackStringValue)); |
+} |
+ |
+ |
+void ApiCallbackParam(const v8::FunctionCallbackInfo<v8::Value>& info) { |
+ CHECK_EQ(1, info.Length()); |
+ CHECK(info[0]->IsNumber()); |
+ info.GetReturnValue().Set(info[0]); |
+} |
+ |
+ |
+// "Fast" accessor, callback to embedder |
+TEST(FastAccessorCallback) { |
+ LocalContext env; |
+ v8::Isolate* isolate = env->GetIsolate(); |
+ v8::HandleScope scope(isolate); |
+ |
+ v8::Local<v8::ObjectTemplate> foo = v8::ObjectTemplate::New(isolate); |
+ { |
+ auto builder = v8::experimental::FastAccessorBuilder::New(isolate); |
+ builder->ReturnValue( |
+ builder->Call(&ApiCallbackInt, builder->IntegerConstant(999))); |
+ foo->SetAccessorProperty(v8_str("int"), |
+ v8::FunctionTemplate::NewWithFastHandler( |
+ isolate, NativePropertyAccessor, builder)); |
+ |
+ builder = v8::experimental::FastAccessorBuilder::New(isolate); |
+ builder->ReturnValue( |
+ builder->Call(&ApiCallbackString, builder->IntegerConstant(0))); |
+ foo->SetAccessorProperty(v8_str("str"), |
+ v8::FunctionTemplate::NewWithFastHandler( |
+ isolate, NativePropertyAccessor, builder)); |
+ |
+ builder = v8::experimental::FastAccessorBuilder::New(isolate); |
+ builder->ReturnValue( |
+ builder->Call(&ApiCallbackParam, builder->IntegerConstant(1000))); |
+ foo->SetAccessorProperty(v8_str("param"), |
+ v8::FunctionTemplate::NewWithFastHandler( |
+ isolate, NativePropertyAccessor, builder)); |
+ } |
+ |
+ // Create an instance. |
+ v8::Local<v8::Object> obj = foo->NewInstance(env.local()).ToLocalChecked(); |
+ CHECK(env->Global()->Set(env.local(), v8_str("obj"), obj).FromJust()); |
+ |
+ // Callbacks: |
+ CompileRun(FN_WARMUP("callbackint", "return obj.int")); |
+ ExpectInt32("callbackint()", 12345); |
+ |
+ CompileRun(FN_WARMUP("callbackstr", "return obj.str")); |
+ ExpectString("callbackstr()", kApiCallbackStringValue); |
+ |
+ CompileRun(FN_WARMUP("callbackparam", "return obj.param")); |
+ ExpectInt32("callbackparam()", 1000); |
+} |