| 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);
|
|
|