JSValue evaluate(ExecState* exec, const SourceCode& source, JSValue thisValue, NakedPtr<Exception>& returnedException) { JSLockHolder lock(exec); RELEASE_ASSERT(exec->vm().atomicStringTable() == wtfThreadData().atomicStringTable()); RELEASE_ASSERT(!exec->vm().isCollectorBusy()); CodeProfiling profile(source); ProgramExecutable* program = ProgramExecutable::create(exec, source); if (!program) { returnedException = exec->vm().exception(); exec->vm().clearException(); return jsUndefined(); } if (!thisValue || thisValue.isUndefinedOrNull()) thisValue = exec->vmEntryGlobalObject(); JSObject* thisObj = jsCast<JSObject*>(thisValue.toThis(exec, NotStrictMode)); JSValue result = exec->interpreter()->execute(program, exec, thisObj); if (exec->hadException()) { returnedException = exec->exception(); exec->clearException(); return jsUndefined(); } RELEASE_ASSERT(result); return result; }
JSValue evaluate(ExecState* exec, const SourceCode& source, JSValue thisValue, NakedPtr<Exception>& returnedException) { VM& vm = exec->vm(); JSLockHolder lock(vm); auto scope = DECLARE_CATCH_SCOPE(vm); RELEASE_ASSERT(vm.atomicStringTable() == wtfThreadData().atomicStringTable()); RELEASE_ASSERT(!vm.isCollectorBusyOnCurrentThread()); CodeProfiling profile(source); ProgramExecutable* program = ProgramExecutable::create(exec, source); ASSERT(scope.exception() || program); if (!program) { returnedException = scope.exception(); scope.clearException(); return jsUndefined(); } if (!thisValue || thisValue.isUndefinedOrNull()) thisValue = exec->vmEntryGlobalObject(); JSObject* thisObj = jsCast<JSObject*>(thisValue.toThis(exec, NotStrictMode)); JSValue result = exec->interpreter()->execute(program, exec, thisObj); if (scope.exception()) { returnedException = scope.exception(); scope.clearException(); return jsUndefined(); } RELEASE_ASSERT(result); return result; }
EncodedJSValue JSC_HOST_CALL dateProtoFuncToJSON(ExecState* exec) { JSValue thisValue = exec->thisValue(); JSObject* object = jsCast<JSObject*>(thisValue.toThis(exec, NotStrictMode)); if (exec->hadException()) return JSValue::encode(jsNull()); JSValue toISOValue = object->get(exec, exec->vm().propertyNames->toISOString); if (exec->hadException()) return JSValue::encode(jsNull()); CallData callData; CallType callType = getCallData(toISOValue, callData); if (callType == CallTypeNone) return throwVMError(exec, createTypeError(exec, ASCIILiteral("toISOString is not a function"))); JSValue result = call(exec, asObject(toISOValue), callType, callData, object, exec->emptyList()); if (exec->hadException()) return JSValue::encode(jsNull()); if (result.isObject()) return throwVMError(exec, createTypeError(exec, ASCIILiteral("toISOString did not return a primitive value"))); return JSValue::encode(result); }
JSValue DebuggerCallFrame::thisValue() const { ASSERT(isValid()); if (!isValid()) return jsUndefined(); CodeBlock* codeBlock = nullptr; JSValue thisValue; if (isTailDeleted()) { thisValue = m_shadowChickenFrame.thisValue; codeBlock = m_shadowChickenFrame.codeBlock; } else { thisValue = m_validMachineFrame->thisValue(); codeBlock = m_validMachineFrame->codeBlock(); } if (!thisValue) return jsUndefined(); ECMAMode ecmaMode = NotStrictMode; if (codeBlock && codeBlock->isStrictMode()) ecmaMode = StrictMode; return thisValue.toThis(m_validMachineFrame, ecmaMode); }