Commit Graph

1278 Commits

Author SHA1 Message Date
hausner@google.com 75f9f5bfa3 Fix error message when assigning to a local const variable
Remove front-end optimization that turned load local const
value into a load literal. Change backend to recognize loading
of const locals. This fixes the error message automagically.

Fix for issue 17258

R=srdjan@google.com

Review URL: https://codereview.chromium.org//186853003

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@33288 260f80e4-7a28-3924-810f-c04153c831b5
2014-03-04 18:44:53 +00:00
hausner@google.com 97e7f2c299 Fix type checks with malformed types
Parser must continue to parse the rest of an expression that contains
a type test with a malformed type.

Before:
'file:XXX’: error: line 5 pos 12: ')' expected
  if (3 is X && 2 == 2) print("foo");

After:
'file:XXX’: malformed type: line 5 pos 12: type 'X' is not loaded
  if (3 is X && 2 == 2) print("foo");
           ^
type error.
#0      main (file:XXX:5:12)
#1      _startIsolate.isolateStartHandler (dart:isolate-patch/isolate_patch.dart:216)
#2      _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:115)

R=regis@google.com

Review URL: https://codereview.chromium.org//183743015

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@33253 260f80e4-7a28-3924-810f-c04153c831b5
2014-03-03 23:27:44 +00:00
rmacnak@google.com b49aa48f07 Fix VM crash when parsing what looks like a closure call during metadata evaluation.
BUG=http://dartbug.com/17141
R=gbracha@google.com, hausner@google.com

Review URL: https://codereview.chromium.org//180313003

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@33141 260f80e4-7a28-3924-810f-c04153c831b5
2014-02-27 23:24:05 +00:00
hausner@google.com 5920d6c173 Fix formatting issue from previous CL
TBR: iposva

Review URL: https://codereview.chromium.org//179083005

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@33030 260f80e4-7a28-3924-810f-c04153c831b5
2014-02-25 18:48:37 +00:00
hausner@google.com ad3fb79210 Better error message for assignment to final local variables
“No top-level getter found” becomes “cannot assign to final variable xxx”.

Fixes issue 16782.

R=iposva@google.com

Review URL: https://codereview.chromium.org//177633008

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@33028 260f80e4-7a28-3924-810f-c04153c831b5
2014-02-25 18:01:35 +00:00
fschneider@google.com 16857e0b13 Revert r32930 (Add more timing information in the VM to track time...)
It caused severe performance regressions that should be addressed.

TBR=asiva@google.com

Review URL: https://codereview.chromium.org//177733002

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@32959 260f80e4-7a28-3924-810f-c04153c831b5
2014-02-24 12:15:55 +00:00
iposva@google.com edd82bc688 - Restore the better error message.
R=asiva@google.com

Review URL: https://codereview.chromium.org//170313008

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@32939 260f80e4-7a28-3924-810f-c04153c831b5
2014-02-21 22:44:39 +00:00
asiva@google.com 6d313d3797 Add more timing information in the VM to track time spent is dart code Vs native code.
R=johnmccutchan@google.com, turnidge@google.com

Review URL: https://codereview.chromium.org//137483010

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@32930 260f80e4-7a28-3924-810f-c04153c831b5
2014-02-21 21:30:29 +00:00
lrn@google.com 9c6b5e4823 Doesn't work as written when int != intptr_t.
Review URL: https://codereview.chromium.org//175083003

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@32898 260f80e4-7a28-3924-810f-c04153c831b5
2014-02-21 13:34:29 +00:00
lrn@google.com 0dbb989cb8 Add internal operation that converts a growable list to a fixed list.
The conversion breaks the original list, but doesn't copy data.
Currently only used in List.from(Iterable).

BUG= http://dartbug.com/9458
R=floitsch@google.com, iposva@google.com

Review URL: https://codereview.chromium.org//134893003

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@32896 260f80e4-7a28-3924-810f-c04153c831b5
2014-02-21 13:15:16 +00:00
regis@google.com 7830430adf Implement eager instantiation and canonicalization of type arguments at run
time using a cache in uninstantiated type arguments.
Remove InstantiatedTypeArguments class.
Fix a bug in optimized code: do not update unused type test cache for Smi.
Fix a bug in optimized code on ARM and MIPS in type test cache lookup.

