Changeset 127647 in webkit


Ignore:
Timestamp:
Sep 5, 2012 2:44:43 PM (12 years ago)
Author:
ggaren@apple.com
Message:

Throw exceptions when assigning to const in strict mode
https://bugs.webkit.org/show_bug.cgi?id=95894

Reviewed by Oliver Hunt.

Currently, this never happens; but it will start happening once the
callee is a local const register. In this patch, there's no change in
behavior.

  • bytecompiler/BytecodeGenerator.cpp:

(JSC::BytecodeGenerator::emitReadOnlyExceptionIfNeeded): Helper function
for doing the throwing.

  • bytecompiler/BytecodeGenerator.h:
  • bytecompiler/NodesCodegen.cpp:

(JSC::PostfixResolveNode::emitBytecode):
(JSC::PrefixResolveNode::emitBytecode):
(JSC::ReadModifyResolveNode::emitBytecode):
(JSC::AssignResolveNode::emitBytecode): Call the helper function.

Location:
trunk/Source/JavaScriptCore
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/ChangeLog

    r127643 r127647  
     12012-09-05  Geoffrey Garen  <ggaren@apple.com>
     2
     3        Throw exceptions when assigning to const in strict mode
     4        https://bugs.webkit.org/show_bug.cgi?id=95894
     5
     6        Reviewed by Oliver Hunt.
     7
     8        Currently, this never happens; but it will start happening once the
     9        callee is a local const register. In this patch, there's no change in
     10        behavior.
     11
     12        * bytecompiler/BytecodeGenerator.cpp:
     13        (JSC::BytecodeGenerator::emitReadOnlyExceptionIfNeeded): Helper function
     14        for doing the throwing.
     15        * bytecompiler/BytecodeGenerator.h:
     16
     17        * bytecompiler/NodesCodegen.cpp:
     18        (JSC::PostfixResolveNode::emitBytecode):
     19        (JSC::PrefixResolveNode::emitBytecode):
     20        (JSC::ReadModifyResolveNode::emitBytecode):
     21        (JSC::AssignResolveNode::emitBytecode): Call the helper function.
     22
    1232012-09-05  Geoffrey Garen  <ggaren@apple.com>
    224
  • trunk/Source/JavaScriptCore/bytecompiler/BytecodeGenerator.cpp

    r127393 r127647  
    25952595}
    25962596
     2597void BytecodeGenerator::emitReadOnlyExceptionIfNeeded()
     2598{
     2599    if (!isStrictMode())
     2600        return;
     2601
     2602    RefPtr<RegisterID> error = emitLoad(newTemporary(), createTypeError(scope()->globalObject()->globalExec(), StrictModeReadonlyPropertyWriteError));
     2603    emitThrow(error.get());
     2604}
     2605
    25972606} // namespace JSC
  • trunk/Source/JavaScriptCore/bytecompiler/BytecodeGenerator.h

    r127393 r127647  
    508508        RegisterID* emitNextPropertyName(RegisterID* dst, RegisterID* base, RegisterID* i, RegisterID* size, RegisterID* iter, Label* target);
    509509
     510        void emitReadOnlyExceptionIfNeeded();
     511
    510512        // Start a try block. 'start' must have been emitted.
    511513        TryData* pushTry(Label* start);
  • trunk/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp

    r127544 r127647  
    610610
    611611    if (RegisterID* local = resolveResult.local()) {
    612         if (resolveResult.isReadOnly())
     612        if (resolveResult.isReadOnly()) {
     613            generator.emitReadOnlyExceptionIfNeeded();
    613614            return generator.emitToJSNumber(generator.finalDestination(dst), local);
     615        }
    614616        if (dst == generator.ignoredResult())
    615617            return emitPreIncOrDec(generator, local, m_operator);
     
    793795    if (RegisterID* local = resolveResult.local()) {
    794796        if (resolveResult.isReadOnly()) {
     797            generator.emitReadOnlyExceptionIfNeeded();
    795798            if (dst == generator.ignoredResult())
    796799                return generator.emitToJSNumber(generator.newTemporary(), local);
     
    12111214
    12121215    if (RegisterID *local = resolveResult.local()) {
    1213         if (resolveResult.isReadOnly())
     1216        if (resolveResult.isReadOnly()) {
     1217            generator.emitReadOnlyExceptionIfNeeded();
    12141218            return emitReadModifyAssignment(generator, generator.finalDestination(dst), local, m_right, m_operator, OperandTypes(ResultType::unknownType(), m_right->resultDescriptor()));
     1219        }
    12151220       
    12161221        if (generator.leftHandSideNeedsCopy(m_rightHasAssignments, m_right->isPure(generator))) {
     
    12471252
    12481253    if (RegisterID *local = resolveResult.local()) {
    1249         if (resolveResult.isReadOnly())
     1254        if (resolveResult.isReadOnly()) {
     1255            generator.emitReadOnlyExceptionIfNeeded();
    12501256            return generator.emitNode(dst, m_right);
     1257        }
    12511258        RegisterID* result = generator.emitNode(local, m_right);
    12521259        return generator.moveToDestinationIfNeeded(dst, result);
Note: See TracChangeset for help on using the changeset viewer.