Changeset 28887 in webkit for trunk/JavaScriptCore/kjs/nodes.cpp
- Timestamp:
- Dec 20, 2007, 9:42:50 AM (17 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JavaScriptCore/kjs/nodes.cpp
r28886 r28887 47 47 #define KJS_BREAKPOINT \ 48 48 if (Debugger::debuggersPresent > 0 && !hitStatement(exec)) \ 49 return Completion(Normal);49 return 0; 50 50 51 51 #define KJS_CHECKEXCEPTION \ … … 272 272 } 273 273 274 Completion Node::createErrorCompletion(ExecState* exec, ErrorType e, const char *msg)275 { 276 return Completion(Throw,Error::create(exec, e, msg, lineNo(), currentSourceId(exec), currentSourceURL(exec)));277 } 278 279 Completion Node::createErrorCompletion(ExecState *exec, ErrorType e, const char *msg, const Identifier &ident)274 JSValue* Node::setErrorCompletion(ExecState* exec, ErrorType e, const char* msg) 275 { 276 return exec->setThrowCompletion(Error::create(exec, e, msg, lineNo(), currentSourceId(exec), currentSourceURL(exec))); 277 } 278 279 JSValue* Node::setErrorCompletion(ExecState* exec, ErrorType e, const char* msg, const Identifier& ident) 280 280 { 281 281 UString message = msg; 282 282 substitute(message, ident.ustring()); 283 return Completion(Throw,Error::create(exec, e, message, lineNo(), currentSourceId(exec), currentSourceURL(exec)));283 return exec->setThrowCompletion(Error::create(exec, e, message, lineNo(), currentSourceId(exec), currentSourceURL(exec))); 284 284 } 285 285 … … 365 365 } 366 366 367 CompletionNode::rethrowException(ExecState* exec)367 JSValue* Node::rethrowException(ExecState* exec) 368 368 { 369 369 JSValue* exception = exec->exception(); 370 370 exec->clearException(); 371 371 handleException(exec, exception); 372 return Completion(Throw,exception);372 return exec->setThrowCompletion(exception); 373 373 } 374 374 … … 387 387 } 388 388 389 // return true if the debugger wants us to stop at this point 389 // Set normal completion and return false if the debugger wants us to stop at this point. 390 // FIXME: This seems like poor naming and strange design. Why false to stop? Why "hit statement"? 390 391 bool StatementNode::hitStatement(ExecState* exec) 391 392 { 392 Debugger *dbg= exec->dynamicGlobalObject()->debugger();393 if (dbg)394 return dbg->atStatement(exec, currentSourceId(exec), firstLine(), lastLine());395 else396 return true; // continue393 Debugger* debugger = exec->dynamicGlobalObject()->debugger(); 394 if (!debugger || debugger->atStatement(exec, currentSourceId(exec), firstLine(), lastLine())) 395 return true; 396 exec->setCompletionType(Normal); 397 return false; 397 398 } 398 399 … … 3549 3550 3550 3551 // ECMA 12.2 3551 Completion VarStatementNode::execute(ExecState *exec)3552 { 3553 KJS_BREAKPOINT ;3552 JSValue* VarStatementNode::execute(ExecState* exec) 3553 { 3554 KJS_BREAKPOINT 3554 3555 3555 3556 next->evaluate(exec); 3556 3557 KJS_CHECKEXCEPTION 3557 3558 3558 return Completion(Normal);3559 return exec->setNormalCompletion(); 3559 3560 } 3560 3561 … … 3588 3589 } 3589 3590 3590 static inline Completion statementListExecute(SourceElements& statements, ExecState* exec) 3591 { 3592 JSValue* v = 0; 3593 Completion c(Normal); 3594 const SourceElements::iterator end = statements.end(); 3595 for (SourceElements::iterator ptr = statements.begin(); ptr != end; ++ptr) { 3596 c = (*ptr)->execute(exec); 3597 3598 if (JSValue* v2 = c.value()) 3599 v = v2; 3600 c.setValue(v); 3601 3602 if (c.complType() != Normal) 3603 return c; 3604 } 3605 return c; 3606 } 3607 3591 static inline JSValue* statementListExecute(SourceElements& statements, ExecState* exec) 3592 { 3593 JSValue* value = 0; 3594 size_t size = statements.size(); 3595 for (size_t i = 0; i != size; ++i) { 3596 JSValue* statementValue = statements[i]->execute(exec); 3597 if (exec->completionType() != Normal) 3598 return statementValue; 3599 if (statementValue) 3600 value = statementValue; 3601 } 3602 return exec->setNormalCompletion(value); 3603 } 3604 3608 3605 // ------------------------------ BlockNode ------------------------------------ 3609 3606 … … 3620 3617 3621 3618 // ECMA 12.1 3622 Completion BlockNode::execute(ExecState *exec)3619 JSValue* BlockNode::execute(ExecState* exec) 3623 3620 { 3624 3621 return statementListExecute(*m_children, exec); … … 3628 3625 3629 3626 // ECMA 12.3 3630 Completion EmptyStatementNode::execute(ExecState *)3631 { 3632 return Completion(Normal);3627 JSValue* EmptyStatementNode::execute(ExecState* exec) 3628 { 3629 return exec->setNormalCompletion(); 3633 3630 } 3634 3631 … … 3642 3639 3643 3640 // ECMA 12.4 3644 Completion ExprStatementNode::execute(ExecState *exec)3645 { 3646 KJS_BREAKPOINT;3647 3648 JSValue *v= expr->evaluate(exec);3649 KJS_CHECKEXCEPTION3650 3651 return Completion(Normal, v);3641 JSValue* ExprStatementNode::execute(ExecState* exec) 3642 { 3643 KJS_BREAKPOINT 3644 3645 JSValue* value = expr->evaluate(exec); 3646 KJS_CHECKEXCEPTION 3647 3648 return exec->setNormalCompletion(value); 3652 3649 } 3653 3650 … … 3665 3662 3666 3663 // ECMA 12.5 3667 CompletionIfNode::execute(ExecState* exec)3668 { 3669 KJS_BREAKPOINT ;3664 JSValue* IfNode::execute(ExecState* exec) 3665 { 3666 KJS_BREAKPOINT 3670 3667 3671 3668 bool b = expr->evaluateToBoolean(exec); … … 3678 3675 // no else 3679 3676 if (!statement2) 3680 return Completion(Normal);3677 return exec->setNormalCompletion(); 3681 3678 3682 3679 // else … … 3693 3690 3694 3691 // ECMA 12.6.1 3695 Completion DoWhileNode::execute(ExecState *exec)3696 { 3697 KJS_BREAKPOINT ;3692 JSValue* DoWhileNode::execute(ExecState* exec) 3693 { 3694 KJS_BREAKPOINT 3698 3695 3699 3696 JSValue* value = 0; … … 3701 3698 while (1) { 3702 3699 exec->pushIteration(); 3703 Completion c= statement->execute(exec);3700 JSValue* statementValue = statement->execute(exec); 3704 3701 exec->popIteration(); 3705 3702 3706 3703 if (exec->dynamicGlobalObject()->timedOut()) 3707 return Completion(Interrupted); 3708 3709 if (c.isValueCompletion()) 3710 value = c.value(); 3711 3712 if (!((c.complType() == Continue) && ls.contains(c.target()))) { 3713 if ((c.complType() == Break) && ls.contains(c.target())) 3714 return Completion(Normal, value); 3715 if (c.complType() != Normal) 3716 return c; 3704 exec->setInterruptedCompletion(); 3705 3706 if (statementValue) 3707 value = statementValue; 3708 3709 if (exec->completionType() != Normal) { 3710 if (exec->completionType() == Continue && ls.contains(exec->breakOrContinueTarget())) 3711 goto continueDoWhileLoop; 3712 if (exec->completionType() == Break && ls.contains(exec->breakOrContinueTarget())) 3713 break; 3714 return statementValue; 3717 3715 } 3718 3716 3717 continueDoWhileLoop: 3719 3718 bool b = expr->evaluateToBoolean(exec); 3720 3719 KJS_CHECKEXCEPTION 3721 3720 if (!b) 3722 return Completion(Normal, value);3723 } 3724 3725 return Completion(); // work around gcc 4.0 bug3721 break; 3722 } 3723 3724 return exec->setNormalCompletion(value); 3726 3725 } 3727 3726 … … 3735 3734 3736 3735 // ECMA 12.6.2 3737 Completion WhileNode::execute(ExecState *exec)3738 { 3739 KJS_BREAKPOINT ;3736 JSValue* WhileNode::execute(ExecState* exec) 3737 { 3738 KJS_BREAKPOINT 3740 3739 3741 3740 JSValue* value = 0; … … 3745 3744 KJS_CHECKEXCEPTION 3746 3745 if (!b) 3747 return Completion(Normal, value);3746 break; 3748 3747 3749 3748 exec->pushIteration(); 3750 Completion c= statement->execute(exec);3749 JSValue* statementValue = statement->execute(exec); 3751 3750 exec->popIteration(); 3752 3751 3753 3752 if (exec->dynamicGlobalObject()->timedOut()) 3754 return Completion(Interrupted); 3755 3756 if (c.isValueCompletion()) 3757 value = c.value(); 3758 3759 if ((c.complType() == Continue) && ls.contains(c.target())) 3760 continue; 3761 if ((c.complType() == Break) && ls.contains(c.target())) 3762 return Completion(Normal, value); 3763 if (c.complType() != Normal) 3764 return c; 3765 } 3766 3767 return Completion(); // work around gcc 4.0 bug 3753 return exec->setInterruptedCompletion(); 3754 3755 if (statementValue) 3756 value = statementValue; 3757 3758 if (exec->completionType() != Normal) { 3759 if (exec->completionType() == Continue && ls.contains(exec->breakOrContinueTarget())) 3760 continue; 3761 if (exec->completionType() == Break && ls.contains(exec->breakOrContinueTarget())) 3762 break; 3763 return statementValue; 3764 } 3765 } 3766 3767 return exec->setNormalCompletion(value); 3768 3768 } 3769 3769 … … 3782 3782 3783 3783 // ECMA 12.6.3 3784 CompletionForNode::execute(ExecState *exec)3785 { 3786 JSValue* cval= 0;3784 JSValue* ForNode::execute(ExecState *exec) 3785 { 3786 JSValue* value = 0; 3787 3787 3788 3788 if (expr1) { … … 3796 3796 KJS_CHECKEXCEPTION 3797 3797 if (!b) 3798 return Completion(Normal, cval);3798 break; 3799 3799 } 3800 3800 3801 3801 exec->pushIteration(); 3802 Completion c= statement->execute(exec);3802 JSValue* statementValue = statement->execute(exec); 3803 3803 exec->popIteration(); 3804 if (c.isValueCompletion()) 3805 cval = c.value(); 3806 if (!((c.complType() == Continue) && ls.contains(c.target()))) { 3807 if ((c.complType() == Break) && ls.contains(c.target())) 3808 return Completion(Normal, cval); 3809 if (c.complType() != Normal) 3810 return c; 3804 if (statementValue) 3805 value = statementValue; 3806 3807 if (exec->dynamicGlobalObject()->timedOut()) 3808 return exec->setInterruptedCompletion(); 3809 3810 if (exec->completionType() != Normal) { 3811 if (exec->completionType() == Continue && ls.contains(exec->breakOrContinueTarget())) 3812 goto continueForLoop; 3813 if (exec->completionType() == Break && ls.contains(exec->breakOrContinueTarget())) 3814 break; 3815 return statementValue; 3811 3816 } 3812 3817 3813 if (exec->dynamicGlobalObject()->timedOut()) 3814 return Completion(Interrupted); 3815 3818 continueForLoop: 3816 3819 if (expr3) { 3817 3820 expr3->evaluate(exec); … … 3820 3823 } 3821 3824 3822 return Completion(); // work around gcc 4.0 bug3825 return exec->setNormalCompletion(value); 3823 3826 } 3824 3827 … … 3848 3851 3849 3852 // ECMA 12.6.4 3850 Completion ForInNode::execute(ExecState *exec) 3851 { 3852 JSValue *e; 3853 JSValue *retval = 0; 3854 JSObject *v; 3855 Completion c; 3856 PropertyNameArray propertyNames; 3853 JSValue* ForInNode::execute(ExecState* exec) 3854 { 3855 JSValue* value = 0; 3857 3856 3858 3857 if (varDecl) { … … 3861 3860 } 3862 3861 3863 e = expr->evaluate(exec); 3864 3865 // for Null and Undefined, we want to make sure not to go through 3866 // the loop at all, because their object wrappers will have a 3867 // property list but will throw an exception if you attempt to 3868 // access any property. 3862 JSValue* e = expr->evaluate(exec); 3863 3864 // For Null and Undefined, we want to make sure not to go through 3865 // the loop at all, because toObject will throw an exception. 3869 3866 if (e->isUndefinedOrNull()) 3870 return Completion(Normal);3867 return exec->setNormalCompletion(); 3871 3868 3872 3869 KJS_CHECKEXCEPTION 3873 v = e->toObject(exec); 3870 JSObject* v = e->toObject(exec); 3871 PropertyNameArray propertyNames; 3874 3872 v->getPropertyNames(exec, propertyNames); 3875 3873 3876 3874 PropertyNameArray::const_iterator end = propertyNames.end(); 3877 3875 for (PropertyNameArray::const_iterator it = propertyNames.begin(); it != end; ++it) { 3878 const Identifier &name = *it;3876 const Identifier& name = *it; 3879 3877 if (!v->hasProperty(exec, name)) 3880 3878 continue; … … 3929 3927 3930 3928 exec->pushIteration(); 3931 c= statement->execute(exec);3929 JSValue* statementValue = statement->execute(exec); 3932 3930 exec->popIteration(); 3933 if ( c.isValueCompletion())3934 retval = c.value();3935 3936 if ( !((c.complType() == Continue) && ls.contains(c.target()))) {3937 if ((c.complType() == Break) && ls.contains(c.target()))3938 break;3939 if (c.complType() != Normal) {3940 return c;3941 }3931 if (statementValue) 3932 value = statementValue; 3933 3934 if (exec->completionType() != Normal) { 3935 if (exec->completionType() == Continue && ls.contains(exec->breakOrContinueTarget())) 3936 continue; 3937 if (exec->completionType() == Break && ls.contains(exec->breakOrContinueTarget())) 3938 break; 3939 return statementValue; 3942 3940 } 3943 3941 } 3944 3942 3945 return Completion(Normal, retval);3943 return exec->setNormalCompletion(value); 3946 3944 } 3947 3945 … … 3949 3947 3950 3948 // ECMA 12.7 3951 Completion ContinueNode::execute(ExecState *exec)3952 { 3953 KJS_BREAKPOINT ;3949 JSValue* ContinueNode::execute(ExecState* exec) 3950 { 3951 KJS_BREAKPOINT 3954 3952 3955 3953 if (ident.isEmpty() && !exec->inIteration()) 3956 return createErrorCompletion(exec, SyntaxError, "Invalid continue statement.");3954 return setErrorCompletion(exec, SyntaxError, "Invalid continue statement."); 3957 3955 if (!ident.isEmpty() && !exec->seenLabels()->contains(ident)) 3958 return createErrorCompletion(exec, SyntaxError, "Label %s not found.", ident);3959 return Completion(Continue,&ident);3956 return setErrorCompletion(exec, SyntaxError, "Label %s not found.", ident); 3957 return exec->setContinueCompletion(&ident); 3960 3958 } 3961 3959 … … 3963 3961 3964 3962 // ECMA 12.8 3965 Completion BreakNode::execute(ExecState *exec) 3966 { 3967 KJS_BREAKPOINT; 3968 3969 if (ident.isEmpty() && !exec->inIteration() && 3970 !exec->inSwitch()) 3971 return createErrorCompletion(exec, SyntaxError, "Invalid break statement."); 3963 JSValue* BreakNode::execute(ExecState *exec) 3964 { 3965 KJS_BREAKPOINT 3966 3967 if (ident.isEmpty() && !exec->inIteration() && !exec->inSwitch()) 3968 return setErrorCompletion(exec, SyntaxError, "Invalid break statement."); 3972 3969 if (!ident.isEmpty() && !exec->seenLabels()->contains(ident)) 3973 return createErrorCompletion(exec, SyntaxError, "Label %s not found.");3974 return Completion(Break,&ident);3970 return setErrorCompletion(exec, SyntaxError, "Label %s not found."); 3971 return exec->setBreakCompletion(&ident); 3975 3972 } 3976 3973 … … 3984 3981 3985 3982 // ECMA 12.9 3986 Completion ReturnNode::execute(ExecState *exec)3987 { 3988 KJS_BREAKPOINT ;3983 JSValue* ReturnNode::execute(ExecState* exec) 3984 { 3985 KJS_BREAKPOINT 3989 3986 3990 3987 CodeType codeType = exec->codeType(); 3991 3988 if (codeType != FunctionCode) 3992 return createErrorCompletion(exec, SyntaxError, "Invalid return statement.");3989 return setErrorCompletion(exec, SyntaxError, "Invalid return statement."); 3993 3990 3994 3991 if (!value) 3995 return Completion(ReturnValue,jsUndefined());3996 3997 JSValue *v = value->evaluate(exec);3992 return exec->setReturnValueCompletion(jsUndefined()); 3993 3994 JSValue* v = value->evaluate(exec); 3998 3995 KJS_CHECKEXCEPTION 3999 3996 4000 return Completion(ReturnValue,v);3997 return exec->setReturnValueCompletion(v); 4001 3998 } 4002 3999 … … 4010 4007 4011 4008 // ECMA 12.10 4012 CompletionWithNode::execute(ExecState *exec)4013 { 4014 KJS_BREAKPOINT ;4009 JSValue* WithNode::execute(ExecState *exec) 4010 { 4011 KJS_BREAKPOINT 4015 4012 4016 4013 JSValue *v = expr->evaluate(exec); … … 4019 4016 KJS_CHECKEXCEPTION 4020 4017 exec->pushScope(o); 4021 Completion res= statement->execute(exec);4018 JSValue* value = statement->execute(exec); 4022 4019 exec->popScope(); 4023 4020 4024 return res;4021 return value; 4025 4022 } 4026 4023 … … 4045 4042 4046 4043 // ECMA 12.11 4047 Completion CaseClauseNode::evalStatements(ExecState *exec)4044 JSValue* CaseClauseNode::executeStatements(ExecState* exec) 4048 4045 { 4049 4046 if (m_children) 4050 4047 return statementListExecute(*m_children, exec); 4051 else 4052 return Completion(Normal, jsUndefined()); 4048 return exec->setNormalCompletion(); 4053 4049 } 4054 4050 … … 4082 4078 4083 4079 // ECMA 12.11 4084 Completion CaseBlockNode::evalBlock(ExecState *exec, JSValue *input) 4085 { 4086 JSValue *v; 4087 Completion res; 4088 ClauseListNode *a = list1.get(); 4089 ClauseListNode *b = list2.get(); 4090 CaseClauseNode *clause; 4091 4080 JSValue* CaseBlockNode::executeBlock(ExecState* exec, JSValue* input) 4081 { 4082 ClauseListNode* a = list1.get(); 4092 4083 while (a) { 4093 clause = a->getClause();4084 CaseClauseNode* clause = a->getClause(); 4094 4085 a = a->getNext(); 4095 v = clause->evaluate(exec);4086 JSValue* v = clause->evaluate(exec); 4096 4087 KJS_CHECKEXCEPTION 4097 4088 if (strictEqual(exec, input, v)) { 4098 res = clause->evalStatements(exec);4099 if ( res.complType() != Normal)4089 JSValue* res = clause->executeStatements(exec); 4090 if (exec->completionType() != Normal) 4100 4091 return res; 4101 while (a) {4102 res = a->getClause()->evalStatements(exec);4103 if ( res.complType() != Normal)4092 for (; a; a = a->getNext()) { 4093 JSValue* res = a->getClause()->executeStatements(exec); 4094 if (exec->completionType() != Normal) 4104 4095 return res; 4105 a = a->getNext();4106 4096 } 4107 4097 break; … … 4109 4099 } 4110 4100 4101 ClauseListNode* b = list2.get(); 4111 4102 while (b) { 4112 clause = b->getClause();4103 CaseClauseNode* clause = b->getClause(); 4113 4104 b = b->getNext(); 4114 v = clause->evaluate(exec);4105 JSValue* v = clause->evaluate(exec); 4115 4106 KJS_CHECKEXCEPTION 4116 4107 if (strictEqual(exec, input, v)) { 4117 res = clause->evalStatements(exec);4118 if ( res.complType() != Normal)4108 JSValue* res = clause->executeStatements(exec); 4109 if (exec->completionType() != Normal) 4119 4110 return res; 4120 4111 goto step18; … … 4124 4115 // default clause 4125 4116 if (def) { 4126 res = def->evalStatements(exec);4127 if ( res.complType() != Normal)4117 JSValue* res = def->executeStatements(exec); 4118 if (exec->completionType() != Normal) 4128 4119 return res; 4129 4120 } … … 4131 4122 step18: 4132 4123 while (b) { 4133 clause = b->getClause();4134 res = clause->evalStatements(exec);4135 if ( res.complType() != Normal)4124 CaseClauseNode* clause = b->getClause(); 4125 JSValue* res = clause->executeStatements(exec); 4126 if (exec->completionType() != Normal) 4136 4127 return res; 4137 4128 b = b->getNext(); … … 4141 4132 KJS_CHECKEXCEPTION 4142 4133 4143 return Completion(Normal);4134 return exec->setNormalCompletion(); 4144 4135 } 4145 4136 … … 4153 4144 4154 4145 // ECMA 12.11 4155 Completion SwitchNode::execute(ExecState *exec)4156 { 4157 KJS_BREAKPOINT ;4146 JSValue* SwitchNode::execute(ExecState* exec) 4147 { 4148 KJS_BREAKPOINT 4158 4149 4159 4150 JSValue *v = expr->evaluate(exec); … … 4161 4152 4162 4153 exec->pushSwitch(); 4163 Completion res = block->evalBlock(exec,v);4154 JSValue* result = block->executeBlock(exec, v); 4164 4155 exec->popSwitch(); 4165 4156 4166 if ( (res.complType() == Break) && ls.contains(res.target()))4167 return Completion(Normal, res.value());4168 return res ;4157 if (exec->completionType() == Break && ls.contains(exec->breakOrContinueTarget())) 4158 exec->setCompletionType(Normal); 4159 return result; 4169 4160 } 4170 4161 … … 4177 4168 4178 4169 // ECMA 12.12 4179 CompletionLabelNode::execute(ExecState *exec)4170 JSValue* LabelNode::execute(ExecState *exec) 4180 4171 { 4181 4172 if (!exec->seenLabels()->push(label)) 4182 return createErrorCompletion(exec, SyntaxError, "Duplicated label %s found.", label);4183 Completion e= statement->execute(exec);4173 return setErrorCompletion(exec, SyntaxError, "Duplicated label %s found.", label); 4174 JSValue* result = statement->execute(exec); 4184 4175 exec->seenLabels()->pop(); 4185 4176 4186 if ( (e.complType() == Break) && (e.target() == label))4187 return Completion(Normal, e.value());4188 return e;4177 if (exec->completionType() == Break && exec->breakOrContinueTarget() == label) 4178 exec->setCompletionType(Normal); 4179 return result; 4189 4180 } 4190 4181 … … 4197 4188 4198 4189 // ECMA 12.13 4199 Completion ThrowNode::execute(ExecState *exec)4200 { 4201 KJS_BREAKPOINT ;4190 JSValue* ThrowNode::execute(ExecState* exec) 4191 { 4192 KJS_BREAKPOINT 4202 4193 4203 4194 JSValue *v = expr->evaluate(exec); … … 4205 4196 4206 4197 handleException(exec, v); 4207 return Completion(Throw,v);4198 return exec->setThrowCompletion(v); 4208 4199 } 4209 4200 … … 4219 4210 4220 4211 // ECMA 12.14 4221 CompletionTryNode::execute(ExecState *exec)4222 { 4223 KJS_BREAKPOINT ;4224 4225 Completion c= tryBlock->execute(exec);4212 JSValue* TryNode::execute(ExecState *exec) 4213 { 4214 KJS_BREAKPOINT 4215 4216 JSValue* result = tryBlock->execute(exec); 4226 4217 4227 4218 if (Collector::isOutOfMemory()) 4228 return c; // don't try to catch an out of memory exception thrown by the collector4219 return result; // don't try to catch an out of memory exception thrown by the collector 4229 4220 4230 if (catchBlock && c.complType() == Throw) {4231 JSObject *obj = new JSObject;4232 obj->put(exec, exceptionIdent, c.value(), DontDelete);4221 if (catchBlock && exec->completionType() == Throw) { 4222 JSObject* obj = new JSObject; 4223 obj->put(exec, exceptionIdent, result, DontDelete); 4233 4224 exec->pushScope(obj); 4234 c= catchBlock->execute(exec);4225 result = catchBlock->execute(exec); 4235 4226 exec->popScope(); 4236 4227 } 4237 4228 4238 4229 if (finallyBlock) { 4239 Completion c2 = finallyBlock->execute(exec); 4240 if (c2.complType() != Normal) 4241 c = c2; 4230 ComplType savedCompletionType = exec->completionType(); 4231 JSValue* finallyResult = finallyBlock->execute(exec); 4232 if (exec->completionType() != Normal) 4233 result = finallyResult; 4234 else 4235 exec->setCompletionType(savedCompletionType); 4242 4236 } 4243 4237 4244 return c;4238 return result; 4245 4239 } 4246 4240 … … 4497 4491 } 4498 4492 4499 CompletionProgramNode::execute(ExecState* exec)4493 JSValue* ProgramNode::execute(ExecState* exec) 4500 4494 { 4501 4495 processDeclarations(exec); … … 4503 4497 } 4504 4498 4505 CompletionEvalNode::execute(ExecState* exec)4499 JSValue* EvalNode::execute(ExecState* exec) 4506 4500 { 4507 4501 processDeclarations(exec); … … 4509 4503 } 4510 4504 4511 CompletionFunctionBodyNode::execute(ExecState* exec)4505 JSValue* FunctionBodyNode::execute(ExecState* exec) 4512 4506 { 4513 4507 processDeclarations(exec); … … 4516 4510 if (!dbg->callEvent(exec, sourceId(), lineNo(), exec->function(), *exec->arguments())) { 4517 4511 dbg->imp()->abort(); 4518 return Completion(Interrupted, jsUndefined());4512 return exec->setInterruptedCompletion(); 4519 4513 } 4520 4514 } 4521 4515 4522 Completion completion= ScopeNode::execute(exec);4516 JSValue* result = ScopeNode::execute(exec); 4523 4517 4524 4518 if (Debugger* dbg = exec->dynamicGlobalObject()->debugger()) { 4525 if (completion.complType() == Throw) 4526 exec->setException(completion.value()); 4527 4519 if (exec->completionType() == Throw) 4520 exec->setException(result); 4528 4521 if (!dbg->returnEvent(exec, sourceId(), lineNo(), exec->function())) { 4529 4522 dbg->imp()->abort(); 4530 return Completion(Interrupted, jsUndefined());4523 return exec->setInterruptedCompletion(); 4531 4524 } 4532 4525 } 4533 4526 4534 4527 4535 return completion;4528 return result; 4536 4529 } 4537 4530 … … 4556 4549 } 4557 4550 4558 Completion FuncDeclNode::execute(ExecState *)4559 { 4560 return Completion(Normal);4551 JSValue* FuncDeclNode::execute(ExecState* exec) 4552 { 4553 return exec->setNormalCompletion(); 4561 4554 } 4562 4555
Note:
See TracChangeset
for help on using the changeset viewer.