R=iposva@google.com, srdjan@google.com

Review URL: https://codereview.chromium.org//154393003

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@32447 260f80e4-7a28-3924-810f-c04153c831b5
2014-02-07 19:54:33 +00:00
hausner@google.com ac559f643a Introduce cache of resolved names in library
A name that is not resolved in the local scope gets looked up
in the global scope of the library to which the code being compiled
belongs. The local name dictionary gets searched first, then the
dictionary of each imported library (and and their re-exported
libraries.) Each dictionary lookup includes the lookup of the
mangled getter and setter names, which means that we concatenate
the same name many times.

This change introduces a cache that stores the result of a previous
name lookup, including negative lookup results. The latter is important
to speed up the resolution of names that are not in the global name
space, e.g. class members like .length in lists.

Experiments running dart2js (with VM option --compile_all) show
that this reduces the number of name mangling calls by a factor of 10
and speeds up compiling dart2js by 15%.

R=asiva@google.com

Review URL: https://codereview.chromium.org//135123011

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@32385 260f80e4-7a28-3924-810f-c04153c831b5
2014-02-06 21:32:31 +00:00
asiva@google.com 29de1e8e59 Enter and Exit scope when calling into the native library tag handler
instead of relying on an outer enclosing scope.

R=hausner@google.com

Review URL: https://codereview.chromium.org//141803019

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@32346 260f80e4-7a28-3924-810f-c04153c831b5
2014-02-05 23:42:06 +00:00
fschneider@google.com 6ffa061fdf Fix stack height assertion code and free up a bit in the Function tag bits.
The bit has_finally was only used to skip the checking of the stack height
at return statements: There was an unused value floating on top of the
expression stack in unoptimized code if the finally block preceded a normal
return statement. Normallyi, that does not cause harm. Optimized code is not
affected since it has a fixed stack size for expression evaluation.

This CL fixes the stack height for functions with try-finally by introducing
a temporary local where the return value is saved before an inlined
finally-block.

R=srdjan@google.com

Review URL: https://codereview.chromium.org//149603003

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@32157 260f80e4-7a28-3924-810f-c04153c831b5
2014-01-30 12:12:31 +00:00
rmacnak@google.com 2808e02ca0 VM: Fix crash when a type error is encountered while evaluating metadata in checked mode.
BUG=http://dartbug.com/16321
R=hausner@google.com

Review URL: https://codereview.chromium.org//148263007

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@32042 260f80e4-7a28-3924-810f-c04153c831b5
2014-01-27 23:50:45 +00:00
hausner@google.com 0c434b3073 Rename kDummyTokenIndex to kNoSourcePos
Addresses comment to previous change list.

R=regis@google.com

Review URL: https://codereview.chromium.org//144343002

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@31969 260f80e4-7a28-3924-810f-c04153c831b5
2014-01-21 23:46:26 +00:00
hausner@google.com baf16bac5e Make safe points in generated code invisible to the debugger
- remove some PC descriptors that are part of implicit, synthesized
  code, e.g. generated null checks in == methods, implicit constructors,
  implicitly generated code in user constructors, etc.
- ignore single step callbacks on PC descriptors that are part of
  synthesized code.

R=regis@google.com

Review URL: https://codereview.chromium.org//137003006

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@31966 260f80e4-7a28-3924-810f-c04153c831b5
2014-01-21 21:49:42 +00:00
regis@google.com 5832bdbbb3 Handle wrong method invocation of a type parameter (fix issue 13134).
Add test.

R=gbracha@google.com, hausner@google.com

Review URL: https://codereview.chromium.org//134083005

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@31944 260f80e4-7a28-3924-810f-c04153c831b5
2014-01-18 01:03:22 +00:00
hausner@google.com 812467f0f6 Fix several little buglets with stepping
No need to halt on single step if there is a breakpoint on the
same location. While looking at the resulting test failures, I
discovered that the step_in_equals test was not at all testing
what it was meant to test. It happened to pass because of a
related bug in the parser. Decided to abandon that test and
instead check that we can break at == even if one of the operands
is null.

Added ability to match line numbers in the debugger tests.

R=regis@google.com

Review URL: https://codereview.chromium.org//135843003

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@31898 260f80e4-7a28-3924-810f-c04153c831b5
2014-01-16 21:15:17 +00:00
lrn@google.com 3b3e87cabc Revert "Rename internal library dart:_collection-dev to dart:_internal."
Dartium needs updating too.

