// Copyright 2016 the V8 project authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "src/handles.h" #include "src/interface-descriptors.h" #include "src/isolate.h" #include "test/cctest/compiler/function-tester.h" namespace v8 { namespace internal { namespace compiler { class ZoneHolder { public: explicit ZoneHolder(Isolate* isolate) : zone_(isolate->allocator()) {} Zone* zone() { return &zone_; } private: Zone zone_; }; // Inherit from ZoneHolder in order to create a zone that can be passed to // CodeAssembler base class constructor. template class CodeAssemblerTesterImpl : private ZoneHolder, public CodeAssemblerT { public: // Test generating code for a stub. CodeAssemblerTesterImpl(Isolate* isolate, const CallInterfaceDescriptor& descriptor) : ZoneHolder(isolate), CodeAssemblerT(isolate, ZoneHolder::zone(), descriptor, Code::ComputeFlags(Code::STUB), "test"), scope_(isolate) {} // Test generating code for a JS function (e.g. builtins). CodeAssemblerTesterImpl(Isolate* isolate, int parameter_count) : ZoneHolder(isolate), CodeAssemblerT(isolate, ZoneHolder::zone(), parameter_count, Code::ComputeFlags(Code::FUNCTION), "test"), scope_(isolate) {} // This constructor is intended to be used for creating code objects with // specific flags. CodeAssemblerTesterImpl(Isolate* isolate, Code::Flags flags) : ZoneHolder(isolate), CodeAssemblerT(isolate, ZoneHolder::zone(), 0, flags, "test"), scope_(isolate) {} Handle GenerateCodeCloseAndEscape() { return scope_.CloseAndEscape(CodeAssemblerT::GenerateCode()); } // Expose some internal methods. Node* SmiShiftBitsConstant() { return CodeAssemblerT::SmiShiftBitsConstant(); } private: HandleScope scope_; LocalContext context_; }; } // namespace compiler } // namespace internal } // namespace v8