| Index: src/arm/codegen-arm.cc
|
| ===================================================================
|
| --- src/arm/codegen-arm.cc (revision 3513)
|
| +++ src/arm/codegen-arm.cc (working copy)
|
| @@ -2601,42 +2601,6 @@
|
| }
|
|
|
|
|
| -// This deferred code stub will be used for creating the boilerplate
|
| -// by calling Runtime_CreateObjectLiteralBoilerplate.
|
| -// Each created boilerplate is stored in the JSFunction and they are
|
| -// therefore context dependent.
|
| -class DeferredObjectLiteral: public DeferredCode {
|
| - public:
|
| - explicit DeferredObjectLiteral(ObjectLiteral* node) : node_(node) {
|
| - set_comment("[ DeferredObjectLiteral");
|
| - }
|
| -
|
| - virtual void Generate();
|
| -
|
| - private:
|
| - ObjectLiteral* node_;
|
| -};
|
| -
|
| -
|
| -void DeferredObjectLiteral::Generate() {
|
| - // Argument is passed in r1.
|
| -
|
| - // If the entry is undefined we call the runtime system to compute
|
| - // the literal.
|
| - // Literal array (0).
|
| - __ push(r1);
|
| - // Literal index (1).
|
| - __ mov(r0, Operand(Smi::FromInt(node_->literal_index())));
|
| - __ push(r0);
|
| - // Constant properties (2).
|
| - __ mov(r0, Operand(node_->constant_properties()));
|
| - __ push(r0);
|
| - __ CallRuntime(Runtime::kCreateObjectLiteralBoilerplate, 3);
|
| - __ mov(r2, Operand(r0));
|
| - // Result is returned in r2.
|
| -}
|
| -
|
| -
|
| void CodeGenerator::VisitObjectLiteral(ObjectLiteral* node) {
|
| #ifdef DEBUG
|
| int original_height = frame_->height();
|
| @@ -2644,39 +2608,22 @@
|
| VirtualFrame::SpilledScope spilled_scope;
|
| Comment cmnt(masm_, "[ ObjectLiteral");
|
|
|
| - DeferredObjectLiteral* deferred = new DeferredObjectLiteral(node);
|
| -
|
| - // Retrieve the literal array and check the allocated entry.
|
| -
|
| // Load the function of this activation.
|
| - __ ldr(r1, frame_->Function());
|
| -
|
| - // Load the literals array of the function.
|
| - __ ldr(r1, FieldMemOperand(r1, JSFunction::kLiteralsOffset));
|
| -
|
| - // Load the literal at the ast saved index.
|
| - int literal_offset =
|
| - FixedArray::kHeaderSize + node->literal_index() * kPointerSize;
|
| - __ ldr(r2, FieldMemOperand(r1, literal_offset));
|
| -
|
| - // Check whether we need to materialize the object literal boilerplate.
|
| - // If so, jump to the deferred code.
|
| - __ LoadRoot(ip, Heap::kUndefinedValueRootIndex);
|
| - __ cmp(r2, Operand(ip));
|
| - deferred->Branch(eq);
|
| - deferred->BindExit();
|
| -
|
| - // Push the object literal boilerplate.
|
| - frame_->EmitPush(r2);
|
| -
|
| - // Clone the boilerplate object.
|
| - Runtime::FunctionId clone_function_id = Runtime::kCloneLiteralBoilerplate;
|
| - if (node->depth() == 1) {
|
| - clone_function_id = Runtime::kCloneShallowLiteralBoilerplate;
|
| + __ ldr(r2, frame_->Function());
|
| + // Literal array.
|
| + __ ldr(r2, FieldMemOperand(r2, JSFunction::kLiteralsOffset));
|
| + // Literal index.
|
| + __ mov(r1, Operand(Smi::FromInt(node->literal_index())));
|
| + // Constant properties.
|
| + __ mov(r0, Operand(node->constant_properties()));
|
| + frame_->EmitPushMultiple(3, r2.bit() | r1.bit() | r0.bit());
|
| + if (node->depth() > 1) {
|
| + frame_->CallRuntime(Runtime::kCreateObjectLiteral, 3);
|
| + } else {
|
| + frame_->CallRuntime(Runtime::kCreateObjectLiteralShallow, 3);
|
| }
|
| - frame_->CallRuntime(clone_function_id, 1);
|
| frame_->EmitPush(r0); // save the result
|
| - // r0: cloned object literal
|
| + // r0: created object literal
|
|
|
| for (int i = 0; i < node->properties()->length(); i++) {
|
| ObjectLiteral::Property* property = node->properties()->at(i);
|
| @@ -2724,42 +2671,6 @@
|
| }
|
|
|
|
|
| -// This deferred code stub will be used for creating the boilerplate
|
| -// by calling Runtime_CreateArrayLiteralBoilerplate.
|
| -// Each created boilerplate is stored in the JSFunction and they are
|
| -// therefore context dependent.
|
| -class DeferredArrayLiteral: public DeferredCode {
|
| - public:
|
| - explicit DeferredArrayLiteral(ArrayLiteral* node) : node_(node) {
|
| - set_comment("[ DeferredArrayLiteral");
|
| - }
|
| -
|
| - virtual void Generate();
|
| -
|
| - private:
|
| - ArrayLiteral* node_;
|
| -};
|
| -
|
| -
|
| -void DeferredArrayLiteral::Generate() {
|
| - // Argument is passed in r1.
|
| -
|
| - // If the entry is undefined we call the runtime system to computed
|
| - // the literal.
|
| - // Literal array (0).
|
| - __ push(r1);
|
| - // Literal index (1).
|
| - __ mov(r0, Operand(Smi::FromInt(node_->literal_index())));
|
| - __ push(r0);
|
| - // Constant properties (2).
|
| - __ mov(r0, Operand(node_->literals()));
|
| - __ push(r0);
|
| - __ CallRuntime(Runtime::kCreateArrayLiteralBoilerplate, 3);
|
| - __ mov(r2, Operand(r0));
|
| - // Result is returned in r2.
|
| -}
|
| -
|
| -
|
| void CodeGenerator::VisitArrayLiteral(ArrayLiteral* node) {
|
| #ifdef DEBUG
|
| int original_height = frame_->height();
|
| @@ -2767,39 +2678,22 @@
|
| VirtualFrame::SpilledScope spilled_scope;
|
| Comment cmnt(masm_, "[ ArrayLiteral");
|
|
|
| - DeferredArrayLiteral* deferred = new DeferredArrayLiteral(node);
|
| -
|
| - // Retrieve the literal array and check the allocated entry.
|
| -
|
| // Load the function of this activation.
|
| - __ ldr(r1, frame_->Function());
|
| -
|
| - // Load the literals array of the function.
|
| - __ ldr(r1, FieldMemOperand(r1, JSFunction::kLiteralsOffset));
|
| -
|
| - // Load the literal at the ast saved index.
|
| - int literal_offset =
|
| - FixedArray::kHeaderSize + node->literal_index() * kPointerSize;
|
| - __ ldr(r2, FieldMemOperand(r1, literal_offset));
|
| -
|
| - // Check whether we need to materialize the object literal boilerplate.
|
| - // If so, jump to the deferred code.
|
| - __ LoadRoot(ip, Heap::kUndefinedValueRootIndex);
|
| - __ cmp(r2, Operand(ip));
|
| - deferred->Branch(eq);
|
| - deferred->BindExit();
|
| -
|
| - // Push the object literal boilerplate.
|
| - frame_->EmitPush(r2);
|
| -
|
| - // Clone the boilerplate object.
|
| - Runtime::FunctionId clone_function_id = Runtime::kCloneLiteralBoilerplate;
|
| - if (node->depth() == 1) {
|
| - clone_function_id = Runtime::kCloneShallowLiteralBoilerplate;
|
| + __ ldr(r2, frame_->Function());
|
| + // Literals array.
|
| + __ ldr(r2, FieldMemOperand(r2, JSFunction::kLiteralsOffset));
|
| + // Literal index.
|
| + __ mov(r1, Operand(Smi::FromInt(node->literal_index())));
|
| + // Constant elements.
|
| + __ mov(r0, Operand(node->constant_elements()));
|
| + frame_->EmitPushMultiple(3, r2.bit() | r1.bit() | r0.bit());
|
| + if (node->depth() > 1) {
|
| + frame_->CallRuntime(Runtime::kCreateArrayLiteral, 3);
|
| + } else {
|
| + frame_->CallRuntime(Runtime::kCreateArrayLiteralShallow, 3);
|
| }
|
| - frame_->CallRuntime(clone_function_id, 1);
|
| frame_->EmitPush(r0); // save the result
|
| - // r0: cloned object literal
|
| + // r0: created object literal
|
|
|
| // Generate code to set the elements in the array that are not
|
| // literals.
|
|
|