Committed: https://code.google.com/p/dart/source/detail?r=31827

R=floitsch@google.com

Review URL: https://codereview.chromium.org//133273011

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@31877 260f80e4-7a28-3924-810f-c04153c831b5
2014-01-16 12:06:38 +00:00
lrn@google.com ead87f47e9 Revert "Rename internal library dart:_collection-dev to dart:_internal."
Dartium needs updating too.

Review URL: https://codereview.chromium.org//133273011

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@31827 260f80e4-7a28-3924-810f-c04153c831b5
2014-01-15 12:27:44 +00:00
lrn@google.com 0098710559 Rename internal library dart:_collection-dev to dart:_internal.
BUG= http://dartbug.com/14140
R=floitsch@google.com

Review URL: https://codereview.chromium.org//133893007

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@31823 260f80e4-7a28-3924-810f-c04153c831b5
2014-01-15 09:24:46 +00:00
regis@google.com c2f0dec5ec Support bounded mixins in the VM (fix issue 14453).
Add tests.

R=gbracha@google.com, hausner@google.com

Review URL: https://codereview.chromium.org//137543004

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@31794 260f80e4-7a28-3924-810f-c04153c831b5
2014-01-14 18:41:27 +00:00
zra@google.com fdeff1ba17 Replaces LongJump with LongJumpScope.
LongJump required explicitly restoring the old
long jump base before function return. This was
sometimes forgotten, leading to crashes. This
change puts the base restoration into the
destructor so that it happens automatically on
return.

R=iposva@google.com

Review URL: https://codereview.chromium.org//108383007

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@31463 260f80e4-7a28-3924-810f-c04153c831b5
2014-01-04 01:23:43 +00:00
zra@google.com f6ef03b857 Adds missing calls to reset long_jump_base.
Fixes Issue 15744.

R=hausner@google.com, iposva@google.com

Review URL: https://codereview.chromium.org//108513016

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@31431 260f80e4-7a28-3924-810f-c04153c831b5
2014-01-02 20:53:55 +00:00
hausner@google.com 8f125a4cff Detect missing with clause in mixing applications
Fixes 15758.

R=srdjan@google.com

Review URL: https://codereview.chromium.org//102443008

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@31370 260f80e4-7a28-3924-810f-c04153c831b5
2013-12-26 17:27:09 +00:00
asiva@google.com a576fec3c0 Allow the native resolver to setup whether it needs the Dart API scope to
be setup automatically or not when a native function is invoked.
This would allow the embedder to treat some native functions as leaf
functions whose invocation can be very light.

R=hausner@google.com, zra@google.com

Review URL: https://codereview.chromium.org//117723002

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@31286 260f80e4-7a28-3924-810f-c04153c831b5
2013-12-19 17:47:56 +00:00
asiva@google.com 64a261fbbd Changes to interpret the optimizable bit based on whether the function
is native or not.

R=srdjan@google.com

Review URL: https://codereview.chromium.org//101753005

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@31207 260f80e4-7a28-3924-810f-c04153c831b5
2013-12-17 22:07:41 +00:00
regis@google.com fb6d24945f Introduce class TypeRef in the VM to fully support recursive types.
Fix issues 15244, 15148, 14869, 14000, and 13688 (was closed, but fragile).

Note that the current solution is not final as it may not be correct in more
complex cases not yet covered by language tests.
The final solution will require a 'trail' instead of a simple mark bit to
prevent operations involving recursive types to diverge.

R=asiva@google.com

Review URL: https://codereview.chromium.org//103913005

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@31087 260f80e4-7a28-3924-810f-c04153c831b5
2013-12-11 22:51:19 +00:00
hausner@google.com cea1acc8a1 Fix assignable syntax analysis
My previous change has a bug in it that I didn’t trip over
because I ran test with a version that masked the assertion with
a compilation error.

R=srdjan@google.com

Review URL: https://codereview.chromium.org//107023002

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@30909 260f80e4-7a28-3924-810f-c04153c831b5
2013-12-05 19:15:00 +00:00
hausner@google.com 2e3b0fd8bf Detect illegal assignable expressions
The AST cannot distinguish between (x) and x. Adding a check
to the VM compiler that detects syntactically illegal assignments
like (x) = 0. The existing checks only analyze the AST so we
didn’t detect some illegal cases.

