Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(657)

Side by Side Diff: src/ffi/ffi-compiler.cc

Issue 2639163004: [ffi] Translation + test for int32 (Closed)
Patch Set: Arm fixes Created 3 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/ffi/ffi-compiler.h ('k') | test/cctest/ffi/test-ffi.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2017 the V8 project authors. All rights reserved. 1 // Copyright 2017 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/ffi/ffi-compiler.h" 5 #include "src/ffi/ffi-compiler.h"
6 #include "src/api.h" 6 #include "src/api.h"
7 #include "src/code-factory.h" 7 #include "src/code-factory.h"
8 8
9 namespace v8 { 9 namespace v8 {
10 namespace internal { 10 namespace internal {
(...skipping 17 matching lines...) Expand all
28 prev_map, instance_size, in_object_properties, unused_property_fields); 28 prev_map, instance_size, in_object_properties, unused_property_fields);
29 context->set_native_function_map(*map); 29 context->set_native_function_map(*map);
30 } 30 }
31 31
32 namespace ffi { 32 namespace ffi {
33 33
34 class FFIAssembler : public CodeStubAssembler { 34 class FFIAssembler : public CodeStubAssembler {
35 public: 35 public:
36 explicit FFIAssembler(CodeAssemblerState* state) : CodeStubAssembler(state) {} 36 explicit FFIAssembler(CodeAssemblerState* state) : CodeStubAssembler(state) {}
37 37
38 Node* ToJS(Node* node, Node* context, MachineType type) { 38 Node* ToJS(Node* node, Node* context, FFIType type) {
39 switch (type) {
40 case FFIType::kInt32:
41 return ChangeInt32ToTagged(node);
42 }
39 UNREACHABLE(); 43 UNREACHABLE();
40 // TODO(mattloring): Needs to be implemented.
41 return nullptr; 44 return nullptr;
42 } 45 }
43 46
44 Node* FromJS(Node* node, Node* context, MachineType type) { 47 Node* FromJS(Node* node, Node* context, FFIType type) {
48 switch (type) {
49 case FFIType::kInt32:
50 return TruncateTaggedToWord32(context, node);
51 }
45 UNREACHABLE(); 52 UNREACHABLE();
46 // TODO(mattloring): Needs to be implemented.
47 return nullptr; 53 return nullptr;
48 } 54 }
49 55
56 MachineType FFIToMachineType(FFIType type) {
57 switch (type) {
58 case FFIType::kInt32:
59 return MachineType::Int32();
60 }
61 UNREACHABLE();
62 return MachineType::None();
63 }
64
65 Signature<MachineType>* FFIToMachineSignature(FFISignature* sig) {
66 Signature<MachineType>::Builder sig_builder(zone(), sig->return_count(),
67 sig->parameter_count());
68 for (size_t i = 0; i < sig->return_count(); i++) {
69 sig_builder.AddReturn(FFIToMachineType(sig->GetReturn(i)));
70 }
71 for (size_t j = 0; j < sig->parameter_count(); j++) {
72 sig_builder.AddParam(FFIToMachineType(sig->GetParam(j)));
73 }
74 return sig_builder.Build();
75 }
76
50 void GenerateJSToNativeWrapper(NativeFunction* func) { 77 void GenerateJSToNativeWrapper(NativeFunction* func) {
51 int params = static_cast<int>(func->sig->parameter_count()); 78 int params = static_cast<int>(func->sig->parameter_count());
52 int returns = static_cast<int>(func->sig->return_count()); 79 int returns = static_cast<int>(func->sig->return_count());
53 ApiFunction api_func(func->start); 80 ApiFunction api_func(func->start);
54 ExternalReference ref(&api_func, ExternalReference::DIRECT_API_CALL, 81 ExternalReference ref(&api_func, ExternalReference::BUILTIN_CALL,
55 isolate()); 82 isolate());
56 83
57 Node* context_param = GetJSContextParameter(); 84 Node* context_param = GetJSContextParameter();
58 85
59 Node** inputs = zone()->NewArray<Node*>(params + 1); 86 Node** inputs = zone()->NewArray<Node*>(params + 1);
60 int input_count = 0; 87 int input_count = 0;
61 inputs[input_count++] = ExternalConstant(ref); 88 inputs[input_count++] = ExternalConstant(ref);
62 for (int i = 0; i < params; i++) { 89 for (int i = 0; i < params; i++) {
63 inputs[input_count++] = 90 inputs[input_count++] =
64 FromJS(Parameter(i), context_param, func->sig->GetParam(i)); 91 FromJS(Parameter(i), context_param, func->sig->GetParam(i));
65 } 92 }
66 93
67 Node* call = CallCFunctionN(func->sig, input_count, inputs); 94 Node* call =
95 CallCFunctionN(FFIToMachineSignature(func->sig), input_count, inputs);
68 Node* return_val = UndefinedConstant(); 96 Node* return_val = UndefinedConstant();
69 if (returns == 1) { 97 if (returns == 1) {
70 return_val = ToJS(call, context_param, func->sig->GetReturn()); 98 return_val = ToJS(call, context_param, func->sig->GetReturn());
71 } 99 }
72 Return(return_val); 100 Return(return_val);
73 } 101 }
74 }; 102 };
75 103
76 Handle<JSFunction> CompileJSToNativeWrapper(Isolate* isolate, 104 Handle<JSFunction> CompileJSToNativeWrapper(Isolate* isolate,
77 Handle<String> name, 105 Handle<String> name,
78 NativeFunction func) { 106 NativeFunction func) {
79 int params = static_cast<int>(func.sig->parameter_count()); 107 int params = static_cast<int>(func.sig->parameter_count());
80 Zone zone(isolate->allocator(), ZONE_NAME); 108 Zone zone(isolate->allocator(), ZONE_NAME);
81 CodeAssemblerState state(isolate, &zone, params, 109 CodeAssemblerState state(isolate, &zone, params,
82 Code::ComputeFlags(Code::FUNCTION), "js-to-native"); 110 Code::ComputeFlags(Code::BUILTIN), "js-to-native");
83 FFIAssembler assembler(&state); 111 FFIAssembler assembler(&state);
84 assembler.GenerateJSToNativeWrapper(&func); 112 assembler.GenerateJSToNativeWrapper(&func);
85 Handle<Code> code = assembler.GenerateCode(&state); 113 Handle<Code> code = assembler.GenerateCode(&state);
86 114
87 Handle<SharedFunctionInfo> shared = 115 Handle<SharedFunctionInfo> shared =
88 isolate->factory()->NewSharedFunctionInfo(name, code, false); 116 isolate->factory()->NewSharedFunctionInfo(name, code, false);
89 shared->set_length(params); 117 shared->set_length(params);
90 shared->set_internal_formal_parameter_count(params); 118 shared->set_internal_formal_parameter_count(params);
91 Handle<JSFunction> function = isolate->factory()->NewFunction( 119 Handle<JSFunction> function = isolate->factory()->NewFunction(
92 isolate->native_function_map(), name, code); 120 isolate->native_function_map(), name, code);
93 function->set_shared(*shared); 121 function->set_shared(*shared);
94 return function; 122 return function;
95 } 123 }
96 124
97 } // namespace ffi 125 } // namespace ffi
98 } // namespace internal 126 } // namespace internal
99 } // namespace v8 127 } // namespace v8
OLDNEW
« no previous file with comments | « src/ffi/ffi-compiler.h ('k') | test/cctest/ffi/test-ffi.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698