| // 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 "test/unittests/test-helpers.h" | 
 |  | 
 | #include "include/v8.h" | 
 | #include "src/api/api.h" | 
 | #include "src/execution/isolate.h" | 
 | #include "src/handles/handles.h" | 
 | #include "src/objects/objects-inl.h" | 
 | #include "src/objects/objects.h" | 
 | #include "src/parsing/scanner-character-streams.h" | 
 | #include "src/parsing/scanner.h" | 
 |  | 
 | namespace v8 { | 
 | namespace internal { | 
 | namespace test { | 
 |  | 
 | Handle<String> CreateSource(Isolate* isolate, | 
 |                             ExternalOneByteString::Resource* maybe_resource) { | 
 |   if (!maybe_resource) { | 
 |     static const char test_script[] = "(x) { x*x; }"; | 
 |     maybe_resource = new test::ScriptResource(test_script, strlen(test_script)); | 
 |   } | 
 |   return isolate->factory() | 
 |       ->NewExternalStringFromOneByte(maybe_resource) | 
 |       .ToHandleChecked(); | 
 | } | 
 |  | 
 | Handle<SharedFunctionInfo> CreateSharedFunctionInfo( | 
 |     Isolate* isolate, | 
 |     v8::String::ExternalOneByteStringResource* maybe_resource) { | 
 |   HandleScope scope(isolate); | 
 |   Handle<String> source = CreateSource(isolate, maybe_resource); | 
 |   Handle<Script> script = isolate->factory()->NewScript(source); | 
 |   Handle<WeakFixedArray> infos = isolate->factory()->NewWeakFixedArray(3); | 
 |   script->set_shared_function_infos(*infos); | 
 |   Handle<SharedFunctionInfo> shared = | 
 |       isolate->factory()->NewSharedFunctionInfoForBuiltin( | 
 |           isolate->factory()->NewStringFromAsciiChecked("f"), | 
 |           Builtins::kCompileLazy); | 
 |   int function_literal_id = 1; | 
 |   shared->set_function_literal_id(function_literal_id); | 
 |   // Ensure that the function can be compiled lazily. | 
 |   shared->set_uncompiled_data( | 
 |       *isolate->factory()->NewUncompiledDataWithoutPreparseData( | 
 |           ReadOnlyRoots(isolate).empty_string_handle(), 0, source->length())); | 
 |   // Make sure we have an outer scope info, even though it's empty | 
 |   shared->set_raw_outer_scope_info_or_feedback_metadata( | 
 |       ScopeInfo::Empty(isolate)); | 
 |   shared->SetScript(ReadOnlyRoots(isolate), *script, function_literal_id); | 
 |   return scope.CloseAndEscape(shared); | 
 | } | 
 |  | 
 | std::unique_ptr<ParseInfo> OuterParseInfoForShared( | 
 |     Isolate* isolate, Handle<SharedFunctionInfo> shared, | 
 |     UnoptimizedCompileState* state) { | 
 |   Script script = Script::cast(shared->script()); | 
 |   std::unique_ptr<ParseInfo> result = std::make_unique<ParseInfo>( | 
 |       isolate, i::UnoptimizedCompileFlags::ForScriptCompile(isolate, script), | 
 |       state); | 
 |  | 
 |   // Create a character stream to simulate the parser having done so for the | 
 |   // top-level ParseProgram. | 
 |   Handle<String> source(String::cast(script.source()), isolate); | 
 |   std::unique_ptr<Utf16CharacterStream> stream( | 
 |       ScannerStream::For(isolate, source)); | 
 |   result->set_character_stream(std::move(stream)); | 
 |  | 
 |   return result; | 
 | } | 
 |  | 
 | }  // namespace test | 
 | }  // namespace internal | 
 | }  // namespace v8 |