Looking at the source to detect syntactically illegal left hand
expressions is a bit ugly because we can’t easily look at
previous tokens. This change rewinds the token iterator a few
positions and then moves forward to check whether the last token
of the expression is an identifier or a closing bracket ].

Added new test. We did not have a single test case for this :)

R=regis@google.com

Review URL: https://codereview.chromium.org//106843002

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@30904 260f80e4-7a28-3924-810f-c04153c831b5
2013-12-05 18:15:21 +00:00
fschneider@google.com cd54507fc2 Mark native functions when they are created.
Until now the parser marked native functions as native when parsing.

This may be too late for some functions. E.g. the native typed list
constructor may not be invoked because the intrinsic code is executed
instead (unless for example new-space allocation fails).

This causes missing type information when optimizing functions using
those recognized factory functions like Uint8List._new.

R=srdjan@google.com

Review URL: https://codereview.chromium.org//99373002

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@30846 260f80e4-7a28-3924-810f-c04153c831b5
2013-12-04 10:32:43 +00:00
regis@google.com d1e945994e Improve type test and type equality for generics (issue 15148).
R=srdjan@google.com

Review URL: https://codereview.chromium.org//81363002

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@30546 260f80e4-7a28-3924-810f-c04153c831b5
2013-11-21 21:30:51 +00:00
rmacnak@google.com 307dfe1bde Fix crash evaluating metadata with super in a const constructor argument.
R=hausner@google.com

Review URL: https://codereview.chromium.org//76963003

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@30491 260f80e4-7a28-3924-810f-c04153c831b5
2013-11-21 00:11:31 +00:00
rmacnak@google.com f76f7f7ecf Handle undefined field/getter access from arguments to const constructors in metadata, and related problematic cases.
BUG=http://dartbug.com/13817
R=hausner@google.com

Review URL: https://codereview.chromium.org//68333007

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@30385 260f80e4-7a28-3924-810f-c04153c831b5
2013-11-19 01:02:26 +00:00
regis@google.com db2cec593d Distinguish between malformed and malbounded types more efficiently using the
recently introduced LanguageError 'kind' field.

R=hausner@google.com

Review URL: https://codereview.chromium.org//75713002

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@30383 260f80e4-7a28-3924-810f-c04153c831b5
2013-11-18 23:31:12 +00:00
regis@google.com 2a355a7bb6 Lazily format LanguageError messages (fix issue 15069).
R=iposva@google.com

Review URL: https://codereview.chromium.org//68113028

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@30308 260f80e4-7a28-3924-810f-c04153c831b5
2013-11-15 18:54:24 +00:00
regis@google.com 694401d38e Rename mixin typedef to mixin application alias in VM.
R=hausner@google.com, rmacnak@google.com

