Skip to content
This repository has been archived by the owner on Apr 22, 2023. It is now read-only.

Commit

Permalink
Browse files Browse the repository at this point in the history
v8: upgrade to 3.11.10.22
  • Loading branch information
piscisaureus committed Sep 6, 2012
1 parent 6174ea6 commit 4899116
Show file tree
Hide file tree
Showing 10 changed files with 345 additions and 37 deletions.
11 changes: 8 additions & 3 deletions deps/v8/build/common.gypi
Expand Up @@ -239,6 +239,7 @@
'WIN32',
],
'msvs_configuration_attributes': {
'OutputDirectory': '<(DEPTH)\\build\\$(ConfigurationName)',
'IntermediateDirectory': '$(OutDir)\\obj\\$(ProjectName)',
'CharacterSet': '1',
},
Expand Down Expand Up @@ -270,7 +271,7 @@
'target_conditions': [
['_toolset=="host"', {
'variables': {
'm32flag': '<!((echo | $(echo ${CXX_host:-$(which g++)}) -m32 -E - > /dev/null 2>&1) && echo "-m32" || true)',
'm32flag': '<!((echo | $(echo ${CXX_host:-$(which g++)}) -m32 -E - > /dev/null 2>&1) && echo -n "-m32" || true)',
},
'cflags': [ '<(m32flag)' ],
'ldflags': [ '<(m32flag)' ],
Expand All @@ -280,7 +281,7 @@
}],
['_toolset=="target"', {
'variables': {
'm32flag': '<!((echo | $(echo ${CXX_target:-${CXX:-$(which g++)}}) -m32 -E - > /dev/null 2>&1) && echo "-m32" || true)',
'm32flag': '<!((echo | $(echo ${CXX_target:-${CXX:-$(which g++)}}) -m32 -E - > /dev/null 2>&1) && echo -n "-m32" || true)',
},
'cflags': [ '<(m32flag)' ],
'ldflags': [ '<(m32flag)' ],
Expand Down Expand Up @@ -323,7 +324,7 @@
},
'conditions': [
['OS=="linux" or OS=="freebsd" or OS=="openbsd" or OS=="netbsd"', {
'cflags': [ '-Wno-unused-parameter',
'cflags': [ '-Wall', '<(werror)', '-W', '-Wno-unused-parameter',
'-Wnon-virtual-dtor', '-Woverloaded-virtual' ],
}],
],
Expand All @@ -332,6 +333,10 @@
'conditions': [
['OS=="linux" or OS=="freebsd" or OS=="openbsd" or OS=="netbsd" \
or OS=="android"', {
'cflags!': [
'-O2',
'-Os',
],
'cflags': [
'-fdata-sections',
'-ffunction-sections',
Expand Down
3 changes: 3 additions & 0 deletions deps/v8/src/accessors.cc
Expand Up @@ -755,6 +755,9 @@ MaybeObject* Accessors::FunctionGetCaller(Object* object, void*) {
caller = potential_caller;
potential_caller = it.next();
}
if (!caller->shared()->native() && potential_caller != NULL) {
caller = potential_caller;
}
// If caller is bound, return null. This is compatible with JSC, and
// allows us to make bound functions use the strict function map
// and its associated throwing caller and arguments.
Expand Down
11 changes: 6 additions & 5 deletions deps/v8/src/ic.cc
Expand Up @@ -992,15 +992,15 @@ void LoadIC::UpdateCaches(LookupResult* lookup,
if (callback->IsAccessorInfo()) {
Handle<AccessorInfo> info = Handle<AccessorInfo>::cast(callback);
if (v8::ToCData<Address>(info->getter()) == 0) return;
if (!receiver->HasFastProperties()) return;
if (!holder->HasFastProperties()) return;
if (!info->IsCompatibleReceiver(*receiver)) return;
code = isolate()->stub_cache()->ComputeLoadCallback(
name, receiver, holder, info);
} else if (callback->IsAccessorPair()) {
Handle<Object> getter(Handle<AccessorPair>::cast(callback)->getter());
if (!getter->IsJSFunction()) return;
if (holder->IsGlobalObject()) return;
if (!receiver->HasFastProperties()) return;
if (!holder->HasFastProperties()) return;
code = isolate()->stub_cache()->ComputeLoadViaGetter(
name, receiver, holder, Handle<JSFunction>::cast(getter));
} else {
Expand Down Expand Up @@ -1269,7 +1269,7 @@ void KeyedLoadIC::UpdateCaches(LookupResult* lookup,
Handle<AccessorInfo> callback =
Handle<AccessorInfo>::cast(callback_object);
if (v8::ToCData<Address>(callback->getter()) == 0) return;
if (!receiver->HasFastProperties()) return;
if (!holder->HasFastProperties()) return;
if (!callback->IsCompatibleReceiver(*receiver)) return;
code = isolate()->stub_cache()->ComputeKeyedLoadCallback(
name, receiver, holder, callback);
Expand Down Expand Up @@ -1487,17 +1487,18 @@ void StoreIC::UpdateCaches(LookupResult* lookup,
case CALLBACKS: {
Handle<Object> callback(lookup->GetCallbackObject());
if (callback->IsAccessorInfo()) {
ASSERT(*holder == *receiver); // LookupForWrite checks this.
Handle<AccessorInfo> info = Handle<AccessorInfo>::cast(callback);
if (v8::ToCData<Address>(info->setter()) == 0) return;
if (!receiver->HasFastProperties()) return;
if (!holder->HasFastProperties()) return;
ASSERT(info->IsCompatibleReceiver(*receiver));
code = isolate()->stub_cache()->ComputeStoreCallback(
name, receiver, info, strict_mode);
} else if (callback->IsAccessorPair()) {
Handle<Object> setter(Handle<AccessorPair>::cast(callback)->setter());
if (!setter->IsJSFunction()) return;
if (holder->IsGlobalObject()) return;
if (!receiver->HasFastProperties()) return;
if (!holder->HasFastProperties()) return;
code = isolate()->stub_cache()->ComputeStoreViaSetter(
name, receiver, Handle<JSFunction>::cast(setter), strict_mode);
} else {
Expand Down
4 changes: 3 additions & 1 deletion deps/v8/src/v8natives.js
Expand Up @@ -1654,7 +1654,9 @@ function NewFunction(arg1) { // length == 1

// The call to SetNewFunctionAttributes will ensure the prototype
// property of the resulting function is enumerable (ECMA262, 15.3.5.2).
var f = %CompileString(source)();
var global_receiver = %GlobalReceiver(global);
var f = %_CallFunction(global_receiver, %CompileString(source));

%FunctionMarkNameShouldPrintAsAnonymous(f);
return %SetNewFunctionAttributes(f);
}
Expand Down
2 changes: 1 addition & 1 deletion deps/v8/src/version.cc
Expand Up @@ -35,7 +35,7 @@
#define MAJOR_VERSION 3
#define MINOR_VERSION 11
#define BUILD_NUMBER 10
#define PATCH_LEVEL 19
#define PATCH_LEVEL 22
// Use 1 for candidates and 0 otherwise.
// (Boolean macro values are not supported by all preprocessors.)
#define IS_CANDIDATE_VERSION 0
Expand Down
12 changes: 4 additions & 8 deletions deps/v8/src/x64/code-stubs-x64.cc
Expand Up @@ -999,8 +999,8 @@ void BinaryOpStub::GenerateSmiCode(
SmiCodeGenerateHeapNumberResults allow_heapnumber_results) {

// Arguments to BinaryOpStub are in rdx and rax.
Register left = rdx;
Register right = rax;
const Register left = rdx;
const Register right = rax;

// We only generate heapnumber answers for overflowing calculations
// for the four basic arithmetic operations and logical right shift by 0.
Expand Down Expand Up @@ -1042,20 +1042,16 @@ void BinaryOpStub::GenerateSmiCode(

case Token::DIV:
// SmiDiv will not accept left in rdx or right in rax.
left = rcx;
right = rbx;
__ movq(rbx, rax);
__ movq(rcx, rdx);
__ SmiDiv(rax, left, right, &use_fp_on_smis);
__ SmiDiv(rax, rcx, rbx, &use_fp_on_smis);
break;

case Token::MOD:
// SmiMod will not accept left in rdx or right in rax.
left = rcx;
right = rbx;
__ movq(rbx, rax);
__ movq(rcx, rdx);
__ SmiMod(rax, left, right, &use_fp_on_smis);
__ SmiMod(rax, rcx, rbx, &use_fp_on_smis);
break;

case Token::BIT_OR: {
Expand Down
195 changes: 179 additions & 16 deletions deps/v8/test/cctest/test-api.cc
Expand Up @@ -14567,17 +14567,41 @@ THREADED_TEST(FunctionGetScriptId) {

static v8::Handle<Value> GetterWhichReturns42(Local<String> name,
const AccessorInfo& info) {
CHECK(v8::Utils::OpenHandle(*info.This())->IsJSObject());
CHECK(v8::Utils::OpenHandle(*info.Holder())->IsJSObject());
return v8_num(42);
}


static void SetterWhichSetsYOnThisTo23(Local<String> name,
Local<Value> value,
const AccessorInfo& info) {
CHECK(v8::Utils::OpenHandle(*info.This())->IsJSObject());
CHECK(v8::Utils::OpenHandle(*info.Holder())->IsJSObject());
info.This()->Set(v8_str("y"), v8_num(23));
}


Handle<Value> FooGetInterceptor(Local<String> name,
const AccessorInfo& info) {
CHECK(v8::Utils::OpenHandle(*info.This())->IsJSObject());
CHECK(v8::Utils::OpenHandle(*info.Holder())->IsJSObject());
if (!name->Equals(v8_str("foo"))) return Handle<Value>();
return v8_num(42);
}


Handle<Value> FooSetInterceptor(Local<String> name,
Local<Value> value,
const AccessorInfo& info) {
CHECK(v8::Utils::OpenHandle(*info.This())->IsJSObject());
CHECK(v8::Utils::OpenHandle(*info.Holder())->IsJSObject());
if (!name->Equals(v8_str("foo"))) return Handle<Value>();
info.This()->Set(v8_str("y"), v8_num(23));
return v8_num(23);
}


TEST(SetterOnConstructorPrototype) {
v8::HandleScope scope;
Local<ObjectTemplate> templ = ObjectTemplate::New();
Expand Down Expand Up @@ -16813,7 +16837,64 @@ TEST(TryFinallyMessage) {
}


static void Helper137002(bool do_store,
bool polymorphic,
bool remove_accessor,
bool interceptor) {
LocalContext context;
Local<ObjectTemplate> templ = ObjectTemplate::New();
if (interceptor) {
templ->SetNamedPropertyHandler(FooGetInterceptor, FooSetInterceptor);
} else {
templ->SetAccessor(v8_str("foo"),
GetterWhichReturns42,
SetterWhichSetsYOnThisTo23);
}
context->Global()->Set(v8_str("obj"), templ->NewInstance());

// Turn monomorphic on slow object with native accessor, then turn
// polymorphic, finally optimize to create negative lookup and fail.
CompileRun(do_store ?
"function f(x) { x.foo = void 0; }" :
"function f(x) { return x.foo; }");
CompileRun("obj.y = void 0;");
if (!interceptor) {
CompileRun("%OptimizeObjectForAddingMultipleProperties(obj, 1);");
}
CompileRun("obj.__proto__ = null;"
"f(obj); f(obj); f(obj);");
if (polymorphic) {
CompileRun("f({});");
}
CompileRun("obj.y = void 0;"
"%OptimizeFunctionOnNextCall(f);");
if (remove_accessor) {
CompileRun("delete obj.foo;");
}
CompileRun("var result = f(obj);");
if (do_store) {
CompileRun("result = obj.y;");
}
if (remove_accessor && !interceptor) {
CHECK(context->Global()->Get(v8_str("result"))->IsUndefined());
} else {
CHECK_EQ(do_store ? 23 : 42,
context->Global()->Get(v8_str("result"))->Int32Value());
}
}


THREADED_TEST(Regress137002a) {
i::FLAG_allow_natives_syntax = true;
i::FLAG_compilation_cache = false;
v8::HandleScope scope;
for (int i = 0; i < 16; i++) {
Helper137002(i & 8, i & 4, i & 2, i & 1);
}
}


THREADED_TEST(Regress137002b) {
i::FLAG_allow_natives_syntax = true;
v8::HandleScope scope;
LocalContext context;
Expand All @@ -16823,19 +16904,65 @@ THREADED_TEST(Regress137002a) {
SetterWhichSetsYOnThisTo23);
context->Global()->Set(v8_str("obj"), templ->NewInstance());

// Turn monomorphic on slow object with native accessor, then turn
// polymorphic, finally optimize to create negative lookup and fail.
CompileRun("function f(x) { return x.foo; }"
"%OptimizeObjectForAddingMultipleProperties(obj, 1);"
// Turn monomorphic on slow object with native accessor, then just
// delete the property and fail.
CompileRun("function load(x) { return x.foo; }"
"function store(x) { x.foo = void 0; }"
"function keyed_load(x, key) { return x[key]; }"
// Second version of function has a different source (add void 0)
// so that it does not share code with the first version. This
// ensures that the ICs are monomorphic.
"function load2(x) { void 0; return x.foo; }"
"function store2(x) { void 0; x.foo = void 0; }"
"function keyed_load2(x, key) { void 0; return x[key]; }"

"obj.y = void 0;"
"obj.__proto__ = null;"
"f(obj); f(obj); f({});"
"%OptimizeFunctionOnNextCall(f);"
"var result = f(obj);");
CHECK_EQ(42, context->Global()->Get(v8_str("result"))->Int32Value());
}

"var subobj = {};"
"subobj.y = void 0;"
"subobj.__proto__ = obj;"
"%OptimizeObjectForAddingMultipleProperties(obj, 1);"

THREADED_TEST(Regress137002b) {
// Make the ICs monomorphic.
"load(obj); load(obj);"
"load2(subobj); load2(subobj);"
"store(obj); store(obj);"
"store2(subobj); store2(subobj);"
"keyed_load(obj, 'foo'); keyed_load(obj, 'foo');"
"keyed_load2(subobj, 'foo'); keyed_load2(subobj, 'foo');"

// Actually test the shiny new ICs and better not crash. This
// serves as a regression test for issue 142088 as well.
"load(obj);"
"load2(subobj);"
"store(obj);"
"store2(subobj);"
"keyed_load(obj, 'foo');"
"keyed_load2(subobj, 'foo');"

// Delete the accessor. It better not be called any more now.
"delete obj.foo;"
"obj.y = void 0;"
"subobj.y = void 0;"

"var load_result = load(obj);"
"var load_result2 = load2(subobj);"
"var keyed_load_result = keyed_load(obj, 'foo');"
"var keyed_load_result2 = keyed_load2(subobj, 'foo');"
"store(obj);"
"store2(subobj);"
"var y_from_obj = obj.y;"
"var y_from_subobj = subobj.y;");
CHECK(context->Global()->Get(v8_str("load_result"))->IsUndefined());
CHECK(context->Global()->Get(v8_str("load_result2"))->IsUndefined());
CHECK(context->Global()->Get(v8_str("keyed_load_result"))->IsUndefined());
CHECK(context->Global()->Get(v8_str("keyed_load_result2"))->IsUndefined());
CHECK(context->Global()->Get(v8_str("y_from_obj"))->IsUndefined());
CHECK(context->Global()->Get(v8_str("y_from_subobj"))->IsUndefined());
}


THREADED_TEST(Regress142088) {
i::FLAG_allow_natives_syntax = true;
v8::HandleScope scope;
LocalContext context;
Expand All @@ -16847,10 +16974,46 @@ THREADED_TEST(Regress137002b) {

// Turn monomorphic on slow object with native accessor, then just
// delete the property and fail.
CompileRun("function f(x) { return x.foo; }"
"%OptimizeObjectForAddingMultipleProperties(obj, 1);"
CompileRun("function load(x) { return x.foo; }"
"function store(x) { x.foo = void 0; }"
"function keyed_load(x, key) { return x[key]; }"
// Second version of function has a different source (add void 0)
// so that it does not share code with the first version. This
// ensures that the ICs are monomorphic.
"function load2(x) { void 0; return x.foo; }"
"function store2(x) { void 0; x.foo = void 0; }"
"function keyed_load2(x, key) { void 0; return x[key]; }"

"obj.__proto__ = null;"
"f(obj); f(obj); delete obj.foo;"
"var result = f(obj);");
CHECK(context->Global()->Get(v8_str("result"))->IsUndefined());
"var subobj = {};"
"subobj.__proto__ = obj;"
"%OptimizeObjectForAddingMultipleProperties(obj, 1);"

// Make the ICs monomorphic.
"load(obj); load(obj);"
"load2(subobj); load2(subobj);"
"store(obj);"
"store2(subobj);"
"keyed_load(obj, 'foo'); keyed_load(obj, 'foo');"
"keyed_load2(subobj, 'foo'); keyed_load2(subobj, 'foo');"

// Delete the accessor. It better not be called any more now.
"delete obj.foo;"
"obj.y = void 0;"
"subobj.y = void 0;"

"var load_result = load(obj);"
"var load_result2 = load2(subobj);"
"var keyed_load_result = keyed_load(obj, 'foo');"
"var keyed_load_result2 = keyed_load2(subobj, 'foo');"
"store(obj);"
"store2(subobj);"
"var y_from_obj = obj.y;"
"var y_from_subobj = subobj.y;");
CHECK(context->Global()->Get(v8_str("load_result"))->IsUndefined());
CHECK(context->Global()->Get(v8_str("load_result2"))->IsUndefined());
CHECK(context->Global()->Get(v8_str("keyed_load_result"))->IsUndefined());
CHECK(context->Global()->Get(v8_str("keyed_load_result2"))->IsUndefined());
CHECK(context->Global()->Get(v8_str("y_from_obj"))->IsUndefined());
CHECK(context->Global()->Get(v8_str("y_from_subobj"))->IsUndefined());
}

0 comments on commit 4899116

Please sign in to comment.