| Index: test/cctest/test-api.cc
 | 
| ===================================================================
 | 
| --- test/cctest/test-api.cc	(revision 2982)
 | 
| +++ test/cctest/test-api.cc	(working copy)
 | 
| @@ -1,4 +1,4 @@
 | 
| -// Copyright 2007-2008 the V8 project authors. All rights reserved.
 | 
| +// Copyright 2007-2009 the V8 project authors. All rights reserved.
 | 
|  // Redistribution and use in source and binary forms, with or without
 | 
|  // modification, are permitted provided that the following conditions are
 | 
|  // met:
 | 
| @@ -31,6 +31,7 @@
 | 
|  
 | 
|  #include "api.h"
 | 
|  #include "compilation-cache.h"
 | 
| +#include "execution.h"
 | 
|  #include "snapshot.h"
 | 
|  #include "platform.h"
 | 
|  #include "top.h"
 | 
| @@ -7879,3 +7880,77 @@
 | 
|    for (int i = 0; i < 100; i++) v8::V8::IdleNotification(true);
 | 
|    for (int i = 0; i < 100; i++) v8::V8::IdleNotification(false);
 | 
|  }
 | 
| +
 | 
| +
 | 
| +static uint32_t* stack_limit;
 | 
| +
 | 
| +static v8::Handle<Value> GetStackLimitCallback(const v8::Arguments& args) {
 | 
| +  stack_limit = reinterpret_cast<uint32_t*>(i::StackGuard::climit());
 | 
| +  return v8::Undefined();
 | 
| +}
 | 
| +
 | 
| +
 | 
| +// Uses the address of a local variable to determine the stack top now.
 | 
| +// Given a size, returns an address that is that far from the current
 | 
| +// top of stack.
 | 
| +static uint32_t* ComputeStackLimit(uint32_t size) {
 | 
| +  uint32_t* answer = &size - (size / sizeof(size));
 | 
| +  // If the size is very large and the stack is very near the bottom of
 | 
| +  // memory then the calculation above may wrap around and give an address
 | 
| +  // that is above the (downwards-growing) stack.  In that case we return
 | 
| +  // a very low address.
 | 
| +  if (answer > &size) return reinterpret_cast<uint32_t*>(sizeof(size));
 | 
| +  return answer;
 | 
| +}
 | 
| +
 | 
| +
 | 
| +TEST(SetResourceConstraints) {
 | 
| +  static const int K = 1024;
 | 
| +  uint32_t* set_limit = ComputeStackLimit(128 * K);
 | 
| +
 | 
| +  // Set stack limit.
 | 
| +  v8::ResourceConstraints constraints;
 | 
| +  constraints.set_stack_limit(set_limit);
 | 
| +  CHECK(v8::SetResourceConstraints(&constraints));
 | 
| +
 | 
| +  // Execute a script.
 | 
| +  v8::HandleScope scope;
 | 
| +  LocalContext env;
 | 
| +  Local<v8::FunctionTemplate> fun_templ =
 | 
| +      v8::FunctionTemplate::New(GetStackLimitCallback);
 | 
| +  Local<Function> fun = fun_templ->GetFunction();
 | 
| +  env->Global()->Set(v8_str("get_stack_limit"), fun);
 | 
| +  CompileRun("get_stack_limit();");
 | 
| +
 | 
| +  CHECK(stack_limit == set_limit);
 | 
| +}
 | 
| +
 | 
| +
 | 
| +TEST(SetResourceConstraintsInThread) {
 | 
| +  uint32_t* set_limit;
 | 
| +  {
 | 
| +    v8::Locker locker;
 | 
| +    static const int K = 1024;
 | 
| +    set_limit = ComputeStackLimit(128 * K);
 | 
| +
 | 
| +    // Set stack limit.
 | 
| +    v8::ResourceConstraints constraints;
 | 
| +    constraints.set_stack_limit(set_limit);
 | 
| +    CHECK(v8::SetResourceConstraints(&constraints));
 | 
| +
 | 
| +    // Execute a script.
 | 
| +    v8::HandleScope scope;
 | 
| +    LocalContext env;
 | 
| +    Local<v8::FunctionTemplate> fun_templ =
 | 
| +        v8::FunctionTemplate::New(GetStackLimitCallback);
 | 
| +    Local<Function> fun = fun_templ->GetFunction();
 | 
| +    env->Global()->Set(v8_str("get_stack_limit"), fun);
 | 
| +    CompileRun("get_stack_limit();");
 | 
| +
 | 
| +    CHECK(stack_limit == set_limit);
 | 
| +  }
 | 
| +  {
 | 
| +    v8::Locker locker;
 | 
| +    CHECK(stack_limit == set_limit);
 | 
| +  }
 | 
| +}
 | 
| 
 |