Commit 903599a2 authored by deanm@chromium.org's avatar deanm@chromium.org

Fix strict aliasing crash on x64.

Review URL: http://codereview.chromium.org/164498


git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@2692 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent 166cf2e4
......@@ -169,7 +169,7 @@ LIBRARY_FLAGS = {
},
'arch:x64': {
'CPPDEFINES': ['V8_TARGET_ARCH_X64'],
'CCFLAGS': ['-fno-strict-aliasing', '-m64'],
'CCFLAGS': ['-m64'],
'LINKFLAGS': ['-m64'],
},
'prof:oprofile': {
......
......@@ -290,7 +290,6 @@ void CompilationCacheScript::Put(Handle<String> source,
HandleScope scope;
ASSERT(boilerplate->IsBoilerplate());
Handle<CompilationCacheTable> table = GetTable(0);
// TODO(X64): -fstrict-aliasing causes a problem with table. Fix it.
CALL_HEAP_FUNCTION_VOID(table->Put(*source, *boilerplate));
}
......
......@@ -39,7 +39,7 @@ namespace internal {
template<class T>
Handle<T>::Handle(T* obj) {
ASSERT(!obj->IsFailure());
location_ = reinterpret_cast<T**>(HandleScope::CreateHandle(obj));
location_ = HandleScope::CreateHandle(obj);
}
......
......@@ -82,7 +82,7 @@ class Handle {
}
static Handle<T> null() { return Handle<T>(); }
bool is_null() {return location_ == NULL; }
bool is_null() { return location_ == NULL; }
// Closes the given scope, but lets this handle escape. See
// implementation in api.h.
......@@ -119,15 +119,18 @@ class HandleScope {
static int NumberOfHandles();
// Creates a new handle with the given value.
static inline Object** CreateHandle(Object* value) {
void** result = current_.next;
if (result == current_.limit) result = Extend();
template <typename T>
static inline T** CreateHandle(T* value) {
void** cur = current_.next;
if (cur == current_.limit) cur = Extend();
// Update the current next field, set the value in the created
// handle, and return the result.
ASSERT(result < current_.limit);
current_.next = result + 1;
*reinterpret_cast<Object**>(result) = value;
return reinterpret_cast<Object**>(result);
ASSERT(cur < current_.limit);
current_.next = cur + 1;
T** result = reinterpret_cast<T**>(cur);
*result = value;
return result;
}
private:
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment