| 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 7ae089bf69cf3b52669f898f245d4c46b9a0c419..9dde2c7df856e5b0ee51b98a2be02e0b8df389e6 100644
|
| --- a/test/cctest/test-api-fast-accessor-builder.cc
|
| +++ b/test/cctest/test-api-fast-accessor-builder.cc
|
| @@ -400,3 +400,92 @@ TEST(FastAccessorCallback) {
|
| CompileRun(FN_WARMUP("callbackparam", "return obj.param"));
|
| ExpectInt32("callbackparam()", 1000);
|
| }
|
| +
|
| +TEST(FastAccessorToSmi) {
|
| + // Crankshaft support for fast accessors is not implemented; crankshafted
|
| + // code uses the slow accessor which breaks this test's expectations.
|
| + v8::internal::FLAG_always_opt = false;
|
| + LocalContext env;
|
| + v8::Isolate* isolate = env->GetIsolate();
|
| + v8::HandleScope scope(isolate);
|
| +
|
| + v8::Local<v8::ObjectTemplate> foo = v8::ObjectTemplate::New(isolate);
|
| + foo->SetInternalFieldCount(1);
|
| +
|
| + {
|
| + // Accessor load_smi.
|
| + auto builder = v8::experimental::FastAccessorBuilder::New(isolate);
|
| +
|
| + // Read the variable and convert it to a Smi.
|
| + auto flags = builder->LoadValue(
|
| + builder->LoadInternalField(builder->GetReceiver(), 0), 0);
|
| + builder->ReturnValue(builder->ToSmi(flags));
|
| + foo->SetAccessorProperty(v8_str("load_smi"),
|
| + v8::FunctionTemplate::NewWithFastHandler(
|
| + isolate, NativePropertyAccessor, builder));
|
| + }
|
| +
|
| + // Create an instance.
|
| + v8::Local<v8::Object> obj = foo->NewInstance(env.local()).ToLocalChecked();
|
| +
|
| + uint32_t flags;
|
| + obj->SetAlignedPointerInInternalField(0, &flags);
|
| + CHECK(env->Global()->Set(env.local(), v8_str("obj"), obj).FromJust());
|
| +
|
| + // Access flags.
|
| + CompileRun(FN_WARMUP("load_smi", "return obj.load_smi"));
|
| +
|
| + flags = 54321;
|
| + ExpectInt32("load_smi()", 54321);
|
| +
|
| + flags = 0;
|
| + ExpectInt32("load_smi()", 0);
|
| +
|
| + flags = 123456789;
|
| + ExpectInt32("load_smi()", 123456789);
|
| +}
|
| +
|
| +TEST(FastAccessorGoto) {
|
| + // Crankshaft support for fast accessors is not implemented; crankshafted
|
| + // code uses the slow accessor which breaks this test's expectations.
|
| + v8::internal::FLAG_always_opt = false;
|
| + LocalContext env;
|
| + v8::Isolate* isolate = env->GetIsolate();
|
| + v8::HandleScope scope(isolate);
|
| +
|
| + v8::Local<v8::ObjectTemplate> foo = v8::ObjectTemplate::New(isolate);
|
| + foo->SetInternalFieldCount(1);
|
| +
|
| + {
|
| + auto builder = v8::experimental::FastAccessorBuilder::New(isolate);
|
| + auto successLabel = builder->MakeLabel();
|
| + auto failLabel = builder->MakeLabel();
|
| +
|
| + // The underlying raw assembler is clever enough to reject unreachable
|
| + // basic blocks, this instruction has no effect besides marking the failed
|
| + // return BB as reachable.
|
| + builder->CheckNotZeroOrJump(builder->IntegerConstant(1234), failLabel);
|
| +
|
| + builder->Goto(successLabel);
|
| +
|
| + builder->SetLabel(failLabel);
|
| + builder->ReturnValue(builder->IntegerConstant(0));
|
| +
|
| + builder->SetLabel(successLabel);
|
| + builder->ReturnValue(builder->IntegerConstant(60707357));
|
| +
|
| + foo->SetAccessorProperty(v8_str("goto_test"),
|
| + 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());
|
| +
|
| + // Access flags.
|
| + CompileRun(FN_WARMUP("test", "return obj.goto_test"));
|
| +
|
| + ExpectInt32("test()", 60707357);
|
| +}
|
|
|