| 6257 | |
| 6258 | |
| 6259 | ResultType Script::DefineClassProperty(LPTSTR aBuf, bool aStatic, bool &aBufHasBraceOrNotNeeded) |
| 6260 | { |
| 6261 | LPTSTR name_end = find_identifier_end(aBuf); |
| 6262 | LPTSTR param_start = omit_leading_whitespace(name_end); |
| 6263 | LPTSTR param_end, next_token; |
| 6264 | if (*param_start == '[') |
| 6265 | { |
| 6266 | param_start = omit_leading_whitespace(param_start + 1); |
| 6267 | if (*param_start == ']') |
| 6268 | return ScriptError(ERR_PROPERTY_EMPTY_BRACKETS, aBuf); |
| 6269 | param_end = param_start + FindExprDelim(param_start, ']'); |
| 6270 | if (!*param_end) |
| 6271 | return ScriptError(ERR_MISSING_CLOSE_BRACKET, aBuf); |
| 6272 | next_token = omit_leading_whitespace(param_end + 1); |
| 6273 | } |
| 6274 | else |
| 6275 | { |
| 6276 | param_end = param_start; |
| 6277 | next_token = param_start; |
| 6278 | } |
| 6279 | if (!*next_token) |
| 6280 | aBufHasBraceOrNotNeeded = false; |
| 6281 | else if (*next_token == '{' && !next_token[1] |
| 6282 | || *next_token == '=' && next_token[1] == '>') |
| 6283 | aBufHasBraceOrNotNeeded = true; |
| 6284 | else |
| 6285 | return ScriptError(ERR_INVALID_LINE_IN_CLASS_DEF, aBuf); |
| 6286 | |
| 6287 | // Save the property name and parameter list for later use with DefineFunc(). |
| 6288 | int name_length = int(name_end - aBuf); |
| 6289 | int param_length = int(param_end - param_start); |
| 6290 | mClassPropertyDef = tmalloc(name_length + param_length + 7); // +7 for ".Get()\0" |
| 6291 | if (!mClassPropertyDef) |
| 6292 | return ScriptError(ERR_OUTOFMEM); |
| 6293 | _stprintf(mClassPropertyDef, _T("%.*s.Get(%.*s)"), name_length, aBuf, param_length, param_start); |
| 6294 | |
| 6295 | Object *class_object = mClassObject[mClassObjectCount - 1]; |
| 6296 | if (!aStatic) |
| 6297 | class_object = (Object *)class_object->GetOwnPropObj(_T("Prototype")); |
| 6298 | *name_end = 0; // Terminate for aBuf use below. |
| 6299 | switch (class_object->GetOwnPropType(aBuf)) |
| 6300 | { |
| 6301 | case Object::PropType::Object: |
| 6302 | case Object::PropType::DynamicValue: // get/set |
| 6303 | case Object::PropType::DynamicMixed: // get/set and call |
| 6304 | return ScriptError(ERR_DUPLICATE_DECLARATION, aBuf); |
| 6305 | } |
| 6306 | mClassProperty = class_object->DefineProperty(aBuf); |
| 6307 | mClassPropertyStatic = aStatic; |
| 6308 | if (!mClassProperty) |
| 6309 | return ScriptError(ERR_OUTOFMEM); |
| 6310 | |
| 6311 | if (*next_token == '=') // => expr |
| 6312 | { |
| 6313 | // mClassPropertyDef is already set up for "Get". |
| 6314 | if (!DefineClassPropertyXet(aBuf, next_token)) |
| 6315 | return FAIL; |
| 6316 | // Immediately close this property definition. |
nothing calls this directly
no test coverage detected