| Index: src/d8.cc | 
| =================================================================== | 
| --- src/d8.cc	(revision 1633) | 
| +++ src/d8.cc	(working copy) | 
| @@ -163,6 +163,28 @@ | 
| } | 
|  | 
|  | 
| +Handle<Value> Shell::SetEnvironment(const Arguments& args) { | 
| +  if (args.Length() != 2) { | 
| +    const char* message = "setenv() takes two arguments"; | 
| +    return ThrowException(String::New(message)); | 
| +  } | 
| +  String::Utf8Value var(args[0]); | 
| +  String::Utf8Value value(args[1]); | 
| +  if (*var == NULL) { | 
| +    const char* message = | 
| +        "os.setenv(): String conversion of variable name failed."; | 
| +    return ThrowException(String::New(message)); | 
| +  } | 
| +  if (*value == NULL) { | 
| +    const char* message = | 
| +        "os.setenv(): String conversion of variable contents failed."; | 
| +    return ThrowException(String::New(message)); | 
| +  } | 
| +  setenv(*var, *value, 1); | 
| +  return v8::Undefined(); | 
| +} | 
| + | 
| + | 
| Handle<Value> Shell::Load(const Arguments& args) { | 
| for (int i = 0; i < args.Length(); i++) { | 
| HandleScope handle_scope; | 
| @@ -342,8 +364,13 @@ | 
| global_template->Set(String::New("load"), FunctionTemplate::New(Load)); | 
| global_template->Set(String::New("quit"), FunctionTemplate::New(Quit)); | 
| global_template->Set(String::New("version"), FunctionTemplate::New(Version)); | 
| -  global_template->Set(String::New("system"), FunctionTemplate::New(System)); | 
|  | 
| +  Handle<ObjectTemplate> os_templ = ObjectTemplate::New(); | 
| +  os_templ->Set(String::New("system"), FunctionTemplate::New(System)); | 
| +  os_templ->Set(String::New("chdir"), FunctionTemplate::New(ChangeDirectory)); | 
| +  os_templ->Set(String::New("setenv"), FunctionTemplate::New(SetEnvironment)); | 
| +  global_template->Set(String::New("os"), os_templ); | 
| + | 
| utility_context_ = Context::New(NULL, global_template); | 
| utility_context_->SetSecurityToken(Undefined()); | 
| Context::Scope utility_scope(utility_context_); | 
|  |