| OLD | NEW |
| 1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include <stdlib.h> | 5 #include <stdlib.h> |
| 6 | 6 |
| 7 #include "include/v8.h" | 7 #include "include/v8.h" |
| 8 #include "include/v8-experimental.h" | 8 #include "include/v8-experimental.h" |
| 9 | 9 |
| 10 #include "src/api.h" | 10 #include "src/api.h" |
| (...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 182 // CheckNotZeroOrReturnNull: | 182 // CheckNotZeroOrReturnNull: |
| 183 CompileRun(FN_WARMUP("nullcheck", "return obj.nullcheck")); | 183 CompileRun(FN_WARMUP("nullcheck", "return obj.nullcheck")); |
| 184 obj->SetAlignedPointerInInternalField(0, /* anything != nullptr */ isolate); | 184 obj->SetAlignedPointerInInternalField(0, /* anything != nullptr */ isolate); |
| 185 ExpectInt32("nullcheck()", 5); | 185 ExpectInt32("nullcheck()", 5); |
| 186 obj->SetAlignedPointerInInternalField(0, nullptr); | 186 obj->SetAlignedPointerInInternalField(0, nullptr); |
| 187 ExpectNull("nullcheck()"); | 187 ExpectNull("nullcheck()"); |
| 188 | 188 |
| 189 // CheckFlagSetOrReturnNull: | 189 // CheckFlagSetOrReturnNull: |
| 190 CompileRun(FN_WARMUP("maskcheck", "return obj.maskcheck")); | 190 CompileRun(FN_WARMUP("maskcheck", "return obj.maskcheck")); |
| 191 obj->SetAlignedPointerInInternalField(1, reinterpret_cast<void*>(0xf0)); | 191 obj->SetAlignedPointerInInternalField(1, reinterpret_cast<void*>(0xf0)); |
| 192 ExpectNull("maskcheck()"); |
| 193 obj->SetAlignedPointerInInternalField(1, reinterpret_cast<void*>(0xfe)); |
| 192 ExpectInt32("maskcheck()", 42); | 194 ExpectInt32("maskcheck()", 42); |
| 193 obj->SetAlignedPointerInInternalField(1, reinterpret_cast<void*>(0xfe)); | |
| 194 ExpectNull("maskcheck()"); | |
| 195 } | 195 } |
| 196 | 196 |
| 197 | 197 |
| 198 // "Fast" accessor with simple control flow via explicit labels. | 198 // "Fast" accessor with simple control flow via explicit labels. |
| 199 TEST(FastAccessorControlFlowWithLabels) { | 199 TEST(FastAccessorControlFlowWithLabels) { |
| 200 // Crankshaft support for fast accessors is not implemented; crankshafted | 200 // Crankshaft support for fast accessors is not implemented; crankshafted |
| 201 // code uses the slow accessor which breaks this test's expectations. | 201 // code uses the slow accessor which breaks this test's expectations. |
| 202 v8::internal::FLAG_always_opt = false; | 202 v8::internal::FLAG_always_opt = false; |
| 203 LocalContext env; | 203 LocalContext env; |
| 204 v8::Isolate* isolate = env->GetIsolate(); | 204 v8::Isolate* isolate = env->GetIsolate(); |
| 205 v8::HandleScope scope(isolate); | 205 v8::HandleScope scope(isolate); |
| 206 | 206 |
| 207 v8::Local<v8::ObjectTemplate> foo = v8::ObjectTemplate::New(isolate); | 207 v8::Local<v8::ObjectTemplate> foo = v8::ObjectTemplate::New(isolate); |
| 208 foo->SetInternalFieldCount(1); | 208 foo->SetInternalFieldCount(1); |
| 209 { | 209 { |
| 210 // accessor isnull: 0 for nullptr, else 1. | 210 // accessor isnull: 0 for nullptr, else 1. |
| 211 auto builder = v8::experimental::FastAccessorBuilder::New(isolate); | 211 auto builder = v8::experimental::FastAccessorBuilder::New(isolate); |
| 212 auto label = builder->MakeLabel(); | 212 auto label = builder->MakeLabel(); |
| 213 auto val = builder->LoadInternalField(builder->GetReceiver(), 0); | 213 auto val = builder->LoadInternalField(builder->GetReceiver(), 0); |
| 214 builder->CheckNotZeroOrJump(val, label); | 214 builder->CheckNotZeroOrJump(val, label); |
| 215 builder->ReturnValue(builder->IntegerConstant(1)); |
| 216 builder->SetLabel(label); |
| 215 builder->ReturnValue(builder->IntegerConstant(0)); | 217 builder->ReturnValue(builder->IntegerConstant(0)); |
| 216 builder->SetLabel(label); | |
| 217 builder->ReturnValue(builder->IntegerConstant(1)); | |
| 218 foo->SetAccessorProperty(v8_str("isnull"), | 218 foo->SetAccessorProperty(v8_str("isnull"), |
| 219 v8::FunctionTemplate::NewWithFastHandler( | 219 v8::FunctionTemplate::NewWithFastHandler( |
| 220 isolate, NativePropertyAccessor, builder)); | 220 isolate, NativePropertyAccessor, builder)); |
| 221 } | 221 } |
| 222 | 222 |
| 223 // Create an instance. | 223 // Create an instance. |
| 224 v8::Local<v8::Object> obj = foo->NewInstance(env.local()).ToLocalChecked(); | 224 v8::Local<v8::Object> obj = foo->NewInstance(env.local()).ToLocalChecked(); |
| 225 CHECK(env->Global()->Set(env.local(), v8_str("obj"), obj).FromJust()); | 225 CHECK(env->Global()->Set(env.local(), v8_str("obj"), obj).FromJust()); |
| 226 | 226 |
| 227 // CheckNotZeroOrReturnNull: | 227 // CheckNotZeroOrReturnNull: |
| (...skipping 27 matching lines...) Expand all Loading... |
| 255 { | 255 { |
| 256 // accessor intisnonzero | 256 // accessor intisnonzero |
| 257 int intval_offset = | 257 int intval_offset = |
| 258 static_cast<int>(reinterpret_cast<intptr_t>(&val.intval) - | 258 static_cast<int>(reinterpret_cast<intptr_t>(&val.intval) - |
| 259 reinterpret_cast<intptr_t>(&val)); | 259 reinterpret_cast<intptr_t>(&val)); |
| 260 auto builder = v8::experimental::FastAccessorBuilder::New(isolate); | 260 auto builder = v8::experimental::FastAccessorBuilder::New(isolate); |
| 261 auto label = builder->MakeLabel(); | 261 auto label = builder->MakeLabel(); |
| 262 auto val = builder->LoadValue( | 262 auto val = builder->LoadValue( |
| 263 builder->LoadInternalField(builder->GetReceiver(), 0), intval_offset); | 263 builder->LoadInternalField(builder->GetReceiver(), 0), intval_offset); |
| 264 builder->CheckNotZeroOrJump(val, label); | 264 builder->CheckNotZeroOrJump(val, label); |
| 265 builder->ReturnValue(builder->IntegerConstant(1)); |
| 266 builder->SetLabel(label); |
| 265 builder->ReturnValue(builder->IntegerConstant(0)); | 267 builder->ReturnValue(builder->IntegerConstant(0)); |
| 266 builder->SetLabel(label); | |
| 267 builder->ReturnValue(builder->IntegerConstant(1)); | |
| 268 foo->SetAccessorProperty(v8_str("nonzero"), | 268 foo->SetAccessorProperty(v8_str("nonzero"), |
| 269 v8::FunctionTemplate::NewWithFastHandler( | 269 v8::FunctionTemplate::NewWithFastHandler( |
| 270 isolate, NativePropertyAccessor, builder)); | 270 isolate, NativePropertyAccessor, builder)); |
| 271 } | 271 } |
| 272 { | 272 { |
| 273 // accessor loadval | 273 // accessor loadval |
| 274 int v8val_offset = static_cast<int>(reinterpret_cast<intptr_t>(&val.v8val) - | 274 int v8val_offset = static_cast<int>(reinterpret_cast<intptr_t>(&val.v8val) - |
| 275 reinterpret_cast<intptr_t>(&val)); | 275 reinterpret_cast<intptr_t>(&val)); |
| 276 auto builder = v8::experimental::FastAccessorBuilder::New(isolate); | 276 auto builder = v8::experimental::FastAccessorBuilder::New(isolate); |
| 277 builder->ReturnValue(builder->LoadObject( | 277 builder->ReturnValue(builder->LoadObject( |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 355 // Callbacks: | 355 // Callbacks: |
| 356 CompileRun(FN_WARMUP("callbackint", "return obj.int")); | 356 CompileRun(FN_WARMUP("callbackint", "return obj.int")); |
| 357 ExpectInt32("callbackint()", 12345); | 357 ExpectInt32("callbackint()", 12345); |
| 358 | 358 |
| 359 CompileRun(FN_WARMUP("callbackstr", "return obj.str")); | 359 CompileRun(FN_WARMUP("callbackstr", "return obj.str")); |
| 360 ExpectString("callbackstr()", kApiCallbackStringValue); | 360 ExpectString("callbackstr()", kApiCallbackStringValue); |
| 361 | 361 |
| 362 CompileRun(FN_WARMUP("callbackparam", "return obj.param")); | 362 CompileRun(FN_WARMUP("callbackparam", "return obj.param")); |
| 363 ExpectInt32("callbackparam()", 1000); | 363 ExpectInt32("callbackparam()", 1000); |
| 364 } | 364 } |
| OLD | NEW |