Changeset 37160 in webkit for trunk/JavaScriptCore/kjs/Arguments.cpp
- Timestamp:
- Oct 1, 2008, 3:18:50 PM (17 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JavaScriptCore/kjs/Arguments.cpp
r36821 r37160 38 38 const ClassInfo Arguments::info = { "Arguments", 0, 0, 0 }; 39 39 40 struct ArgumentsData : Noncopyable {41 ArgumentsData(JSActivation* activation, unsigned numParameters, int firstParameterIndex, unsigned numArguments, JSFunction* callee)42 : activation(activation)43 , numParameters(numParameters)44 , firstParameterIndex(firstParameterIndex)45 , numArguments(numArguments)46 , extraArguments(0)47 , callee(callee)48 , overrodeLength(false)49 , overrodeCallee(false)50 {51 }52 53 JSActivation* activation;54 55 unsigned numParameters;56 int firstParameterIndex;57 unsigned numArguments;58 Register* extraArguments;59 OwnArrayPtr<bool> deletedArguments;60 Register extraArgumentsFixedBuffer[4];61 62 JSFunction* callee;63 bool overrodeLength : 1;64 bool overrodeCallee : 1;65 };66 67 // ECMA 10.1.868 Arguments::Arguments(ExecState* exec, JSFunction* function, JSActivation* activation, int firstParameterIndex, Register* argv, int argc)69 : JSObject(exec->lexicalGlobalObject()->argumentsStructure())70 , d(new ArgumentsData(activation, function->numParameters(), firstParameterIndex, argc, function))71 {72 ASSERT(activation);73 74 if (d->numArguments > d->numParameters) {75 unsigned numExtraArguments = d->numArguments - d->numParameters;76 Register* extraArguments;77 if (numExtraArguments > sizeof(d->extraArgumentsFixedBuffer) / sizeof(Register))78 extraArguments = new Register[numExtraArguments];79 else80 extraArguments = d->extraArgumentsFixedBuffer;81 for (unsigned i = 0; i < numExtraArguments; ++i)82 extraArguments[i] = argv[d->numParameters + i];83 d->extraArguments = extraArguments;84 }85 }86 87 40 Arguments::~Arguments() 88 41 { … … 94 47 { 95 48 JSObject::mark(); 49 50 for (unsigned i = 0; i < d->numParameters; ++i) { 51 if (!d->registers[i].marked()) 52 d->registers[i].mark(); 53 } 96 54 97 55 if (d->extraArguments) { … … 106 64 d->callee->mark(); 107 65 108 if ( !d->activation->marked())66 if (d->activation && !d->activation->marked()) 109 67 d->activation->mark(); 110 68 } … … 119 77 120 78 if (d->numParameters == d->numArguments) { 121 args.initialize(&d-> activation->registerAt(d->firstParameterIndex), d->numArguments);79 args.initialize(&d->registers[d->firstParameterIndex], d->numArguments); 122 80 return; 123 81 } … … 126 84 unsigned i = 0; 127 85 for (; i < parametersLength; ++i) 128 args.append(d-> activation->uncheckedSymbolTableGetValue(d->firstParameterIndex + i));86 args.append(d->registers[d->firstParameterIndex + i].jsValue(exec)); 129 87 for (; i < d->numArguments; ++i) 130 args.append(d->extraArguments[i - d->numParameters]. getJSValue());88 args.append(d->extraArguments[i - d->numParameters].jsValue(exec)); 131 89 return; 132 90 } … … 136 94 for (; i < parametersLength; ++i) { 137 95 if (!d->deletedArguments[i]) 138 args.append(d-> activation->uncheckedSymbolTableGetValue(d->firstParameterIndex + i));96 args.append(d->registers[d->firstParameterIndex + i].jsValue(exec)); 139 97 else 140 98 args.append(get(exec, i)); … … 142 100 for (; i < d->numArguments; ++i) { 143 101 if (!d->deletedArguments[i]) 144 args.append(d->extraArguments[i - d->numParameters]. getJSValue());102 args.append(d->extraArguments[i - d->numParameters].jsValue(exec)); 145 103 else 146 104 args.append(get(exec, i)); … … 152 110 if (i < d->numArguments && (!d->deletedArguments || !d->deletedArguments[i])) { 153 111 if (i < d->numParameters) 154 d->activation->uncheckedSymbolTableGet(d->firstParameterIndex + i, slot);155 else 156 slot.setValue(d->extraArguments[i - d->numParameters]. getJSValue());112 slot.setRegisterSlot(&d->registers[d->firstParameterIndex + i]); 113 else 114 slot.setValue(d->extraArguments[i - d->numParameters].jsValue(exec)); 157 115 return true; 158 116 } … … 167 125 if (isArrayIndex && i < d->numArguments && (!d->deletedArguments || !d->deletedArguments[i])) { 168 126 if (i < d->numParameters) 169 d->activation->uncheckedSymbolTableGet(d->firstParameterIndex + i, slot);170 else 171 slot.setValue(d->extraArguments[i - d->numParameters]. getJSValue());127 slot.setRegisterSlot(&d->registers[d->firstParameterIndex + i]); 128 else 129 slot.setValue(d->extraArguments[i - d->numParameters].jsValue(exec)); 172 130 return true; 173 131 } … … 190 148 if (i < d->numArguments && (!d->deletedArguments || !d->deletedArguments[i])) { 191 149 if (i < d->numParameters) 192 d-> activation->uncheckedSymbolTablePut(d->firstParameterIndex + i, value);150 d->registers[d->firstParameterIndex + i] = value; 193 151 else 194 152 d->extraArguments[i - d->numParameters] = value; … … 205 163 if (isArrayIndex && i < d->numArguments && (!d->deletedArguments || !d->deletedArguments[i])) { 206 164 if (i < d->numParameters) 207 d-> activation->uncheckedSymbolTablePut(d->firstParameterIndex + i, value);165 d->registers[d->firstParameterIndex + i] = value; 208 166 else 209 167 d->extraArguments[i - d->numParameters] = value;
Note:
See TracChangeset
for help on using the changeset viewer.