Review URL: https://codereview.chromium.org//71693003

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@30277 260f80e4-7a28-3924-810f-c04153c831b5
2013-11-14 17:42:39 +00:00
kmillikin@google.com 2a87b7eb94 Simplify the desugaring of catch clauses.
Rather than if/then/continue (where the continue does not match the
semantics of Dart's continue), use if/then/else.  This removes the
unnecessary goto and label as a step toward streamlining support for
jumping in the compiler backend.

R=hausner@google.com

Review URL: https://codereview.chromium.org//63983005

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@30227 260f80e4-7a28-3924-810f-c04153c831b5
2013-11-13 14:08:11 +00:00
regis@google.com e3da5e16e4 Check type bounds of redirecting factories (issue 14699).
Add tests for malbounded redirecting factories.
Clean up bound checking code and type error reporting code.

R=hausner@google.com

Review URL: https://codereview.chromium.org//66033006

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@30177 260f80e4-7a28-3924-810f-c04153c831b5
2013-11-11 22:59:48 +00:00
hausner@google.com 6f95dbae2e Fix try-catch for sure
Fix scoping of user-defined exception and stack trace variables in
catch clause.

R=regis@google.com

Review URL: https://codereview.chromium.org//63033003

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@30003 260f80e4-7a28-3924-810f-c04153c831b5
2013-11-06 22:07:31 +00:00
hausner@google.com 2139b9d5f0 Undo change 29900
Undo a gratuitous change to the parser.

@kmillikin: please at least be courteous enough to ask one of the front-end
authors to review a change that is not a pressing issue, such as style preferences.

Review URL: https://codereview.chromium.org//61413002

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@29954 260f80e4-7a28-3924-810f-c04153c831b5
2013-11-06 01:21:32 +00:00
hausner@google.com ef16a556ae Revert 29947
Review URL: https://codereview.chromium.org//60343006

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@29949 260f80e4-7a28-3924-810f-c04153c831b5
2013-11-06 00:33:36 +00:00
hausner@google.com e96a4fc5ba Fix scoping of catch clause variables
Fix recent regression in try-catch and fix scoping of exception
object and stack trace variable. Add test to ensure shadowing of
these variables is possible.

R=regis@google.com

Review URL: https://codereview.chromium.org//60943003

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@29947 260f80e4-7a28-3924-810f-c04153c831b5
2013-11-06 00:05:25 +00:00
regis@google.com 528a7ce3d9 Complete latest spec changes regarding malformed types (see issue 14006).
Update language tests and mark them as failing in dart2js as appropriate.
Mark a few co19 tests as failing.
Mark a dart2js test as failing due to unresolved types.

Unfortunately, https://codereview.chromium.org/53583003/ was uncomplete and
missed a few mappings of malformed types to dynamic.

R=hausner@google.com

Review URL: https://codereview.chromium.org//57133004

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@29924 260f80e4-7a28-3924-810f-c04153c831b5
2013-11-05 18:46:13 +00:00
kmillikin@google.com a59e0881cf Clean up Parser::ParseTryStatement in the VM.
Streamline the implementation, factor out repeated code, rename some cryptic
identifiers, and fix a misspelling.

Also, disentangle an implicit include dependency: class_finalizer.cc was
getting code_generator.h implicitly from something included (unnecessarily
as it turns out) by parser.h.

R=fschneider@google.com

Review URL: https://codereview.chromium.org//59683002

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@29900 260f80e4-7a28-3924-810f-c04153c831b5
2013-11-05 12:49:14 +00:00
kmillikin@google.com caded68c92 Flatten the AST for try/catch.
Flatten a pair of blocks where the outer one is solely used to hold
the bindings of the parameters and to contain the inner one.

R=fschneider@google.com

Review URL: https://codereview.chromium.org//59523002

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@29889 260f80e4-7a28-3924-810f-c04153c831b5
2013-11-05 11:20:59 +00:00
hausner@google.com 1b87d7e2bd Compile time error on forward references to functions
Like variables, names of functions must not be referenced
before they are declared.

R=srdjan@google.com

Review URL: https://codereview.chromium.org//49253006

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@29835 260f80e4-7a28-3924-810f-c04153c831b5
2013-11-04 18:53:58 +00:00
iposva@google.com 9869227f25 - Remove support for the non-used Dart_kLibraryTag in the C API.
R=asiva@google.com

Review URL: https://codereview.chromium.org//57663003

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@29822 260f80e4-7a28-3924-810f-c04153c831b5
2013-11-04 17:27:11 +00:00
fschneider@google.com 91ca330ac8 VM: Fix initialization of statics in presence of exceptions.
In a static- or top-level variable v

var v = expr
static v = expr

If the initializer expression expr throws, the VM throws a
CyclicInitializationError when loading v afterwards, even though
this has nothing to do with cyclic initialization.

I'm changing the way implicit static getters and static initializers are
compiled. Static initializers are invoked from static getters.

They look as follows:

get:v {
  if (field.value === transition_sentinel) {
    field.value = null;
    throw new CyclicInitializationError();
  }
  if (field.value === sentinel) {
    field.value = transition_sentinel;
    init:v();
  }
  return field.value;
}


init:v {
  try {
    field.value = expr;
  } catch {
    if (field.value === transition_sentinel) {
      field.value = null;
    }
    rethrow;
  }
}

BUG=http://dartbug.com/5802
TEST=language/lazy_static3_test,
language/throwing_lazy_variable_test,
co19/Language/12_Expressions/30_Identifier_Reference_A08_t02

R=hausner@google.com

Review URL: https://codereview.chromium.org//54713003

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@29797 260f80e4-7a28-3924-810f-c04153c831b5
2013-11-04 10:08:47 +00:00