Changeset 36792 in webkit for trunk/JavaScriptCore/kjs/Arguments.cpp
- Timestamp:
- Sep 22, 2008, 9:55:51 PM (17 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JavaScriptCore/kjs/Arguments.cpp
r36782 r36792 38 38 const ClassInfo Arguments::info = { "Arguments", 0, 0, 0 }; 39 39 40 struct ArgumentsData {40 struct ArgumentsData : Noncopyable { 41 41 ArgumentsData(JSActivation* activation, unsigned numParameters, unsigned firstArgumentIndex, unsigned numArguments) 42 42 : activation(activation) … … 44 44 , firstArgumentIndex(firstArgumentIndex) 45 45 , numArguments(numArguments) 46 , extraArguments(0) 46 47 { 47 48 } … … 51 52 unsigned firstArgumentIndex; 52 53 unsigned numArguments; 53 OwnArrayPtr<JSValue*>extraArguments;54 Register* extraArguments; 54 55 OwnArrayPtr<bool> deletedArguments; 56 Register extraArgumentsFixedBuffer[4]; 55 57 }; 56 58 … … 67 69 if (d->numArguments > d->numParameters) { 68 70 unsigned numExtraArguments = d->numArguments - d->numParameters; 69 JSValue** extraArguments = new JSValue*[numExtraArguments]; 71 Register* extraArguments; 72 if (numExtraArguments > sizeof(d->extraArgumentsFixedBuffer) / sizeof(Register)) 73 extraArguments = new Register[numExtraArguments]; 74 else 75 extraArguments = d->extraArgumentsFixedBuffer; 70 76 for (unsigned i = 0; i < numExtraArguments; ++i) 71 extraArguments[i] = argv[d->numParameters + i] .getJSValue();72 d->extraArguments .set(extraArguments);77 extraArguments[i] = argv[d->numParameters + i]; 78 d->extraArguments = extraArguments; 73 79 } 74 80 } … … 76 82 Arguments::~Arguments() 77 83 { 84 if (d->extraArguments != d->extraArgumentsFixedBuffer) 85 delete [] d->extraArguments; 78 86 } 79 87 … … 85 93 unsigned numExtraArguments = d->numArguments - d->numParameters; 86 94 for (unsigned i = 0; i < numExtraArguments; ++i) { 87 if (!d->extraArguments[i] ->marked())88 d->extraArguments[i] ->mark();95 if (!d->extraArguments[i].marked()) 96 d->extraArguments[i].mark(); 89 97 } 90 98 } … … 96 104 void Arguments::fillArgList(ExecState* exec, ArgList& args) 97 105 { 98 if (!d->deletedArguments) { 106 if (LIKELY(!d->deletedArguments)) { 107 if (LIKELY(!d->numParameters)) { 108 args.initialize(d->extraArguments, d->numArguments); 109 return; 110 } 111 99 112 if (d->numParameters == d->numArguments) { 100 113 args.initialize(&d->activation->registerAt(d->firstArgumentIndex), d->numArguments); … … 107 120 args.append(d->activation->uncheckedSymbolTableGetValue(d->firstArgumentIndex + i)); 108 121 for (; i < d->numArguments; ++i) 109 args.append( d->extraArguments[i - d->numParameters]);122 args.append(get(exec, i)); 110 123 return; 111 124 } … … 121 134 for (; i < d->numArguments; ++i) { 122 135 if (!d->deletedArguments[i]) 123 args.append(d->extraArguments[i - d->numParameters] );136 args.append(d->extraArguments[i - d->numParameters].getJSValue()); 124 137 else 125 138 args.append(get(exec, i)); … … 133 146 d->activation->uncheckedSymbolTableGet(d->firstArgumentIndex + i, slot); 134 147 else 135 slot.setValue Slot(&d->extraArguments[i - d->numParameters]);148 slot.setValue(d->extraArguments[i - d->numParameters].getJSValue()); 136 149 return true; 137 150 } … … 148 161 d->activation->uncheckedSymbolTableGet(d->firstArgumentIndex + i, slot); 149 162 else 150 slot.setValue Slot(&d->extraArguments[i - d->numParameters]);163 slot.setValue(d->extraArguments[i - d->numParameters].getJSValue()); 151 164 return true; 152 165 }
Note:
See TracChangeset
for help on using the changeset viewer.