diff options
Diffstat (limited to 'deps/v8/src/ast/compile-time-value.cc')
-rw-r--r-- | deps/v8/src/ast/compile-time-value.cc | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/deps/v8/src/ast/compile-time-value.cc b/deps/v8/src/ast/compile-time-value.cc new file mode 100644 index 0000000000..eda536b716 --- /dev/null +++ b/deps/v8/src/ast/compile-time-value.cc @@ -0,0 +1,56 @@ +// 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<FixedArray> CompileTimeValue::GetElements(Handle<FixedArray> value) { + return Handle<FixedArray>(FixedArray::cast(value->get(kElementsSlot))); +} + +} // namespace internal +} // namespace v8 |