// Copyright 2017 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.
|
|
#ifndef V8_OBJECTS_SCRIPT_H_
|
#define V8_OBJECTS_SCRIPT_H_
|
|
#include "src/objects.h"
|
#include "src/objects/fixed-array.h"
|
|
// Has to be the last include (doesn't have include guards):
|
#include "src/objects/object-macros.h"
|
|
namespace v8 {
|
namespace internal {
|
|
// Script describes a script which has been added to the VM.
|
class Script : public Struct, public NeverReadOnlySpaceObject {
|
public:
|
using NeverReadOnlySpaceObject::GetHeap;
|
using NeverReadOnlySpaceObject::GetIsolate;
|
|
// Script types.
|
enum Type {
|
TYPE_NATIVE = 0,
|
TYPE_EXTENSION = 1,
|
TYPE_NORMAL = 2,
|
TYPE_WASM = 3,
|
TYPE_INSPECTOR = 4
|
};
|
|
// Script compilation types.
|
enum CompilationType { COMPILATION_TYPE_HOST = 0, COMPILATION_TYPE_EVAL = 1 };
|
|
// Script compilation state.
|
enum CompilationState {
|
COMPILATION_STATE_INITIAL = 0,
|
COMPILATION_STATE_COMPILED = 1
|
};
|
|
// [source]: the script source.
|
DECL_ACCESSORS(source, Object)
|
|
// [name]: the script name.
|
DECL_ACCESSORS(name, Object)
|
|
// [id]: the script id.
|
DECL_INT_ACCESSORS(id)
|
|
// [line_offset]: script line offset in resource from where it was extracted.
|
DECL_INT_ACCESSORS(line_offset)
|
|
// [column_offset]: script column offset in resource from where it was
|
// extracted.
|
DECL_INT_ACCESSORS(column_offset)
|
|
// [context_data]: context data for the context this script was compiled in.
|
DECL_ACCESSORS(context_data, Object)
|
|
// [type]: the script type.
|
DECL_INT_ACCESSORS(type)
|
|
// [line_ends]: FixedArray of line ends positions.
|
DECL_ACCESSORS(line_ends, Object)
|
|
DECL_ACCESSORS(eval_from_shared_or_wrapped_arguments, Object)
|
|
// [eval_from_shared]: for eval scripts the shared function info for the
|
// function from which eval was called.
|
DECL_ACCESSORS(eval_from_shared, SharedFunctionInfo)
|
|
// [wrapped_arguments]: for the list of arguments in a wrapped script.
|
DECL_ACCESSORS(wrapped_arguments, FixedArray)
|
|
// Whether the script is implicitly wrapped in a function.
|
inline bool is_wrapped() const;
|
|
// Whether the eval_from_shared field is set with a shared function info
|
// for the eval site.
|
inline bool has_eval_from_shared() const;
|
|
// [eval_from_position]: the source position in the code for the function
|
// from which eval was called, as positive integer. Or the code offset in the
|
// code from which eval was called, as negative integer.
|
DECL_INT_ACCESSORS(eval_from_position)
|
|
// [shared_function_infos]: weak fixed array containing all shared
|
// function infos created from this script.
|
DECL_ACCESSORS(shared_function_infos, WeakFixedArray)
|
|
// [flags]: Holds an exciting bitfield.
|
DECL_INT_ACCESSORS(flags)
|
|
// [source_url]: sourceURL from magic comment
|
DECL_ACCESSORS(source_url, Object)
|
|
// [source_mapping_url]: sourceMappingURL magic comment
|
DECL_ACCESSORS(source_mapping_url, Object)
|
|
// [wasm_module_object]: the wasm module object this script belongs to.
|
// This must only be called if the type of this script is TYPE_WASM.
|
DECL_ACCESSORS(wasm_module_object, Object)
|
|
// [host_defined_options]: Options defined by the embedder.
|
DECL_ACCESSORS(host_defined_options, FixedArray)
|
|
// [compilation_type]: how the the script was compiled. Encoded in the
|
// 'flags' field.
|
inline CompilationType compilation_type();
|
inline void set_compilation_type(CompilationType type);
|
|
// [compilation_state]: determines whether the script has already been
|
// compiled. Encoded in the 'flags' field.
|
inline CompilationState compilation_state();
|
inline void set_compilation_state(CompilationState state);
|
|
// [origin_options]: optional attributes set by the embedder via ScriptOrigin,
|
// and used by the embedder to make decisions about the script. V8 just passes
|
// this through. Encoded in the 'flags' field.
|
inline v8::ScriptOriginOptions origin_options();
|
inline void set_origin_options(ScriptOriginOptions origin_options);
|
|
DECL_CAST(Script)
|
|
// If script source is an external string, check that the underlying
|
// resource is accessible. Otherwise, always return true.
|
inline bool HasValidSource();
|
|
Object* GetNameOrSourceURL();
|
|
// Retrieve source position from where eval was called.
|
int GetEvalPosition();
|
|
// Check if the script contains any Asm modules.
|
bool ContainsAsmModule();
|
|
// Init line_ends array with source code positions of line ends.
|
static void InitLineEnds(Handle<Script> script);
|
|
// Carries information about a source position.
|
struct PositionInfo {
|
PositionInfo() : line(-1), column(-1), line_start(-1), line_end(-1) {}
|
|
int line; // Zero-based line number.
|
int column; // Zero-based column number.
|
int line_start; // Position of first character in line.
|
int line_end; // Position of final linebreak character in line.
|
};
|
|
// Specifies whether to add offsets to position infos.
|
enum OffsetFlag { NO_OFFSET = 0, WITH_OFFSET = 1 };
|
|
// Retrieves information about the given position, optionally with an offset.
|
// Returns false on failure, and otherwise writes into the given info object
|
// on success.
|
// The static method should is preferable for handlified callsites because it
|
// initializes the line ends array, avoiding expensive recomputations.
|
// The non-static version is not allocating and safe for unhandlified
|
// callsites.
|
static bool GetPositionInfo(Handle<Script> script, int position,
|
PositionInfo* info, OffsetFlag offset_flag);
|
bool GetPositionInfo(int position, PositionInfo* info,
|
OffsetFlag offset_flag) const;
|
|
bool IsUserJavaScript();
|
|
// Wrappers for GetPositionInfo
|
static int GetColumnNumber(Handle<Script> script, int code_offset);
|
int GetColumnNumber(int code_pos) const;
|
static int GetLineNumber(Handle<Script> script, int code_offset);
|
int GetLineNumber(int code_pos) const;
|
|
// Look through the list of existing shared function infos to find one
|
// that matches the function literal. Return empty handle if not found.
|
MaybeHandle<SharedFunctionInfo> FindSharedFunctionInfo(
|
Isolate* isolate, const FunctionLiteral* fun);
|
|
// Iterate over all script objects on the heap.
|
class Iterator {
|
public:
|
explicit Iterator(Isolate* isolate);
|
Script* Next();
|
|
private:
|
WeakArrayList::Iterator iterator_;
|
DISALLOW_COPY_AND_ASSIGN(Iterator);
|
};
|
|
// Dispatched behavior.
|
DECL_PRINTER(Script)
|
DECL_VERIFIER(Script)
|
|
static const int kSourceOffset = HeapObject::kHeaderSize;
|
static const int kNameOffset = kSourceOffset + kPointerSize;
|
static const int kLineOffsetOffset = kNameOffset + kPointerSize;
|
static const int kColumnOffsetOffset = kLineOffsetOffset + kPointerSize;
|
static const int kContextOffset = kColumnOffsetOffset + kPointerSize;
|
static const int kTypeOffset = kContextOffset + kPointerSize;
|
static const int kLineEndsOffset = kTypeOffset + kPointerSize;
|
static const int kIdOffset = kLineEndsOffset + kPointerSize;
|
static const int kEvalFromSharedOrWrappedArgumentsOffset =
|
kIdOffset + kPointerSize;
|
static const int kEvalFromPositionOffset =
|
kEvalFromSharedOrWrappedArgumentsOffset + kPointerSize;
|
static const int kSharedFunctionInfosOffset =
|
kEvalFromPositionOffset + kPointerSize;
|
static const int kFlagsOffset = kSharedFunctionInfosOffset + kPointerSize;
|
static const int kSourceUrlOffset = kFlagsOffset + kPointerSize;
|
static const int kSourceMappingUrlOffset = kSourceUrlOffset + kPointerSize;
|
static const int kHostDefinedOptionsOffset =
|
kSourceMappingUrlOffset + kPointerSize;
|
static const int kSize = kHostDefinedOptionsOffset + kPointerSize;
|
|
private:
|
// Bit positions in the flags field.
|
static const int kCompilationTypeBit = 0;
|
static const int kCompilationStateBit = 1;
|
static const int kOriginOptionsShift = 2;
|
static const int kOriginOptionsSize = 4;
|
static const int kOriginOptionsMask = ((1 << kOriginOptionsSize) - 1)
|
<< kOriginOptionsShift;
|
|
DISALLOW_IMPLICIT_CONSTRUCTORS(Script);
|
};
|
|
} // namespace internal
|
} // namespace v8
|
|
#include "src/objects/object-macros-undef.h"
|
|
#endif // V8_OBJECTS_SCRIPT_H_
|