1// Copyright 2016 the V8 project authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "src/ast/compile-time-value.h" 6 7#include "src/ast/ast.h" 8#include "src/factory.h" 9#include "src/handles-inl.h" 10#include "src/isolate.h" 11#include "src/objects-inl.h" 12 13namespace v8 { 14namespace internal { 15 16bool CompileTimeValue::IsCompileTimeValue(Expression* expression) { 17 if (expression->IsLiteral()) return true; 18 MaterializedLiteral* lit = expression->AsMaterializedLiteral(); 19 return lit != NULL && lit->is_simple(); 20} 21 22Handle<FixedArray> CompileTimeValue::GetValue(Isolate* isolate, 23 Expression* expression) { 24 Factory* factory = isolate->factory(); 25 DCHECK(IsCompileTimeValue(expression)); 26 Handle<FixedArray> result = factory->NewFixedArray(2, TENURED); 27 ObjectLiteral* object_literal = expression->AsObjectLiteral(); 28 if (object_literal != NULL) { 29 DCHECK(object_literal->is_simple()); 30 if (object_literal->fast_elements()) { 31 result->set(kLiteralTypeSlot, Smi::FromInt(OBJECT_LITERAL_FAST_ELEMENTS)); 32 } else { 33 result->set(kLiteralTypeSlot, Smi::FromInt(OBJECT_LITERAL_SLOW_ELEMENTS)); 34 } 35 result->set(kElementsSlot, *object_literal->constant_properties()); 36 } else { 37 ArrayLiteral* array_literal = expression->AsArrayLiteral(); 38 DCHECK(array_literal != NULL && array_literal->is_simple()); 39 result->set(kLiteralTypeSlot, Smi::FromInt(ARRAY_LITERAL)); 40 result->set(kElementsSlot, *array_literal->constant_elements()); 41 } 42 return result; 43} 44 45CompileTimeValue::LiteralType CompileTimeValue::GetLiteralType( 46 Handle<FixedArray> value) { 47 Smi* literal_type = Smi::cast(value->get(kLiteralTypeSlot)); 48 return static_cast<LiteralType>(literal_type->value()); 49} 50 51Handle<FixedArray> CompileTimeValue::GetElements(Handle<FixedArray> value) { 52 return Handle<FixedArray>(FixedArray::cast(value->get(kElementsSlot))); 53} 54 55} // namespace internal 56} // namespace v8 57