| OLD | NEW | 
|    1 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file |    1 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file | 
|    2 // for details. All rights reserved. Use of this source code is governed by a |    2 // for details. All rights reserved. Use of this source code is governed by a | 
|    3 // BSD-style license that can be found in the LICENSE file. |    3 // BSD-style license that can be found in the LICENSE file. | 
|    4  |    4  | 
|    5 #include "vm/bootstrap_natives.h" |    5 #include "vm/bootstrap_natives.h" | 
|    6  |    6  | 
 |    7 #include "include/dart_api.h" | 
|    7 #include "vm/bigint_operations.h" |    8 #include "vm/bigint_operations.h" | 
|    8 #include "vm/dart_entry.h" |    9 #include "vm/dart_entry.h" | 
 |   10 #include "vm/dart_api_impl.h" | 
|    9 #include "vm/exceptions.h" |   11 #include "vm/exceptions.h" | 
 |   12 #include "vm/isolate.h" | 
|   10 #include "vm/native_entry.h" |   13 #include "vm/native_entry.h" | 
|   11 #include "vm/object.h" |   14 #include "vm/object.h" | 
|   12 #include "vm/object_store.h" |   15 #include "vm/object_store.h" | 
|   13 #include "vm/symbols.h" |   16 #include "vm/symbols.h" | 
|   14  |   17  | 
|   15 namespace dart { |   18 namespace dart { | 
|   16  |   19  | 
|   17 DEFINE_FLAG(bool, trace_intrinsified_natives, false, |   20 DEFINE_FLAG(bool, trace_intrinsified_natives, false, | 
|   18     "Report if any of the intrinsified natives are called"); |   21     "Report if any of the intrinsified natives are called"); | 
|   19  |   22  | 
| (...skipping 199 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  219     } |  222     } | 
|  220     String& temp = String::Handle(); |  223     String& temp = String::Handle(); | 
|  221     temp = String::Concat(Symbols::Dash(), *int_string); |  224     temp = String::Concat(Symbols::Dash(), *int_string); | 
|  222     return Integer::New(temp); |  225     return Integer::New(temp); | 
|  223   } |  226   } | 
|  224  |  227  | 
|  225   return Object::null(); |  228   return Object::null(); | 
|  226 } |  229 } | 
|  227  |  230  | 
|  228  |  231  | 
 |  232 DEFINE_NATIVE_ENTRY(Integer_fromEnvironment, 3) { | 
 |  233   GET_NON_NULL_NATIVE_ARGUMENT(String, name, arguments->NativeArgAt(1)); | 
 |  234   GET_NATIVE_ARGUMENT(Integer, default_value, arguments->NativeArgAt(2)); | 
 |  235   // Call the embedder to supply us with the environment. | 
 |  236   Dart_EnvironmentCallback callback = isolate->environment_callback(); | 
 |  237   if (callback != NULL) { | 
 |  238     Dart_Handle result = callback(Api::NewHandle(isolate, name.raw())); | 
 |  239     if (Dart_IsError(result)) { | 
 |  240       const Object& error = | 
 |  241           Object::Handle(isolate, Api::UnwrapHandle(result)); | 
 |  242       Exceptions::ThrowArgumentError( | 
 |  243           String::Handle( | 
 |  244               String::New(Error::Cast(error).ToErrorCString()))); | 
 |  245     } else if (Dart_IsString(result)) { | 
 |  246       uint8_t* digits; | 
 |  247       intptr_t digits_len; | 
 |  248       Dart_StringToUTF8(result, &digits, &digits_len); | 
 |  249       if (digits_len > 0) { | 
 |  250         // Check for valid integer literal before constructing integer object. | 
 |  251         // Skip leading minus if present. | 
 |  252         if (digits[0] == '-') { | 
 |  253           digits++; | 
 |  254           digits_len--; | 
 |  255         } | 
 |  256         // Check remaining string for decimal or hex-decimal literal. | 
 |  257         bool is_number = true; | 
 |  258         if (digits_len > 2 && | 
 |  259             digits[0] == '0' && | 
 |  260             (digits[1] == 'x' || digits[1] == 'X')) { | 
 |  261           for (int i = 2; i < digits_len && is_number; i++) { | 
 |  262             is_number = ('0' <= digits[i] && digits[i] <= '9') || | 
 |  263                         ('A' <= digits[i] && digits[i] <= 'F') || | 
 |  264                         ('a' <= digits[i] && digits[i] <= 'f'); | 
 |  265           } | 
 |  266         } else { | 
 |  267           for (int i = 0; i < digits_len && is_number; i++) { | 
 |  268             is_number = '0' <= digits[i] && digits[i] <= '9'; | 
 |  269           } | 
 |  270         } | 
 |  271         if (digits_len > 0 && is_number) { | 
 |  272           const Object& value = | 
 |  273               Object::Handle(isolate, Api::UnwrapHandle(result)); | 
 |  274           ASSERT(value.IsString()); | 
 |  275           return Integer::NewCanonical(String::Cast(value)); | 
 |  276         } | 
 |  277       } | 
 |  278     } else if (!Dart_IsNull(result)) { | 
 |  279       Exceptions::ThrowArgumentError( | 
 |  280           String::Handle(String::New("Illegal environment value"))); | 
 |  281     } | 
 |  282   } | 
 |  283   return default_value.raw(); | 
 |  284 } | 
 |  285  | 
 |  286  | 
|  229 // Passing true for 'silent' prevents throwing JavascriptIntegerOverflow. |  287 // Passing true for 'silent' prevents throwing JavascriptIntegerOverflow. | 
|  230 static RawInteger* ShiftOperationHelper(Token::Kind kind, |  288 static RawInteger* ShiftOperationHelper(Token::Kind kind, | 
|  231                                         const Integer& value, |  289                                         const Integer& value, | 
|  232                                         const Smi& amount, |  290                                         const Smi& amount, | 
|  233                                         const bool silent = false) { |  291                                         const bool silent = false) { | 
|  234   if (amount.Value() < 0) { |  292   if (amount.Value() < 0) { | 
|  235     Exceptions::ThrowArgumentError(amount); |  293     Exceptions::ThrowArgumentError(amount); | 
|  236   } |  294   } | 
|  237   if (value.IsSmi()) { |  295   if (value.IsSmi()) { | 
|  238     const Smi& smi_value = Smi::Cast(value); |  296     const Smi& smi_value = Smi::Cast(value); | 
| (...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  401   // Use the preallocated out of memory exception to avoid calling |  459   // Use the preallocated out of memory exception to avoid calling | 
|  402   // into dart code or allocating any code. |  460   // into dart code or allocating any code. | 
|  403   const Instance& exception = |  461   const Instance& exception = | 
|  404       Instance::Handle(isolate->object_store()->out_of_memory()); |  462       Instance::Handle(isolate->object_store()->out_of_memory()); | 
|  405   Exceptions::Throw(exception); |  463   Exceptions::Throw(exception); | 
|  406   UNREACHABLE(); |  464   UNREACHABLE(); | 
|  407   return 0; |  465   return 0; | 
|  408 } |  466 } | 
|  409  |  467  | 
|  410 }  // namespace dart |  468 }  // namespace dart | 
| OLD | NEW |