Changeset 31746 in webkit for trunk/JavaScriptCore/kjs
- Timestamp:
- Apr 8, 2008, 7:17:49 PM (17 years ago)
- Location:
- trunk/JavaScriptCore/kjs
- Files:
-
- 16 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JavaScriptCore/kjs/Activation.h
r31136 r31746 67 67 static const ClassInfo info; 68 68 69 virtual JSObject* toThisObject(ExecState*) const; 70 69 71 virtual void mark(); 70 72 void markChildren(); -
trunk/JavaScriptCore/kjs/ExecState.cpp
r31267 r31746 43 43 44 44 // The constructor for the globalExec pseudo-ExecState 45 inline ExecState::ExecState(JSGlobalObject* globalObject )45 inline ExecState::ExecState(JSGlobalObject* globalObject, JSObject* thisObject) 46 46 : m_globalObject(globalObject) 47 47 , m_exception(0) … … 56 56 , m_inlineScopeChainNode(0, 0) 57 57 , m_variableObject(globalObject) 58 , m_thisValue(globalObject) 58 , m_thisValue(thisObject) 59 , m_globalThisValue(thisObject) 59 60 , m_iterationDepth(0) 60 61 , m_switchDepth(0) … … 78 79 , m_variableObject(globalObject) 79 80 , m_thisValue(thisObject) 81 , m_globalThisValue(thisObject) 80 82 , m_iterationDepth(0) 81 83 , m_switchDepth(0) … … 101 103 , m_variableObject(variableObject) 102 104 , m_thisValue(thisObject) 105 , m_globalThisValue(thisObject) 103 106 , m_iterationDepth(0) 104 107 , m_switchDepth(0) … … 116 119 } 117 120 118 GlobalExecState::GlobalExecState(JSGlobalObject* globalObject )119 : ExecState(globalObject )121 GlobalExecState::GlobalExecState(JSGlobalObject* globalObject, JSObject* thisObject) 122 : ExecState(globalObject, thisObject) 120 123 { 121 124 } -
trunk/JavaScriptCore/kjs/ExecState.h
r31172 r31746 74 74 75 75 JSObject* thisValue() const { return m_thisValue; } 76 JSObject* globalThisValue() const { return m_globalThisValue; } 76 77 77 78 ExecState* callingExecState() { return m_callingExec; } … … 165 166 166 167 protected: 167 ExecState(JSGlobalObject* );168 ExecState(JSGlobalObject*, JSObject* thisObject); 168 169 ExecState(JSGlobalObject*, JSObject* thisObject, ProgramNode*); 169 170 ExecState(JSGlobalObject*, JSObject* thisObject, EvalNode*, ExecState* callingExecState, const ScopeChain&, JSVariableObject*); 170 ExecState(JSGlobalObject*, JSObject* thisObject, FunctionBodyNode*, ExecState* callingExecState, FunctionImp*, const List& args);171 ExecState(JSGlobalObject*, JSObject* thisObject, JSObject* globalThisValue, FunctionBodyNode*, ExecState* callingExecState, FunctionImp*, const List& args); 171 172 ~ExecState(); 172 173 … … 191 192 ScopeChainNode m_inlineScopeChainNode; 192 193 JSVariableObject* m_variableObject; 194 193 195 JSObject* m_thisValue; 196 JSObject* m_globalThisValue; 194 197 195 198 LabelStack m_labelStack; … … 204 207 class GlobalExecState : public ExecState { 205 208 public: 206 GlobalExecState(JSGlobalObject* );209 GlobalExecState(JSGlobalObject*, JSObject* thisObject); 207 210 ~GlobalExecState(); 208 211 }; … … 222 225 class FunctionExecState : public ExecState { 223 226 public: 224 FunctionExecState(JSGlobalObject*, JSObject* thisObject, FunctionBodyNode*,227 FunctionExecState(JSGlobalObject*, JSObject* thisObject, JSObject* globalThisValue, FunctionBodyNode*, 225 228 ExecState* callingExecState, FunctionImp*, const List& args); 226 229 ~FunctionExecState(); -
trunk/JavaScriptCore/kjs/ExecStateInlines.h
r31205 r31746 31 31 namespace KJS { 32 32 33 inline ExecState::ExecState(JSGlobalObject* globalObject, JSObject* thisObject, 33 inline ExecState::ExecState(JSGlobalObject* globalObject, JSObject* thisObject, JSObject* globalThisValue, 34 34 FunctionBodyNode* functionBodyNode, ExecState* callingExec, 35 35 FunctionImp* func, const List& args) … … 45 45 , m_inlineScopeChainNode(0, 0) 46 46 , m_thisValue(thisObject) 47 , m_globalThisValue(globalThisValue) 47 48 , m_iterationDepth(0) 48 49 , m_switchDepth(0) … … 69 70 } 70 71 71 inline FunctionExecState::FunctionExecState(JSGlobalObject* globalObject, JSObject* thisObject, 72 inline FunctionExecState::FunctionExecState(JSGlobalObject* globalObject, JSObject* thisObject, JSObject* globalThisValue, 72 73 FunctionBodyNode* functionBodyNode, ExecState* callingExec, 73 74 FunctionImp* func, const List& args) 74 : ExecState(globalObject, thisObject, functionBodyNode, callingExec, func, args)75 : ExecState(globalObject, thisObject, globalThisValue, functionBodyNode, callingExec, func, args) 75 76 { 76 77 m_globalObject->activeExecStates().append(this); -
trunk/JavaScriptCore/kjs/JSGlobalObject.cpp
r31226 r31746 328 328 // Set global functions. 329 329 330 d()->evalFunction = new PrototypeReflexiveFunction(exec, d()->functionPrototype, 1, exec->propertyNames().eval, globalFuncEval );330 d()->evalFunction = new PrototypeReflexiveFunction(exec, d()->functionPrototype, 1, exec->propertyNames().eval, globalFuncEval, this); 331 331 putDirectFunction(d()->evalFunction, DontEnum); 332 332 putDirectFunction(new PrototypeFunction(exec, d()->functionPrototype, 2, "parseInt", globalFuncParseInt), DontEnum); … … 535 535 } 536 536 537 JSGlobalObject* JSGlobalObject::toGlobalObject(ExecState*) const 538 { 539 return const_cast<JSGlobalObject*>(this); 540 } 541 537 542 ExecState* JSGlobalObject::globalExec() 538 543 { -
trunk/JavaScriptCore/kjs/JSGlobalObject.h
r31173 r31746 77 77 78 78 struct JSGlobalObjectData : public JSVariableObjectData { 79 JSGlobalObjectData(JSGlobalObject* globalObject )79 JSGlobalObjectData(JSGlobalObject* globalObject, JSObject* thisValue) 80 80 : JSVariableObjectData(&inlineSymbolTable) 81 , globalExec(globalObject )81 , globalExec(globalObject, thisValue) 82 82 { 83 83 } … … 142 142 public: 143 143 JSGlobalObject() 144 : JSVariableObject(new JSGlobalObjectData(this ))144 : JSVariableObject(new JSGlobalObjectData(this, this)) 145 145 { 146 146 init(); … … 148 148 149 149 protected: 150 JSGlobalObject(JSValue* proto )151 : JSVariableObject(proto, new JSGlobalObjectData(this ))150 JSGlobalObject(JSValue* proto, JSObject* globalThisValue) 151 : JSVariableObject(proto, new JSGlobalObjectData(this, globalThisValue)) 152 152 { 153 153 init(); … … 226 226 227 227 virtual bool isGlobalObject() const { return true; } 228 virtual JSGlobalObject* toGlobalObject(ExecState*) const; 228 229 229 230 virtual ExecState* globalExec(); -
trunk/JavaScriptCore/kjs/array_instance.cpp
r31343 r31746 24 24 #include "array_instance.h" 25 25 26 #include "JSGlobalObject.h"27 26 #include "PropertyNameArray.h" 28 27 #include <wtf/Assertions.h> … … 490 489 : exec(e) 491 490 , compareFunction(cf) 492 , global Object(e->dynamicGlobalObject())491 , globalThisValue(e->globalThisValue()) 493 492 { 494 493 } … … 497 496 JSObject *compareFunction; 498 497 List arguments; 499 JS GlobalObject* globalObject;498 JSObject* globalThisValue; 500 499 }; 501 500 … … 514 513 args->arguments.append(va); 515 514 args->arguments.append(vb); 516 double compareResult = args->compareFunction->call 517 (args->exec, args->globalObject, args->arguments)->toNumber(args->exec); 515 double compareResult = args->compareFunction->call(args->exec, args->globalThisValue, args->arguments)->toNumber(args->exec); 518 516 return compareResult < 0 ? -1 : compareResult > 0 ? 1 : 0; 519 517 } -
trunk/JavaScriptCore/kjs/array_object.cpp
r30041 r31746 405 405 l.append(jObj); 406 406 l.append(minObj); 407 compareResult = sortFunction->call(exec, exec-> dynamicGlobalObject(), l)->toNumber(exec);407 compareResult = sortFunction->call(exec, exec->globalThisValue(), l)->toNumber(exec); 408 408 } else 409 409 compareResult = (jObj->toString(exec) < minObj->toString(exec)) ? -1 : 1; … … 503 503 return throwError(exec, TypeError); 504 504 505 JSObject* applyThis = args[1]->isUndefinedOrNull() ? exec-> dynamicGlobalObject() : args[1]->toObject(exec);505 JSObject* applyThis = args[1]->isUndefinedOrNull() ? exec->globalThisValue() : args[1]->toObject(exec); 506 506 JSObject* resultArray = static_cast<JSObject*>(exec->lexicalGlobalObject()->arrayConstructor()->construct(exec, exec->emptyList())); 507 507 … … 536 536 return throwError(exec, TypeError); 537 537 538 JSObject* applyThis = args[1]->isUndefinedOrNull() ? exec-> dynamicGlobalObject() : args[1]->toObject(exec);538 JSObject* applyThis = args[1]->isUndefinedOrNull() ? exec->globalThisValue() : args[1]->toObject(exec); 539 539 540 540 unsigned length = thisObj->get(exec, exec->propertyNames().length)->toUInt32(exec); … … 576 576 return throwError(exec, TypeError); 577 577 578 JSObject* applyThis = args[1]->isUndefinedOrNull() ? exec-> dynamicGlobalObject() : args[1]->toObject(exec);578 JSObject* applyThis = args[1]->isUndefinedOrNull() ? exec->globalThisValue() : args[1]->toObject(exec); 579 579 580 580 JSValue* result = jsBoolean(true); … … 611 611 return throwError(exec, TypeError); 612 612 613 JSObject* applyThis = args[1]->isUndefinedOrNull() ? exec-> dynamicGlobalObject() : args[1]->toObject(exec);613 JSObject* applyThis = args[1]->isUndefinedOrNull() ? exec->globalThisValue() : args[1]->toObject(exec); 614 614 615 615 unsigned length = thisObj->get(exec, exec->propertyNames().length)->toUInt32(exec); … … 636 636 return throwError(exec, TypeError); 637 637 638 JSObject* applyThis = args[1]->isUndefinedOrNull() ? exec-> dynamicGlobalObject() : args[1]->toObject(exec);638 JSObject* applyThis = args[1]->isUndefinedOrNull() ? exec->globalThisValue() : args[1]->toObject(exec); 639 639 640 640 JSValue* result = jsBoolean(false); -
trunk/JavaScriptCore/kjs/function.cpp
r31173 r31746 74 74 JSValue* FunctionImp::callAsFunction(ExecState* exec, JSObject* thisObj, const List& args) 75 75 { 76 FunctionExecState newExec(exec->dynamicGlobalObject(), thisObj, body.get(), exec, this, args);76 FunctionExecState newExec(exec->dynamicGlobalObject(), thisObj, exec->globalThisValue(), body.get(), exec, this, args); 77 77 JSValue* result = body->execute(&newExec); 78 78 if (newExec.completionType() == ReturnValue) … … 465 465 // call instead of storing the list ourselves. 466 466 d()->argumentsObject = new Arguments(exec, d()->exec->function(), *d()->exec->arguments(), this); 467 } 468 469 JSObject* ActivationImp::toThisObject(ExecState* exec) const 470 { 471 return exec->globalThisValue(); 467 472 } 468 473 … … 739 744 JSValue* globalFuncEval(ExecState* exec, PrototypeReflexiveFunction* function, JSObject* thisObj, const List& args) 740 745 { 741 JSGlobalObject* globalObject = thisObj-> isGlobalObject() ? static_cast<JSGlobalObject*>(thisObj) : 0;746 JSGlobalObject* globalObject = thisObj->toGlobalObject(exec); 742 747 743 748 if (!globalObject || globalObject->evalFunction() != function) … … 745 750 746 751 ScopeChain scopeChain(globalObject); 747 return eval(exec, scopeChain, globalObject, globalObject, globalObject, args);752 return eval(exec, scopeChain, globalObject, globalObject, function->cachedGlobalObject()->toThisObject(exec), args); 748 753 } 749 754 … … 891 896 // ------------------------------ PrototypeReflexiveFunction ------------------------------- 892 897 893 PrototypeReflexiveFunction::PrototypeReflexiveFunction(ExecState* exec, FunctionPrototype* functionPrototype, int len, const Identifier& name, JSMemberFunction function )898 PrototypeReflexiveFunction::PrototypeReflexiveFunction(ExecState* exec, FunctionPrototype* functionPrototype, int len, const Identifier& name, JSMemberFunction function, JSGlobalObject* cachedGlobalObject) 894 899 : InternalFunctionImp(functionPrototype, name) 895 900 , m_function(function) 901 , m_cachedGlobalObject(cachedGlobalObject) 896 902 { 897 903 ASSERT_ARG(function, function); 904 ASSERT_ARG(cachedGlobalObject, cachedGlobalObject); 898 905 putDirect(exec->propertyNames().length, jsNumber(len), DontDelete | ReadOnly | DontEnum); 899 906 } … … 904 911 } 905 912 913 void PrototypeReflexiveFunction::mark() 914 { 915 InternalFunctionImp::mark(); 916 if (!m_cachedGlobalObject->marked()) 917 m_cachedGlobalObject->mark(); 918 } 919 906 920 } // namespace KJS -
trunk/JavaScriptCore/kjs/function.h
r30871 r31746 143 143 typedef JSValue* (*JSMemberFunction)(ExecState*, PrototypeReflexiveFunction*, JSObject* thisObj, const List&); 144 144 145 PrototypeReflexiveFunction(ExecState*, FunctionPrototype*, int len, const Identifier&, JSMemberFunction );145 PrototypeReflexiveFunction(ExecState*, FunctionPrototype*, int len, const Identifier&, JSMemberFunction, JSGlobalObject* expectedThisObject); 146 146 147 virtual void mark(); 147 148 virtual JSValue* callAsFunction(ExecState* exec, JSObject* thisObj, const List&); 149 150 JSGlobalObject* cachedGlobalObject() const { return m_cachedGlobalObject; } 148 151 149 152 private: 150 153 const JSMemberFunction m_function; 154 JSGlobalObject* m_cachedGlobalObject; 151 155 }; 152 156 -
trunk/JavaScriptCore/kjs/function_object.cpp
r31208 r31746 87 87 JSObject* applyThis; 88 88 if (thisArg->isUndefinedOrNull()) 89 applyThis = exec-> dynamicGlobalObject();89 applyThis = exec->globalThisValue(); 90 90 else 91 91 applyThis = thisArg->toObject(exec); … … 117 117 JSObject* callThis; 118 118 if (thisArg->isUndefinedOrNull()) 119 callThis = exec-> dynamicGlobalObject();119 callThis = exec->globalThisValue(); 120 120 else 121 121 callThis = thisArg->toObject(exec); -
trunk/JavaScriptCore/kjs/nodes.cpp
r31431 r31746 1123 1123 KJS_CHECKEXCEPTIONVALUE 1124 1124 1125 JSObject* thisObj = base;1126 // ECMA 11.2.3 says that in this situation the this value should be null.1127 // However, section 10.2.3 says that in the case where the value provided1128 // by the caller is null, the global object should be used. It also says1129 // that the section does not apply to internal functions, but for simplicity1130 // of implementation we use the global object anyway here. This guarantees1131 // that in host objects you always get a valid object for this.1132 if (thisObj->isActivationObject())1133 thisObj = exec->dynamicGlobalObject();1134 1135 1125 if (callerType == EvalOperator) { 1136 1126 if (base == exec->lexicalGlobalObject() && func == exec->lexicalGlobalObject()->evalFunction()) { … … 1139 1129 } 1140 1130 } 1131 1132 JSObject* thisObj = base->toThisObject(exec); 1141 1133 return func->call(exec, thisObj, argList); 1142 1134 } … … 1183 1175 KJS_CHECKEXCEPTIONVALUE 1184 1176 1185 JSObject* thisObj = exec->dynamicGlobalObject(); 1186 1177 JSObject* thisObj = exec->globalThisValue(); 1187 1178 return func->call(exec, thisObj, argList); 1188 1179 } … … 1267 1258 KJS_CHECKEXCEPTIONVALUE 1268 1259 1269 return func->call(exec, exec->dynamicGlobalObject(), argList); 1260 JSObject* thisObj = exec->globalThisValue(); 1261 return func->call(exec, thisObj, argList); 1270 1262 } 1271 1263 … … 1319 1311 m_args->evaluateList(exec, argList); 1320 1312 KJS_CHECKEXCEPTIONVALUE 1321 1322 return func->call(exec, exec->dynamicGlobalObject(), argList); 1313 1314 JSObject* thisObj = exec->globalThisValue(); 1315 return func->call(exec, thisObj, argList); 1323 1316 } 1324 1317 … … 1449 1442 ASSERT(!thisObj->isActivationObject()); 1450 1443 1444 // No need to call toThisObject() on the thisObj as it is known not to be the GlobalObject or ActivationObject 1451 1445 return func->call(exec, thisObj, argList); 1452 1446 } … … 1498 1492 ASSERT(!thisObj->isActivationObject()); 1499 1493 1494 // No need to call toThisObject() on the thisObj as it is known not to be the GlobalObject or ActivationObject 1500 1495 return func->call(exec, thisObj, argList); 1501 1496 } -
trunk/JavaScriptCore/kjs/object.cpp
r31147 r31746 94 94 #endif 95 95 96 JSValue *ret = callAsFunction(exec,thisObj,args);96 JSValue* ret = callAsFunction(exec, thisObj, args); 97 97 98 98 #if KJS_MAX_STACK > 0 … … 262 262 args.append(value); 263 263 264 setterFunc->call(exec, this , args);264 setterFunc->call(exec, this->toThisObject(exec), args); 265 265 return; 266 266 } else { … … 338 338 if (o->implementsCall()) { // spec says "not primitive type" but ... 339 339 JSObject *thisObj = const_cast<JSObject*>(object); 340 JSValue* def = o->call(exec, thisObj , exec->emptyList());340 JSValue* def = o->call(exec, thisObj->toThisObject(exec), exec->emptyList()); 341 341 JSType defType = def->type(); 342 342 ASSERT(defType != GetterSetterType); … … 418 418 _prop.setHasGetterSetterProperties(true); 419 419 gs->setSetter(setterFunc); 420 } 421 422 JSValue* JSObject::lookupGetter(ExecState*, const Identifier& propertyName) 423 { 424 JSObject* obj = this; 425 while (true) { 426 JSValue* v = obj->getDirect(propertyName); 427 if (v) { 428 if (v->type() != GetterSetterType) 429 return jsUndefined(); 430 JSObject* funcObj = static_cast<GetterSetterImp*>(v)->getGetter(); 431 if (!funcObj) 432 return jsUndefined(); 433 return funcObj; 434 } 435 436 if (!obj->prototype() || !obj->prototype()->isObject()) 437 return jsUndefined(); 438 obj = static_cast<JSObject*>(obj->prototype()); 439 } 440 } 441 442 JSValue* JSObject::lookupSetter(ExecState*, const Identifier& propertyName) 443 { 444 JSObject* obj = this; 445 while (true) { 446 JSValue* v = obj->getDirect(propertyName); 447 if (v) { 448 if (v->type() != GetterSetterType) 449 return jsUndefined(); 450 JSObject* funcObj = static_cast<GetterSetterImp*>(v)->getSetter(); 451 if (!funcObj) 452 return jsUndefined(); 453 return funcObj; 454 } 455 456 if (!obj->prototype() || !obj->prototype()->isObject()) 457 return jsUndefined(); 458 obj = static_cast<JSObject*>(obj->prototype()); 459 } 420 460 } 421 461 … … 546 586 } 547 587 588 JSObject* JSObject::toThisObject(ExecState*) const 589 { 590 return const_cast<JSObject*>(this); 591 } 592 593 JSGlobalObject* JSObject::toGlobalObject(ExecState*) const 594 { 595 return 0; 596 } 597 548 598 void JSObject::putDirect(const Identifier &propertyName, JSValue *value, int attr) 549 599 { … … 571 621 JSObject *getterFunc = gs->getGetter(); 572 622 if (getterFunc) 573 slot.setGetterSlot(this , getterFunc);623 slot.setGetterSlot(this->toThisObject(0), getterFunc); 574 624 else 575 625 slot.setUndefined(this); -
trunk/JavaScriptCore/kjs/object.h
r31225 r31746 403 403 virtual UString toString(ExecState *exec) const; 404 404 virtual JSObject *toObject(ExecState *exec) const; 405 405 406 virtual JSObject* toThisObject(ExecState*) const; 407 virtual JSGlobalObject* toGlobalObject(ExecState*) const; 408 406 409 virtual bool getPropertyAttributes(const Identifier& propertyName, unsigned& attributes) const; 407 410 … … 425 428 void fillGetterPropertySlot(PropertySlot& slot, JSValue **location); 426 429 427 void defineGetter(ExecState *exec, const Identifier& propertyName, JSObject *getterFunc); 428 void defineSetter(ExecState *exec, const Identifier& propertyName, JSObject *setterFunc); 430 virtual void defineGetter(ExecState*, const Identifier& propertyName, JSObject* getterFunction); 431 virtual void defineSetter(ExecState*, const Identifier& propertyName, JSObject* setterFunction); 432 virtual JSValue* lookupGetter(ExecState*, const Identifier& propertyName); 433 virtual JSValue* lookupSetter(ExecState*, const Identifier& propertyName); 429 434 430 435 void saveProperties(SavedProperties &p) const { _prop.save(p); } -
trunk/JavaScriptCore/kjs/object_object.cpp
r31208 r31746 110 110 JSValue* objectProtoFuncLookupGetter(ExecState* exec, JSObject* thisObj, const List& args) 111 111 { 112 Identifier propertyName = Identifier(args[0]->toString(exec)); 113 JSObject* obj = thisObj; 114 while (true) { 115 JSValue* v = obj->getDirect(propertyName); 116 if (v) { 117 if (v->type() != GetterSetterType) 118 return jsUndefined(); 119 JSObject* funcObj = static_cast<GetterSetterImp*>(v)->getGetter(); 120 if (!funcObj) 121 return jsUndefined(); 122 return funcObj; 123 } 124 125 if (!obj->prototype() || !obj->prototype()->isObject()) 126 return jsUndefined(); 127 obj = static_cast<JSObject*>(obj->prototype()); 128 } 112 return thisObj->lookupGetter(exec, Identifier(args[0]->toString(exec))); 129 113 } 130 114 131 115 JSValue* objectProtoFuncLookupSetter(ExecState* exec, JSObject* thisObj, const List& args) 132 116 { 133 Identifier propertyName = Identifier(args[0]->toString(exec)); 134 JSObject* obj = thisObj; 135 while (true) { 136 JSValue* v = obj->getDirect(propertyName); 137 if (v) { 138 if (v->type() != GetterSetterType) 139 return jsUndefined(); 140 JSObject* funcObj = static_cast<GetterSetterImp*>(v)->getSetter(); 141 if (!funcObj) 142 return jsUndefined(); 143 return funcObj; 144 } 145 146 if (!obj->prototype() || !obj->prototype()->isObject()) 147 return jsUndefined(); 148 obj = static_cast<JSObject*>(obj->prototype()); 149 } 117 return thisObj->lookupSetter(exec, Identifier(args[0]->toString(exec))); 150 118 } 151 119 -
trunk/JavaScriptCore/kjs/string_object.cpp
r30942 r31746 351 351 args.append(sourceVal); 352 352 353 substitutedReplacement = replacementFunction->call(exec, exec->dynamicGlobalObject(), 354 args)->toString(exec); 353 substitutedReplacement = replacementFunction->call(exec, exec->globalThisValue(), args)->toString(exec); 355 354 } else 356 355 substitutedReplacement = substituteBackreferences(replacementString, source, ovector, reg); … … 401 400 args.append(sourceVal); 402 401 403 replacementString = replacementFunction->call(exec, exec->dynamicGlobalObject(), 404 args)->toString(exec); 402 replacementString = replacementFunction->call(exec, exec->globalThisValue(), args)->toString(exec); 405 403 } 406 404
Note:
See TracChangeset
for help on using the changeset viewer.