Index: src/ffi/ffi-compiler.cc |
diff --git a/src/ffi/ffi-compiler.cc b/src/ffi/ffi-compiler.cc |
index 49d18b0f0e7b2463a14991e69dc9296b787b4208..d6c4771843d68023493ffb33ac95922d33802801 100644 |
--- a/src/ffi/ffi-compiler.cc |
+++ b/src/ffi/ffi-compiler.cc |
@@ -35,23 +35,50 @@ class FFIAssembler : public CodeStubAssembler { |
public: |
explicit FFIAssembler(CodeAssemblerState* state) : CodeStubAssembler(state) {} |
- Node* ToJS(Node* node, Node* context, MachineType type) { |
+ Node* ToJS(Node* node, Node* context, FFIType type) { |
+ switch (type) { |
+ case FFIType::kInt32: |
+ return ChangeInt32ToTagged(node); |
+ } |
UNREACHABLE(); |
- // TODO(mattloring): Needs to be implemented. |
return nullptr; |
} |
- Node* FromJS(Node* node, Node* context, MachineType type) { |
+ Node* FromJS(Node* node, Node* context, FFIType type) { |
+ switch (type) { |
+ case FFIType::kInt32: |
+ return TruncateTaggedToWord32(context, node); |
+ } |
UNREACHABLE(); |
- // TODO(mattloring): Needs to be implemented. |
return nullptr; |
} |
+ MachineType FFIToMachineType(FFIType type) { |
+ switch (type) { |
+ case FFIType::kInt32: |
+ return MachineType::Int32(); |
+ } |
+ UNREACHABLE(); |
+ return MachineType::None(); |
+ } |
+ |
+ Signature<MachineType>* FFIToMachineSignature(FFISignature* sig) { |
+ Signature<MachineType>::Builder sig_builder(zone(), sig->return_count(), |
+ sig->parameter_count()); |
+ for (size_t i = 0; i < sig->return_count(); i++) { |
+ sig_builder.AddReturn(FFIToMachineType(sig->GetReturn(i))); |
+ } |
+ for (size_t j = 0; j < sig->parameter_count(); j++) { |
+ sig_builder.AddParam(FFIToMachineType(sig->GetParam(j))); |
+ } |
+ return sig_builder.Build(); |
+ } |
+ |
void GenerateJSToNativeWrapper(NativeFunction* func) { |
int params = static_cast<int>(func->sig->parameter_count()); |
int returns = static_cast<int>(func->sig->return_count()); |
ApiFunction api_func(func->start); |
- ExternalReference ref(&api_func, ExternalReference::DIRECT_API_CALL, |
+ ExternalReference ref(&api_func, ExternalReference::BUILTIN_CALL, |
isolate()); |
Node* context_param = GetJSContextParameter(); |
@@ -64,7 +91,8 @@ class FFIAssembler : public CodeStubAssembler { |
FromJS(Parameter(i), context_param, func->sig->GetParam(i)); |
} |
- Node* call = CallCFunctionN(func->sig, input_count, inputs); |
+ Node* call = |
+ CallCFunctionN(FFIToMachineSignature(func->sig), input_count, inputs); |
Node* return_val = UndefinedConstant(); |
if (returns == 1) { |
return_val = ToJS(call, context_param, func->sig->GetReturn()); |
@@ -79,7 +107,7 @@ Handle<JSFunction> CompileJSToNativeWrapper(Isolate* isolate, |
int params = static_cast<int>(func.sig->parameter_count()); |
Zone zone(isolate->allocator(), ZONE_NAME); |
CodeAssemblerState state(isolate, &zone, params, |
- Code::ComputeFlags(Code::FUNCTION), "js-to-native"); |
+ Code::ComputeFlags(Code::BUILTIN), "js-to-native"); |
FFIAssembler assembler(&state); |
assembler.GenerateJSToNativeWrapper(&func); |
Handle<Code> code = assembler.GenerateCode(&state); |