| // 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<FixedArray> CompileTimeValue::GetValue(Isolate* isolate, |
| Expression* expression) { |
| Factory* factory = isolate->factory(); |
| DCHECK(IsCompileTimeValue(expression)); |
| Handle<FixedArray> 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<FixedArray> value) { |
| Smi* literal_type = Smi::cast(value->get(kLiteralTypeSlot)); |
| return static_cast<LiteralType>(literal_type->value()); |
| } |
| |
| Handle<HeapObject> CompileTimeValue::GetElements(Handle<FixedArray> value) { |
| return Handle<HeapObject>(HeapObject::cast(value->get(kElementsSlot))); |
| } |
| |
| } // namespace internal |
| } // namespace v8 |