diff --git a/src/builtins/BuiltinArrayBuffer.cpp b/src/builtins/BuiltinArrayBuffer.cpp index 915c9e608..1655b1096 100644 --- a/src/builtins/BuiltinArrayBuffer.cpp +++ b/src/builtins/BuiltinArrayBuffer.cpp @@ -31,11 +31,13 @@ static Value builtinArrayBufferConstructor(ExecutionState& state, Value thisValu { if (!newTarget.hasValue()) { ErrorObject::throwBuiltinError(state, ErrorCode::TypeError, ErrorObject::Messages::GlobalObject_ConstructorRequiresNew); + return Value(); } uint64_t byteLength = argv[0].toIndex(state); if (UNLIKELY(byteLength == Value::InvalidIndexValue)) { ErrorObject::throwBuiltinError(state, ErrorCode::RangeError, state.context()->staticStrings().ArrayBuffer.string(), false, String::emptyString, ErrorObject::Messages::GlobalObject_FirstArgumentInvalidLength); + return Value(); } Optional maxByteLength; diff --git a/src/builtins/BuiltinDataView.cpp b/src/builtins/BuiltinDataView.cpp index 8f620756e..19e60fca9 100644 --- a/src/builtins/BuiltinDataView.cpp +++ b/src/builtins/BuiltinDataView.cpp @@ -42,6 +42,7 @@ static Value builtinDataViewConstructor(ExecutionState& state, Value thisValue, { if (!newTarget.hasValue()) { ErrorObject::throwBuiltinError(state, ErrorCode::TypeError, ErrorObject::Messages::GlobalObject_ConstructorRequiresNew); + return Value(); } if (!(argv[0].isObject() && argv[0].asPointerValue()->isArrayBuffer())) { ErrorObject::throwBuiltinError(state, ErrorCode::TypeError, state.context()->staticStrings().DataView.string(), false, String::emptyString, ErrorObject::Messages::GlobalObject_ThisNotArrayBufferObject); diff --git a/src/builtins/BuiltinFinalizationRegistry.cpp b/src/builtins/BuiltinFinalizationRegistry.cpp index 66a81a6d7..64845d0a2 100644 --- a/src/builtins/BuiltinFinalizationRegistry.cpp +++ b/src/builtins/BuiltinFinalizationRegistry.cpp @@ -36,6 +36,7 @@ static Value builtinFinalizationRegistryConstructor(ExecutionState& state, Value { if (!newTarget.hasValue()) { ErrorObject::throwBuiltinError(state, ErrorCode::TypeError, ErrorObject::Messages::GlobalObject_ConstructorRequiresNew); + return Value(); } if (argc == 0 || !argv[0].isCallable()) { ErrorObject::throwBuiltinError(state, ErrorCode::TypeError, "cleanup Callback is not callable"); diff --git a/src/builtins/BuiltinIntl.cpp b/src/builtins/BuiltinIntl.cpp index 1d7243871..2048b79ea 100644 --- a/src/builtins/BuiltinIntl.cpp +++ b/src/builtins/BuiltinIntl.cpp @@ -449,6 +449,7 @@ static Value builtinIntlPluralRulesConstructor(ExecutionState& state, Value this // If NewTarget is undefined, throw a TypeError exception. if (!newTarget) { ErrorObject::throwBuiltinError(state, ErrorCode::TypeError, ErrorObject::Messages::GlobalObject_ConstructorRequiresNew); + return Value(); } #if defined(ENABLE_RUNTIME_ICU_BINDER) @@ -570,6 +571,7 @@ static Value builtinIntlLocaleConstructor(ExecutionState& state, Value thisValue // If NewTarget is undefined, throw a TypeError exception. if (!newTarget) { ErrorObject::throwBuiltinError(state, ErrorCode::TypeError, ErrorObject::Messages::GlobalObject_ConstructorRequiresNew); + return Value(); } Value tagValue = argv[0]; @@ -908,6 +910,7 @@ static Value builtinIntlRelativeTimeFormatConstructor(ExecutionState& state, Val // If NewTarget is undefined, throw a TypeError exception. if (!newTarget) { ErrorObject::throwBuiltinError(state, ErrorCode::TypeError, ErrorObject::Messages::GlobalObject_ConstructorRequiresNew); + return Value(); } #if defined(ENABLE_RUNTIME_ICU_BINDER) @@ -1002,6 +1005,7 @@ static Value builtinIntlDisplayNamesConstructor(ExecutionState& state, Value thi // If NewTarget is undefined, throw a TypeError exception. if (!newTarget) { ErrorObject::throwBuiltinError(state, ErrorCode::TypeError, ErrorObject::Messages::GlobalObject_ConstructorRequiresNew); + return Value(); } Object* proto = Object::getPrototypeFromConstructor(state, newTarget.value(), [](ExecutionState& state, Context* realm) -> Object* { @@ -1046,6 +1050,7 @@ static Value builtinIntlListFormatConstructor(ExecutionState& state, Value thisV // If NewTarget is undefined, throw a TypeError exception. if (!newTarget) { ErrorObject::throwBuiltinError(state, ErrorCode::TypeError, ErrorObject::Messages::GlobalObject_ConstructorRequiresNew); + return Value(); } Object* proto = Object::getPrototypeFromConstructor(state, newTarget.value(), [](ExecutionState& state, Context* realm) -> Object* { diff --git a/src/builtins/BuiltinMap.cpp b/src/builtins/BuiltinMap.cpp index 5077e4d75..56894d4f9 100644 --- a/src/builtins/BuiltinMap.cpp +++ b/src/builtins/BuiltinMap.cpp @@ -31,6 +31,7 @@ static Value builtinMapConstructor(ExecutionState& state, Value thisValue, size_ { if (!newTarget.hasValue()) { ErrorObject::throwBuiltinError(state, ErrorCode::TypeError, ErrorObject::Messages::GlobalObject_ConstructorRequiresNew); + return Value(); } // Let map be ? OrdinaryCreateFromConstructor(NewTarget, "%MapPrototype%", « [[MapData]] »). diff --git a/src/builtins/BuiltinSet.cpp b/src/builtins/BuiltinSet.cpp index bb1d42c2d..efec19e3d 100644 --- a/src/builtins/BuiltinSet.cpp +++ b/src/builtins/BuiltinSet.cpp @@ -32,6 +32,7 @@ static Value builtinSetConstructor(ExecutionState& state, Value thisValue, size_ // If NewTarget is undefined, throw a TypeError exception. if (!newTarget.hasValue()) { ErrorObject::throwBuiltinError(state, ErrorCode::TypeError, ErrorObject::Messages::GlobalObject_ConstructorRequiresNew); + return Value(); } // Let set be ? OrdinaryCreateFromConstructor(NewTarget, "%SetPrototype%", « [[SetData]] »). diff --git a/src/builtins/BuiltinTypedArray.cpp b/src/builtins/BuiltinTypedArray.cpp index 719e547ae..1142c5cba 100644 --- a/src/builtins/BuiltinTypedArray.cpp +++ b/src/builtins/BuiltinTypedArray.cpp @@ -379,6 +379,7 @@ static Value builtinTypedArrayConstructor(ExecutionState& state, Value thisValue uint64_t elemlen = firstArg.toIndex(state); if (elemlen == Value::InvalidIndexValue) { ErrorObject::throwBuiltinError(state, ErrorCode::RangeError, state.context()->staticStrings().TypedArray.string(), false, String::emptyString, ErrorObject::Messages::GlobalObject_FirstArgumentInvalidLength); + return Value(); } return TA::allocateTypedArray(state, newTarget.value(), elemlen); } diff --git a/src/builtins/BuiltinWeakMap.cpp b/src/builtins/BuiltinWeakMap.cpp index ae8c1e960..6f9d565bc 100644 --- a/src/builtins/BuiltinWeakMap.cpp +++ b/src/builtins/BuiltinWeakMap.cpp @@ -31,6 +31,7 @@ static Value builtinWeakMapConstructor(ExecutionState& state, Value thisValue, s { if (!newTarget.hasValue()) { ErrorObject::throwBuiltinError(state, ErrorCode::TypeError, ErrorObject::Messages::GlobalObject_ConstructorRequiresNew); + return Value(); } Object* proto = Object::getPrototypeFromConstructor(state, newTarget.value(), [](ExecutionState& state, Context* constructorRealm) -> Object* { diff --git a/src/builtins/BuiltinWeakRef.cpp b/src/builtins/BuiltinWeakRef.cpp index 64a0b8915..72107ccee 100644 --- a/src/builtins/BuiltinWeakRef.cpp +++ b/src/builtins/BuiltinWeakRef.cpp @@ -30,6 +30,7 @@ static Value builtinWeakRefConstructor(ExecutionState& state, Value thisValue, s { if (!newTarget.hasValue()) { ErrorObject::throwBuiltinError(state, ErrorCode::TypeError, ErrorObject::Messages::GlobalObject_ConstructorRequiresNew); + return Value(); } if (argc == 0 || !argv[0].isObject()) { ErrorObject::throwBuiltinError(state, ErrorCode::TypeError, "target is not object"); diff --git a/src/builtins/BuiltinWeakSet.cpp b/src/builtins/BuiltinWeakSet.cpp index 0fdffb6aa..6b981e3e8 100644 --- a/src/builtins/BuiltinWeakSet.cpp +++ b/src/builtins/BuiltinWeakSet.cpp @@ -32,6 +32,7 @@ static Value builtinWeakSetConstructor(ExecutionState& state, Value thisValue, s { if (!newTarget.hasValue()) { ErrorObject::throwBuiltinError(state, ErrorCode::TypeError, ErrorObject::Messages::GlobalObject_ConstructorRequiresNew); + return Value(); } Object* proto = Object::getPrototypeFromConstructor(state, newTarget.value(), [](ExecutionState& state, Context* constructorRealm) -> Object* { diff --git a/src/interpreter/ByteCode.h b/src/interpreter/ByteCode.h index 8f8bb854f..2179e686f 100644 --- a/src/interpreter/ByteCode.h +++ b/src/interpreter/ByteCode.h @@ -3004,7 +3004,7 @@ class End : public ByteCode { #ifndef NDEBUG void dump() { - printf("end(return with r[%u])", m_registerIndex); + printf("end(return with r%u)", m_registerIndex); } #endif }; diff --git a/src/interpreter/ByteCodeInterpreter.cpp b/src/interpreter/ByteCodeInterpreter.cpp index c15d28e87..1b136ce85 100644 --- a/src/interpreter/ByteCodeInterpreter.cpp +++ b/src/interpreter/ByteCodeInterpreter.cpp @@ -3083,7 +3083,7 @@ NEVER_INLINE Value InterpreterSlowPath::tryOperation(ExecutionState*& state, siz return Value(); } } catch (const Value& val) { - stackTraceDataVector = newState->context()->vmInstance()->currentSandBox()->stackTraceDataVector(); + stackTraceDataVector = std::move(newState->context()->vmInstance()->currentSandBox()->stackTraceDataVector()); newState->rareData()->m_controlFlowRecord->back() = new ControlFlowRecord(ControlFlowRecord::NeedsThrow, val); } } @@ -3156,7 +3156,7 @@ NEVER_INLINE Value InterpreterSlowPath::tryOperation(ExecutionState*& state, siz return Value(Value::EmptyValue); } } else if (record->reason() == ControlFlowRecord::NeedsThrow) { - state->context()->vmInstance()->currentSandBox()->rethrowPreviouslyCaughtException(*state, record->value(), stackTraceDataVector); + state->context()->vmInstance()->currentSandBox()->rethrowPreviouslyCaughtException(*state, record->value(), std::move(stackTraceDataVector)); ASSERT_NOT_REACHED(); // never get here. but I add return statement for removing compile warning return Value(Value::EmptyValue); diff --git a/src/parser/Script.cpp b/src/parser/Script.cpp index 76b74c139..3f50cb240 100644 --- a/src/parser/Script.cpp +++ b/src/parser/Script.cpp @@ -85,6 +85,7 @@ Script* Script::loadModuleFromScript(ExecutionState& state, ModuleRequest& reque Platform::LoadModuleResult result = Global::platform()->onLoadModule(context(), this, request.m_specifier, request.m_type); if (!result.script) { ErrorObject::throwBuiltinError(state, (ErrorCode)result.errorCode, result.errorMessage->toNonGCUTF8StringData().data()); + return nullptr; } if (!result.script->moduleData()->m_didCallLoadedCallback) { Global::platform()->didLoadModule(context(), this, result.script.value()); diff --git a/src/runtime/ExecutionState.cpp b/src/runtime/ExecutionState.cpp index f91b068b9..c530056ce 100644 --- a/src/runtime/ExecutionState.cpp +++ b/src/runtime/ExecutionState.cpp @@ -197,6 +197,7 @@ Object* ExecutionState::findPrivateMemberContextObject() auto o = mostNearestHomeObject(); if (!o) { ErrorObject::throwBuiltinError(*this, ErrorCode::TypeError, "Cannot read/write private member here"); + return nullptr; } return convertHomeObjectIntoPrivateMemberContextObject(o.value()); } diff --git a/src/runtime/ScriptClassConstructorFunctionObject.cpp b/src/runtime/ScriptClassConstructorFunctionObject.cpp index aa478e065..e32efdb2f 100644 --- a/src/runtime/ScriptClassConstructorFunctionObject.cpp +++ b/src/runtime/ScriptClassConstructorFunctionObject.cpp @@ -146,8 +146,7 @@ Value ScriptClassConstructorFunctionObject::construct(ExecutionState& state, con // Return envRec.GetThisBinding(). // -> perform at ScriptClassConstructorFunctionObjectReturnValueBinderWithConstruct return FunctionObjectProcessCallGenerator::processCall(state, this, thisArgument, argc, argv, newTarget) - .asObject(); + ScriptClassConstructorFunctionObjectNewTargetBinderWithConstruct, ScriptClassConstructorFunctionObjectReturnValueBinderWithConstruct>(state, this, thisArgument, argc, argv, newTarget); } void ScriptClassConstructorFunctionObject::initInstanceFieldMembers(ExecutionState& state, Object* instance)