| Index: runtime/vm/os_fuchsia.cc | 
| diff --git a/runtime/vm/os_fuchsia.cc b/runtime/vm/os_fuchsia.cc | 
| index 10faf1c66a977f41db125a8fd0ff83ec51fc2e32..db9264ee2a3526de093d404118e306413dbd7e66 100644 | 
| --- a/runtime/vm/os_fuchsia.cc | 
| +++ b/runtime/vm/os_fuchsia.cc | 
| @@ -11,6 +11,7 @@ | 
| #include <magenta/types.h> | 
|  | 
| #include "platform/assert.h" | 
| +#include "vm/zone.h" | 
|  | 
| namespace dart { | 
|  | 
| @@ -54,20 +55,19 @@ int64_t OS::GetCurrentTimeMicros() { | 
|  | 
|  | 
| int64_t OS::GetCurrentMonotonicTicks() { | 
| -  UNIMPLEMENTED(); | 
| -  return 0; | 
| +  return _magenta_current_time(); | 
| } | 
|  | 
|  | 
| int64_t OS::GetCurrentMonotonicFrequency() { | 
| -  UNIMPLEMENTED(); | 
| -  return 0; | 
| +  return kNanosecondsPerSecond; | 
| } | 
|  | 
|  | 
| int64_t OS::GetCurrentMonotonicMicros() { | 
| -  UNIMPLEMENTED(); | 
| -  return 0; | 
| +  int64_t ticks = GetCurrentMonotonicTicks(); | 
| +  ASSERT(GetCurrentMonotonicFrequency() == kNanosecondsPerSecond); | 
| +  return ticks / kNanosecondsPerMicrosecond; | 
| } | 
|  | 
|  | 
| @@ -89,16 +89,45 @@ void OS::AlignedFree(void* ptr) { | 
|  | 
|  | 
| // TODO(5411554):  May need to hoist these architecture dependent code | 
| -// into a architecture specific file e.g: os_ia32_linux.cc | 
| +// into a architecture specific file e.g: os_ia32_fuchsia.cc | 
| intptr_t OS::ActivationFrameAlignment() { | 
| -  UNIMPLEMENTED(); | 
| -  return 0; | 
| +#if defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_X64) || \ | 
| +    defined(TARGET_ARCH_ARM64) | 
| +  const int kMinimumAlignment = 16; | 
| +#elif defined(TARGET_ARCH_ARM) || defined(TARGET_ARCH_DBC) | 
| +  const int kMinimumAlignment = 8; | 
| +#else | 
| +#error Unsupported architecture. | 
| +#endif | 
| +  intptr_t alignment = kMinimumAlignment; | 
| +  // TODO(5411554): Allow overriding default stack alignment for | 
| +  // testing purposes. | 
| +  // Flags::DebugIsInt("stackalign", &alignment); | 
| +  ASSERT(Utils::IsPowerOfTwo(alignment)); | 
| +  ASSERT(alignment >= kMinimumAlignment); | 
| +  return alignment; | 
| } | 
|  | 
|  | 
| intptr_t OS::PreferredCodeAlignment() { | 
| -  UNIMPLEMENTED(); | 
| -  return 0; | 
| +#if defined(TARGET_ARCH_IA32) ||                                               \ | 
| +    defined(TARGET_ARCH_X64) ||                                                \ | 
| +    defined(TARGET_ARCH_ARM64) ||                                              \ | 
| +    defined(TARGET_ARCH_DBC) | 
| +  const int kMinimumAlignment = 32; | 
| +#elif defined(TARGET_ARCH_ARM) || defined(TARGET_ARCH_MIPS) | 
| +  const int kMinimumAlignment = 16; | 
| +#else | 
| +#error Unsupported architecture. | 
| +#endif | 
| +  intptr_t alignment = kMinimumAlignment; | 
| +  // TODO(5411554): Allow overriding default code alignment for | 
| +  // testing purposes. | 
| +  // Flags::DebugIsInt("codealign", &alignment); | 
| +  ASSERT(Utils::IsPowerOfTwo(alignment)); | 
| +  ASSERT(alignment >= kMinimumAlignment); | 
| +  ASSERT(alignment <= OS::kMaxPreferredCodeAlignment); | 
| +  return alignment; | 
| } | 
|  | 
|  | 
| @@ -153,26 +182,53 @@ void OS::VFPrint(FILE* stream, const char* format, va_list args) { | 
|  | 
|  | 
| int OS::SNPrint(char* str, size_t size, const char* format, ...) { | 
| -  UNIMPLEMENTED(); | 
| -  return 0; | 
| +  va_list args; | 
| +  va_start(args, format); | 
| +  int retval = VSNPrint(str, size, format, args); | 
| +  va_end(args); | 
| +  return retval; | 
| } | 
|  | 
|  | 
| int OS::VSNPrint(char* str, size_t size, const char* format, va_list args) { | 
| -  UNIMPLEMENTED(); | 
| -  return 0; | 
| +  int retval = vsnprintf(str, size, format, args); | 
| +  if (retval < 0) { | 
| +    FATAL1("Fatal error in OS::VSNPrint with format '%s'", format); | 
| +  } | 
| +  return retval; | 
| } | 
|  | 
|  | 
| char* OS::SCreate(Zone* zone, const char* format, ...) { | 
| -  UNIMPLEMENTED(); | 
| -  return NULL; | 
| +  va_list args; | 
| +  va_start(args, format); | 
| +  char* buffer = VSCreate(zone, format, args); | 
| +  va_end(args); | 
| +  return buffer; | 
| } | 
|  | 
|  | 
| char* OS::VSCreate(Zone* zone, const char* format, va_list args) { | 
| -  UNIMPLEMENTED(); | 
| -  return NULL; | 
| +  // Measure. | 
| +  va_list measure_args; | 
| +  va_copy(measure_args, args); | 
| +  intptr_t len = VSNPrint(NULL, 0, format, measure_args); | 
| +  va_end(measure_args); | 
| + | 
| +  char* buffer; | 
| +  if (zone) { | 
| +    buffer = zone->Alloc<char>(len + 1); | 
| +  } else { | 
| +    buffer = reinterpret_cast<char*>(malloc(len + 1)); | 
| +  } | 
| +  ASSERT(buffer != NULL); | 
| + | 
| +  // Print. | 
| +  va_list print_args; | 
| +  va_copy(print_args, args); | 
| +  VSNPrint(buffer, len + 1, format, print_args); | 
| +  va_end(print_args); | 
| +  return buffer; | 
| } | 
|  | 
|  | 
|  |