• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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
3 // found in the LICENSE file.
4 
5 #include "src/bootstrapper.h"
6 #include "src/code-stubs.h"
7 #include "src/compiler/common-operator.h"
8 #include "src/compiler/graph.h"
9 #include "src/compiler/js-graph.h"
10 #include "src/compiler/js-operator.h"
11 #include "src/compiler/linkage.h"
12 #include "src/compiler/machine-operator.h"
13 #include "src/compiler/pipeline.h"
14 #include "src/parsing/parser.h"
15 #include "test/cctest/compiler/function-tester.h"
16 
17 namespace v8 {
18 namespace internal {
19 namespace compiler {
20 
21 
TEST(RunStringLengthStub)22 TEST(RunStringLengthStub) {
23   HandleAndZoneScope scope;
24   Isolate* isolate = scope.main_isolate();
25   Zone* zone = scope.main_zone();
26 
27   // Create code and an accompanying descriptor.
28   StringLengthStub stub(isolate);
29   Handle<Code> code = stub.GenerateCode();
30   CompilationInfo info(&stub, isolate, zone);
31   CallDescriptor* descriptor = Linkage::ComputeIncoming(zone, &info);
32 
33   // Create a function to call the code using the descriptor.
34   Graph graph(zone);
35   CommonOperatorBuilder common(zone);
36   // FunctionTester (ab)uses a 4-argument function
37   Node* start = graph.NewNode(common.Start(6));
38   // Parameter 0 is the receiver
39   Node* receiverParam = graph.NewNode(common.Parameter(1), start);
40   Node* nameParam = graph.NewNode(common.Parameter(2), start);
41   Node* slotParam = graph.NewNode(common.Parameter(3), start);
42   Node* vectorParam = graph.NewNode(common.Parameter(4), start);
43   Node* theCode = graph.NewNode(common.HeapConstant(code));
44   Node* dummyContext = graph.NewNode(common.NumberConstant(0.0));
45   Node* call =
46       graph.NewNode(common.Call(descriptor), theCode, receiverParam, nameParam,
47                     slotParam, vectorParam, dummyContext, start, start);
48   Node* ret = graph.NewNode(common.Return(), call, call, start);
49   Node* end = graph.NewNode(common.End(1), ret);
50   graph.SetStart(start);
51   graph.SetEnd(end);
52   FunctionTester ft(&graph, 4);
53 
54   // Actuall call through to the stub, verifying its result.
55   const char* testString = "Und das Lamm schrie HURZ!";
56   Handle<JSReceiver> receiverArg =
57       Object::ToObject(isolate, ft.Val(testString)).ToHandleChecked();
58   Handle<String> nameArg = ft.Val("length");
59   Handle<Object> slot = ft.Val(0.0);
60   Handle<Object> vector = ft.Val(0.0);
61   Handle<Object> result =
62       ft.Call(receiverArg, nameArg, slot, vector).ToHandleChecked();
63   CHECK_EQ(static_cast<int>(strlen(testString)), Smi::cast(*result)->value());
64 }
65 
66 
67 }  // namespace compiler
68 }  // namespace internal
69 }  // namespace v8
70