| Index: src/wasm/wasm-js.cc
|
| diff --git a/src/wasm/wasm-js.cc b/src/wasm/wasm-js.cc
|
| index 0b6b25b127f1429be3b0f019cc5e90aa53d16250..811b62f0505bbf6e12afdf85f53710cdb700b6ed 100644
|
| --- a/src/wasm/wasm-js.cc
|
| +++ b/src/wasm/wasm-js.cc
|
| @@ -312,7 +312,7 @@ bool GetIntegerProperty(v8::Isolate* isolate, ErrorThrower* thrower,
|
| int upper_bound) {
|
| v8::MaybeLocal<v8::Value> maybe = object->Get(context, property);
|
| v8::Local<v8::Value> value;
|
| - if (maybe.ToLocal(&value) && !value->IsUndefined()) {
|
| + if (maybe.ToLocal(&value)) {
|
| int64_t number;
|
| if (!value->IntegerValue(context).To(&number)) return false;
|
| if (number < static_cast<int64_t>(lower_bound)) {
|
| @@ -321,19 +321,13 @@ bool GetIntegerProperty(v8::Isolate* isolate, ErrorThrower* thrower,
|
| number, lower_bound);
|
| return false;
|
| }
|
| - if (number > static_cast<int64_t>(std::numeric_limits<int>::max())) {
|
| - thrower->RangeError("Property value %" PRId64 " is out of integer range",
|
| - number);
|
| - return false;
|
| - }
|
| - int num = static_cast<int>(number);
|
| - if (num > upper_bound) {
|
| + if (number > static_cast<int64_t>(upper_bound)) {
|
| thrower->RangeError("Property value %" PRId64
|
| " is above the upper bound %d",
|
| number, upper_bound);
|
| return false;
|
| }
|
| - *result = num;
|
| + *result = static_cast<int>(number);
|
| return true;
|
| }
|
| return false;
|
| @@ -375,16 +369,17 @@ void WebAssemblyTable(const v8::FunctionCallbackInfo<v8::Value>& args) {
|
| }
|
| // The descriptor's 'maximum'.
|
| int maximum;
|
| - bool has_maximum = true;
|
| - if (!GetIntegerProperty(isolate, &thrower, context, descriptor,
|
| - v8_str(isolate, "maximum"), &maximum, initial,
|
| - max_table_size)) {
|
| - if (reinterpret_cast<i::Isolate*>(isolate)->has_pending_exception() ||
|
| - thrower.error()) {
|
| + Local<String> maximum_key = v8_str(isolate, "maximum");
|
| + Maybe<bool> has_maximum = descriptor->Has(context, maximum_key);
|
| +
|
| + if (has_maximum.IsNothing()) {
|
| + // There has been an exception, just return.
|
| + return;
|
| + }
|
| + if (has_maximum.FromJust()) {
|
| + if (!GetIntegerProperty(isolate, &thrower, context, descriptor, maximum_key,
|
| + &maximum, initial, max_table_size)) {
|
| return;
|
| - } else {
|
| - // There was no error, the property just does not exist.
|
| - has_maximum = false;
|
| }
|
| }
|
|
|
| @@ -399,7 +394,7 @@ void WebAssemblyTable(const v8::FunctionCallbackInfo<v8::Value>& args) {
|
| for (int i = 0; i < initial; ++i) fixed_array->set(i, null);
|
| table_obj->SetInternalField(0, *fixed_array);
|
| table_obj->SetInternalField(
|
| - 1, has_maximum
|
| + 1, has_maximum.FromJust()
|
| ? static_cast<i::Object*>(i::Smi::FromInt(maximum))
|
| : static_cast<i::Object*>(i_isolate->heap()->undefined_value()));
|
| i::Handle<i::Symbol> table_sym(i_isolate->native_context()->wasm_table_sym());
|
| @@ -420,20 +415,23 @@ void WebAssemblyMemory(const v8::FunctionCallbackInfo<v8::Value>& args) {
|
| Local<v8::Object> descriptor = args[0]->ToObject(context).ToLocalChecked();
|
| // The descriptor's 'initial'.
|
| int initial;
|
| - GetIntegerProperty(isolate, &thrower, context, descriptor,
|
| - v8_str(isolate, "initial"), &initial, 0, 65536);
|
| + if (!GetIntegerProperty(isolate, &thrower, context, descriptor,
|
| + v8_str(isolate, "initial"), &initial, 0, 65536)) {
|
| + return;
|
| + }
|
| // The descriptor's 'maximum'.
|
| int maximum;
|
| - bool has_maximum = true;
|
| - if (!GetIntegerProperty(isolate, &thrower, context, descriptor,
|
| - v8_str(isolate, "maximum"), &maximum, initial,
|
| - 65536)) {
|
| - if (reinterpret_cast<i::Isolate*>(isolate)->has_pending_exception() ||
|
| - thrower.error()) {
|
| + Local<String> maximum_key = v8_str(isolate, "maximum");
|
| + Maybe<bool> has_maximum = descriptor->Has(context, maximum_key);
|
| +
|
| + if (has_maximum.IsNothing()) {
|
| + // There has been an exception, just return.
|
| + return;
|
| + }
|
| + if (has_maximum.FromJust()) {
|
| + if (!GetIntegerProperty(isolate, &thrower, context, descriptor, maximum_key,
|
| + &maximum, initial, 65536)) {
|
| return;
|
| - } else {
|
| - // There was no error, the property just does not exist.
|
| - has_maximum = false;
|
| }
|
| }
|
| i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate);
|
| @@ -448,7 +446,7 @@ void WebAssemblyMemory(const v8::FunctionCallbackInfo<v8::Value>& args) {
|
| i::JSArrayBuffer::SetupAllocatingData(buffer, i_isolate, size);
|
| memory_obj->SetInternalField(0, *buffer);
|
| memory_obj->SetInternalField(
|
| - 1, has_maximum
|
| + 1, has_maximum.FromJust()
|
| ? static_cast<i::Object*>(i::Smi::FromInt(maximum))
|
| : static_cast<i::Object*>(i_isolate->heap()->undefined_value()));
|
| i::Handle<i::Symbol> memory_sym(
|
|
|