// 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/ast/compile-time-value.h" #include "src/ast/ast.h" #include "src/factory.h" #include "src/handles-inl.h" #include "src/isolate.h" #include "src/objects-inl.h" namespace v8 { namespace internal { bool CompileTimeValue::IsCompileTimeValue(Expression* expression) { if (expression->IsLiteral()) return true; MaterializedLiteral* lit = expression->AsMaterializedLiteral(); return lit != NULL && lit->is_simple(); } Handle CompileTimeValue::GetValue(Isolate* isolate, Expression* expression) { Factory* factory = isolate->factory(); DCHECK(IsCompileTimeValue(expression)); Handle result = factory->NewFixedArray(2, TENURED); ObjectLiteral* object_literal = expression->AsObjectLiteral(); if (object_literal != NULL) { DCHECK(object_literal->is_simple()); if (object_literal->fast_elements()) { result->set(kLiteralTypeSlot, Smi::FromInt(OBJECT_LITERAL_FAST_ELEMENTS)); } else { result->set(kLiteralTypeSlot, Smi::FromInt(OBJECT_LITERAL_SLOW_ELEMENTS)); } result->set(kElementsSlot, *object_literal->constant_properties()); } else { ArrayLiteral* array_literal = expression->AsArrayLiteral(); DCHECK(array_literal != NULL && array_literal->is_simple()); result->set(kLiteralTypeSlot, Smi::FromInt(ARRAY_LITERAL)); result->set(kElementsSlot, *array_literal->constant_elements()); } return result; } CompileTimeValue::LiteralType CompileTimeValue::GetLiteralType( Handle value) { Smi* literal_type = Smi::cast(value->get(kLiteralTypeSlot)); return static_cast(literal_type->value()); } Handle CompileTimeValue::GetElements(Handle value) { return Handle(HeapObject::cast(value->get(kElementsSlot))); } } // namespace internal } // namespace v8