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 "src/interface-descriptors.h" | 5 #include "src/interface-descriptors.h" |
6 #include "src/isolate.h" | 6 #include "src/isolate.h" |
7 #include "test/cctest/compiler/function-tester.h" | 7 #include "test/cctest/compiler/function-tester.h" |
8 | 8 |
9 namespace v8 { | 9 namespace v8 { |
10 namespace internal { | 10 namespace internal { |
11 namespace compiler { | 11 namespace compiler { |
12 | 12 |
13 | 13 |
14 class CodeStubAssemblerTester : public CodeStubAssembler { | 14 class CodeStubAssemblerTester : public CodeStubAssembler { |
15 public: | 15 public: |
| 16 // Test generating code for a stub. |
16 CodeStubAssemblerTester(Isolate* isolate, | 17 CodeStubAssemblerTester(Isolate* isolate, |
17 const CallInterfaceDescriptor& descriptor) | 18 const CallInterfaceDescriptor& descriptor) |
18 : CodeStubAssembler(isolate, isolate->runtime_zone(), descriptor, | 19 : CodeStubAssembler(isolate, isolate->runtime_zone(), descriptor, |
19 Code::ComputeFlags(Code::STUB), "test"), | 20 Code::ComputeFlags(Code::STUB), "test"), |
20 scope_(isolate) {} | 21 scope_(isolate) {} |
21 | 22 |
| 23 // Test generating code for a JS function (e.g. builtins). |
| 24 CodeStubAssemblerTester(Isolate* isolate, int parameter_count) |
| 25 : CodeStubAssembler(isolate, isolate->runtime_zone(), parameter_count, |
| 26 Code::ComputeFlags(Code::FUNCTION), "test"), |
| 27 scope_(isolate) {} |
| 28 |
22 private: | 29 private: |
23 HandleScope scope_; | 30 HandleScope scope_; |
24 LocalContext context_; | 31 LocalContext context_; |
25 }; | 32 }; |
26 | 33 |
27 | 34 |
28 TEST(SimpleSmiReturn) { | 35 TEST(SimpleSmiReturn) { |
29 Isolate* isolate(CcTest::InitIsolateOnce()); | 36 Isolate* isolate(CcTest::InitIsolateOnce()); |
30 VoidDescriptor descriptor(isolate); | 37 VoidDescriptor descriptor(isolate); |
31 CodeStubAssemblerTester m(isolate, descriptor); | 38 CodeStubAssemblerTester m(isolate, descriptor); |
(...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
240 Handle<FixedArray> array = isolate->factory()->NewFixedArray(5); | 247 Handle<FixedArray> array = isolate->factory()->NewFixedArray(5); |
241 array->set(4, Smi::FromInt(733)); | 248 array->set(4, Smi::FromInt(733)); |
242 m.Return(m.LoadFixedArrayElementSmiIndex(m.HeapConstant(array), | 249 m.Return(m.LoadFixedArrayElementSmiIndex(m.HeapConstant(array), |
243 m.SmiTag(m.Int32Constant(4)))); | 250 m.SmiTag(m.Int32Constant(4)))); |
244 Handle<Code> code = m.GenerateCode(); | 251 Handle<Code> code = m.GenerateCode(); |
245 FunctionTester ft(descriptor, code); | 252 FunctionTester ft(descriptor, code); |
246 MaybeHandle<Object> result = ft.Call(); | 253 MaybeHandle<Object> result = ft.Call(); |
247 CHECK_EQ(733, Handle<Smi>::cast(result.ToHandleChecked())->value()); | 254 CHECK_EQ(733, Handle<Smi>::cast(result.ToHandleChecked())->value()); |
248 } | 255 } |
249 | 256 |
| 257 TEST(LoadHeapNumber) { |
| 258 Isolate* isolate(CcTest::InitIsolateOnce()); |
| 259 VoidDescriptor descriptor(isolate); |
| 260 CodeStubAssemblerTester m(isolate, descriptor); |
| 261 Handle<HeapNumber> number = isolate->factory()->NewHeapNumber(1234); |
| 262 m.Return(m.SmiTag( |
| 263 m.ChangeFloat64ToUint32(m.LoadHeapNumber(m.HeapConstant(number))))); |
| 264 Handle<Code> code = m.GenerateCode(); |
| 265 FunctionTester ft(descriptor, code); |
| 266 MaybeHandle<Object> result = ft.Call(); |
| 267 CHECK_EQ(1234, Handle<Smi>::cast(result.ToHandleChecked())->value()); |
| 268 } |
| 269 |
| 270 TEST(InstanceType) { |
| 271 Isolate* isolate(CcTest::InitIsolateOnce()); |
| 272 VoidDescriptor descriptor(isolate); |
| 273 CodeStubAssemblerTester m(isolate, descriptor); |
| 274 Handle<HeapObject> undefined = isolate->factory()->undefined_value(); |
| 275 m.Return(m.SmiTag(m.InstanceType(m.HeapConstant(undefined)))); |
| 276 Handle<Code> code = m.GenerateCode(); |
| 277 FunctionTester ft(descriptor, code); |
| 278 MaybeHandle<Object> result = ft.Call(); |
| 279 CHECK_EQ(InstanceType::ODDBALL_TYPE, |
| 280 Handle<Smi>::cast(result.ToHandleChecked())->value()); |
| 281 } |
| 282 |
| 283 namespace { |
| 284 |
| 285 class TestBitField : public BitField<unsigned, 3, 3> {}; |
| 286 |
| 287 } // namespace |
| 288 |
| 289 TEST(BitFieldValue) { |
| 290 Isolate* isolate(CcTest::InitIsolateOnce()); |
| 291 VoidDescriptor descriptor(isolate); |
| 292 CodeStubAssemblerTester m(isolate, descriptor); |
| 293 m.Return(m.SmiTag(m.BitFieldValue<TestBitField>(m.Int32Constant(0x2f)))); |
| 294 Handle<Code> code = m.GenerateCode(); |
| 295 FunctionTester ft(descriptor, code); |
| 296 MaybeHandle<Object> result = ft.Call(); |
| 297 // value = 00101111 |
| 298 // mask = 00111000 |
| 299 // result = 101 |
| 300 CHECK_EQ(5, Handle<Smi>::cast(result.ToHandleChecked())->value()); |
| 301 } |
| 302 |
| 303 namespace { |
| 304 |
| 305 Handle<JSFunction> CreateFunctionFromCode(int parameter_count_with_receiver, |
| 306 Handle<Code> code) { |
| 307 Isolate* isolate = code->GetIsolate(); |
| 308 Handle<String> name = isolate->factory()->InternalizeUtf8String("test"); |
| 309 Handle<JSFunction> function = |
| 310 isolate->factory()->NewFunctionWithoutPrototype(name, code); |
| 311 function->shared()->set_internal_formal_parameter_count( |
| 312 parameter_count_with_receiver - 1); // Implicit undefined receiver. |
| 313 return function; |
| 314 } |
| 315 |
| 316 } // namespace |
| 317 |
| 318 TEST(JSFunction) { |
| 319 const int kNumParams = 3; // Receiver, left, right. |
| 320 Isolate* isolate(CcTest::InitIsolateOnce()); |
| 321 CodeStubAssemblerTester m(isolate, kNumParams); |
| 322 m.Return(m.SmiTag( |
| 323 m.Int32Add(m.SmiUntag32(m.Parameter(1)), m.SmiUntag32(m.Parameter(2))))); |
| 324 Handle<Code> code = m.GenerateCode(); |
| 325 Handle<JSFunction> function = CreateFunctionFromCode(kNumParams, code); |
| 326 Handle<Object> args[] = {Handle<Smi>(Smi::FromInt(23), isolate), |
| 327 Handle<Smi>(Smi::FromInt(34), isolate)}; |
| 328 MaybeHandle<Object> result = |
| 329 Execution::Call(isolate, function, isolate->factory()->undefined_value(), |
| 330 arraysize(args), args); |
| 331 CHECK_EQ(57, Handle<Smi>::cast(result.ToHandleChecked())->value()); |
| 332 } |
| 333 |
250 } // namespace compiler | 334 } // namespace compiler |
251 } // namespace internal | 335 } // namespace internal |
252 } // namespace v8 | 336 } // namespace v8 |
OLD | NEW |