diff options
| author | Kristian Monsen <kristianm@google.com> | 2010-05-21 16:53:46 +0100 |
|---|---|---|
| committer | Kristian Monsen <kristianm@google.com> | 2010-05-25 10:24:15 +0100 |
| commit | 6c2af9490927c3c5959b5cb07461b646f8b32f6c (patch) | |
| tree | f7111b9b22befab472616c1d50ec94eb50f1ec8c /JavaScriptCore/bytecompiler | |
| parent | a149172322a9067c14e8b474a53e63649aa17cad (diff) | |
| download | external_webkit-6c2af9490927c3c5959b5cb07461b646f8b32f6c.zip external_webkit-6c2af9490927c3c5959b5cb07461b646f8b32f6c.tar.gz external_webkit-6c2af9490927c3c5959b5cb07461b646f8b32f6c.tar.bz2 | |
Merge WebKit at r59636: Initial merge by git
Change-Id: I59b289c4e6b18425f06ce41cc9d34c522515de91
Diffstat (limited to 'JavaScriptCore/bytecompiler')
| -rw-r--r-- | JavaScriptCore/bytecompiler/BytecodeGenerator.cpp | 60 | ||||
| -rw-r--r-- | JavaScriptCore/bytecompiler/BytecodeGenerator.h | 5 | ||||
| -rw-r--r-- | JavaScriptCore/bytecompiler/NodesCodegen.cpp | 17 |
3 files changed, 55 insertions, 27 deletions
diff --git a/JavaScriptCore/bytecompiler/BytecodeGenerator.cpp b/JavaScriptCore/bytecompiler/BytecodeGenerator.cpp index db79d67..e5f3d15 100644 --- a/JavaScriptCore/bytecompiler/BytecodeGenerator.cpp +++ b/JavaScriptCore/bytecompiler/BytecodeGenerator.cpp @@ -34,8 +34,6 @@ #include "PrototypeFunction.h" #include "JSFunction.h" #include "Interpreter.h" -#include "RegExp.h" -#include "RegExpObject.h" #include "UString.h" using namespace std; @@ -829,6 +827,11 @@ RegisterID* BytecodeGenerator::addConstantValue(JSValue v) return &m_constantPoolRegisters[index]; } +unsigned BytecodeGenerator::addRegExp(RegExp* r) +{ + return m_codeBlock->addRegExp(r); +} + RegisterID* BytecodeGenerator::emitMove(RegisterID* dst, RegisterID* src) { emitOpcode(op_mov); @@ -979,12 +982,6 @@ RegisterID* BytecodeGenerator::emitLoad(RegisterID* dst, const Identifier& ident return emitLoad(dst, JSValue(stringInMap)); } -RegisterID* BytecodeGenerator::emitLoad(RegisterID* dst, RegExp* regExp) -{ - JSValue jsRegExp = new (globalData()) RegExpObject(m_scopeChain->globalObject()->regExpStructure(), regExp); - return emitLoad(dst, jsRegExp); -} - RegisterID* BytecodeGenerator::emitLoad(RegisterID* dst, JSValue v) { RegisterID* constantID = addConstantValue(v); @@ -993,7 +990,7 @@ RegisterID* BytecodeGenerator::emitLoad(RegisterID* dst, JSValue v) return constantID; } -bool BytecodeGenerator::findScopedProperty(const Identifier& property, int& index, size_t& stackDepth, bool forWriting, JSObject*& globalObject) +bool BytecodeGenerator::findScopedProperty(const Identifier& property, int& index, size_t& stackDepth, bool forWriting, bool& requiresDynamicChecks, JSObject*& globalObject) { // Cases where we cannot statically optimize the lookup. if (property == propertyNames().arguments || !canOptimizeNonLocals()) { @@ -1009,7 +1006,7 @@ bool BytecodeGenerator::findScopedProperty(const Identifier& property, int& inde } size_t depth = 0; - + requiresDynamicChecks = false; ScopeChainIterator iter = m_scopeChain->begin(); ScopeChainIterator end = m_scopeChain->end(); for (; iter != end; ++iter, ++depth) { @@ -1034,10 +1031,11 @@ bool BytecodeGenerator::findScopedProperty(const Identifier& property, int& inde globalObject = currentVariableObject; return true; } - if (currentVariableObject->isDynamicScope()) + bool scopeRequiresDynamicChecks = false; + if (currentVariableObject->isDynamicScope(scopeRequiresDynamicChecks)) break; + requiresDynamicChecks |= scopeRequiresDynamicChecks; } - // Can't locate the property but we're able to avoid a few lookups. stackDepth = depth; index = missingSymbolMarker(); @@ -1062,7 +1060,8 @@ RegisterID* BytecodeGenerator::emitResolve(RegisterID* dst, const Identifier& pr size_t depth = 0; int index = 0; JSObject* globalObject = 0; - if (!findScopedProperty(property, index, depth, false, globalObject) && !globalObject) { + bool requiresDynamicChecks = false; + if (!findScopedProperty(property, index, depth, false, requiresDynamicChecks, globalObject) && !globalObject) { // We can't optimise at all :-( emitOpcode(op_resolve); instructions().append(dst->index()); @@ -1080,7 +1079,7 @@ RegisterID* BytecodeGenerator::emitResolve(RegisterID* dst, const Identifier& pr #endif } - if (index != missingSymbolMarker() && !forceGlobalResolve) { + if (index != missingSymbolMarker() && !forceGlobalResolve && !requiresDynamicChecks) { // Directly index the property lookup across multiple scopes. return emitGetScopedVar(dst, depth, index, globalObject); } @@ -1090,12 +1089,22 @@ RegisterID* BytecodeGenerator::emitResolve(RegisterID* dst, const Identifier& pr #else m_codeBlock->addGlobalResolveInstruction(instructions().size()); #endif - emitOpcode(op_resolve_global); + emitOpcode(requiresDynamicChecks ? op_resolve_global_dynamic : op_resolve_global); instructions().append(dst->index()); instructions().append(globalObject); instructions().append(addConstant(property)); instructions().append(0); instructions().append(0); + if (requiresDynamicChecks) + instructions().append(depth); + return dst; + } + + if (requiresDynamicChecks) { + // If we get here we have eval nested inside a |with| just give up + emitOpcode(op_resolve); + instructions().append(dst->index()); + instructions().append(addConstant(property)); return dst; } @@ -1151,8 +1160,9 @@ RegisterID* BytecodeGenerator::emitResolveBase(RegisterID* dst, const Identifier size_t depth = 0; int index = 0; JSObject* globalObject = 0; - findScopedProperty(property, index, depth, false, globalObject); - if (!globalObject) { + bool requiresDynamicChecks = false; + findScopedProperty(property, index, depth, false, requiresDynamicChecks, globalObject); + if (!globalObject || requiresDynamicChecks) { // We can't optimise at all :-( emitOpcode(op_resolve_base); instructions().append(dst->index()); @@ -1169,7 +1179,8 @@ RegisterID* BytecodeGenerator::emitResolveWithBase(RegisterID* baseDst, Register size_t depth = 0; int index = 0; JSObject* globalObject = 0; - if (!findScopedProperty(property, index, depth, false, globalObject) || !globalObject) { + bool requiresDynamicChecks = false; + if (!findScopedProperty(property, index, depth, false, requiresDynamicChecks, globalObject) || !globalObject || requiresDynamicChecks) { // We can't optimise at all :-( emitOpcode(op_resolve_with_base); instructions().append(baseDst->index()); @@ -1201,12 +1212,14 @@ RegisterID* BytecodeGenerator::emitResolveWithBase(RegisterID* baseDst, Register #else m_codeBlock->addGlobalResolveInstruction(instructions().size()); #endif - emitOpcode(op_resolve_global); + emitOpcode(requiresDynamicChecks ? op_resolve_global_dynamic : op_resolve_global); instructions().append(propDst->index()); instructions().append(globalObject); instructions().append(addConstant(property)); instructions().append(0); instructions().append(0); + if (requiresDynamicChecks) + instructions().append(depth); return baseDst; } @@ -1364,6 +1377,15 @@ RegisterID* BytecodeGenerator::emitNewFunction(RegisterID* dst, FunctionBodyNode return dst; } +RegisterID* BytecodeGenerator::emitNewRegExp(RegisterID* dst, RegExp* regExp) +{ + emitOpcode(op_new_regexp); + instructions().append(dst->index()); + instructions().append(addRegExp(regExp)); + return dst; +} + + RegisterID* BytecodeGenerator::emitNewFunctionExpression(RegisterID* r0, FuncExprNode* n) { FunctionBodyNode* function = n->body(); diff --git a/JavaScriptCore/bytecompiler/BytecodeGenerator.h b/JavaScriptCore/bytecompiler/BytecodeGenerator.h index 919183e..0a49392 100644 --- a/JavaScriptCore/bytecompiler/BytecodeGenerator.h +++ b/JavaScriptCore/bytecompiler/BytecodeGenerator.h @@ -106,7 +106,7 @@ namespace JSC { // // NB: depth does _not_ include the local scope. eg. a depth of 0 refers // to the scope containing this codeblock. - bool findScopedProperty(const Identifier&, int& index, size_t& depth, bool forWriting, JSObject*& globalObject); + bool findScopedProperty(const Identifier&, int& index, size_t& depth, bool forWriting, bool& includesDynamicScopes, JSObject*& globalObject); // Returns the register storing "this" RegisterID* thisRegister() { return &m_thisRegister; } @@ -264,7 +264,6 @@ namespace JSC { RegisterID* emitLoad(RegisterID* dst, bool); RegisterID* emitLoad(RegisterID* dst, double); RegisterID* emitLoad(RegisterID* dst, const Identifier&); - RegisterID* emitLoad(RegisterID* dst, RegExp* regExp); RegisterID* emitLoad(RegisterID* dst, JSValue); RegisterID* emitUnaryOp(OpcodeID, RegisterID* dst, RegisterID* src); @@ -277,6 +276,7 @@ namespace JSC { RegisterID* emitNewFunction(RegisterID* dst, FunctionBodyNode* body); RegisterID* emitNewFunctionExpression(RegisterID* dst, FuncExprNode* func); + RegisterID* emitNewRegExp(RegisterID* dst, RegExp* regExp); RegisterID* emitMove(RegisterID* dst, RegisterID* src); @@ -446,6 +446,7 @@ namespace JSC { unsigned addConstant(const Identifier&); RegisterID* addConstantValue(JSValue); + unsigned addRegExp(RegExp*); PassRefPtr<FunctionExecutable> makeFunction(ExecState* exec, FunctionBodyNode* body) { diff --git a/JavaScriptCore/bytecompiler/NodesCodegen.cpp b/JavaScriptCore/bytecompiler/NodesCodegen.cpp index aaf2dd1..cfd00da 100644 --- a/JavaScriptCore/bytecompiler/NodesCodegen.cpp +++ b/JavaScriptCore/bytecompiler/NodesCodegen.cpp @@ -149,7 +149,7 @@ RegisterID* RegExpNode::emitBytecode(BytecodeGenerator& generator, RegisterID* d return emitThrowError(generator, SyntaxError, "Invalid regular expression: %s", regExp->errorMessage()); if (dst == generator.ignoredResult()) return 0; - return generator.emitLoad(generator.finalDestination(dst), regExp.get()); + return generator.emitNewRegExp(generator.finalDestination(dst), regExp.get()); } // ------------------------------ ThisNode ------------------------------------- @@ -351,7 +351,8 @@ RegisterID* FunctionCallResolveNode::emitBytecode(BytecodeGenerator& generator, int index = 0; size_t depth = 0; JSObject* globalObject = 0; - if (generator.findScopedProperty(m_ident, index, depth, false, globalObject) && index != missingSymbolMarker()) { + bool requiresDynamicChecks = false; + if (generator.findScopedProperty(m_ident, index, depth, false, requiresDynamicChecks, globalObject) && index != missingSymbolMarker() && !requiresDynamicChecks) { RefPtr<RegisterID> func = generator.emitGetScopedVar(generator.newTemporary(), depth, index, globalObject); RefPtr<RegisterID> thisRegister = generator.emitLoad(generator.newTemporary(), jsNull()); return generator.emitCall(generator.finalDestination(dst, func.get()), func.get(), thisRegister.get(), m_args, divot(), startOffset(), endOffset()); @@ -524,7 +525,8 @@ RegisterID* PostfixResolveNode::emitBytecode(BytecodeGenerator& generator, Regis int index = 0; size_t depth = 0; JSObject* globalObject = 0; - if (generator.findScopedProperty(m_ident, index, depth, true, globalObject) && index != missingSymbolMarker()) { + bool requiresDynamicChecks = false; + if (generator.findScopedProperty(m_ident, index, depth, true, requiresDynamicChecks, globalObject) && index != missingSymbolMarker() && !requiresDynamicChecks) { RefPtr<RegisterID> value = generator.emitGetScopedVar(generator.newTemporary(), depth, index, globalObject); RegisterID* oldValue; if (dst == generator.ignoredResult()) { @@ -710,7 +712,8 @@ RegisterID* PrefixResolveNode::emitBytecode(BytecodeGenerator& generator, Regist int index = 0; size_t depth = 0; JSObject* globalObject = 0; - if (generator.findScopedProperty(m_ident, index, depth, false, globalObject) && index != missingSymbolMarker()) { + bool requiresDynamicChecks = false; + if (generator.findScopedProperty(m_ident, index, depth, false, requiresDynamicChecks, globalObject) && index != missingSymbolMarker() && !requiresDynamicChecks) { RefPtr<RegisterID> propDst = generator.emitGetScopedVar(generator.tempDestination(dst), depth, index, globalObject); emitPreIncOrDec(generator, propDst.get(), m_operator); generator.emitPutScopedVar(depth, index, propDst.get(), globalObject); @@ -1132,7 +1135,8 @@ RegisterID* ReadModifyResolveNode::emitBytecode(BytecodeGenerator& generator, Re int index = 0; size_t depth = 0; JSObject* globalObject = 0; - if (generator.findScopedProperty(m_ident, index, depth, true, globalObject) && index != missingSymbolMarker()) { + bool requiresDynamicChecks = false; + if (generator.findScopedProperty(m_ident, index, depth, true, requiresDynamicChecks, globalObject) && index != missingSymbolMarker() && !requiresDynamicChecks) { RefPtr<RegisterID> src1 = generator.emitGetScopedVar(generator.tempDestination(dst), depth, index, globalObject); RegisterID* result = emitReadModifyAssignment(generator, generator.finalDestination(dst, src1.get()), src1.get(), m_right, m_operator, OperandTypes(ResultType::unknownType(), m_right->resultDescriptor())); generator.emitPutScopedVar(depth, index, result, globalObject); @@ -1161,7 +1165,8 @@ RegisterID* AssignResolveNode::emitBytecode(BytecodeGenerator& generator, Regist int index = 0; size_t depth = 0; JSObject* globalObject = 0; - if (generator.findScopedProperty(m_ident, index, depth, true, globalObject) && index != missingSymbolMarker()) { + bool requiresDynamicChecks = false; + if (generator.findScopedProperty(m_ident, index, depth, true, requiresDynamicChecks, globalObject) && index != missingSymbolMarker() && !requiresDynamicChecks) { if (dst == generator.ignoredResult()) dst = 0; RegisterID* value = generator.emitNode(dst, m_right); |
