276 final Object[] objectSpill = new Object[values.size()]; 277 278 for (final Property property : propertyMap.getProperties()) { 279 if (!dualFields || property.getType() == Object.class) { 280 objectSpill[property.getSlot()] = values.get(property.getSlot()); 281 } else { 282 primitiveSpill[property.getSlot()] = ObjectClassGenerator.pack((Number) values.get(property.getSlot())); 283 } 284 } 285 286 final ScriptObject object = dualFields ? 287 new JD(propertyMap, primitiveSpill, objectSpill) : new JO(propertyMap, null, objectSpill); 288 object.setInitialProto(global.getObjectPrototype()); 289 object.setArray(arrayData); 290 return object; 291 } 292 293 private static Class<?> getType(final Object value) { 294 if (value instanceof Integer) { 295 return int.class; 296 } else if (value instanceof Long) { 297 return long.class; 298 } else if (value instanceof Double) { 299 return double.class; 300 } else { 301 return Object.class; 302 } 303 } 304 305 private void expectColon() { 306 skipWhiteSpace(); 307 final int n = next(); 308 if (n != ':') { 309 throw expectedError(pos - 1, ":", toString(n)); 310 } 311 } 312 313 private Object parseArray() { 314 ArrayData arrayData = ArrayData.EMPTY_ARRAY; 315 int state = STATE_EMPTY; 316 317 assert peek() == '['; 460 skipDigits(); 461 } 462 463 // exponent 464 c = peek(); 465 if (c == 'e' || c == 'E') { 466 pos++; 467 c = next(); 468 if (c == '-' || c == '+') { 469 c = next(); 470 } 471 if (!isDigit(c)) { 472 throw numberError(pos - 1); 473 } 474 skipDigits(); 475 } 476 477 final double d = Double.parseDouble(source.substring(start, pos)); 478 if (JSType.isRepresentableAsInt(d)) { 479 return (int) d; 480 } else if (JSType.isRepresentableAsLong(d)) { 481 return (long) d; 482 } 483 return d; 484 } 485 486 private Object parseKeyword(final String keyword, final Object value) { 487 if (!source.regionMatches(pos, keyword, 0, keyword.length())) { 488 throw expectedError(pos, "json literal", "ident"); 489 } 490 pos += keyword.length(); 491 return value; 492 } 493 494 private int peek() { 495 if (pos >= length) { 496 return -1; 497 } 498 return source.charAt(pos); 499 } 500 501 private int next() { | 276 final Object[] objectSpill = new Object[values.size()]; 277 278 for (final Property property : propertyMap.getProperties()) { 279 if (!dualFields || property.getType() == Object.class) { 280 objectSpill[property.getSlot()] = values.get(property.getSlot()); 281 } else { 282 primitiveSpill[property.getSlot()] = ObjectClassGenerator.pack((Number) values.get(property.getSlot())); 283 } 284 } 285 286 final ScriptObject object = dualFields ? 287 new JD(propertyMap, primitiveSpill, objectSpill) : new JO(propertyMap, null, objectSpill); 288 object.setInitialProto(global.getObjectPrototype()); 289 object.setArray(arrayData); 290 return object; 291 } 292 293 private static Class<?> getType(final Object value) { 294 if (value instanceof Integer) { 295 return int.class; 296 } else if (value instanceof Double) { 297 return double.class; 298 } else { 299 return Object.class; 300 } 301 } 302 303 private void expectColon() { 304 skipWhiteSpace(); 305 final int n = next(); 306 if (n != ':') { 307 throw expectedError(pos - 1, ":", toString(n)); 308 } 309 } 310 311 private Object parseArray() { 312 ArrayData arrayData = ArrayData.EMPTY_ARRAY; 313 int state = STATE_EMPTY; 314 315 assert peek() == '['; 458 skipDigits(); 459 } 460 461 // exponent 462 c = peek(); 463 if (c == 'e' || c == 'E') { 464 pos++; 465 c = next(); 466 if (c == '-' || c == '+') { 467 c = next(); 468 } 469 if (!isDigit(c)) { 470 throw numberError(pos - 1); 471 } 472 skipDigits(); 473 } 474 475 final double d = Double.parseDouble(source.substring(start, pos)); 476 if (JSType.isRepresentableAsInt(d)) { 477 return (int) d; 478 } 479 return d; 480 } 481 482 private Object parseKeyword(final String keyword, final Object value) { 483 if (!source.regionMatches(pos, keyword, 0, keyword.length())) { 484 throw expectedError(pos, "json literal", "ident"); 485 } 486 pos += keyword.length(); 487 return value; 488 } 489 490 private int peek() { 491 if (pos >= length) { 492 return -1; 493 } 494 return source.charAt(pos); 495 } 496 497 private int next() { |